From 356fe947ca4be8545cd92b456eeb6dd4bc9d5577 Mon Sep 17 00:00:00 2001 From: ajshort Date: Sat, 16 Apr 2011 00:25:15 +1000 Subject: [PATCH 01/48] API CHANGE: Removed the unused Notifications class. --- email/Notifications.php | 64 ----------------------------------------- 1 file changed, 64 deletions(-) delete mode 100755 email/Notifications.php diff --git a/email/Notifications.php b/email/Notifications.php deleted file mode 100755 index d8299f49a..000000000 --- a/email/Notifications.php +++ /dev/null @@ -1,64 +0,0 @@ - $items) { - if($memberID) { - $email = new $emailTemplateClass(); - $email->populateTemplate(new ArrayData(array( - "Recipient" => DataObject::get_by_id("Member", $memberID), - "BrokenPages" => new DataObjectSet($items), - ))); - $email->debug(); - $email->send(); - $count++; - } - } - } - return $count; - } - - /** - * Get all the items that were passed with this event type. - * @param eventType A string, this should match the eventType passed to {@link event()} - */ - static function getItems($eventType) { - $allItems = array(); - if(isset(Notifications::$events[$eventType])) { - foreach(Notifications::$events[$eventType] as $memberID => $items) { - $allItems = array_merge($allItems, (array)$items); - } - } - return $allItems; - } - -} - -?> \ No newline at end of file From ae170ad991529f609b1c2e52d9d92a26a7420d3d Mon Sep 17 00:00:00 2001 From: ajshort Date: Sat, 16 Apr 2011 00:26:03 +1000 Subject: [PATCH 02/48] API CHANGE: Removed the unused XML class - use PHP's inbuilt XML support instead. --- integration/XML.php | 182 -------------------------------------------- 1 file changed, 182 deletions(-) delete mode 100755 integration/XML.php diff --git a/integration/XML.php b/integration/XML.php deleted file mode 100755 index 77dacc922..000000000 --- a/integration/XML.php +++ /dev/null @@ -1,182 +0,0 @@ -Building XML parsers with the XML class - * - * To use the XML parser, you need to create a subclass. Then you define process_XXX functions to process different tags. The parser walks sequentially through the file and calls the process_XXX functions when it hits different tags. - * - * * **process_(tagname):** This will be called when the parser finds the start tag. It will be passed the attributes of the tag. - * * **process_(tagname)_end:** This will be called when the parser finds the closng tag. It will be passed the attributes and the content of the tag. - * - * * **process_tag :** This will be called if it is implemented and a method has not been created already for the tag being parsed. It is passed the tag name and attributes of the tag. - * - * * **process_tag_end:** This will be called if it is implemented and a method has not been created already for the tag being parsed. It is passed the tag name, the content of the tag and the attributes of the tag. - * - * - * The idea is that within this function, you build up $this->result with a useful representation of the XML data. It could be an array structure, an object, or something else. - * - * There are a couple of methods on the XML object that will help with - * - * * **$this->inContext('(tag)', '(tag).(class)'):** This will return true if the current tag has the specified tags as ancestors, in the order that you've specified. - * - * Finally, there are public methods that can be called on an instantiated XML subclass. This is how you will make use of your new parser. - * - * * **$parser->tidyXHTML($content):** This will run "tidy -asxhtml" on your content. This is useful if you're wanting to use the XML parser to parse HTML that may or may not be XML compliant. - * * **$parser->parse($content):** This will call the parser on the given XML content, and return the $this->result object that gets built. - * - * Example - * - * - * class DeliciousHtmlParser extends XML { - * protected $currentItem = 0; - * - * function process_li($attributes) { - * if($attributes['class'] == "post") { - * $this->currentItem = sizeof($this->parsed); - * } - * } - * - * function process_a_end($content, $attributes) { - * if($this->inContext('li.post','h4.desc')) { - * $this->parsed[$this->currentItem][link] = $attributes[href]; - * $this->parsed[$this->currentItem][title] = $content; - * - * } else if($this->inContext('li.post','div.meta') && $attributes['class'] == 'tag') { - * $this->parsed[$this->currentItem][tags][] = $content; - * } - * } - * } - * - * $html = file_get_contents("http://del.icio.us/$user/?setcount=100"); - * $parser = new DeliciousHtmlParser(); - * $tidyHtml = $parser->tidyXHTML($html); - * $result = $parser->parse($tidyHtml); - * - * - * @package sapphire - * @subpackage misc - */ -class XML extends Object { - protected $parser; - protected $context, $attributeStore; - protected $parsed; - protected $collatedText; - - - function tidyXHTML($content) { - $cleanFile = TEMP_FOLDER . "/cleaner.tmp"; - $fh = fopen($cleanFile,"wb"); - fwrite($fh, $content); - fclose($fh); - - if(file_exists($cleanFile)) { - $result = `tidy -asxhtml $cleanFile`; - unlink($cleanFile); - return $result; - } - } - - function parse($content, $recursive = false) { - $this->parser = xml_parser_create('UTF-8'); - - // Andrew keeps giving me the wrong FSKING encoding! :-P - $content = ereg_replace('encoding="[^"]+"','encoding="utf-8"', $content); - - xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, false); - //xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, 'UTF-8'); - xml_set_object($this->parser, $this); - xml_set_element_handler($this->parser, "tag_open", "tag_close"); - xml_set_character_data_handler($this->parser, "cdata"); - - $this->parsed = null; - $this->context = array(); - $this->attributeStore = array(); - - xml_parse($this->parser, $content); - - // Handle a bad encoding type by forcing ISO-8859-15 - if(xml_get_error_code($this->parser) == 32 && !$recursive) { - $content = ereg_replace('encoding="[^"]+"','encoding="utf-8"', $content); - return $this->parse($content, true); - } - - if($err = xml_get_error_code($this->parser)) { - user_error("XML parser broke with error $err:" . xml_error_string($err), E_USER_ERROR); - } - - return $this->parsed; - } - - function inContext() { - $items = func_get_args(); - $i=0; - foreach($items as $item) { - while($i < sizeof($this->context)) { - if($this->context[$i] == $item) break; - $i++; - } - if($this->context[$i] != $item) return false; - } - return true; - } - - function stackActionFor($tag) { - for($i=sizeof($this->contextStack)-1;$i>=0;$i--) { - if($this->context[$i]['tag'] == $tag) return $this->contextStack[$i]['action']; - } - } - - function tag_open($parser, $tag, $attributes) { - // Strip namespaces out of tags and attributes - $tag = ereg_replace('[^:]+:','',$tag); - if($attributes) foreach($attributes as $k => $v) $newAttributes[ereg_replace('[^:]+:','',$k)] = $v; - $attributes = isset($newAttributes) ? $newAttributes : $attributes; - - - if(isset($attributes['class'])) { - $this->context[] = "$tag.{$attributes['class']}"; - } else { - $this->context[] = $tag; - } - $this->attributeStore[] = $attributes; - - $this->collatedText = ""; - - $tagProcessorFunc = "process_$tag"; - if($this->hasMethod($tagProcessorFunc)) { - $this->$tagProcessorFunc($attributes); - }elseif($this->hasMethod($tagProcessorFunc = "process_tag")){ - $this->$tagProcessorFunc($tag, $attributes); - } - - - if($attributes) foreach($attributes as $k => $v) { - $attProcessorFunc = "processatt_$k"; - if($this->hasMethod($attProcessorFunc)) { - $this->$attProcessorFunc($tag, $attributes); - } - } - } - - function tag_close($parser, $tag) { - $tag = ereg_replace('[^:]+:','',$tag); - - array_pop($this->context); - $attributes = array_pop($this->attributeStore); - - if(method_exists($this, $funcName = "process_{$tag}_end")) { - $this->$funcName($this->collatedText, $attributes); - }elseif(method_exists($this,$funcName = "process_tag_end")){ - // else run default method - $this->$funcName($tag,$this->collatedText, $attributes); - } - - $this->collatedText = ""; - } - - function cdata($parser, $cdata) { - $this->collatedText .= $cdata; - } -} \ No newline at end of file From 381e952aaf3bc4827894e8397915e86902d90867 Mon Sep 17 00:00:00 2001 From: ajshort Date: Sat, 16 Apr 2011 00:27:25 +1000 Subject: [PATCH 03/48] API CHANGE: Removed the unused Archive and TarballArchive classes. --- filesystem/Archive.php | 27 ----------- filesystem/TarballArchive.php | 87 ----------------------------------- 2 files changed, 114 deletions(-) delete mode 100644 filesystem/Archive.php delete mode 100644 filesystem/TarballArchive.php diff --git a/filesystem/Archive.php b/filesystem/Archive.php deleted file mode 100644 index cff3e66f2..000000000 --- a/filesystem/Archive.php +++ /dev/null @@ -1,27 +0,0 @@ - \ No newline at end of file diff --git a/filesystem/TarballArchive.php b/filesystem/TarballArchive.php deleted file mode 100644 index 49e9475cf..000000000 --- a/filesystem/TarballArchive.php +++ /dev/null @@ -1,87 +0,0 @@ -filename = $filename; - - if(substr($filename, strlen($filename) - strlen('.gz')) == '.gz' || - substr($filename, strlen($filename) - strlen('.tgz')) == '.tgz') { - $this->compressionModifiers = 'z'; - } else if(substr($filename, strlen($filename) - strlen('.bz2')) == '.bz2') { - $compressionModifiers = 'j'; - } - } - - function listing() { - // Call tar on the command line to get the info we need - $base = BASE_PATH; - $command = "tar -tv{$this->compressionModifiers}f $base/$this->filename"; - $consoleList = `$command`; - - $listing = array(); - // Seperate into an array of lines - $listItems = explode("\n", $consoleList); - - foreach($listItems as $listItem) { - // The path is the last thing on the line - $fullpath = substr($listItem, strrpos($listItem, ' ') + 1); - $path = explode('/', $fullpath); - $item = array(); - - // The first part of the line is the permissions - the first character will be d if it is a directory - $item['type'] = (substr($listItem, 0, 1) == 'd') ? 'directory' : 'file'; - if($item['type'] == 'directory') { - $item['listing'] = array(); - // If it's a directory, the path will have a slash on the end, so get rid of it. - array_pop($path); - } - - // The name of the file/directory is the last item on the path - $name = array_pop($path); - if($name == '') { - continue; - } - - $item['path'] = implode('/', $path); - - // Put the item in the right place - $dest = &$listing; - foreach($path as $folder) { - // If the directory doesn't exist, create it - if(!isset($dest[$folder])) { - $dest[$folder] = array(); - $dest[$folder]['listing'] = array(); - $dest[$folder]['type'] = 'directory'; - } - $dest = &$dest[$folder]['listing']; - } - - // If this is a directory and it's listing has already been created, copy the the listing - if($item['type'] == 'directory' && isset($dest[$name]['listing'])) { - $item['listing'] = $dest[$name]['listing']; - } - $dest[$name] = $item; - } - - - return $listing; - } - - function extractTo($destination, $entries = null) { - if(!isset($entries)) { - $command = "tar -xv{$this->compressionModifiers}f ../$this->filename --directory $destination"; - $output = `$command`; - } - } - -} - -?> \ No newline at end of file From e8dd38eac34e406cfd3dcfd822230153b170a4de Mon Sep 17 00:00:00 2001 From: ajshort Date: Sun, 17 Apr 2011 20:44:37 +1000 Subject: [PATCH 04/48] API CHANGE: Removed DataObjectLog class, the same functionality should be implemented using extensions. --- model/DataObject.php | 10 ---- model/DataObjectLog.php | 113 ---------------------------------------- 2 files changed, 123 deletions(-) delete mode 100755 model/DataObjectLog.php diff --git a/model/DataObject.php b/model/DataObject.php index b6991cd00..788791776 100755 --- a/model/DataObject.php +++ b/model/DataObject.php @@ -974,7 +974,6 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity * - All relevant tables will be updated. * - $this->onBeforeWrite() gets called beforehand. * - Extensions such as Versioned will ammend the database-write to ensure that a version is saved. - * - Calls to {@link DataObjectLog} can be used to see everything that's been changed. * * @uses DataExtension->augmentWrite() * @@ -1116,13 +1115,6 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity } DB::manipulate($manipulation); - - if(isset($isNewRecord) && $isNewRecord) { - DataObjectLog::addedObject($this); - } else { - DataObjectLog::changedObject($this); - } - $this->onAfterWrite(); $this->changed = null; @@ -1212,8 +1204,6 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity $this->OldID = $this->ID; $this->ID = 0; - - DataObjectLog::deletedObject($this); } /** diff --git a/model/DataObjectLog.php b/model/DataObjectLog.php deleted file mode 100755 index 30b336304..000000000 --- a/model/DataObjectLog.php +++ /dev/null @@ -1,113 +0,0 @@ -class][] = $object; - } - } - - /** - * Add this DataObject as deleted in the log. - * @param DataObject $object - */ - static function deletedObject($object) { - if(self::$enabled) { - self::$deleted[$object->class][] = $object; - } - } - - /** - * Add this DataObject as changed in the log. - * @param DataObject $object - */ - static function changedObject($object) { - if(self::$enabled) { - self::$changed[$object->class][] = $object; - } - } - - /** - * Get all DataObjects that have been added this session that are of - * the class or a subclass of the class provided. - * @param string $className The class name. - * @return array - */ - static function getAdded($className) { - return self::getByClass($className, self::$added); - } - - /** - * Get all DataObjects that have been deleted this session that are of - * the class or a subclass of the class provided. - * @param string $className The class name. - * @return array - */ - static function getDeleted($className) { - return self::getByClass($className, self::$deleted); - } - - /** - * Get all DataObjects that have been changed this session that are of - * the class or a subclass of the class provided. - * @param string $className The class name. - * @return array - */ - static function getChanged($className) { - return self::getByClass($className, self::$changed); - } - - /** - * Get all DataObjects in the given set that are of the class or a - * subclass of the class provided. - * @param string $className The class name. - * @param array $set The set to search in. - * @return array - */ - static function getByClass($className, $set) { - $allClasses = ClassInfo::subclassesFor($className); - foreach($allClasses as $subClass) { - if(isset($set[$subClass])) { - foreach($set[$subClass] as $page) { - $result[$page->ID] = $page; - } - } - } - return isset($result) ? $result : null; - } -} - -?> \ No newline at end of file From a95e6ebae860185a0153b40c397b33050a54d7cb Mon Sep 17 00:00:00 2001 From: ajshort Date: Sun, 17 Apr 2011 20:45:29 +1000 Subject: [PATCH 05/48] API CHANGE: Removed long deprecated TreeSelectorField form field. --- forms/TreeSelectorField.php | 86 ------------------------------------- 1 file changed, 86 deletions(-) delete mode 100755 forms/TreeSelectorField.php diff --git a/forms/TreeSelectorField.php b/forms/TreeSelectorField.php deleted file mode 100755 index 814ecc663..000000000 --- a/forms/TreeSelectorField.php +++ /dev/null @@ -1,86 +0,0 @@ -sourceObject = $sourceObject; - parent::__construct($name, $title); - } - - function Field() { - Requirements::javascript(SAPPHIRE_DIR . "/thirdparty/prototype/prototype.js"); - Requirements::javascript(SAPPHIRE_DIR . "/thirdparty/behaviour/behaviour.js"); - Requirements::javascript(SAPPHIRE_DIR . "/javascript/prototype_improvements.js"); - - Requirements::add_i18n_javascript(SAPPHIRE_DIR . '/javascript/lang'); - Requirements::javascript(SAPPHIRE_DIR . "/thirdparty/jquery/jquery.js"); - Requirements::javascript(SAPPHIRE_DIR . "/javascript/TreeDropdownField.js"); - - $fieldName = $this->name; - if($this->form) { - $record = $this->form->getRecord(); - if($record && $record->hasMethod($fieldName)) $items = $record->$fieldName(); - } - if($items) { - foreach($items as $item) { - $titleArray[] =$item->Title; - $idArray[] = $item->ID; - } - if($titleArray) { - $itemList = implode(", ", $titleArray); - $value = implode(",", $idArray); - } - } - - $id = $this->id(); - - return << - - - $itemList - -HTML; - } - - /** - * Save the results into the form - */ - function saveInto(DataObject $record) { - $fieldName = $this->name; - $saveDest = $record->$fieldName(); - - if($this->value) { - $items = preg_split("/ *, */", trim($this->value)); - } - - $saveDest->setByIDList($items); - } - - - /** - * Return the site tree - */ - function gettree() { - echo "
- - -
"; - - - $obj = singleton($this->sourceObject); - $obj->markPartialTree(10); - - $eval = '"
  • name . '-$child->ID\" class=\"$child->class closed" . ($child->isExpanded() ? "" : " unexpanded") . "\">" . $child->Title . ""'; - echo $obj->getChildrenAsUL("class=\"tree\"", $eval, null, true); - - } - -} - -?> From 1ac23f8f676cb986dac679fbf43e4a7b61d0be68 Mon Sep 17 00:00:00 2001 From: ajshort Date: Sun, 17 Apr 2011 21:57:32 +1000 Subject: [PATCH 06/48] API CHANGE: Removed deprecated AutocompleteTextField form field. --- forms/AutocompleteTextField.php | 54 --------------------------------- 1 file changed, 54 deletions(-) delete mode 100644 forms/AutocompleteTextField.php diff --git a/forms/AutocompleteTextField.php b/forms/AutocompleteTextField.php deleted file mode 100644 index eadf6a516..000000000 --- a/forms/AutocompleteTextField.php +++ /dev/null @@ -1,54 +0,0 @@ -optionsURL = $optionsURL; - - parent::__construct($name, $title, $value, $maxLength); - } - - function extraClass() { - return parent::extraClass() . " autocomplete"; - } - - function Field() { - // Requirements::javascript(SAPPHIRE_DIR . '/javascript/AutocompleteTextField.js'); - $attributes = array( - 'class' => "{$this->class} text" . ($this->extraClass() ? $this->extraClass() : ''), - 'type' => 'text', - 'id' => $this->id(), - 'name' => $this->name, - 'value' => $this->Value(), - 'tabindex' => $this->getTabIndex(), - 'size' => $this->maxLength ? min( $this->maxLength, 30 ) : 30 - ); - if($this->maxLength) $attributes['maxlength'] = $this->maxLength; - - return $this->createTag('input', $attributes) . "
    id() . "_Options\" class=\"autocompleteoptions\">
    "; - } - - function FieldHolder() { - $holder = parent::FieldHolder(); - - $id = $this->id(); - - $holder .= << - new Ajax.Autocompleter( '$id', '{$id}_Options', '{$this->optionsURL}', { afterUpdateElement : function(el) { if(el.onajaxupdate) { el.onajaxupdate(); } } } ); - -JS; - - return $holder; - } -} -?> \ No newline at end of file From 5304215fc784858a71109ec7b1bd80d0e6f0c774 Mon Sep 17 00:00:00 2001 From: Al Date: Sun, 1 May 2011 17:36:09 +1200 Subject: [PATCH 07/48] MINOR Documentation updated to reflect that $PastVisitor is deprecated --- docs/en/reference/built-in-page-controls.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/en/reference/built-in-page-controls.md b/docs/en/reference/built-in-page-controls.md index 7f03dcb5b..653113cb7 100644 --- a/docs/en/reference/built-in-page-controls.md +++ b/docs/en/reference/built-in-page-controls.md @@ -209,13 +209,15 @@ If the user is logged in this will print out Welcome Back, Admin -#### <% if PastMember %>, <% if PastVisitor %> +#### <% if PastMember %> These controls detect the visitor's previous experience with the site: -* $PastVisitor will return true if the visitor has been to the site before * $PastMember will return true if the visitor has signed up or logged in on the site before +Note that as of version 2.4 `$PastVisitor` is deprecated. If you wish to check if a visitor has been to the site before, +set a cookie with `Cookie::set()` and test for it with `Cookie::get()`. + ### Date and Time #### $Now.Nice, $Now.Year @@ -333,7 +335,7 @@ $LinkToID, $VersionID, $CopyContentFromID, $RecordClassName $Link, $LinkOrCurrent, $LinkOrSection, $LinkingMode, $ElementName, $InSection, $Comments, $Breadcrumbs, $NestedTitle, $MetaTags, $ContentSource, $MultipleParents, $TreeTitle, $CMSTreeClasses, $Now, $LinkTo, $AbsoluteLink, $CurrentMember, -$PastVisitor, $PastMember, $XML_val, $RAW_val, $SQL_val, $JS_val, $ATT_val, $First, $Last, $FirstLast, $MiddleString, +$PastMember, $XML_val, $RAW_val, $SQL_val, $JS_val, $ATT_val, $First, $Last, $FirstLast, $MiddleString, $Middle, $Even, $Odd, $EvenOdd, $Pos, $TotalItems, $BaseHref, $CurrentPage, $Top ### All fields available in Page From 5ecb55dfb21bf5130742945427f0291bd9891f17 Mon Sep 17 00:00:00 2001 From: Al Date: Sun, 1 May 2011 17:50:06 +1200 Subject: [PATCH 08/48] MINOR Documentation tidying --- docs/en/reference/built-in-page-controls.md | 46 ++++++++++----------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/docs/en/reference/built-in-page-controls.md b/docs/en/reference/built-in-page-controls.md index 653113cb7..c39be16c0 100644 --- a/docs/en/reference/built-in-page-controls.md +++ b/docs/en/reference/built-in-page-controls.md @@ -4,7 +4,7 @@ Ever wonder when you use `$Title` and `<% Control Children %>` what else you can call in the templates?. This page is here to help with a guide on what template controls you can call. -**Note for advanced users:** These built-in page controls are defined in the `[api:SiteTree]` classes, which are the +**Note for advanced users:** These built-in page controls are defined in the [api:SiteTree] classes, which are the 'root' data-object and controller classes for all the sites. So if you're dealing with something that isn't a sub-class of one of these, our handy reference to 'built-in page controls' won't be so relevant. @@ -18,8 +18,8 @@ within another page control. #### <% control Menu(1) %>, <% control Menu(2) %>, ... -Returns a fixed level menu. Because this only works in the top level, you can't use it for nested menus. Used <% -control Children %> instead. You can nest `<% control Children %>`. +Returns a fixed level menu. Because this only works in the top level, you can't use it for nested menus. Use +`<% control Children %>` instead. You can nest `<% control Children %>`. #### <% control ChildrenOf(page-url) %> @@ -39,7 +39,7 @@ you're on the page __about us > staff > bob marley__: #### <% control Page(my-page) %>$Title<% end_control %> "Page" will return a single page from the site tree, looking it up by URL. You can use it in the `<% control %>` format. -Can't be called using $Page(my-page).Title. +Can't be called using `$Page(my-page).Title`. ## Page controls that can be used anywhere @@ -110,7 +110,7 @@ These return different linking modes. $LinkingMode provides the greatest contro * section: A child of this page is currently open, which means that we're currently in this section of the site. * current: This page is currently open. -A useful way of using this is in your menus. You can use the following code below to generate an class="current" or +A useful way of using this is in your menus. You can use the following code below to generate class="current" or class="section" on your links. Take the following code :::ss @@ -123,8 +123,7 @@ When viewed on the Home page it will render like this
  • Home
  • -$LinkOrCurrent ignores the section status, returning link instead. $LinkOrSection ingores the current status, returning -section instead. Both of these options can simplify your CSS when you only have 2 different cases to consider. +`$LinkOrCurrent` ignores the section status, returning link instead. `$LinkOrSection` ignores the current status, returning section instead. Both of these options can simplify your CSS when you only have 2 different cases to consider. #### <% if LinkOrCurrent = current %> @@ -181,13 +180,13 @@ file #### $ClassName -Returns the ClassName of the PHP object. Eg if you have a custom HomePage page type with $ClassName in the template, it +Returns the ClassName of the PHP object. Eg if you have a custom HomePage page type with `$ClassName` in the template, it will return "HomePage" #### $BaseHref Returns the base URL for the current site. This is used to populate the `` tag by default, so if you want to -override `<% base_tag %>` with a specific piece of HTML, you can do something like ```` +override `<% base_tag %>` with a specific piece of HTML, you can do something like `` ### Controlling Members and Visitors Data @@ -211,9 +210,8 @@ If the user is logged in this will print out #### <% if PastMember %> -These controls detect the visitor's previous experience with the site: - -* $PastMember will return true if the visitor has signed up or logged in on the site before +Detect the visitor's previous experience with the site. `$PastMember` will return true if the visitor has signed up or +logged in on the site before. Note that as of version 2.4 `$PastVisitor` is deprecated. If you wish to check if a visitor has been to the site before, set a cookie with `Cookie::set()` and test for it with `Cookie::get()`. @@ -222,18 +220,18 @@ set a cookie with `Cookie::set()` and test for it with `Cookie::get()`. #### $Now.Nice, $Now.Year -$Now returns the current date. You can call any of the methods from the `[api:Date]` class on +`$Now` returns the current date. You can call any of the methods from the [api:Date] class on it. #### $Created.Nice, $Created.Ago -$Created returns the time the page was created, $Created.Ago returns how long ago the page was created. You can also -call any of methods of the `[api:Date]` class on it. +`$Created` returns the time the page was created, `$Created.Ago` returns how long ago the page was created. You can also +call any of methods of the [api:Date] class on it. #### $LastEdited.Nice, $LastEdited.Ago -$LastEdited returns the time the page was modified, $LastEdited.Ago returns how long ago the page was modified.You can also -call any of methods of the `[api:Date]` class on it. +`$LastEdited `returns the time the page was modified, `$LastEdited.Ago` returns how long ago the page was modified. You +can also call any of methods of the [api:Date] class on it. ### DataObjectSet Options @@ -241,21 +239,21 @@ If you are using a DataObjectSet you have a wide range of methods you can call o #### <% if Even %>, <% if Odd %>, $EvenOdd -These controls can be used to do zebra-striping. $EvenOdd will return 'even' or 'odd' as appropriate. +These controls can be used to do zebra-striping. `$EvenOdd` will return 'even' or 'odd' as appropriate. #### <% if First %>, <% if Last %>, <% if Middle %>, $FirstLast These controls can be used to set up special behaviour for the first and last records of a datafeed. `<% if Middle %>` is -set when neither first not last are set. $FirstLast will be 'first', 'last', or '' +set when neither first not last are set. `$FirstLast` will be 'first', 'last', or ''. #### $Pos, $TotalItems -$TotalItems will return the number of items on this page of the datafeed, and Pos will return a counter starting at 1. +`$TotalItems` will return the number of items on this page of the datafeed, and `$Pos` will return a counter starting at 1. #### $Top When you're inside a control loop in your template, and want to reference methods on the current controller you're on, -breaking out of the loop to get it, you can use $Top to do so. For example: +breaking out of the loop to get it, you can use `$Top` to do so. For example: :::ss $URLSegment @@ -267,7 +265,7 @@ breaking out of the loop to get it, you can use $Top to do so. For example: ## Properties of a datafeed itself, rather than one of its items -If we have a control such as `<% control SearchResults %>`, there are some properties, such as $SearchResults.NextLink, +If we have a control such as `<% control SearchResults %>`, there are some properties, such as `$SearchResults.NextLink`, that aren't accessible within `<% control SearchResults %>`. These can be used on any datafeed. ### Search Results @@ -279,8 +277,8 @@ Returns true when we have a multi-page datafeed, restricted with a limit. #### $SearchResults.NextLink, $SearchResults.PrevLink This returns links to the next and previous page in a multi-page datafeed. They will return blank if there's no -appropriate page to go to, so $PrevLink will return blank when you're on the first page. You can therefore use <% if -PrevLink %> to keep your template tidy. +appropriate page to go to, so `$PrevLink` will return blank when you're on the first page. You can therefore use +`<% if PrevLink %>` to keep your template tidy. #### $SearchResults.CurrentPage, $SearchResults.TotalPages From cd6115b85b2e5862b55182f2d5f0e6b218698e58 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Thu, 28 Apr 2011 23:00:59 +1200 Subject: [PATCH 09/48] API CHANGE Removed Controller::PastVisitor(), used PastMember() instead --- control/Controller.php | 9 --------- 1 file changed, 9 deletions(-) diff --git a/control/Controller.php b/control/Controller.php index 4f959bd87..8e8c553f4 100755 --- a/control/Controller.php +++ b/control/Controller.php @@ -394,15 +394,6 @@ class Controller extends RequestHandler { return Member::currentUser(); } - /** - * Returns true if the visitor has been here before - * @return boolean - */ - function PastVisitor() { - user_error("Controller::PastVisitor() is deprecated", E_USER_NOTICE); - return false; - } - /** * Return true if the visitor has signed up for a login account before * @return boolean From 4bd97cfd79c5e943dab6b30e1fcc82c38a65cf58 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Thu, 28 Apr 2011 23:02:10 +1200 Subject: [PATCH 10/48] API CHANGE Removed Director::get_site_mode() and set_site_mode(), functionality no longer required API CHANGE Removed Director::add_callback(), use custom extension on controller instead API CHANGE Removed Director::currentPage(), use get_current_page() instead --- control/Director.php | 63 +------------------------------------------- 1 file changed, 1 insertion(+), 62 deletions(-) diff --git a/control/Director.php b/control/Director.php index 472152feb..fb76363e6 100755 --- a/control/Director.php +++ b/control/Director.php @@ -21,12 +21,7 @@ class Director { * @var SiteTree */ private static $current_page; - - /** - * @deprecated 2.4 - */ - static $siteMode; - + static $alternateBaseFolder; static $alternateBaseURL; @@ -37,12 +32,6 @@ class Director { static protected $environment_type; - /** - * @deprecated 2.4 - */ - static protected $callbacks; - - /** * Add URL matching rules to the Director. * @@ -324,13 +313,6 @@ class Director { public static function set_current_page($page) { self::$current_page = $page; } - - /** - * @deprecated 2.4 Use {@link Director::get_current_page()}. - */ - static function currentPage() { - return self::get_current_page(); - } /** * Turns the given URL into an absolute URL. @@ -689,49 +671,6 @@ class Director { return (php_sapi_name() == "cli"); } - //////////////////////////////////////////////////////////////////////////////////////////// - // Site mode methods - //////////////////////////////////////////////////////////////////////////////////////////// - - /** - * @deprecated 2.4 - */ - static function set_site_mode($mode) { - user_error ( - 'Director::set_site_mode() is deprecated as the functionality is no longer neccesary.', E_USER_NOTICE - ); - - Director::$siteMode = $mode; - - if(isset(self::$callbacks[$mode])) { - foreach(self::$callbacks[$mode] as $extension) { - call_user_func($extension); - } - } - } - - /** - * @deprecated 2.4 - */ - static function get_site_mode() { - user_error ( - 'Director::set_site_mode() is deprecated as the functionality is no longer neccesary.', E_USER_NOTICE - ); - - return Director::$siteMode; - } - - /** - * @deprecated 2.4 Use a custom extension on your controller. - */ - static function add_callback($function, $mode = 'site') { - user_error ( - 'Director::add_callback() is deprecated, please use a custom extension on your controller', E_USER_NOTICE - ); - - self::$callbacks[$mode][] = $function; - } - //////////////////////////////////////////////////////////////////////////////////////////// // Environment type methods //////////////////////////////////////////////////////////////////////////////////////////// From 1ec01d5dffac89b06d187a2ff10b1734dfe7e098 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Thu, 28 Apr 2011 23:03:55 +1200 Subject: [PATCH 11/48] API CHANGE Removed SS_HTTPResponse->getLinks(), use HTTP::getLinksIn() or DOMDocument --- control/HTTPResponse.php | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/control/HTTPResponse.php b/control/HTTPResponse.php index 23a2e03e5..6b48a6580 100755 --- a/control/HTTPResponse.php +++ b/control/HTTPResponse.php @@ -246,32 +246,6 @@ class SS_HTTPResponse { return in_array($this->statusCode, array(301, 302, 401, 403)); } - /** - * @deprecated 2.4 Use {@link HTTP::getLinksIn()} on DOMDocument. - */ - public function getLinks() { - user_error ( - 'SS_HTTPResponse->getLinks() is deprecated, please use HTTP::getLinksIn() or DOMDocument.', E_USER_NOTICE - ); - - $attributes = array('id', 'href', 'class'); - $links = array(); - $results = array(); - - if(preg_match_all('/]+>/i', $this->body, $links)) foreach($links[0] as $link) { - $processedLink = array(); - foreach($attributes as $attribute) { - $matches = array(); - if(preg_match('/' . $attribute . '\s*=\s*"([^"]+)"/i', $link, $matches)) { - $processedLink[$attribute] = $matches[1]; - } - } - $results[] = $processedLink; - } - - return $results; - } - } /** From 64692ccee67aa42aa51b657041b43b5b84870456 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Thu, 28 Apr 2011 23:04:10 +1200 Subject: [PATCH 12/48] API CHANGE Removed LeftAndMain->getitem(), use show() instead --- admin/code/LeftAndMain.php | 8 -------- 1 file changed, 8 deletions(-) diff --git a/admin/code/LeftAndMain.php b/admin/code/LeftAndMain.php index 73d3c317c..c6016d825 100644 --- a/admin/code/LeftAndMain.php +++ b/admin/code/LeftAndMain.php @@ -363,14 +363,6 @@ class LeftAndMain extends Controller { return $content; } - /** - * @deprecated 2.4 Please use show() - */ - public function getitem($request) { - $form = $this->getEditForm($request->getVar('ID')); - return $form->formHtmlContent(); - } - //------------------------------------------------------------------------------------------// // Main UI components From 44354d472f97575c4852e88e49e45add44dfc41b Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Thu, 28 Apr 2011 23:06:29 +1200 Subject: [PATCH 13/48] API CHANGE Removed Session::clearAll(), use clear_all() instead API CHANGE Removed Session::getAll(), use get_all() instead --- control/Session.php | 31 ++----------------------------- 1 file changed, 2 insertions(+), 29 deletions(-) diff --git a/control/Session.php b/control/Session.php index 1c9bbc242..be2fa25fb 100644 --- a/control/Session.php +++ b/control/Session.php @@ -54,7 +54,7 @@ * You can also get all the values in the session at once. This is useful for debugging. * * - * Session::getAll(); // returns an array of all the session values. + * Session::get_all(); // returns an array of all the session values. * * * Clearing Data @@ -68,7 +68,7 @@ * Or you can clear every single value in the session at once. Note SilverStripe stores some of its own session data including form and page comment information. None of this is vital but clear_all will clear everything. * * - * Session::clearAll(); + * Session::clear_all(); * * * @see Cookie @@ -211,15 +211,6 @@ class Session { } } - /** - * @deprecated 2.5 Use Session::add_to_array($name, $val) instead - */ - public static function addToArray($name, $val) { - user_error('Session::addToArray() is deprecated. Please use Session::add_to_array() instead.', E_USER_NOTICE); - - return Session::add_to_array($name, $val); - } - /** * Add a value to a specific key in the session array */ @@ -254,16 +245,7 @@ class Session { public static function get_all() { return self::current_session()->inst_getAll(); } - - /** - * @deprecated 2.5 Use Session::get_all() - */ - public static function getAll() { - user_error('Session::getAll() is deprecated. Please use Session::get_all() instead.', E_USER_NOTICE); - return Session::get_all(); - } - /** * Clear a given session key, value pair. * @@ -282,16 +264,7 @@ class Session { return $ret; } - - /** - * @deprecated 2.5 Use Session::clear_all() - */ - public static function clearAll() { - user_error('Session::clearAll() is deprecated. Please use Session::clear_all() instead.', E_USER_NOTICE); - return Session::clear_all(); - } - /** * Save all the values in our session to $_SESSION */ From ea9faeccf76373e23d57d1c10f7a34ed5c60b36a Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Thu, 28 Apr 2011 23:08:54 +1200 Subject: [PATCH 14/48] API CHANGE Removed Object->cacheToFileWithArgs(), please use Object->cacheToFile() with the $arguments param --- core/Object.php | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/core/Object.php b/core/Object.php index 6c41bb5b7..5281dd410 100644 --- a/core/Object.php +++ b/core/Object.php @@ -1062,18 +1062,6 @@ abstract class Object { if(file_exists($file)) unlink($file); } - /** - * @deprecated - */ - public function cacheToFileWithArgs($callback, $arguments = array(), $lifetime = 3600, $ID = false) { - user_error ( - 'Object->cacheToFileWithArgs() is deprecated, please use Object->cacheToFile() with the $arguments param', - E_USER_NOTICE - ); - - return $this->cacheToFile($callback, $lifetime, $ID, $arguments); - } - /** * Loads a cache from the filesystem if a valid on is present and within the specified lifetime * From f8b38e9adb1d2733dbe619a1ff8497a2caa57797 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Sat, 30 Apr 2011 15:11:10 +1200 Subject: [PATCH 15/48] MINOR Moving _layout.scss include from screen.css into its own file, in order to selectively block layout options like body {overflow: none;} while retaining all other cms styles (useful in a dialog context) --- admin/code/LeftAndMain.php | 1 + admin/css/layout.css | 69 ++++ admin/css/screen.css | 474 +++++++++++------------ admin/scss/{_layout.scss => layout.scss} | 9 +- admin/scss/screen.scss | 1 - security/Member.php | 4 +- 6 files changed, 308 insertions(+), 250 deletions(-) create mode 100644 admin/css/layout.css rename admin/scss/{_layout.scss => layout.scss} (92%) diff --git a/admin/code/LeftAndMain.php b/admin/code/LeftAndMain.php index c6016d825..5e6f75f7b 100644 --- a/admin/code/LeftAndMain.php +++ b/admin/code/LeftAndMain.php @@ -192,6 +192,7 @@ class LeftAndMain extends Controller { $htmlEditorConfig->setOption('content_css', implode(',', $cssFiles)); } + Requirements::css(SAPPHIRE_ADMIN_DIR . '/css/layout.css'); Requirements::css(SAPPHIRE_ADMIN_DIR . '/css/screen.css'); Requirements::javascript(THIRDPARTY_DIR . '/prototype/prototype.js'); diff --git a/admin/css/layout.css b/admin/css/layout.css new file mode 100644 index 000000000..5bf4fd899 --- /dev/null +++ b/admin/css/layout.css @@ -0,0 +1,69 @@ +/** This file defines the structural layout of the CMS interface. Ideally, you should be able to lay out the base elements of the CMS with only this file. Please put any presentational definitions (color, fonts, backgrounds, paddings) into _style.scss or _uitheme.scss instead. */ +/* line 17, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { margin: 0; padding: 0; border: 0; font-size: 100%; font: inherit; vertical-align: baseline; } + +/* line 20, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +body { line-height: 1; } + +/* line 22, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +ol, ul { list-style: none; } + +/* line 24, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +table { border-collapse: collapse; border-spacing: 0; } + +/* line 26, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +caption, th, td { text-align: left; font-weight: normal; vertical-align: middle; } + +/* line 28, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +q, blockquote { quotes: none; } +/* line 101, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +q:before, q:after, blockquote:before, blockquote:after { content: ""; content: none; } + +/* line 30, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +a img { border: none; } + +/* line 115, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { display: block; } + +/* line 12, ../scss/layout.scss */ +html, body { width: 100%; height: 100%; padding: 0; margin: 0; overflow: hidden; } + +/* line 20, ../scss/layout.scss */ +.cms-preview { width: 1px; overflow: hidden; } +/* line 24, ../scss/layout.scss */ +.cms-preview .cms-preview-toggle { width: 10px; } +/* line 28, ../scss/layout.scss */ +.cms-preview iframe { width: 100%; height: 100%; } + +/* line 34, ../scss/layout.scss */ +.cms-container { height: 100%; } + +/* line 38, ../scss/layout.scss */ +.cms-menu { width: 250px; overflow: auto; } + +/* line 51, ../scss/layout.scss */ +.cms-preview, .cms-menu, .cms-content, .cms-content-header, .cms-content-tools, .cms-content-form { display: -moz-inline-box; -moz-box-orient: vertical; display: inline-block; vertical-align: middle; *vertical-align: auto; } +/* line 7, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/css3/_inline-block.scss */ +.cms-preview, .cms-menu, .cms-content, .cms-content-header, .cms-content-tools, .cms-content-form { *display: inline; } + +/* line 55, ../scss/layout.scss */ +.cms-content-tools { width: 230px; padding: 10px; overflow: auto; } + +/* line 61, ../scss/layout.scss */ +.cms-content-form { overflow: auto; } + +/* line 65, ../scss/layout.scss */ +.cms-content-header { height: 40px; } +/* line 68, ../scss/layout.scss */ +.cms-content-header h2 { width: 226px; } +/* line 72, ../scss/layout.scss */ +.cms-content-header > div { width: 9999em; overflow: hidden; } + +/* line 78, ../scss/layout.scss */ +.cms-content-actions { padding: 10px; } + +/* line 82, ../scss/layout.scss */ +.cms-logo { height: 30px; overflow: hidden; vertical-align: middle; } + +/* line 88, ../scss/layout.scss */ +.cms-login-status { height: 30px; overflow: hidden; vertical-align: middle; } diff --git a/admin/css/screen.css b/admin/css/screen.css index 57979bb5f..0b7872060 100644 --- a/admin/css/screen.css +++ b/admin/css/screen.css @@ -1,443 +1,429 @@ -@charset "UTF-8"; /** This file is the central collection of included modules, links to custom SCSS files, and any global SCSS variable definitions. DO NOT ADD stylesheet rules to this file directly! Note: By prefixing files with an underscore, they won't create individual CSS files. */ -/* line 14, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td { margin: 0; padding: 0; border: 0; outline: 0; font-weight: inherit; font-style: inherit; font-size: 100%; font-family: inherit; vertical-align: baseline; } +/* line 17, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { margin: 0; padding: 0; border: 0; font-size: 100%; font: inherit; vertical-align: baseline; } -/* line 17, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -body { line-height: 1; color: black; background: white; } +/* line 20, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +body { line-height: 1; } -/* line 19, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +/* line 22, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ ol, ul { list-style: none; } -/* line 21, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -table { border-collapse: separate; border-spacing: 0; vertical-align: middle; } +/* line 24, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +table { border-collapse: collapse; border-spacing: 0; } -/* line 23, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +/* line 26, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ caption, th, td { text-align: left; font-weight: normal; vertical-align: middle; } -/* line 25, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -q, blockquote { quotes: "" ""; } -/* line 96, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -q:before, q:after, blockquote:before, blockquote:after { content: ""; } +/* line 28, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +q, blockquote { quotes: none; } +/* line 101, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +q:before, q:after, blockquote:before, blockquote:after { content: ""; content: none; } -/* line 27, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +/* line 30, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ a img { border: none; } +/* line 115, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { display: block; } + /** This file only contains color definitions. Please put any further formatting into _style.scss. */ -/** This file defines the structural layout of the CMS interface. Ideally, you should be able to lay out the base elements of the CMS with only this file. Please put any presentational definitions (color, fonts, backgrounds, paddings) into _style.scss or _uitheme.scss instead. */ -/* line 9, ../scss/_layout.scss */ -html, body { width: 100%; height: 100%; padding: 0; margin: 0; overflow: hidden; } - -/* line 17, ../scss/_layout.scss */ -.cms-preview { width: 1px; overflow: hidden; } -/* line 21, ../scss/_layout.scss */ -.cms-preview .cms-preview-toggle { width: 10px; } -/* line 25, ../scss/_layout.scss */ -.cms-preview iframe { width: 100%; height: 100%; } - -/* line 31, ../scss/_layout.scss */ -.cms-container { height: 100%; } - -/* line 35, ../scss/_layout.scss */ -.cms-menu { width: 250px; overflow: auto; } - -/* line 47, ../scss/_layout.scss */ -.cms-menu, .cms-content, .cms-content-header, .cms-content-tools, .cms-content-form { display: -moz-inline-box; -moz-box-orient: vertical; display: inline-block; vertical-align: middle; *vertical-align: auto; } -/* line 7, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/css3/_inline-block.scss */ -.cms-menu, .cms-content, .cms-content-header, .cms-content-tools, .cms-content-form { *display: inline; } - -/* line 51, ../scss/_layout.scss */ -.cms-content-tools { width: 250px; overflow: auto; } - -/* line 56, ../scss/_layout.scss */ -.cms-content-form { overflow: auto; } - -/* line 60, ../scss/_layout.scss */ -.cms-content-header { height: 40px; } -/* line 63, ../scss/_layout.scss */ -.cms-content-header h2 { width: 226px; } -/* line 67, ../scss/_layout.scss */ -.cms-content-header > div { width: 9999em; overflow: hidden; } - -/* line 73, ../scss/_layout.scss */ -.cms-content-actions { padding: 10px; } - -/* line 77, ../scss/_layout.scss */ -.cms-logo { height: 30px; overflow: hidden; vertical-align: middle; } - -/* line 83, ../scss/_layout.scss */ -.cms-login-status { height: 30px; overflow: hidden; vertical-align: middle; } - /** This file defines the jstree base styling (see http://jstree.com), as well as any customizations (see bottom of file). The styles are usually added through jstree.js on DOM load, but we need it earlier in order to correctly display the uninitialized tree. */ -/* line 10, ../scss/_tree.scss */ +/* line 10, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree ul { display: block; margin: 0 0 0 0; padding: 0 0 0 0; list-style-type: none; } -/* line 16, ../scss/_tree.scss */ +/* line 16, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree li { display: block; margin: 0 0 0 0; padding: 0 0 0 0; list-style-type: none; display: block; min-height: 18px; line-height: 18px; white-space: nowrap; margin-left: 18px; min-width: 18px; } -/* line 28, ../scss/_tree.scss */ +/* line 28, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree ins { display: inline-block; text-decoration: none; width: 18px; height: 18px; margin: 0 0 0 0; padding: 0; } -/* line 36, ../scss/_tree.scss */ +/* line 36, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree a { display: inline-block; line-height: 16px; height: 16px; color: black; white-space: nowrap; text-decoration: none; padding: 1px 2px; margin: 0; } -/* line 45, ../scss/_tree.scss */ +/* line 45, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree a:focus { outline: none; } -/* line 49, ../scss/_tree.scss */ +/* line 49, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree a > ins { height: 16px; width: 16px; } -/* line 53, ../scss/_tree.scss */ +/* line 53, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree a > .jstree-icon { margin-right: 3px; } -/* line 61, ../scss/_tree.scss */ +/* line 61, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree li.jstree-open > ul { display: block; } -/* line 64, ../scss/_tree.scss */ +/* line 64, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree li.jstree-closed > ul { display: none; } -/* line 69, ../scss/_tree.scss */ +/* line 69, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree li.disabled a { color: #aaaaaa; } -/* line 76, ../scss/_tree.scss */ +/* line 76, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree-rtl a > .jstree-icon { margin-left: 3px; margin-right: 0; } -/* line 80, ../scss/_tree.scss */ +/* line 80, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree-rtl li { margin-left: 0; margin-right: 18px; } -/* line 87, ../scss/_tree.scss */ +/* line 87, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree-rtl > ul > li { margin-right: 0px; } -/* line 91, ../scss/_tree.scss */ +/* line 91, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree > ul > li { margin-left: 0px; } -/* line 95, ../scss/_tree.scss */ +/* line 95, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-dragged { display: block; margin: 0 0 0 0; padding: 4px 4px 4px 24px; position: absolute; top: -2000px; line-height: 16px; z-index: 10000; } -/* line 104, ../scss/_tree.scss */ +/* line 104, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-contextmenu { display: block; visibility: hidden; left: 0; top: -200px; position: absolute; margin: 0; padding: 0; min-width: 180px; background: #ebebeb; border: 1px solid silver; z-index: 10000; *width: 180px; } -/* line 117, ../scss/_tree.scss */ +/* line 117, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-contextmenu ul { min-width: 180px; *width: 180px; } -/* line 120, ../scss/_tree.scss */ +/* line 120, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-contextmenu ul, #vakata-contextmenu li { margin: 0; padding: 0; list-style-type: none; display: block; } -/* line 126, ../scss/_tree.scss */ +/* line 126, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-contextmenu li { line-height: 20px; min-height: 20px; position: relative; padding: 0px; } -/* line 132, ../scss/_tree.scss */ +/* line 132, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-contextmenu li a { padding: 1px 6px; line-height: 17px; display: block; text-decoration: none; margin: 1px 1px 0 1px; } -/* line 139, ../scss/_tree.scss */ +/* line 139, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-contextmenu li ins { float: left; width: 16px; height: 16px; text-decoration: none; margin-right: 2px; } -/* line 146, ../scss/_tree.scss */ +/* line 146, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-contextmenu li a:hover, #vakata-contextmenu li.vakata-hover > a { background: gray; color: white; } -/* line 150, ../scss/_tree.scss */ +/* line 150, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-contextmenu li ul { display: none; position: absolute; top: -2px; left: 100%; background: #ebebeb; border: 1px solid gray; } -/* line 158, ../scss/_tree.scss */ +/* line 158, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-contextmenu .right { right: 100%; left: auto; } -/* line 162, ../scss/_tree.scss */ +/* line 162, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-contextmenu .bottom { bottom: -1px; top: auto; } -/* line 166, ../scss/_tree.scss */ +/* line 166, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-contextmenu li.vakata-separator { min-height: 0; height: 1px; line-height: 1px; font-size: 1px; overflow: hidden; margin: 0 2px; background: silver; /* border-top:1px solid #fefefe; */ padding: 0; } -/* line 176, ../scss/_tree.scss */ +/* line 176, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree ul, .jstree li { display: block; margin: 0 0 0 0; padding: 0 0 0 0; list-style-type: none; } -/* line 182, ../scss/_tree.scss */ +/* line 182, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree li { display: block; min-height: 18px; line-height: 18px; white-space: nowrap; margin-left: 18px; min-width: 18px; } -/* line 190, ../scss/_tree.scss */ +/* line 190, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree-rtl li { margin-left: 0; margin-right: 18px; } -/* line 194, ../scss/_tree.scss */ +/* line 194, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree > ul > li { margin-left: 0px; } -/* line 197, ../scss/_tree.scss */ +/* line 197, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree-rtl > ul > li { margin-right: 0px; } -/* line 200, ../scss/_tree.scss */ +/* line 200, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree ins { display: inline-block; text-decoration: none; width: 18px; height: 18px; margin: 0 0 0 0; padding: 0; } -/* line 208, ../scss/_tree.scss */ +/* line 208, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree a { display: inline-block; line-height: 16px; height: 16px; color: black; white-space: nowrap; text-decoration: none; padding: 1px 2px; margin: 0; } -/* line 218, ../scss/_tree.scss */ +/* line 218, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree a:focus { outline: none; } -/* line 221, ../scss/_tree.scss */ +/* line 221, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree a > ins { height: 16px; width: 16px; } -/* line 225, ../scss/_tree.scss */ +/* line 225, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree a > .jstree-icon { margin-right: 3px; } -/* line 228, ../scss/_tree.scss */ +/* line 228, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree-rtl a > .jstree-icon { margin-left: 3px; margin-right: 0; } -/* line 232, ../scss/_tree.scss */ +/* line 232, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ li.jstree-open > ul { display: block; } -/* line 235, ../scss/_tree.scss */ +/* line 235, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ li.jstree-closed > ul { display: none; } -/* line 238, ../scss/_tree.scss */ +/* line 238, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-dragged ins { display: block; text-decoration: none; width: 16px; height: 16px; margin: 0 0 0 0; padding: 0; position: absolute; top: 4px; left: 4px; -moz-border-radius: 4px; border-radius: 4px; -webkit-border-radius: 4px; } -/* line 252, ../scss/_tree.scss */ +/* line 252, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-dragged .jstree-ok { background: green; } -/* line 255, ../scss/_tree.scss */ +/* line 255, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-dragged .jstree-invalid { background: red; } -/* line 258, ../scss/_tree.scss */ +/* line 258, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #jstree-marker { padding: 0; margin: 0; font-size: 12px; overflow: hidden; height: 12px; width: 8px; position: absolute; top: -30px; z-index: 10001; background-repeat: no-repeat; display: none; background-color: transparent; text-shadow: 1px 1px 1px white; color: black; line-height: 10px; } -/* line 275, ../scss/_tree.scss */ +/* line 275, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #jstree-marker-line { padding: 0; margin: 0; line-height: 0%; font-size: 1px; overflow: hidden; height: 1px; width: 100px; position: absolute; top: -30px; z-index: 10000; background-repeat: no-repeat; display: none; background-color: #456c43; cursor: pointer; border: 1px solid #eeeeee; border-left: 0; -moz-box-shadow: 0px 0px 2px #666; -webkit-box-shadow: 0px 0px 2px #666; box-shadow: 0px 0px 2px #666; -moz-border-radius: 1px; border-radius: 1px; -webkit-border-radius: 1px; } -/* line 299, ../scss/_tree.scss */ +/* line 299, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree .jstree-real-checkbox { display: none; } -/* line 302, ../scss/_tree.scss */ +/* line 302, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree-themeroller .ui-icon { overflow: visible; } -/* line 305, ../scss/_tree.scss */ +/* line 305, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree-themeroller a { padding: 0 2px; } -/* line 308, ../scss/_tree.scss */ +/* line 308, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree-themeroller .jstree-no-icon { display: none; } -/* line 311, ../scss/_tree.scss */ +/* line 311, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree .jstree-wholerow-real { position: relative; z-index: 1; } -/* line 315, ../scss/_tree.scss */ +/* line 315, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree .jstree-wholerow-real li { cursor: pointer; } -/* line 318, ../scss/_tree.scss */ +/* line 318, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree .jstree-wholerow-real a { border-left-color: transparent !important; border-right-color: transparent !important; } -/* line 322, ../scss/_tree.scss */ +/* line 322, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree .jstree-wholerow { position: relative; z-index: 0; height: 0; } -/* line 327, ../scss/_tree.scss */ +/* line 327, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree .jstree-wholerow ul, .jstree .jstree-wholerow li { width: 100%; } -/* line 330, ../scss/_tree.scss */ +/* line 330, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree .jstree-wholerow, .jstree .jstree-wholerow ul, .jstree .jstree-wholerow li, .jstree .jstree-wholerow a { margin: 0 !important; padding: 0 !important; } -/* line 334, ../scss/_tree.scss */ +/* line 334, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree .jstree-wholerow, .jstree .jstree-wholerow ul, .jstree .jstree-wholerow li { background: transparent !important; } -/* line 337, ../scss/_tree.scss */ +/* line 337, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree .jstree-wholerow ins, .jstree .jstree-wholerow span, .jstree .jstree-wholerow input { display: none !important; } -/* line 340, ../scss/_tree.scss */ +/* line 340, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree .jstree-wholerow a, .jstree .jstree-wholerow a:hover { text-indent: -9999px !important; width: 100%; padding: 0 !important; border-right-width: 0px !important; border-left-width: 0px !important; } -/* line 347, ../scss/_tree.scss */ +/* line 347, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree .jstree-wholerow-span { position: absolute; left: 0; margin: 0px; padding: 0; height: 18px; border-width: 0; padding: 0; z-index: 0; } -/* line 360, ../scss/_tree.scss */ +/* line 360, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .cms .jstree-apple.jstree-focused { background: none; } -/* line 363, ../scss/_tree.scss */ +/* line 363, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .cms .jstree-apple > ul { background: none; } -/* line 1, ../scss/_menu.scss */ -.cms-menu { z-index: 10; background-color: #ebeff1; -moz-box-shadow: #aaaaaa 3px 0 3px 0; -webkit-box-shadow: #aaaaaa 3px 0 3px 0; -o-box-shadow: #aaaaaa 3px 0 3px 0; box-shadow: #aaaaaa 3px 0 3px 0; } -/* line 6, ../scss/_menu.scss */ +/* line 1, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ +.cms-menu { z-index: 10; background-color: #ebeff1; -moz-box-shadow: 3px 0 3px #aaaaaa; -webkit-box-shadow: 3px 0 3px #aaaaaa; -o-box-shadow: 3px 0 3px #aaaaaa; box-shadow: 3px 0 3px #aaaaaa; } +/* line 6, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ .cms-menu a { text-decoration: none; } -/* line 12, ../scss/_menu.scss */ -.cms-menu-list li { background-color: #b0bfc6; background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #b0bfc6), color-stop(100%, #758f9b)); background-image: -moz-linear-gradient(top, #b0bfc6 0%, #758f9b 100%); background-image: linear-gradient(top, #b0bfc6 0%, #758f9b 100%); border-bottom: 1px solid #aaaaaa; } -/* line 20, ../scss/_menu.scss */ -.cms-menu-list li a { display: block; height: 32px; vertical-align: middle; font-size: 14px; text-shadow: #aaaaaa 1px 1px 1px; color: #333333; padding: 5px; } -/* line 29, ../scss/_menu.scss */ -.cms-menu-list li a .icon { display: block; float: left; margin-right: 5px; background: url('../images/icons-32.png?1303890208') no-repeat; width: 32px; height: 32px; overflow: hidden; background-position: 0px 0px; } -/* line 37, ../scss/_menu.scss */ +/* line 12, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ +.cms-menu-list li { background-color: #b0bfc6; background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #b0bfc6), color-stop(100%, #758f9b)); background-image: -webkit-linear-gradient(top, #b0bfc6, #758f9b); background-image: -moz-linear-gradient(top, #b0bfc6, #758f9b); background-image: -o-linear-gradient(top, #b0bfc6, #758f9b); background-image: linear-gradient(top, #b0bfc6, #758f9b); border-bottom: 1px solid #aaaaaa; } +/* line 20, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ +.cms-menu-list li a { display: block; height: 32px; vertical-align: middle; font-size: 14px; text-shadow: #aaaaaa; color: #333333; padding: 5px; } +/* line 29, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ +.cms-menu-list li a .icon { display: block; float: left; margin-right: 5px; background: url('../images/icons-32.png?1303987682') no-repeat; width: 32px; height: 32px; overflow: hidden; background-position: 0px 0px; } +/* line 37, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ .cms-menu-list li a .text { display: block; padding-top: 10px; } -/* line 43, ../scss/_menu.scss */ -.cms-menu-list li.current { background-color: #338dc1; background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #338dc1), color-stop(100%, #1e5270)); background-image: -moz-linear-gradient(top, #338dc1 0%, #1e5270 100%); background-image: linear-gradient(top, #338dc1 0%, #1e5270 100%); } -/* line 50, ../scss/_menu.scss */ -.cms-menu-list li.current li { background-color: #2e7ead; background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #2e7ead), color-stop(100%, #287099)); background-image: -moz-linear-gradient(top, #2e7ead 0%, #287099 100%); background-image: linear-gradient(top, #2e7ead 0%, #287099 100%); } -/* line 58, ../scss/_menu.scss */ -.cms-menu-list li.current a { color: white; text-shadow: #333333 1px 1px 1px; } -/* line 68, ../scss/_menu.scss */ -.cms-menu-list li li:first { -moz-box-shadow: #333333 0 4px 4px 0; -webkit-box-shadow: #333333 0 4px 4px 0; -o-box-shadow: #333333 0 4px 4px 0; box-shadow: #333333 0 4px 4px 0; } -/* line 72, ../scss/_menu.scss */ -.cms-menu-list li li a { font-size: 12px; text-shadow: #333333 1px 1px 1px; margin: 0; padding-left: 30px; color: white; } -/* line 80, ../scss/_menu.scss */ +/* line 43, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ +.cms-menu-list li.current { background-color: #338dc1; background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #338dc1), color-stop(100%, #1e5270)); background-image: -webkit-linear-gradient(top, #338dc1, #1e5270); background-image: -moz-linear-gradient(top, #338dc1, #1e5270); background-image: -o-linear-gradient(top, #338dc1, #1e5270); background-image: linear-gradient(top, #338dc1, #1e5270); } +/* line 50, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ +.cms-menu-list li.current li { background-color: #2e7ead; background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #2e7ead), color-stop(100%, #287099)); background-image: -webkit-linear-gradient(top, #2e7ead, #287099); background-image: -moz-linear-gradient(top, #2e7ead, #287099); background-image: -o-linear-gradient(top, #2e7ead, #287099); background-image: linear-gradient(top, #2e7ead, #287099); } +/* line 58, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ +.cms-menu-list li.current a { color: white; text-shadow: #333333; } +/* line 68, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ +.cms-menu-list li li:first { -moz-box-shadow: 0 4px 4px #333333; -webkit-box-shadow: 0 4px 4px #333333; -o-box-shadow: 0 4px 4px #333333; box-shadow: 0 4px 4px #333333; } +/* line 72, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ +.cms-menu-list li li a { font-size: 12px; text-shadow: #333333; margin: 0; padding-left: 30px; color: white; } +/* line 80, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ .cms-menu-list li li.current a { font-weight: bold; } -/* line 87, ../scss/_menu.scss */ +/* line 87, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ .cms-menu-list li#Menu-CMSMain a .icon { background-position: 0px 0px; } -/* line 88, ../scss/_menu.scss */ +/* line 88, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ .cms-menu-list li#Menu-CMSMain.current a .icon, .cms-menu-list li#Menu-CMSMain a:hover .icon { background-position: -32px 0px; } -/* line 89, ../scss/_menu.scss */ +/* line 89, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ .cms-menu-list li#Menu-AssetAdmin a .icon { background-position: 0px -32px; } -/* line 90, ../scss/_menu.scss */ +/* line 90, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ .cms-menu-list li#Menu-AssetAdmin.current a .icon, .cms-menu-list li#Menu-AssetAdmin a:hover .icon { background-position: -32px -32px; } /** This file defines common styles for form elements used throughout the CMS interface. It is an addition to the base styles defined in sapphire/css/Form.css. */ -/* line 9, ../scss/_forms.scss */ -.cms .field { display: block; padding: 10px 0; border-bottom: 1px solid #aaaaaa; } -/* line 14, ../scss/_forms.scss */ -.cms .field label { float: left; width: 10em; } -/* line 20, ../scss/_forms.scss */ -.cms .field .middleColumn { margin-left: 10em; } -/* line 23, ../scss/_forms.scss */ -.cms .field .middleColumn .field { display: inline; padding: 0; border: none; } -/* line 29, ../scss/_forms.scss */ -.cms .field .middleColumn label { float: none; width: auto; } -/* line 38, ../scss/_forms.scss */ -.cms form.nostyle .field { display: inline; padding: 0; border: 0; } -/* line 44, ../scss/_forms.scss */ -.cms form.nostyle label { float: none; width: auto; } -/* line 49, ../scss/_forms.scss */ -.cms form.nostyle .middleColumn { margin-left: 0; } -/* line 55, ../scss/_forms.scss */ -.cms .field.nolabel .middleColumn { margin-left: 0; } -/* line 60, ../scss/_forms.scss */ -.cms input, .cms textarea { -moz-border-radius: 5px; -webkit-border-radius: 5px; -o-border-radius: 5px; -ms-border-radius: 5px; -khtml-border-radius: 5px; border-radius: 5px; background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #ebeff1), color-stop(50%, #ffffff), color-stop(100%, #ebeff1)); background-image: -moz-linear-gradient(top, #ebeff1 0%, #ffffff 50%, #ebeff1 100%); background-image: linear-gradient(top, #ebeff1 0%, #ffffff 50%, #ebeff1 100%); border: 1px solid #aaaaaa; padding: 3px; } -/* line 71, ../scss/_forms.scss */ -.cms input.loading { padding-left: 16px; background: #ebeff1 url(../../images/network-save.gif) no-repeat center left; } -/* line 79, ../scss/_forms.scss */ -.cms .ss-ui-button.ss-ui-action-constructive, .cms .ui-widget-content .ss-ui-button.ss-ui-action-constructive, .cms .ui-widget-header .ss-ui-button.ss-ui-action-constructive { background: none; background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #77b53f), color-stop(100%, #456925)); background-image: -moz-linear-gradient(top, #77b53f 0%, #456925 100%); background-image: linear-gradient(top, #77b53f 0%, #456925 100%); color: white; } -/* line 90, ../scss/_forms.scss */ -.cms .ss-ui-button.ss-ui-action-destructive, .cms .ui-widget-content .ss-ui-button.ss-ui-action-destructive, .cms .ui-widget-header .ss-ui-button.ss-ui-action-destructive { color: red; } -/* line 96, ../scss/_forms.scss */ -.cms .ss-ui-button.ss-ui-action-minor, .cms .ui-widget-content .ss-ui-button.ss-ui-action-minor .ui-widget-header .ss-ui-button.ss-ui-action-minor { background: none; padding: 0; border: 0; color: #333333; text-decoration: underline; } -/* line 104, ../scss/_forms.scss */ -.cms .cms-edit-form { padding-bottom: 20px; } -/* line 108, ../scss/_forms.scss */ -.cms .cms-edit-form .Actions { text-align: right; } -/* line 115, ../scss/_forms.scss */ -.cms .cms-content-tools .field label { float: none; width: auto; } -/* line 120, ../scss/_forms.scss */ -.cms .cms-content-tools .field .middleColumn { margin-left: 0; } +/* line 6, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ +.field { display: block; padding: 10px 0; border-bottom: 1px solid #aaaaaa; } +/* line 11, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ +.field label { float: left; width: 10em; } +/* line 17, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ +.field .middleColumn { margin-left: 10em; } +/* line 20, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ +.field .middleColumn .field { display: inline; padding: 0; border: none; } +/* line 26, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ +.field .middleColumn label { float: none; width: auto; } + +/* line 35, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ +form.nostyle .field { display: inline; padding: 0; border: 0; } +/* line 41, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ +form.nostyle label { float: none; width: auto; } +/* line 46, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ +form.nostyle .middleColumn { margin-left: 0; } + +/* line 52, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ +.field.nolabel .middleColumn { margin-left: 0; } + +/* line 57, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ +input, textarea { -moz-border-radius: 5px; -webkit-border-radius: 5px; -o-border-radius: 5px; -ms-border-radius: 5px; -khtml-border-radius: 5px; border-radius: 5px; background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ebeff1), color-stop(50%, #ffffff), color-stop(100%, #ebeff1)); background-image: -webkit-linear-gradient(top, #ebeff1, #ffffff, #ebeff1); background-image: -moz-linear-gradient(top, #ebeff1, #ffffff, #ebeff1); background-image: -o-linear-gradient(top, #ebeff1, #ffffff, #ebeff1); background-image: linear-gradient(top, #ebeff1, #ffffff, #ebeff1); border: 1px solid #aaaaaa; padding: 3px; } + +/* line 68, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ +input.loading { padding-left: 16px; background: #ebeff1 url(../../images/network-save.gif) no-repeat center left; } + +/* line 76, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ +.ss-ui-button.ss-ui-action-constructive, .ui-widget-content .ss-ui-button.ss-ui-action-constructive, .ui-widget-header .ss-ui-button.ss-ui-action-constructive { background: none; background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #77b53f), color-stop(100%, #456925)); background-image: -webkit-linear-gradient(top, #77b53f, #456925); background-image: -moz-linear-gradient(top, #77b53f, #456925); background-image: -o-linear-gradient(top, #77b53f, #456925); background-image: linear-gradient(top, #77b53f, #456925); color: white; } + +/* line 87, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ +.ss-ui-button.ss-ui-action-destructive, .ui-widget-content .ss-ui-button.ss-ui-action-destructive, .ui-widget-header .ss-ui-button.ss-ui-action-destructive { color: red; } + +/* line 93, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ +.ss-ui-button.ss-ui-action-minor, .ui-widget-content .ss-ui-button.ss-ui-action-minor .ui-widget-header .ss-ui-button.ss-ui-action-minor { background: none; padding: 0; border: 0; color: #333333; text-decoration: underline; } + +/* line 101, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ +.cms-edit-form { padding-bottom: 20px; } +/* line 105, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ +.cms-edit-form .Actions { text-align: right; } + +/* line 112, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ +.cms-content-tools .field label { float: none; width: auto; } +/* line 117, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ +.cms-content-tools .field .middleColumn { margin-left: 0; } /** This file defines CMS-specific customizations to the jQuery UI theme. Every rule in this file should be wrapped in the '.cms' selector (to make it more specific), and contain ONLY overwritten jQuery UI rules (with 'ui-' prefix). This file should be fairly short, as we're using our own custom jQuery UI theme already. TODO Add theme reference Use _style.scss to add more generic style information, and read the jQuery UI theming API: http://jqueryui.com/docs/Theming/API */ -/* line 14, ../scss/_uitheme.scss */ +/* line 14, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_uitheme.scss */ .cms .ui-tabs { padding: 0; } -/* line 17, ../scss/_uitheme.scss */ +/* line 17, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_uitheme.scss */ .cms .ui-tabs .ui-widget-header { border: 0; background: none; } -/* line 24, ../scss/_uitheme.scss */ +/* line 24, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_uitheme.scss */ .cms .ui-widget-content, .cms .ui-tabs .ui-tabs-panel { color: #444444; font-size: 1em; border: 0; background: #ebeff1; } -/* line 31, ../scss/_uitheme.scss */ +/* line 31, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_uitheme.scss */ .cms .ui-widget-header { background: #ebeff1; border: 0; } -/* line 36, ../scss/_uitheme.scss */ +/* line 36, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_uitheme.scss */ .cms .ss-ui-button { padding: 5px; text-decoration: none; } /** This file defines the 'theme' of the CMS: Colors, fonts, backgrounds, and detailed alignments. Together with _layout.css it provides the presentational backbone to the CMS. Ideally a developer should be able to exchange this file with his own theme easily. Please don't put any dimension, display or float information on major structural components like '.cms-container' or '.cms-header' in here, use the _layout.scss file instead. Use SCSS variable definitions in screen.css to avoid repeating styles like background colours or padding dimensions. See _colours.scss to get started. To avoid this file getting too large and complicated, it is encouraged to create new SCSS files for larger components like the CMS menu or tree (see _tree.scss and _menu.scss). */ -/* line 18, ../scss/_style.scss */ +/* line 18, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ body { font-size: 13px; font-family: Verdana, Arial, sans-serif; color: #444444; } -/* line 14, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -body html, body body, body div, body span, body applet, body object, body iframe, body h1, body h2, body h3, body h4, body h5, body h6, body p, body blockquote, body pre, body a, body abbr, body acronym, body address, body big, body cite, body code, body del, body dfn, body em, body font, body img, body ins, body kbd, body q, body s, body samp, body small, body strike, body strong, body sub, body sup, body tt, body var, body dl, body dt, body dd, body ol, body ul, body li, body fieldset, body form, body label, body legend, body table, body caption, body tbody, body tfoot, body thead, body tr, body th, body td { margin: 0; padding: 0; border: 0; outline: 0; font-weight: inherit; font-style: inherit; font-size: 100%; font-family: inherit; vertical-align: baseline; } -/* line 17, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -body body { line-height: 1; color: black; background: white; } -/* line 19, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +/* line 17, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +body html, body body, body div, body span, body applet, body object, body iframe, body h1, body h2, body h3, body h4, body h5, body h6, body p, body blockquote, body pre, body a, body abbr, body acronym, body address, body big, body cite, body code, body del, body dfn, body em, body img, body ins, body kbd, body q, body s, body samp, body small, body strike, body strong, body sub, body sup, body tt, body var, body b, body u, body i, body center, body dl, body dt, body dd, body ol, body ul, body li, body fieldset, body form, body label, body legend, body table, body caption, body tbody, body tfoot, body thead, body tr, body th, body td, body article, body aside, body canvas, body details, body embed, body figure, body figcaption, body footer, body header, body hgroup, body menu, body nav, body output, body ruby, body section, body summary, body time, body mark, body audio, body video { margin: 0; padding: 0; border: 0; font-size: 100%; font: inherit; vertical-align: baseline; } +/* line 20, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +body body { line-height: 1; } +/* line 22, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ body ol, body ul { list-style: none; } -/* line 21, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -body table { border-collapse: separate; border-spacing: 0; vertical-align: middle; } -/* line 23, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +/* line 24, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +body table { border-collapse: collapse; border-spacing: 0; } +/* line 26, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ body caption, body th, body td { text-align: left; font-weight: normal; vertical-align: middle; } -/* line 25, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -body q, body blockquote { quotes: "" ""; } -/* line 96, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -body q:before, body q:after, body blockquote:before, body blockquote:after { content: ""; } -/* line 27, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.10.6/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +/* line 28, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +body q, body blockquote { quotes: none; } +/* line 101, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +body q:before, body q:after, body blockquote:before, body blockquote:after { content: ""; content: none; } +/* line 30, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ body a img { border: none; } +/* line 115, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +body article, body aside, body details, body figcaption, body figure, body footer, body header, body hgroup, body menu, body nav, body section { display: block; } -/* line 25, ../scss/_style.scss */ +/* line 25, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ body * { font-size: 13px; } -/* line 29, ../scss/_style.scss */ +/* line 29, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ body .ui-widget { font-size: 1em; } -/* line 33, ../scss/_style.scss */ +/* line 33, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ strong { font-weight: bold; } -/* line 39, ../scss/_style.scss */ -.cms-content-header { background-color: #afbfc7; background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #afbfc7), color-stop(100%, #91a7b2)); background-image: -moz-linear-gradient(top, #afbfc7 0%, #91a7b2 100%); background-image: linear-gradient(top, #afbfc7 0%, #91a7b2 100%); } -/* line 46, ../scss/_style.scss */ +/* line 39, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ +.cms-content-header { background-color: #afbfc7; background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #afbfc7), color-stop(100%, #91a7b2)); background-image: -webkit-linear-gradient(top, #afbfc7, #91a7b2); background-image: -moz-linear-gradient(top, #afbfc7, #91a7b2); background-image: -o-linear-gradient(top, #afbfc7, #91a7b2); background-image: linear-gradient(top, #afbfc7, #91a7b2); } +/* line 46, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-content-header h2 { float: left; padding: 10px; font-size: 14px; font-weight: bold; } -/* line 53, ../scss/_style.scss */ +/* line 53, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-content-header .cms-content-header-tabs { float: left; } -/* line 60, ../scss/_style.scss */ +/* line 60, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .ui-tabs .cms-content-header .ui-tabs-nav li { height: 40px; } -/* line 63, ../scss/_style.scss */ +/* line 63, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .ui-tabs .cms-content-header .ui-tabs-nav li a { font-weight: bold; font-size: 11px; padding-top: 1em; } -/* line 72, ../scss/_style.scss */ -.ui-tabs .cms-content-header .ui-state-default, .ui-tabs .cms-content-header .ui-widget-content .ui-state-default, .ui-tabs .cms-content-header .ui-widget-header .ui-state-default { background-color: #dddddd; background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #dddddd), color-stop(100%, #b7b7b7)); background-image: -moz-linear-gradient(top, #dddddd 0%, #b7b7b7 100%); background-image: linear-gradient(top, #dddddd 0%, #b7b7b7 100%); } -/* line 82, ../scss/_style.scss */ +/* line 72, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ +.ui-tabs .cms-content-header .ui-state-default, .ui-tabs .cms-content-header .ui-widget-content .ui-state-default, .ui-tabs .cms-content-header .ui-widget-header .ui-state-default { background-color: #dddddd; background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #dddddd), color-stop(100%, #b7b7b7)); background-image: -webkit-linear-gradient(top, #dddddd, #b7b7b7); background-image: -moz-linear-gradient(top, #dddddd, #b7b7b7); background-image: -o-linear-gradient(top, #dddddd, #b7b7b7); background-image: linear-gradient(top, #dddddd, #b7b7b7); } +/* line 82, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .ui-tabs .cms-content-header .ui-state-active, .ui-tabs .cms-content-header .ui-widget-content .ui-state-active, .ui-tabs .cms-content-header .ui-widget-header .ui-state-active { background: #ebeff1; } -/* line 87, ../scss/_style.scss */ -.cms-content-tools { background-color: #dce3e6; } +/* line 87, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ +.cms-content-tools { background-color: #dce3e6; padding: 10px; } -/* line 93, ../scss/_style.scss */ -.cms-header { padding: 10px; background-color: #00111d; background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #00111d), color-stop(50%, #003050), color-stop(100%, #00111d)); background-image: -moz-linear-gradient(top, #00111d 0%, #003050 50%, #00111d 100%); background-image: linear-gradient(top, #00111d 0%, #003050 50%, #00111d 100%); } -/* line 102, ../scss/_style.scss */ +/* line 94, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ +.cms-header { background-color: #00111d; background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #00111d), color-stop(50%, #003050), color-stop(100%, #00111d)); background-image: -webkit-linear-gradient(top, #00111d, #003050, #00111d); background-image: -moz-linear-gradient(top, #00111d, #003050, #00111d); background-image: -o-linear-gradient(top, #00111d, #003050, #00111d); background-image: linear-gradient(top, #00111d, #003050, #00111d); } +/* line 102, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-header * { color: white; } -/* line 109, ../scss/_style.scss */ +/* line 109, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-logo .version { display: none; } -/* line 113, ../scss/_style.scss */ +/* line 113, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-logo * { color: #3ebae0; } -/* line 117, ../scss/_style.scss */ +/* line 117, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-logo a { display: inline-block; height: 25px; width: 25px; float: left; margin-right: 10px; background: url(../images/logo_small.png) no-repeat; text-indent: -9999em; } -/* line 130, ../scss/_style.scss */ +/* line 130, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-login-status .logout-link { display: inline-block; height: 25px; width: 25px; float: left; margin-right: 10px; background: url(../images/logout.png) no-repeat; text-indent: -9999em; } -/* line 144, ../scss/_style.scss */ +/* line 144, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .ss-loading-screen, .ss-loading-screen .loading-logo { width: 100%; height: 100%; overflow: hidden; position: absolute; background: #fff; background: -moz-radial-gradient(50% 50% 180deg, circle cover, white, #efefef, #c7c7c7 100%); background: -webkit-gradient(radial, 50% 50%, 350, 50% 50%, 0, from(#e3e3e3), to(white)); z-index: 100000; margin: 0; padding: 0; } -/* line 159, ../scss/_style.scss */ +/* line 159, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .ss-loading-screen .loading-logo { background-url: url(../images/logo.gif); background-repeat: no-repeat; background-color: transparent; background-position: 50% 50%; } -/* line 165, ../scss/_style.scss */ +/* line 165, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .ss-loading-screen p { width: 100%; text-align: center; position: absolute; bottom: 80px; } -/* line 171, ../scss/_style.scss */ +/* line 171, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .ss-loading-screen p span.notice { display: inline-block; font-size: 14px; padding: 10px 20px; color: #dc7f00; border: none; -moz-border-radius: 5px; -webkit-border-radius: 5px; -o-border-radius: 5px; -ms-border-radius: 5px; -khtml-border-radius: 5px; border-radius: 5px; } -/* line 181, ../scss/_style.scss */ +/* line 181, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .ss-loading-screen .loading-animation { display: none; position: absolute; left: 49%; top: 75%; } /** Messages (see sapphire/css/Form.css) */ -/* line 200, ../scss/_style.scss */ +/* line 200, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .message { margin: 1em 0; padding: 0.5em; font-weight: bold; border: 1px black solid; } -/* line 206, ../scss/_style.scss */ +/* line 206, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .message.notice { background-color: #ffbe66; border-color: #ff9300; } -/* line 211, ../scss/_style.scss */ +/* line 211, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .message.warning { background-color: #ffbe66; border-color: #ff9300; } -/* line 215, ../scss/_style.scss */ +/* line 215, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .message.error { background-color: #ffbe66; border-color: #ff9300; } -/* line 224, ../scss/_style.scss */ +/* line 224, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .ModelAdmin .cms-content-tools { width: 300px; } -/* line 229, ../scss/_style.scss */ +/* line 229, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .ModelAdmin .ResultAssemblyBlock { display: none; } -/* line 236, ../scss/_style.scss */ +/* line 236, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-page-add-form-dialog #PageType li { clear: left; height: 40px; border-bottom: 1px solid #333333; } -/* line 241, ../scss/_style.scss */ +/* line 241, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-page-add-form-dialog #PageType li:hover, .cms-page-add-form-dialog #PageType li.selected { background-color: #ffff99; } -/* line 245, ../scss/_style.scss */ +/* line 245, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-page-add-form-dialog #PageType li input, .cms-page-add-form-dialog #PageType li label, .cms-page-add-form-dialog #PageType li .icon, .cms-page-add-form-dialog #PageType li .title { float: left; } -/* line 249, ../scss/_style.scss */ +/* line 249, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-page-add-form-dialog #PageType li .icon { width: 20px; } -/* line 253, ../scss/_style.scss */ +/* line 253, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-page-add-form-dialog #PageType li .title { width: 100px; font-weight: bold; } -/* line 258, ../scss/_style.scss */ +/* line 258, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-page-add-form-dialog #PageType li .description { font-style: italic; } -/* line 266, ../scss/_style.scss */ +/* line 266, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-content-toolbar > * { display: inline-block; } -/* line 270, ../scss/_style.scss */ +/* line 270, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-content-toolbar .cms-tree-view-modes * { display: inline-block; } -/* line 274, ../scss/_style.scss */ -.cms-content-toolbar .cms-content-batchactions form * { display: inline-block; } +/* line 274, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ +.cms-content-toolbar .cms-content-batchactions form > * { display: inline-block; } -/* line 280, ../scss/_style.scss */ +/* line 280, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-preview-header { background-color: #FFBE66; padding: 10px; font-weight: bold; } -/* line 287, ../scss/_style.scss */ +/* line 290, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ +form.member-profile-form #CsvFile .middleColumn { background: none !important; } +/* line 294, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ +form.member-profile-form .advanced h4 { margin-bottom: .5em; } +/* line 298, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ +form.member-profile-form .Actions { text-align: left; border: 0; } +/* line 303, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ +form.member-profile-form input.customFormat { border: 1px solid #ccc !important; padding: 3px; margin-left: 2px; } +/* line 308, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ +form.member-profile-form .formattingHelpToggle { font-size: 11px; padding: 3px; } +/* line 312, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ +form.member-profile-form .formattingHelpText { margin: 5px auto; color: #333; padding: 5px 10px; width: 90%; background: #fff; border: 1px solid #ccc; } +/* line 320, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ +form.member-profile-form .formattingHelpText ul { padding: 0; } +/* line 323, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ +form.member-profile-form .formattingHelpText li { font-size: 11px; color: #333; margin-bottom: 2px; } + +/* line 332, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-preview { background-color: #b0bfc6; } -/* line 290, ../scss/_style.scss */ +/* line 335, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-preview .cms-preview-toggle { cursor: pointer; } -/* line 293, ../scss/_style.scss */ +/* line 338, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-preview .cms-preview-toggle a { color: white; font-weight: bold; text-decoration: none; } diff --git a/admin/scss/_layout.scss b/admin/scss/layout.scss similarity index 92% rename from admin/scss/_layout.scss rename to admin/scss/layout.scss index 8328709d8..0300ff8f3 100644 --- a/admin/scss/_layout.scss +++ b/admin/scss/layout.scss @@ -6,7 +6,10 @@ * into _style.scss or _uitheme.scss instead. */ -html, body { +@import "compass/reset"; +@import "compass/css3"; + +html,body { width: 100%; height: 100%; padding: 0; @@ -40,6 +43,7 @@ html, body { .cms-content { } +.cms-preview, .cms-menu, .cms-content, .cms-content-header, @@ -49,7 +53,8 @@ html, body { } .cms-content-tools { - width: 250px; + width: 230px; + padding: 10px; overflow: auto; } diff --git a/admin/scss/screen.scss b/admin/scss/screen.scss index 7a4f19c97..9b59087e2 100644 --- a/admin/scss/screen.scss +++ b/admin/scss/screen.scss @@ -12,7 +12,6 @@ @import "compass/utilities/sprites/sprite-img"; @import "colours.scss"; -@import "layout.scss"; @import "tree.scss"; @import "menu.scss"; @import "forms.scss"; diff --git a/security/Member.php b/security/Member.php index 73e5aba41..759b77c37 100755 --- a/security/Member.php +++ b/security/Member.php @@ -1631,9 +1631,7 @@ class Member_GroupSet extends ComponentSet { class Member_ProfileForm extends Form { function __construct($controller, $name, $member) { - Requirements::clear(); - Requirements::css(CMS_DIR . '/css/typography.css'); - Requirements::css(SAPPHIRE_DIR . "/css/Form.css"); + Requirements::block(SAPPHIRE_DIR . '/admin/css/layout.css'); $fields = $member->getCMSFields(); $fields->push(new HiddenField('ID','ID',$member->ID)); From 87163d5bb62bbb1546a89f6e9dfa0e53f8f02818 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Sat, 30 Apr 2011 15:11:39 +1200 Subject: [PATCH 16/48] MINOR Removed unnecessary headers from Member->getCMSFields() --- security/Member.php | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/security/Member.php b/security/Member.php index 759b77c37..b2d05f569 100755 --- a/security/Member.php +++ b/security/Member.php @@ -1133,17 +1133,7 @@ class Member extends DataObject { $password->setCanBeEmpty(true); if(!$this->ID) $password->showOnClick = false; $mainFields->replaceField('Password', $password); - - $mainFields->insertBefore( - new HeaderField('MemberDetailsHeader',_t('Member.PERSONALDETAILS', "Personal Details", PR_MEDIUM, 'Headline for formfields')), - 'FirstName' - ); - - $mainFields->insertBefore( - new HeaderField('MemberUserDetailsHeader',_t('Member.USERDETAILS', "User Details", PR_MEDIUM, 'Headline for formfields')), - 'Email' - ); - + $mainFields->replaceField('Locale', new DropdownField( "Locale", _t('Member.INTERFACELANG', "Interface Language", PR_MEDIUM, 'Language of the CMS'), From eb728c082a63a90715bda46365300bb701eba838 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Sat, 30 Apr 2011 16:47:29 +1200 Subject: [PATCH 17/48] MINOR Fixed panel styling for TreeDropdownField --- css/TreeDropdownField.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/css/TreeDropdownField.css b/css/TreeDropdownField.css index 7e2614c39..3406a8918 100644 --- a/css/TreeDropdownField.css +++ b/css/TreeDropdownField.css @@ -15,8 +15,8 @@ div.TreeDropdownField .title { } div.TreeDropdownField .panel { - clear: both; - float: left; + clear: left; + position: relative; overflow: auto; display: none; cursor: default; From afbb4cc0450ffbc41be56e87c31699ab48b98dc7 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Sat, 30 Apr 2011 16:48:57 +1200 Subject: [PATCH 18/48] MINOR Fixed Member_ProfileForm styling, inlining into _style.css. Misc style fixes --- admin/css/layout.css | 38 +---- admin/css/screen.css | 220 ++++----------------------- admin/javascript/LeftAndMain.js | 4 +- admin/scss/_colours.scss | 1 + admin/scss/_forms.scss | 208 +++++++++++++------------ admin/scss/_style.scss | 49 +++++- css/MemberDatetimeOptionsetField.css | 25 --- security/Member.php | 2 +- 8 files changed, 191 insertions(+), 356 deletions(-) delete mode 100644 css/MemberDatetimeOptionsetField.css diff --git a/admin/css/layout.css b/admin/css/layout.css index 5bf4fd899..4a4136147 100644 --- a/admin/css/layout.css +++ b/admin/css/layout.css @@ -1,69 +1,43 @@ /** This file defines the structural layout of the CMS interface. Ideally, you should be able to lay out the base elements of the CMS with only this file. Please put any presentational definitions (color, fonts, backgrounds, paddings) into _style.scss or _uitheme.scss instead. */ -/* line 17, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { margin: 0; padding: 0; border: 0; font-size: 100%; font: inherit; vertical-align: baseline; } +html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td { margin: 0; padding: 0; border: 0; outline: 0; font-weight: inherit; font-style: inherit; font-size: 100%; font-family: inherit; vertical-align: baseline; } -/* line 20, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -body { line-height: 1; } +body { line-height: 1; color: black; background: white; } -/* line 22, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ ol, ul { list-style: none; } -/* line 24, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -table { border-collapse: collapse; border-spacing: 0; } +table { border-collapse: separate; border-spacing: 0; vertical-align: middle; } -/* line 26, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ caption, th, td { text-align: left; font-weight: normal; vertical-align: middle; } -/* line 28, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -q, blockquote { quotes: none; } -/* line 101, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -q:before, q:after, blockquote:before, blockquote:after { content: ""; content: none; } +q, blockquote { quotes: "" ""; } +q:before, q:after, blockquote:before, blockquote:after { content: ""; } -/* line 30, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ a img { border: none; } -/* line 115, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { display: block; } - -/* line 12, ../scss/layout.scss */ +@charset "UTF-8"; html, body { width: 100%; height: 100%; padding: 0; margin: 0; overflow: hidden; } -/* line 20, ../scss/layout.scss */ .cms-preview { width: 1px; overflow: hidden; } -/* line 24, ../scss/layout.scss */ .cms-preview .cms-preview-toggle { width: 10px; } -/* line 28, ../scss/layout.scss */ .cms-preview iframe { width: 100%; height: 100%; } -/* line 34, ../scss/layout.scss */ .cms-container { height: 100%; } -/* line 38, ../scss/layout.scss */ .cms-menu { width: 250px; overflow: auto; } -/* line 51, ../scss/layout.scss */ .cms-preview, .cms-menu, .cms-content, .cms-content-header, .cms-content-tools, .cms-content-form { display: -moz-inline-box; -moz-box-orient: vertical; display: inline-block; vertical-align: middle; *vertical-align: auto; } -/* line 7, ../../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/css3/_inline-block.scss */ .cms-preview, .cms-menu, .cms-content, .cms-content-header, .cms-content-tools, .cms-content-form { *display: inline; } -/* line 55, ../scss/layout.scss */ .cms-content-tools { width: 230px; padding: 10px; overflow: auto; } -/* line 61, ../scss/layout.scss */ .cms-content-form { overflow: auto; } -/* line 65, ../scss/layout.scss */ .cms-content-header { height: 40px; } -/* line 68, ../scss/layout.scss */ .cms-content-header h2 { width: 226px; } -/* line 72, ../scss/layout.scss */ .cms-content-header > div { width: 9999em; overflow: hidden; } -/* line 78, ../scss/layout.scss */ .cms-content-actions { padding: 10px; } -/* line 82, ../scss/layout.scss */ .cms-logo { height: 30px; overflow: hidden; vertical-align: middle; } -/* line 88, ../scss/layout.scss */ .cms-login-status { height: 30px; overflow: hidden; vertical-align: middle; } diff --git a/admin/css/screen.css b/admin/css/screen.css index 0b7872060..ef80f42cd 100644 --- a/admin/css/screen.css +++ b/admin/css/screen.css @@ -1,429 +1,263 @@ /** This file is the central collection of included modules, links to custom SCSS files, and any global SCSS variable definitions. DO NOT ADD stylesheet rules to this file directly! Note: By prefixing files with an underscore, they won't create individual CSS files. */ -/* line 17, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { margin: 0; padding: 0; border: 0; font-size: 100%; font: inherit; vertical-align: baseline; } +html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td { margin: 0; padding: 0; border: 0; outline: 0; font-weight: inherit; font-style: inherit; font-size: 100%; font-family: inherit; vertical-align: baseline; } -/* line 20, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -body { line-height: 1; } +body { line-height: 1; color: black; background: white; } -/* line 22, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ ol, ul { list-style: none; } -/* line 24, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -table { border-collapse: collapse; border-spacing: 0; } +table { border-collapse: separate; border-spacing: 0; vertical-align: middle; } -/* line 26, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ caption, th, td { text-align: left; font-weight: normal; vertical-align: middle; } -/* line 28, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -q, blockquote { quotes: none; } -/* line 101, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -q:before, q:after, blockquote:before, blockquote:after { content: ""; content: none; } +q, blockquote { quotes: "" ""; } +q:before, q:after, blockquote:before, blockquote:after { content: ""; } -/* line 30, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ a img { border: none; } -/* line 115, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { display: block; } - +@charset "UTF-8"; /** This file only contains color definitions. Please put any further formatting into _style.scss. */ /** This file defines the jstree base styling (see http://jstree.com), as well as any customizations (see bottom of file). The styles are usually added through jstree.js on DOM load, but we need it earlier in order to correctly display the uninitialized tree. */ -/* line 10, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree ul { display: block; margin: 0 0 0 0; padding: 0 0 0 0; list-style-type: none; } -/* line 16, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree li { display: block; margin: 0 0 0 0; padding: 0 0 0 0; list-style-type: none; display: block; min-height: 18px; line-height: 18px; white-space: nowrap; margin-left: 18px; min-width: 18px; } -/* line 28, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree ins { display: inline-block; text-decoration: none; width: 18px; height: 18px; margin: 0 0 0 0; padding: 0; } -/* line 36, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree a { display: inline-block; line-height: 16px; height: 16px; color: black; white-space: nowrap; text-decoration: none; padding: 1px 2px; margin: 0; } -/* line 45, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree a:focus { outline: none; } -/* line 49, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree a > ins { height: 16px; width: 16px; } -/* line 53, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree a > .jstree-icon { margin-right: 3px; } -/* line 61, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree li.jstree-open > ul { display: block; } -/* line 64, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree li.jstree-closed > ul { display: none; } -/* line 69, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree li.disabled a { color: #aaaaaa; } -/* line 76, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree-rtl a > .jstree-icon { margin-left: 3px; margin-right: 0; } -/* line 80, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree-rtl li { margin-left: 0; margin-right: 18px; } -/* line 87, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree-rtl > ul > li { margin-right: 0px; } -/* line 91, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree > ul > li { margin-left: 0px; } -/* line 95, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-dragged { display: block; margin: 0 0 0 0; padding: 4px 4px 4px 24px; position: absolute; top: -2000px; line-height: 16px; z-index: 10000; } -/* line 104, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-contextmenu { display: block; visibility: hidden; left: 0; top: -200px; position: absolute; margin: 0; padding: 0; min-width: 180px; background: #ebebeb; border: 1px solid silver; z-index: 10000; *width: 180px; } -/* line 117, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-contextmenu ul { min-width: 180px; *width: 180px; } -/* line 120, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-contextmenu ul, #vakata-contextmenu li { margin: 0; padding: 0; list-style-type: none; display: block; } -/* line 126, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-contextmenu li { line-height: 20px; min-height: 20px; position: relative; padding: 0px; } -/* line 132, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-contextmenu li a { padding: 1px 6px; line-height: 17px; display: block; text-decoration: none; margin: 1px 1px 0 1px; } -/* line 139, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-contextmenu li ins { float: left; width: 16px; height: 16px; text-decoration: none; margin-right: 2px; } -/* line 146, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-contextmenu li a:hover, #vakata-contextmenu li.vakata-hover > a { background: gray; color: white; } -/* line 150, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-contextmenu li ul { display: none; position: absolute; top: -2px; left: 100%; background: #ebebeb; border: 1px solid gray; } -/* line 158, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-contextmenu .right { right: 100%; left: auto; } -/* line 162, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-contextmenu .bottom { bottom: -1px; top: auto; } -/* line 166, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-contextmenu li.vakata-separator { min-height: 0; height: 1px; line-height: 1px; font-size: 1px; overflow: hidden; margin: 0 2px; background: silver; /* border-top:1px solid #fefefe; */ padding: 0; } -/* line 176, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree ul, .jstree li { display: block; margin: 0 0 0 0; padding: 0 0 0 0; list-style-type: none; } -/* line 182, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree li { display: block; min-height: 18px; line-height: 18px; white-space: nowrap; margin-left: 18px; min-width: 18px; } -/* line 190, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree-rtl li { margin-left: 0; margin-right: 18px; } -/* line 194, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree > ul > li { margin-left: 0px; } -/* line 197, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree-rtl > ul > li { margin-right: 0px; } -/* line 200, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree ins { display: inline-block; text-decoration: none; width: 18px; height: 18px; margin: 0 0 0 0; padding: 0; } -/* line 208, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree a { display: inline-block; line-height: 16px; height: 16px; color: black; white-space: nowrap; text-decoration: none; padding: 1px 2px; margin: 0; } -/* line 218, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree a:focus { outline: none; } -/* line 221, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree a > ins { height: 16px; width: 16px; } -/* line 225, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree a > .jstree-icon { margin-right: 3px; } -/* line 228, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree-rtl a > .jstree-icon { margin-left: 3px; margin-right: 0; } -/* line 232, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ li.jstree-open > ul { display: block; } -/* line 235, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ li.jstree-closed > ul { display: none; } -/* line 238, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-dragged ins { display: block; text-decoration: none; width: 16px; height: 16px; margin: 0 0 0 0; padding: 0; position: absolute; top: 4px; left: 4px; -moz-border-radius: 4px; border-radius: 4px; -webkit-border-radius: 4px; } -/* line 252, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-dragged .jstree-ok { background: green; } -/* line 255, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #vakata-dragged .jstree-invalid { background: red; } -/* line 258, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #jstree-marker { padding: 0; margin: 0; font-size: 12px; overflow: hidden; height: 12px; width: 8px; position: absolute; top: -30px; z-index: 10001; background-repeat: no-repeat; display: none; background-color: transparent; text-shadow: 1px 1px 1px white; color: black; line-height: 10px; } -/* line 275, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ #jstree-marker-line { padding: 0; margin: 0; line-height: 0%; font-size: 1px; overflow: hidden; height: 1px; width: 100px; position: absolute; top: -30px; z-index: 10000; background-repeat: no-repeat; display: none; background-color: #456c43; cursor: pointer; border: 1px solid #eeeeee; border-left: 0; -moz-box-shadow: 0px 0px 2px #666; -webkit-box-shadow: 0px 0px 2px #666; box-shadow: 0px 0px 2px #666; -moz-border-radius: 1px; border-radius: 1px; -webkit-border-radius: 1px; } -/* line 299, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree .jstree-real-checkbox { display: none; } -/* line 302, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree-themeroller .ui-icon { overflow: visible; } -/* line 305, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree-themeroller a { padding: 0 2px; } -/* line 308, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree-themeroller .jstree-no-icon { display: none; } -/* line 311, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree .jstree-wholerow-real { position: relative; z-index: 1; } -/* line 315, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree .jstree-wholerow-real li { cursor: pointer; } -/* line 318, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree .jstree-wholerow-real a { border-left-color: transparent !important; border-right-color: transparent !important; } -/* line 322, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree .jstree-wholerow { position: relative; z-index: 0; height: 0; } -/* line 327, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree .jstree-wholerow ul, .jstree .jstree-wholerow li { width: 100%; } -/* line 330, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree .jstree-wholerow, .jstree .jstree-wholerow ul, .jstree .jstree-wholerow li, .jstree .jstree-wholerow a { margin: 0 !important; padding: 0 !important; } -/* line 334, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree .jstree-wholerow, .jstree .jstree-wholerow ul, .jstree .jstree-wholerow li { background: transparent !important; } -/* line 337, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree .jstree-wholerow ins, .jstree .jstree-wholerow span, .jstree .jstree-wholerow input { display: none !important; } -/* line 340, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree .jstree-wholerow a, .jstree .jstree-wholerow a:hover { text-indent: -9999px !important; width: 100%; padding: 0 !important; border-right-width: 0px !important; border-left-width: 0px !important; } -/* line 347, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .jstree .jstree-wholerow-span { position: absolute; left: 0; margin: 0px; padding: 0; height: 18px; border-width: 0; padding: 0; z-index: 0; } -/* line 360, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .cms .jstree-apple.jstree-focused { background: none; } -/* line 363, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_tree.scss */ .cms .jstree-apple > ul { background: none; } -/* line 1, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ -.cms-menu { z-index: 10; background-color: #ebeff1; -moz-box-shadow: 3px 0 3px #aaaaaa; -webkit-box-shadow: 3px 0 3px #aaaaaa; -o-box-shadow: 3px 0 3px #aaaaaa; box-shadow: 3px 0 3px #aaaaaa; } -/* line 6, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ +.cms-menu { z-index: 10; background-color: #ebeff1; -moz-box-shadow: #aaaaaa 3px 0 3px 0; -webkit-box-shadow: #aaaaaa 3px 0 3px 0; -o-box-shadow: #aaaaaa 3px 0 3px 0; box-shadow: #aaaaaa 3px 0 3px 0; } .cms-menu a { text-decoration: none; } -/* line 12, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ -.cms-menu-list li { background-color: #b0bfc6; background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #b0bfc6), color-stop(100%, #758f9b)); background-image: -webkit-linear-gradient(top, #b0bfc6, #758f9b); background-image: -moz-linear-gradient(top, #b0bfc6, #758f9b); background-image: -o-linear-gradient(top, #b0bfc6, #758f9b); background-image: linear-gradient(top, #b0bfc6, #758f9b); border-bottom: 1px solid #aaaaaa; } -/* line 20, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ -.cms-menu-list li a { display: block; height: 32px; vertical-align: middle; font-size: 14px; text-shadow: #aaaaaa; color: #333333; padding: 5px; } -/* line 29, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ +.cms-menu-list li { background-color: #b0bfc6; background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #b0bfc6), color-stop(100%, #758f9b)); background-image: -moz-linear-gradient(top, #b0bfc6 0%, #758f9b 100%); background-image: linear-gradient(top, #b0bfc6 0%, #758f9b 100%); border-bottom: 1px solid #aaaaaa; } +.cms-menu-list li a { display: block; height: 32px; vertical-align: middle; font-size: 14px; text-shadow: #aaaaaa 1px 1px 1px; color: #333333; padding: 5px; } .cms-menu-list li a .icon { display: block; float: left; margin-right: 5px; background: url('../images/icons-32.png?1303987682') no-repeat; width: 32px; height: 32px; overflow: hidden; background-position: 0px 0px; } -/* line 37, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ .cms-menu-list li a .text { display: block; padding-top: 10px; } -/* line 43, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ -.cms-menu-list li.current { background-color: #338dc1; background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #338dc1), color-stop(100%, #1e5270)); background-image: -webkit-linear-gradient(top, #338dc1, #1e5270); background-image: -moz-linear-gradient(top, #338dc1, #1e5270); background-image: -o-linear-gradient(top, #338dc1, #1e5270); background-image: linear-gradient(top, #338dc1, #1e5270); } -/* line 50, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ -.cms-menu-list li.current li { background-color: #2e7ead; background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #2e7ead), color-stop(100%, #287099)); background-image: -webkit-linear-gradient(top, #2e7ead, #287099); background-image: -moz-linear-gradient(top, #2e7ead, #287099); background-image: -o-linear-gradient(top, #2e7ead, #287099); background-image: linear-gradient(top, #2e7ead, #287099); } -/* line 58, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ -.cms-menu-list li.current a { color: white; text-shadow: #333333; } -/* line 68, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ -.cms-menu-list li li:first { -moz-box-shadow: 0 4px 4px #333333; -webkit-box-shadow: 0 4px 4px #333333; -o-box-shadow: 0 4px 4px #333333; box-shadow: 0 4px 4px #333333; } -/* line 72, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ -.cms-menu-list li li a { font-size: 12px; text-shadow: #333333; margin: 0; padding-left: 30px; color: white; } -/* line 80, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ +.cms-menu-list li.current { background-color: #338dc1; background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #338dc1), color-stop(100%, #1e5270)); background-image: -moz-linear-gradient(top, #338dc1 0%, #1e5270 100%); background-image: linear-gradient(top, #338dc1 0%, #1e5270 100%); } +.cms-menu-list li.current li { background-color: #2e7ead; background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #2e7ead), color-stop(100%, #287099)); background-image: -moz-linear-gradient(top, #2e7ead 0%, #287099 100%); background-image: linear-gradient(top, #2e7ead 0%, #287099 100%); } +.cms-menu-list li.current a { color: white; text-shadow: #333333 1px 1px 1px; } +.cms-menu-list li li:first { -moz-box-shadow: #333333 0 4px 4px 0; -webkit-box-shadow: #333333 0 4px 4px 0; -o-box-shadow: #333333 0 4px 4px 0; box-shadow: #333333 0 4px 4px 0; } +.cms-menu-list li li a { font-size: 12px; text-shadow: #333333 1px 1px 1px; margin: 0; padding-left: 30px; color: white; } .cms-menu-list li li.current a { font-weight: bold; } -/* line 87, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ .cms-menu-list li#Menu-CMSMain a .icon { background-position: 0px 0px; } -/* line 88, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ .cms-menu-list li#Menu-CMSMain.current a .icon, .cms-menu-list li#Menu-CMSMain a:hover .icon { background-position: -32px 0px; } -/* line 89, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ .cms-menu-list li#Menu-AssetAdmin a .icon { background-position: 0px -32px; } -/* line 90, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_menu.scss */ .cms-menu-list li#Menu-AssetAdmin.current a .icon, .cms-menu-list li#Menu-AssetAdmin a:hover .icon { background-position: -32px -32px; } /** This file defines common styles for form elements used throughout the CMS interface. It is an addition to the base styles defined in sapphire/css/Form.css. */ -/* line 6, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ .field { display: block; padding: 10px 0; border-bottom: 1px solid #aaaaaa; } -/* line 11, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ .field label { float: left; width: 10em; } -/* line 17, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ .field .middleColumn { margin-left: 10em; } -/* line 20, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ .field .middleColumn .field { display: inline; padding: 0; border: none; } -/* line 26, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ .field .middleColumn label { float: none; width: auto; } -/* line 35, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ form.nostyle .field { display: inline; padding: 0; border: 0; } -/* line 41, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ form.nostyle label { float: none; width: auto; } -/* line 46, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ form.nostyle .middleColumn { margin-left: 0; } -/* line 52, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ .field.nolabel .middleColumn { margin-left: 0; } -/* line 57, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ -input, textarea { -moz-border-radius: 5px; -webkit-border-radius: 5px; -o-border-radius: 5px; -ms-border-radius: 5px; -khtml-border-radius: 5px; border-radius: 5px; background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ebeff1), color-stop(50%, #ffffff), color-stop(100%, #ebeff1)); background-image: -webkit-linear-gradient(top, #ebeff1, #ffffff, #ebeff1); background-image: -moz-linear-gradient(top, #ebeff1, #ffffff, #ebeff1); background-image: -o-linear-gradient(top, #ebeff1, #ffffff, #ebeff1); background-image: linear-gradient(top, #ebeff1, #ffffff, #ebeff1); border: 1px solid #aaaaaa; padding: 3px; } +input, textarea { -moz-border-radius: 5px; -webkit-border-radius: 5px; -o-border-radius: 5px; -ms-border-radius: 5px; -khtml-border-radius: 5px; border-radius: 5px; background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #ebeff1), color-stop(50%, #ffffff), color-stop(100%, #ebeff1)); background-image: -moz-linear-gradient(top, #ebeff1 0%, #ffffff 50%, #ebeff1 100%); background-image: linear-gradient(top, #ebeff1 0%, #ffffff 50%, #ebeff1 100%); border: 1px solid #aaaaaa; padding: 3px; } -/* line 68, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ input.loading { padding-left: 16px; background: #ebeff1 url(../../images/network-save.gif) no-repeat center left; } -/* line 76, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ -.ss-ui-button.ss-ui-action-constructive, .ui-widget-content .ss-ui-button.ss-ui-action-constructive, .ui-widget-header .ss-ui-button.ss-ui-action-constructive { background: none; background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #77b53f), color-stop(100%, #456925)); background-image: -webkit-linear-gradient(top, #77b53f, #456925); background-image: -moz-linear-gradient(top, #77b53f, #456925); background-image: -o-linear-gradient(top, #77b53f, #456925); background-image: linear-gradient(top, #77b53f, #456925); color: white; } +.ss-ui-button.ss-ui-action-constructive, .ui-widget-content .ss-ui-button.ss-ui-action-constructive, .ui-widget-header .ss-ui-button.ss-ui-action-constructive { background: none; background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #77b53f), color-stop(100%, #456925)); background-image: -moz-linear-gradient(top, #77b53f 0%, #456925 100%); background-image: linear-gradient(top, #77b53f 0%, #456925 100%); color: white; } -/* line 87, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ .ss-ui-button.ss-ui-action-destructive, .ui-widget-content .ss-ui-button.ss-ui-action-destructive, .ui-widget-header .ss-ui-button.ss-ui-action-destructive { color: red; } -/* line 93, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ .ss-ui-button.ss-ui-action-minor, .ui-widget-content .ss-ui-button.ss-ui-action-minor .ui-widget-header .ss-ui-button.ss-ui-action-minor { background: none; padding: 0; border: 0; color: #333333; text-decoration: underline; } -/* line 101, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ .cms-edit-form { padding-bottom: 20px; } -/* line 105, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ +.cms-edit-form .text input, .cms-edit-form textarea { width: 300px; } .cms-edit-form .Actions { text-align: right; } -/* line 112, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ .cms-content-tools .field label { float: none; width: auto; } -/* line 117, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_forms.scss */ .cms-content-tools .field .middleColumn { margin-left: 0; } +.field#ViewerGroups label, .field#EditorGroups label, .field#CreateTopLevelGroups label { display: none; } + /** This file defines CMS-specific customizations to the jQuery UI theme. Every rule in this file should be wrapped in the '.cms' selector (to make it more specific), and contain ONLY overwritten jQuery UI rules (with 'ui-' prefix). This file should be fairly short, as we're using our own custom jQuery UI theme already. TODO Add theme reference Use _style.scss to add more generic style information, and read the jQuery UI theming API: http://jqueryui.com/docs/Theming/API */ -/* line 14, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_uitheme.scss */ .cms .ui-tabs { padding: 0; } -/* line 17, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_uitheme.scss */ .cms .ui-tabs .ui-widget-header { border: 0; background: none; } -/* line 24, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_uitheme.scss */ .cms .ui-widget-content, .cms .ui-tabs .ui-tabs-panel { color: #444444; font-size: 1em; border: 0; background: #ebeff1; } -/* line 31, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_uitheme.scss */ .cms .ui-widget-header { background: #ebeff1; border: 0; } -/* line 36, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_uitheme.scss */ .cms .ss-ui-button { padding: 5px; text-decoration: none; } /** This file defines the 'theme' of the CMS: Colors, fonts, backgrounds, and detailed alignments. Together with _layout.css it provides the presentational backbone to the CMS. Ideally a developer should be able to exchange this file with his own theme easily. Please don't put any dimension, display or float information on major structural components like '.cms-container' or '.cms-header' in here, use the _layout.scss file instead. Use SCSS variable definitions in screen.css to avoid repeating styles like background colours or padding dimensions. See _colours.scss to get started. To avoid this file getting too large and complicated, it is encouraged to create new SCSS files for larger components like the CMS menu or tree (see _tree.scss and _menu.scss). */ -/* line 18, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ body { font-size: 13px; font-family: Verdana, Arial, sans-serif; color: #444444; } -/* line 17, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -body html, body body, body div, body span, body applet, body object, body iframe, body h1, body h2, body h3, body h4, body h5, body h6, body p, body blockquote, body pre, body a, body abbr, body acronym, body address, body big, body cite, body code, body del, body dfn, body em, body img, body ins, body kbd, body q, body s, body samp, body small, body strike, body strong, body sub, body sup, body tt, body var, body b, body u, body i, body center, body dl, body dt, body dd, body ol, body ul, body li, body fieldset, body form, body label, body legend, body table, body caption, body tbody, body tfoot, body thead, body tr, body th, body td, body article, body aside, body canvas, body details, body embed, body figure, body figcaption, body footer, body header, body hgroup, body menu, body nav, body output, body ruby, body section, body summary, body time, body mark, body audio, body video { margin: 0; padding: 0; border: 0; font-size: 100%; font: inherit; vertical-align: baseline; } -/* line 20, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -body body { line-height: 1; } -/* line 22, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +body html, body body, body div, body span, body applet, body object, body iframe, body h1, body h2, body h3, body h4, body h5, body h6, body p, body blockquote, body pre, body a, body abbr, body acronym, body address, body big, body cite, body code, body del, body dfn, body em, body font, body img, body ins, body kbd, body q, body s, body samp, body small, body strike, body strong, body sub, body sup, body tt, body var, body dl, body dt, body dd, body ol, body ul, body li, body fieldset, body form, body label, body legend, body table, body caption, body tbody, body tfoot, body thead, body tr, body th, body td { margin: 0; padding: 0; border: 0; outline: 0; font-weight: inherit; font-style: inherit; font-size: 100%; font-family: inherit; vertical-align: baseline; } +body body { line-height: 1; color: black; background: white; } body ol, body ul { list-style: none; } -/* line 24, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -body table { border-collapse: collapse; border-spacing: 0; } -/* line 26, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +body table { border-collapse: separate; border-spacing: 0; vertical-align: middle; } body caption, body th, body td { text-align: left; font-weight: normal; vertical-align: middle; } -/* line 28, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -body q, body blockquote { quotes: none; } -/* line 101, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -body q:before, body q:after, body blockquote:before, body blockquote:after { content: ""; content: none; } -/* line 30, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ +body q, body blockquote { quotes: "" ""; } +body q:before, body q:after, body blockquote:before, body blockquote:after { content: ""; } body a img { border: none; } -/* line 115, /Library/Ruby/Gems/1.8/gems/compass-0.11.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */ -body article, body aside, body details, body figcaption, body figure, body footer, body header, body hgroup, body menu, body nav, body section { display: block; } -/* line 25, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ body * { font-size: 13px; } -/* line 29, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ body .ui-widget { font-size: 1em; } -/* line 33, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ strong { font-weight: bold; } -/* line 39, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ -.cms-content-header { background-color: #afbfc7; background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #afbfc7), color-stop(100%, #91a7b2)); background-image: -webkit-linear-gradient(top, #afbfc7, #91a7b2); background-image: -moz-linear-gradient(top, #afbfc7, #91a7b2); background-image: -o-linear-gradient(top, #afbfc7, #91a7b2); background-image: linear-gradient(top, #afbfc7, #91a7b2); } -/* line 46, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ +.cms-content-header { background-color: #afbfc7; background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #afbfc7), color-stop(100%, #91a7b2)); background-image: -moz-linear-gradient(top, #afbfc7 0%, #91a7b2 100%); background-image: linear-gradient(top, #afbfc7 0%, #91a7b2 100%); } .cms-content-header h2 { float: left; padding: 10px; font-size: 14px; font-weight: bold; } -/* line 53, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-content-header .cms-content-header-tabs { float: left; } -/* line 60, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .ui-tabs .cms-content-header .ui-tabs-nav li { height: 40px; } -/* line 63, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .ui-tabs .cms-content-header .ui-tabs-nav li a { font-weight: bold; font-size: 11px; padding-top: 1em; } -/* line 72, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ -.ui-tabs .cms-content-header .ui-state-default, .ui-tabs .cms-content-header .ui-widget-content .ui-state-default, .ui-tabs .cms-content-header .ui-widget-header .ui-state-default { background-color: #dddddd; background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #dddddd), color-stop(100%, #b7b7b7)); background-image: -webkit-linear-gradient(top, #dddddd, #b7b7b7); background-image: -moz-linear-gradient(top, #dddddd, #b7b7b7); background-image: -o-linear-gradient(top, #dddddd, #b7b7b7); background-image: linear-gradient(top, #dddddd, #b7b7b7); } -/* line 82, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ +.ui-tabs .cms-content-header .ui-state-default, .ui-tabs .cms-content-header .ui-widget-content .ui-state-default, .ui-tabs .cms-content-header .ui-widget-header .ui-state-default { background-color: #dddddd; background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #dddddd), color-stop(100%, #b7b7b7)); background-image: -moz-linear-gradient(top, #dddddd 0%, #b7b7b7 100%); background-image: linear-gradient(top, #dddddd 0%, #b7b7b7 100%); } .ui-tabs .cms-content-header .ui-state-active, .ui-tabs .cms-content-header .ui-widget-content .ui-state-active, .ui-tabs .cms-content-header .ui-widget-header .ui-state-active { background: #ebeff1; } -/* line 87, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-content-tools { background-color: #dce3e6; padding: 10px; } -/* line 94, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ -.cms-header { background-color: #00111d; background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #00111d), color-stop(50%, #003050), color-stop(100%, #00111d)); background-image: -webkit-linear-gradient(top, #00111d, #003050, #00111d); background-image: -moz-linear-gradient(top, #00111d, #003050, #00111d); background-image: -o-linear-gradient(top, #00111d, #003050, #00111d); background-image: linear-gradient(top, #00111d, #003050, #00111d); } -/* line 102, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ +.cms-header { background-color: #00111d; background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #00111d), color-stop(50%, #003050), color-stop(100%, #00111d)); background-image: -moz-linear-gradient(top, #00111d 0%, #003050 50%, #00111d 100%); background-image: linear-gradient(top, #00111d 0%, #003050 50%, #00111d 100%); } .cms-header * { color: white; } -/* line 109, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-logo .version { display: none; } -/* line 113, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-logo * { color: #3ebae0; } -/* line 117, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-logo a { display: inline-block; height: 25px; width: 25px; float: left; margin-right: 10px; background: url(../images/logo_small.png) no-repeat; text-indent: -9999em; } -/* line 130, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-login-status .logout-link { display: inline-block; height: 25px; width: 25px; float: left; margin-right: 10px; background: url(../images/logout.png) no-repeat; text-indent: -9999em; } -/* line 144, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .ss-loading-screen, .ss-loading-screen .loading-logo { width: 100%; height: 100%; overflow: hidden; position: absolute; background: #fff; background: -moz-radial-gradient(50% 50% 180deg, circle cover, white, #efefef, #c7c7c7 100%); background: -webkit-gradient(radial, 50% 50%, 350, 50% 50%, 0, from(#e3e3e3), to(white)); z-index: 100000; margin: 0; padding: 0; } -/* line 159, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .ss-loading-screen .loading-logo { background-url: url(../images/logo.gif); background-repeat: no-repeat; background-color: transparent; background-position: 50% 50%; } -/* line 165, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .ss-loading-screen p { width: 100%; text-align: center; position: absolute; bottom: 80px; } -/* line 171, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .ss-loading-screen p span.notice { display: inline-block; font-size: 14px; padding: 10px 20px; color: #dc7f00; border: none; -moz-border-radius: 5px; -webkit-border-radius: 5px; -o-border-radius: 5px; -ms-border-radius: 5px; -khtml-border-radius: 5px; border-radius: 5px; } -/* line 181, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .ss-loading-screen .loading-animation { display: none; position: absolute; left: 49%; top: 75%; } /** Messages (see sapphire/css/Form.css) */ -/* line 200, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .message { margin: 1em 0; padding: 0.5em; font-weight: bold; border: 1px black solid; } -/* line 206, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .message.notice { background-color: #ffbe66; border-color: #ff9300; } -/* line 211, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .message.warning { background-color: #ffbe66; border-color: #ff9300; } -/* line 215, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .message.error { background-color: #ffbe66; border-color: #ff9300; } -/* line 224, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .ModelAdmin .cms-content-tools { width: 300px; } -/* line 229, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .ModelAdmin .ResultAssemblyBlock { display: none; } -/* line 236, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-page-add-form-dialog #PageType li { clear: left; height: 40px; border-bottom: 1px solid #333333; } -/* line 241, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-page-add-form-dialog #PageType li:hover, .cms-page-add-form-dialog #PageType li.selected { background-color: #ffff99; } -/* line 245, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-page-add-form-dialog #PageType li input, .cms-page-add-form-dialog #PageType li label, .cms-page-add-form-dialog #PageType li .icon, .cms-page-add-form-dialog #PageType li .title { float: left; } -/* line 249, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-page-add-form-dialog #PageType li .icon { width: 20px; } -/* line 253, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-page-add-form-dialog #PageType li .title { width: 100px; font-weight: bold; } -/* line 258, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-page-add-form-dialog #PageType li .description { font-style: italic; } -/* line 266, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-content-toolbar > * { display: inline-block; } -/* line 270, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-content-toolbar .cms-tree-view-modes * { display: inline-block; } -/* line 274, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-content-toolbar .cms-content-batchactions form > * { display: inline-block; } -/* line 280, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-preview-header { background-color: #FFBE66; padding: 10px; font-weight: bold; } -/* line 290, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ form.member-profile-form #CsvFile .middleColumn { background: none !important; } -/* line 294, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ form.member-profile-form .advanced h4 { margin-bottom: .5em; } -/* line 298, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ form.member-profile-form .Actions { text-align: left; border: 0; } -/* line 303, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ form.member-profile-form input.customFormat { border: 1px solid #ccc !important; padding: 3px; margin-left: 2px; } -/* line 308, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ form.member-profile-form .formattingHelpToggle { font-size: 11px; padding: 3px; } -/* line 312, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ form.member-profile-form .formattingHelpText { margin: 5px auto; color: #333; padding: 5px 10px; width: 90%; background: #fff; border: 1px solid #ccc; } -/* line 320, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ form.member-profile-form .formattingHelpText ul { padding: 0; } -/* line 323, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ form.member-profile-form .formattingHelpText li { font-size: 11px; color: #333; margin-bottom: 2px; } -/* line 332, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-preview { background-color: #b0bfc6; } -/* line 335, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-preview .cms-preview-toggle { cursor: pointer; } -/* line 338, /Users/ingo/Silverstripe/ss/sapphire/admin/scss/_style.scss */ .cms-preview .cms-preview-toggle a { color: white; font-weight: bold; text-decoration: none; } diff --git a/admin/javascript/LeftAndMain.js b/admin/javascript/LeftAndMain.js index f6d055137..7781cf5e7 100644 --- a/admin/javascript/LeftAndMain.js +++ b/admin/javascript/LeftAndMain.js @@ -135,11 +135,11 @@ }); /** - * Class: a#EditMemberProfile + * Class: a#profile-link * * Link for editing the profile for a logged-in member through a modal dialog. */ - $('a#EditMemberProfile').entwine({ + $('.LeftAndMain .profile-link').entwine({ /** * Constructor: onmatch diff --git a/admin/scss/_colours.scss b/admin/scss/_colours.scss index 6ad8dd0de..a594b63d8 100644 --- a/admin/scss/_colours.scss +++ b/admin/scss/_colours.scss @@ -29,6 +29,7 @@ $color-widget-bg: grayscale(lighten($color-base, 20%)); $color-dark-bg: grayscale(#003050); $color-shadow-light: grayscale(#aaa); $color-shadow-dark: grayscale(#333); +$color-highlight: grayscale(#FFFF66); $color-menu-button: grayscale(#338DC1); $color-text: grayscale(#444); $color-text-light: white; diff --git a/admin/scss/_forms.scss b/admin/scss/_forms.scss index 0b8fc4a8e..6489ead3e 100644 --- a/admin/scss/_forms.scss +++ b/admin/scss/_forms.scss @@ -2,45 +2,117 @@ * This file defines common styles for form elements used throughout the CMS interface. * It is an addition to the base styles defined in sapphire/css/Form.css. */ -.cms { - // Form fields - - .field { - display: block; - padding: 10px 0; - border-bottom: 1px solid $color-shadow-light; - - label { - float: left; - width: 10em; - } - - // Don't float inner/contained fields - .middleColumn { - margin-left: 10em; +.field { + display: block; + padding: 10px 0; + border-bottom: 1px solid $color-shadow-light; - .field { - display: inline; - padding: 0; - border: none; - } - - label { - float: none; - width: auto; - } - } + label { + float: left; + width: 10em; } - // TODO Change to mixin? - form.nostyle { + // Don't float inner/contained fields + .middleColumn { + margin-left: 10em; + .field { display: inline; padding: 0; - border: 0; + border: none; } - + + label { + float: none; + width: auto; + } + } +} + +// TODO Change to mixin? +form.nostyle { + .field { + display: inline; + padding: 0; + border: 0; + } + + label { + float: none; + width: auto; + } + + .middleColumn { + margin-left: 0; + } +} + +.field.nolabel { + .middleColumn { + margin-left: 0; + } +} + +input, textarea { + @include border-radius(5px); + @include linear-gradient(color-stops( + $color-widget-bg, + lighten($color-widget-bg, 10%), + $color-widget-bg + )); + border: 1px solid $color-shadow-light; + padding: 3px; +} + +input.loading { + padding-left: 16px; + background: $color-widget-bg url(../../images/network-save.gif) no-repeat center left; +} + +// Buttons +.ss-ui-button.ss-ui-action-constructive, +.ui-widget-content .ss-ui-button.ss-ui-action-constructive, +.ui-widget-header .ss-ui-button.ss-ui-action-constructive { + background: none; // avoid overwritten gradient from jQuery UI styles + @include linear-gradient(color-stops( + $color-button-constructive, + darken($color-button-constructive, 20%) + )); + color: $color-text-light; +} + +.ss-ui-button.ss-ui-action-destructive, +.ui-widget-content .ss-ui-button.ss-ui-action-destructive, +.ui-widget-header .ss-ui-button.ss-ui-action-destructive { + color: $color-button-destructive; +} + +.ss-ui-button.ss-ui-action-minor, +.ui-widget-content .ss-ui-button.ss-ui-action-minor +.ui-widget-header .ss-ui-button.ss-ui-action-minor { + background: none; + padding: 0; + border: 0; + color: $color-text-dark; + text-decoration: underline; +} + +.cms-edit-form { + padding-bottom: 20px; + + .text input, textarea { + width: 300px; + } + + // TODO Unclear if "button bar" concept is edit form specific + .Actions { + text-align: right; + } +} + +.cms-content-tools { + .field { label { float: none; width: auto; @@ -50,76 +122,10 @@ margin-left: 0; } } - - .field.nolabel { - .middleColumn { - margin-left: 0; - } - } - - input, textarea { - @include border-radius(5px); - @include linear-gradient(color-stops( - $color-widget-bg, - lighten($color-widget-bg, 10%), - $color-widget-bg - )); - border: 1px solid $color-shadow-light; - padding: 3px; - } - - input.loading { - padding-left: 16px; - background: $color-widget-bg url(../../images/network-save.gif) no-repeat center left; - } - - // Buttons - .ss-ui-button.ss-ui-action-constructive, - .ui-widget-content .ss-ui-button.ss-ui-action-constructive, - .ui-widget-header .ss-ui-button.ss-ui-action-constructive { - background: none; // avoid overwritten gradient from jQuery UI styles - @include linear-gradient(color-stops( - $color-button-constructive, - darken($color-button-constructive, 20%) - )); - color: $color-text-light; - } - - .ss-ui-button.ss-ui-action-destructive, - .ui-widget-content .ss-ui-button.ss-ui-action-destructive, - .ui-widget-header .ss-ui-button.ss-ui-action-destructive { - color: $color-button-destructive; - } - - .ss-ui-button.ss-ui-action-minor, - .ui-widget-content .ss-ui-button.ss-ui-action-minor - .ui-widget-header .ss-ui-button.ss-ui-action-minor { - background: none; - padding: 0; - border: 0; - color: $color-text-dark; - text-decoration: underline; - } - - .cms-edit-form { - padding-bottom: 20px; +} - // TODO Unclear if "button bar" concept is edit form specific - .Actions { - text-align: right; - } - } - - .cms-content-tools { - .field { - label { - float: none; - width: auto; - } - - .middleColumn { - margin-left: 0; - } - } +.field#ViewerGroups, .field#EditorGroups, .field#CreateTopLevelGroups { + label { + display: none; } } \ No newline at end of file diff --git a/admin/scss/_style.scss b/admin/scss/_style.scss index d1145624d..4491f734c 100644 --- a/admin/scss/_style.scss +++ b/admin/scss/_style.scss @@ -86,12 +86,12 @@ strong { .cms-content-tools { background-color: darken($color-widget-bg, 5%); + padding: 10px; } // ######################### Header and Logo ######################### .cms-header { - padding: 10px; background-color: darken($color-dark-bg, 10%); @include linear-gradient(color-stops( darken($color-dark-bg, 10%), @@ -271,7 +271,7 @@ strong { display: inline-block; } - .cms-content-batchactions form * { + .cms-content-batchactions form > * { display: inline-block; } } @@ -283,6 +283,51 @@ strong { font-weight: bold; } +// ######################### Member Profile ######################### + +form.member-profile-form { + + #CsvFile .middleColumn { + background: none !important; + } + + .advanced h4 { + margin-bottom: .5em; + } + + .Actions { + text-align: left; + border: 0; + } + + input.customFormat { + border: 1px solid #ccc !important; + padding: 3px; + margin-left: 2px; + } + .formattingHelpToggle { + font-size: 11px; + padding: 3px; + } + .formattingHelpText { + margin: 5px auto; + color: #333; + padding: 5px 10px; + width: 90%; + background: #fff; + border: 1px solid #ccc; + } + .formattingHelpText ul { + padding: 0; + } + .formattingHelpText li { + font-size: 11px; + color: #333; + margin-bottom: 2px; + } + +} + // ######################### Other ######################### .cms-preview { background-color: $color-base; diff --git a/css/MemberDatetimeOptionsetField.css b/css/MemberDatetimeOptionsetField.css deleted file mode 100644 index 7c7de217d..000000000 --- a/css/MemberDatetimeOptionsetField.css +++ /dev/null @@ -1,25 +0,0 @@ -input.customFormat { - border: 1px solid #ccc !important; - padding: 3px; - margin-left: 2px; -} -.formattingHelpToggle { - font-size: 11px; - padding: 3px; -} -.formattingHelpText { - margin: 5px auto; - color: #333; - padding: 5px 10px; - width: 90%; - background: #fff; - border: 1px solid #ccc; -} - .formattingHelpText ul { - padding: 0; - } - .formattingHelpText li { - font-size: 11px; - color: #333; - margin-bottom: 2px; - } diff --git a/security/Member.php b/security/Member.php index b2d05f569..b5b11c5c9 100755 --- a/security/Member.php +++ b/security/Member.php @@ -1634,6 +1634,7 @@ class Member_ProfileForm extends Form { parent::__construct($controller, $name, $fields, $actions, $validator); + $this->addExtraClass('member-profile-form'); $this->loadDataFrom($member); } @@ -1858,7 +1859,6 @@ class Member_Validator extends RequiredFields { class Member_DatetimeOptionsetField extends OptionsetField { function Field() { - Requirements::css(SAPPHIRE_DIR . '/css/MemberDatetimeOptionsetField.css'); Requirements::javascript(THIRDPARTY_DIR . '/thirdparty/jquery/jquery.js'); Requirements::javascript(SAPPHIRE_DIR . '/javascript/MemberDatetimeOptionsetField.js'); From 37774d4103f53f1264a51564f557de8fed75d4ab Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Sat, 30 Apr 2011 17:35:25 +1200 Subject: [PATCH 19/48] ENHANCEMENT Added ClassManifest->getModules(), and removed limitation to toplevel modules in ClassManifest->handleFile() (necessary to detect new sapphire/admin/ "submodule") --- core/manifest/ClassManifest.php | 16 +++++++++++++++- tests/core/manifest/ClassManifestTest.php | 6 ++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/core/manifest/ClassManifest.php b/core/manifest/ClassManifest.php index e11633d1b..9221a2e56 100644 --- a/core/manifest/ClassManifest.php +++ b/core/manifest/ClassManifest.php @@ -209,6 +209,20 @@ class SS_ClassManifest { public function getConfigs() { return $this->configs; } + + /** + * Returns an array of module names mapped to their paths. + * "Modules" in sapphire are simply directories with a _config.php file. + * + * @return array + */ + public function getModules() { + $modules = array(); + foreach($this->configs as $configPath) { + $modules[basename(dirname($configPath))] = dirname($configPath); + } + return $modules; + } /** * Completely regenerates the manifest file. @@ -252,7 +266,7 @@ class SS_ClassManifest { } public function handleFile($basename, $pathname, $depth) { - if ($depth == 1 && $basename == self::CONF_FILE) { + if ($basename == self::CONF_FILE) { $this->configs[] = $pathname; return; } diff --git a/tests/core/manifest/ClassManifestTest.php b/tests/core/manifest/ClassManifestTest.php index 701aa8cac..6fa4fe836 100644 --- a/tests/core/manifest/ClassManifestTest.php +++ b/tests/core/manifest/ClassManifestTest.php @@ -105,6 +105,12 @@ class ClassManifestTest extends SapphireTest { $this->assertEquals($expect, $this->manifest->getConfigs()); $this->assertEquals($expect, $this->manifestTests->getConfigs()); } + + public function testGetModules() { + $expect = array("module" => "{$this->base}/module"); + $this->assertEquals($expect, $this->manifest->getModules()); + $this->assertEquals($expect, $this->manifestTests->getModules()); + } public function testTestManifestIncludesTestClasses() { $this->assertNotContains('testclassa', array_keys($this->manifest->getClasses())); From f0c94696c9305206d18953f5938ad08edaf9c66b Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Sat, 30 Apr 2011 17:36:04 +1200 Subject: [PATCH 20/48] MINOR Added (hardcoded) URLs for LeftAndMain_Menu.ss --- admin/templates/Includes/LeftAndMain_Menu.ss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/admin/templates/Includes/LeftAndMain_Menu.ss b/admin/templates/Includes/LeftAndMain_Menu.ss index 3b48ce61b..462a7ce06 100644 --- a/admin/templates/Includes/LeftAndMain_Menu.ss +++ b/admin/templates/Includes/LeftAndMain_Menu.ss @@ -35,10 +35,10 @@
  • class="current"<% end_if %>> Settings
  • -
  • class="current"<% end_if %>> +
  • class="current"<% end_if %>> Reports
  • -
  • class="current"<% end_if %>> +
  • class="current"<% end_if %>> History
  • From 9a595fbd25057f9ac9c367c098cde5ea581cbc89 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Sat, 30 Apr 2011 18:34:14 +1200 Subject: [PATCH 21/48] MINOR Rendering DateField instances with button by default in CMS --- admin/code/LeftAndMain.php | 3 +++ admin/javascript/LeftAndMain.js | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/admin/code/LeftAndMain.php b/admin/code/LeftAndMain.php index 5e6f75f7b..0a8997567 100644 --- a/admin/code/LeftAndMain.php +++ b/admin/code/LeftAndMain.php @@ -235,6 +235,9 @@ class LeftAndMain extends Controller { Requirements::javascript(SAPPHIRE_ADMIN_DIR . '/javascript/LeftAndMain.AddForm.js'); Requirements::javascript(SAPPHIRE_ADMIN_DIR . '/javascript/LeftAndMain.Preview.js'); Requirements::javascript(SAPPHIRE_ADMIN_DIR . '/javascript/LeftAndMain.BatchActions.js'); + + // Handled by LeftAndMain.js + Requirements::block(SAPPHIRE_DIR . '/javascript/DateField.js'); Requirements::themedCSS('typography'); diff --git a/admin/javascript/LeftAndMain.js b/admin/javascript/LeftAndMain.js index 7781cf5e7..16345f309 100644 --- a/admin/javascript/LeftAndMain.js +++ b/admin/javascript/LeftAndMain.js @@ -276,6 +276,29 @@ } }); + /** + * Duplicates functionality in DateField.js, but due to using entwine we can match + * the DOM element on creation, rather than onclick - which allows us to decorate + * the field with a calendar icon + */ + $('.LeftAndMain .field.date input.text').entwine({ + onmatch: function() { + var holder = $(this).parents('.field.date:first'), config = holder.metadata({type: 'class'}); + if(!config.showcalendar) return; + + config.showOn = 'button'; + if(config.locale && $.datepicker.regional[config.locale]) { + config = $.extend(config, $.datepicker.regional[config.locale], {}); + } + + $(this).datepicker(config); + // // Unfortunately jQuery UI only allows configuration of icon images, not sprites + // this.next('button').button('option', 'icons', {primary : 'ui-icon-calendar'}); + + this._super(); + } + }) + }); }(jQuery)); From fe5a7f7351bc5e1a4e54deac4d25dfdbb5c150c0 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Sun, 1 May 2011 20:19:05 +1200 Subject: [PATCH 22/48] MINOR Created 3.0.0 upgrading guide, 3.0.0-pr1 changelog --- docs/en/changelogs/3.0.0.md | 115 ++ docs/en/changelogs/alpha/3.0.0-alpha1.md | 10 - docs/en/changelogs/index.md | 2 + docs/en/changelogs/pr/3.0.0-pr1.md | 1679 ++++++++++++++++++++++ docs/en/howto/index.md | 1 + 5 files changed, 1797 insertions(+), 10 deletions(-) create mode 100644 docs/en/changelogs/3.0.0.md delete mode 100644 docs/en/changelogs/alpha/3.0.0-alpha1.md create mode 100644 docs/en/changelogs/pr/3.0.0-pr1.md diff --git a/docs/en/changelogs/3.0.0.md b/docs/en/changelogs/3.0.0.md new file mode 100644 index 000000000..c50fcbd2a --- /dev/null +++ b/docs/en/changelogs/3.0.0.md @@ -0,0 +1,115 @@ +# 3.0.0 (unreleased) # + +## Overview ## + + * New CMS interface design + * "Page Content" and "Page Settings" are split into two interfaces + * Image/Link insertion moved into a modal dialog instead of a sidebar + * "Add pages" dropdown moved to a more descriptive modal dialog + * Allow usage of "sapphire" framework without the "cms" module + * CMS JavaScript moved to [jQuery.entwine](https://github.com/hafriedlander/jquery.entwine) + * CMS stylesheets are generated by SCSS to provide more flexible and robust styling + +## Upgrading ## + +### New user interface for CMS ### + +Most aspects of the interface have been redesigned, which necessitated a substantial +redevelopment of the underlying logic and presentation. +If you have customized the admin interface in any way, please review +the detailed changelog for this release. Many interface components have changed completely, +unfortunately there is no clear upgrade path for every interface detail. +As a starting point, have a look at the new templates in `cms/templates` +and `sapphire/admin/templates`, as well as the new [jQuery.entwine](https://github.com/hafriedlander/jquery.entwine) +based JavaScript logic. Have a look at the new ["Extending the CMS" guide](../howto/extending-the-cms), +["CSS" guide](../topics/css) and ["JavaScript" guide](../topics/javascript) to get you started. + +### New tree library ### + +The page tree moved from a bespoke tree library to [JSTree](http://jstree.com), +which required changes to markup of the tree and its JavaScript architecture. +This includes changes to `TreeDropdownField` and `TreeMultiSelectField`. + +### Settings-related fields move from `SiteTree->getCMSFields()` to new `SiteTree->getSettingsFields()` ### + +The fields and tabs are now split into two separate forms, which required a structural +change to the underlying class logic. In case you have added or removed fields +in the "Behaviour" or "Access" tab, please move these customizations to a new `getSettingsFields()` method. +In case of SiteTree extension through `updateCMSFields()` and a decorator/extension, +please use the new `updateSettingsFields()` instead. + +### New `SiteTree::$description` field to describe purpose of a page type ### + +Please use this static property to describe the purpose of your page types, +which will help users understand the new "Add page" dialog. +For example, a `TeamPage` type could be described as "Lists all team members, linking to their profiles". +Note: This property is optional (defaults to an empty string), but its usage is highly encouraged. + +### Stylesheet preprocessing via SCSS and the "compass" module ### + +CSS files in the `cms` and `sapphire/admin` modules are now generated through +the ["compass" SilverStripe module](http://silverstripe.org/compass-module), which uses +the ["Compass" framework](http://compass-style.org/) and the ["SCSS" language](http://sass-lang.com/). +This allows us to build more flexible and expressive stylesheets as a foundation for any +extensions to the CMS interface. + +The "compass" module is only required if core stylesheets are modified, +not when simply using the CMS or developing other CMS functionality. +If you want to extend the CMS stylesheets for your own projects without SCSS, +please create a new CSS file and link it into the CMS via `[api:LeftAndMain::require_css()]`. + +### Restructured files and folders ### + +In order to make the `sapphire` framework useable without the `cms` module, +we've moved some files around. + +CMS base functionality which is not directly related to content pages (`SiteTree`) +has been moved from the `cms` module into a new "sub-module" located in `sapphire/admin`. +This includes generic management interfaces like "Files & Images" (`AssetAdmin`), +"Security" (`SecurityAdmin`) and the `ModelAdmin` class. +On the other hand, `SiteTree` related features were moved from `sapphire` to the `cms` module. + +Due to the built-in PHP class autoloader, +this usually won't have any effect on your own code (unless you're including direct file paths). +For any other files (CSS files, templates, images, JavaScript) which might +be referenced by their path, please doublecheck that their path is still valid. + +### Moved `Translatable` extension into new 'translatable' module ### + +If you are translating your `SiteTree` or `DataObject` classes with the `Translatable` +extension, please install the new module from `http://silverstripe.org/translatable-module`. +The following settings can be removed from your own `_config.php`, as they're automatically +included through `translatable/_config.php`: + + Object::add_extension('SiteTree', 'Translatable'); + Object::add_extension('SiteConfig', 'Translatable'); + +### Removed "auto-merging" of member records from `Member->onBeforeWrite()` + +Due to security reasons. Please use `DataObject->merge()` explicitly if this is desired behaviour. + +### Unit tests require definition of used `DataObject` and `Extension` classes ### + +This change was necessary in order to improve performance of the test framework, +and avoid rebuilding the database where no database access is required. +It also won't build any `DataObject` subclasses implementing the `TestOnly` interface, +unless these are explicitly noted. + + * `SapphireTest->extraDataObjects`: List all `TestOnly` classes relevant to your test class here. + * `SapphireTest->requiredExtensions`: Maps `DataObject` classes to an array of required extensions. + Example: `array("MyTreeDataObject" => array("Versioned", "Hierarchy"))` + * `SapphireTest->illegalExtensions`: Does the reverse of `requiredExtensions`: Removes already applied extensions. + +Alternatively, you can enforce database usage by setting `SapphireTest->usesDatabase` to `TRUE` in your test class. + +### Renamed Classes ### + + * `DataObjectDecorator`: Use `DataExtension` instead (the class doesn't implement the [GOF "Decorator" pattern](http://en.wikipedia.org/wiki/Decorator_pattern)) + * `MySQLFulltextSearchable`: Use `FulltextSearchable` instead + * `CMSMainMarkingFilter`: Use `CMSSiteTreeFilter_Search` instead * + +### Removed Classes ### + + * `ConfirmedFormAction` + * `QueuedEmail`, `QueuedEmailDispatchTask` + * `RestrictedTextField`, `UniqueTextField`, `UniqueRestrictedTextField`, `AutocompleteTextField`: Use custom fields instead \ No newline at end of file diff --git a/docs/en/changelogs/alpha/3.0.0-alpha1.md b/docs/en/changelogs/alpha/3.0.0-alpha1.md deleted file mode 100644 index 18c090b29..000000000 --- a/docs/en/changelogs/alpha/3.0.0-alpha1.md +++ /dev/null @@ -1,10 +0,0 @@ -# 2.4.0-alpha1 (2009-11-11) - -## Changelog ## - -TODO - -## Upgrading ## - -### Moved Translatable extension into new 'translatable' module ### - diff --git a/docs/en/changelogs/index.md b/docs/en/changelogs/index.md index 75b7346ee..95164daf8 100644 --- a/docs/en/changelogs/index.md +++ b/docs/en/changelogs/index.md @@ -9,6 +9,7 @@ For information on how to upgrade to newer versions consult the [upgrading](/ins ## Stable Releases + * [3.0.0](3.0.0) - unreleased * [2.4.5](2.4.5) - 2 February 2011 * [2.4.4](2.4.4) - 21 December 2010 * [2.4.3](2.4.3) - 11 November 2010 @@ -40,6 +41,7 @@ For information on how to upgrade to newer versions consult the [upgrading](/ins ## Alpha/beta/release candidate ## + * [3.0.0-pr1](pr/0.0-pr1) - unreleased * [2.4.5-rc1](rc/2.4.5-rc1) - 31 January 2011 * [2.4.4-rc2](rc/2.4.4-rc2) - 20 December 2010 * [2.4.4-rc1](rc/2.4.4-rc1) - 10 December 2010 diff --git a/docs/en/changelogs/pr/3.0.0-pr1.md b/docs/en/changelogs/pr/3.0.0-pr1.md new file mode 100644 index 000000000..194a55cf9 --- /dev/null +++ b/docs/en/changelogs/pr/3.0.0-pr1.md @@ -0,0 +1,1679 @@ +# 3.0.0-pr1 # + +## Overview ## + +See [3.0.0 upgrading guide](../3.0.0) + +## Upgrading ## + +See [3.0.0 upgrading guide](../3.0.0) + +## Changelog ## + +### API Changes + + * 2011-04-28 [48d326c](https://github.com/silverstripe/sapphire/commit/48d326c) Removed Object->cacheToFileWithArgs(), please use Object->cacheToFile() with the $arguments param (Ingo Schommer) + * 2011-04-28 [f485220](https://github.com/silverstripe/sapphire/commit/f485220) Removed LeftAndMain->getitem(), use show() instead (Ingo Schommer) + * 2011-04-23 [beb9fe4](https://github.com/silverstripe/silverstripe-cms/commit/beb9fe4) Removed CMSMain->getfilteredsubtree(), use getsubtree(). API CHANGE Removed CMSMain->SiteTreeFilters(), use CMSSiteTreeFilter_Search (Ingo Schommer) + * 2011-04-23 [2c3dd5d](https://github.com/silverstripe/silverstripe-cms/commit/2c3dd5d) Removed CMSMainMarkingFilter, replaced a while ago by CMSSiteTreeFilter_Search (Ingo Schommer) + * 2011-04-19 [ecddf5b](https://github.com/silverstripe/sapphire/commit/ecddf5b) ModelAdmin->ResultsForm() no longer returns a TabSet (was just a layout crutch to support correct sizing) (Ingo Schommer) + * 2011-04-15 [583f669](https://github.com/silverstripe/sapphire/commit/583f669) Adjusting to split of SiteTree->getCMSFields() into getSettingsFields(), and new tab paths ("Root.Content" instead of "Root.Content.Main") (Ingo Schommer) + * 2011-04-15 [7a50608](https://github.com/silverstripe/silverstripe-cms/commit/7a50608) Splitting off "Behaviour" and "Access" tabs from SiteTree->getCMSFields() into SiteTree->getSettingsFields(). Adjusting functionality to split of SiteTree->getCMSFields() into getSettingsFields(), and new tab paths ("Root.Content" instead of "Root.Content.Main") (Ingo Schommer) + * 2011-04-15 [9da43d1](https://github.com/silverstripe/sapphire/commit/9da43d1) Removed support for CMSTopMenu_alternative template, use CMSMenu.ss in themes or project template folders instead API CHANGE Renamed LeftAndMain->CMSTopMenu() to CMSMenu() API CHANGE Renamed LeftAndMain->Left() to Menu(), used through LeftAndMain_Menu.ss templates (instead of LeftAndMain_left.ss) - in order to avoid presentational naming API CHANGE Renamed LeftAndMain->Right() to Content(), used through LeftAndMain_Content.ss templates (instead of LeftAndMain_right.ss) - in order to avoid presentational naming (Ingo Schommer) + * 2011-04-15 [c1d5e9b](https://github.com/silverstripe/silverstripe-cms/commit/c1d5e9b) Removed SideReport_ToDo report and "To-do" tab on SiteTree, please use the new silverstripe-page-todo module instead (Ingo Schommer) + * 2011-03-31 [982b9bd](https://github.com/silverstripe/sapphire/commit/982b9bd) Switching doctype to HTML5 in CMS templates (Ingo Schommer) + * 2011-03-31 [a423bd4](https://github.com/silverstripe/sapphire/commit/a423bd4) Removed LeftAndMain->setLogo(), use CSS instead (Ingo Schommer) + * 2011-03-31 [cfaec05](https://github.com/silverstripe/sapphire/commit/cfaec05) Removed LeftAndMain->setApplicationName() $logoText parameter, and LeftAndMain->getApplicationLogoText(), overload templates instead (Ingo Schommer) + * 2011-03-31 [05f0ce3](https://github.com/silverstripe/sapphire/commit/05f0ce3) Removed LeftAndMain->setLogo() $logoStyle parameter and LeftAndMain->LogoStyle(), use CSS (Ingo Schommer) + * 2011-03-31 [9b29616](https://github.com/silverstripe/sapphire/commit/9b29616) Rearranged files in sapphire to reflect core dependencies more accurately, and have the tests/ folder mirror its folder structure (Ingo Schommer) + * 2011-03-29 [59230d8](https://github.com/silverstripe/sapphire/commit/59230d8) Removed unused QueuedEmail and QueuedEmailDispatchTask (Ingo Schommer) + * 2011-03-28 [9d742f0](https://github.com/silverstripe/sapphire/commit/9d742f0) Removed ?debug_firebug GET parameter, and related firebug-lite inclusion in LeftAndMain (Ingo Schommer) + * 2011-03-28 [466add9](https://github.com/silverstripe/silverstripe-cms/commit/466add9) Removed CMSBatchAction->getDoingText(), couples behaviour with view too tightly, and was replaced by graphical loading indication in CMS UI a while ago (Ingo Schommer) + * 2011-03-23 [3f3f0f6](https://github.com/silverstripe/sapphire/commit/3f3f0f6) Moved SiteTree->doRollbackTo() to Versioned class (Ingo Schommer) + * 2011-03-23 [426f7e7](https://github.com/silverstripe/silverstripe-cms/commit/426f7e7) Moved SiteTree->doRollbackTo() to Versioned class (Ingo Schommer) + * 2011-03-22 [d61444e](https://github.com/silverstripe/sapphire/commit/d61444e) Moved Translatable class into new 'translatable' module (Ingo Schommer) + * 2011-03-17 [e0e1f81](https://github.com/silverstripe/sapphire/commit/e0e1f81) Removed deprecated RestrictedTextField, UniqueTextField and UniqueRestrictedTextField (Sean Harvey) + * 2011-03-17 [53f43f5](https://github.com/silverstripe/sapphire/commit/53f43f5) Removed deprecated $allowHTML parameter from HeaderField constructor. Use allowHTML() method instead (Sean Harvey) + * 2011-03-17 [180185d](https://github.com/silverstripe/sapphire/commit/180185d) Removed $className and $allowHTML from DatalessField constructor to support LabelField changes (Sean Harvey) + * 2011-03-17 [18fb465](https://github.com/silverstripe/sapphire/commit/18fb465) Removed deprecated $className and $allowHTML parameters to LabelField (Sean Harvey) + * 2011-03-17 [454023c](https://github.com/silverstripe/sapphire/commit/454023c) Remove deprecated methods getAllowedMaxFileSize, setAllowedMaxSize, getAllowedExtensions and setAllowedExtensions on FileField (Sean Harvey) + * 2011-03-16 [a99d7b0](https://github.com/silverstripe/silverstripe-cms/commit/a99d7b0) Removed CMSBatchAction->getDoingText(), the same information can be visualized via a spinner button without this overhead (Ingo Schommer) + * 2011-03-10 [10abaf0](https://github.com/silverstripe/sapphire/commit/10abaf0) Returning <span class="ins"> instead of <ins> from SiteTree->getTreeTitle() (for easier parsing in javascript tree library which uses <ins> for other purposes) (Ingo Schommer) + * 2011-03-02 [fd3ae91](https://github.com/silverstripe/silverstripe-cms/commit/fd3ae91) Replaced LeftAndMain->ajaxupdatesort() and LeftAndMain->ajaxupdateparent() with a combined LeftAndMain->savetreenode() (and a changed request parameter signature) (Ingo Schommer) + * 2011-02-11 [23e342c](https://github.com/silverstripe/sapphire/commit/23e342c) Removing support for PHPUnit 3.4 (3.5.0 has been released in Sept 2010). Removing PhpUnitWrapper_3_4, and adding better version detection. (Ingo Schommer) + * 2010-12-16 [1c34d8f](https://github.com/silverstripe/sapphire/commit/1c34d8f) Deprecated TreeTitle(), use getTreeTitle() (in SiteTree, File, Group) (Ingo Schommer) + * 2010-12-05 [5c0b218](https://github.com/silverstripe/sapphire/commit/5c0b218) Added security token to TableListField->Link() in order to include it in all URL actions automatically. This ensures that field actions bypassing Form->httpSubmission() still get CSRF protection (from r113275) (Sam Minnee) + * 2010-11-13 [854cbe7](https://github.com/silverstripe/sapphire/commit/854cbe7) Don't partially URI encode strings in SiteTree->RelativeLink(), rely on XML casting in templates instead (fixes #6125, thanks paradigmincarnate) (Ingo Schommer) + * 2010-10-19 [d8a8635](https://github.com/silverstripe/sapphire/commit/d8a8635) Member->canEdit() returns false if the editing member has lower permissions than the edited member, for example if a member with CMS_ACCESS_SecurityAdmin permissions tries to edit an ADMIN (fixes #5651) (from r110856) (Sam Minnee) + * 2010-10-15 [52bd0cc](https://github.com/silverstripe/sapphire/commit/52bd0cc) Using FieldHolder() instead of Field() for subfields in DatetimeField->FieldHolder(), in order to get configuraton settings for javascript DateField (from r107439) (Ingo Schommer) + * 2010-10-15 [3581a8d](https://github.com/silverstripe/sapphire/commit/3581a8d) Deprecated File->getLinkedURL() MINOR Avoiding duplication by using existing getFullPath() in File->getAbsoluteURL() (from r107268) (Ingo Schommer) + * 2010-10-15 [a848a18](https://github.com/silverstripe/sapphire/commit/a848a18) Deprecated AutocompleteTextField, use third-party solutions (from r107054) (Ingo Schommer) + * 2010-10-13 [42f5002](https://github.com/silverstripe/silverstripe-installer/commit/42f5002) Installer now uses a database configuration helper class which isolates the logic of checking the database away from the installer, this interface can be used by other databases like MSSQL and PostgreSQL. The installer now looks for a specific file inside each database module, provided it's configured in install.php MySQL is provided by default, as it lives in sapphire (from r98786) (sminnee) + * 2010-10-13 [3680339](https://github.com/silverstripe/sapphire/commit/3680339) Changed MySQLFulltextSearchable class to FulltextSearchable (applies to all databases) (from r102012) (Sam Minnee) + * 2010-10-13 [740e490](https://github.com/silverstripe/sapphire/commit/740e490) Disallow methods/actions in RequestHandler->checkAccessAction() which are implemented on parent classes (e.g. ViewableData and Object), unless access is controlled through $allowed_actions. This limits information exposure from getters used in template contexts. (from r102003) (Sam Minnee) + * 2010-05-25 [9c03cc7](https://github.com/silverstripe/sapphire/commit/9c03cc7) Refactored Requirements to use Requirements_Backend at all times - this makes testing far easier. Thanks tobych! MINOR Updated RequirementsTest to test Requirements_Backend instead of global statics (from r100513) (Ingo Schommer) + * 2010-05-25 [5a38c65](https://github.com/silverstripe/sapphire/commit/5a38c65) TreeDropdownField no longer requires your object to have the Hierarchy extension (from r100512) (Ingo Schommer) + * 2010-05-25 [07e3fb9](https://github.com/silverstripe/sapphire/commit/07e3fb9) Removed deprecated Email_Template class, please use Email instead! (from r100503) (Ingo Schommer) + * 2010-05-25 [75b9897](https://github.com/silverstripe/sapphire/commit/75b9897) #5107 Upload now uses Upload_Validator to separate the validation rules from the File loading done in the Upload class (from r100057) (Ingo Schommer) + * 2010-04-14 [618328a](https://github.com/silverstripe/sapphire/commit/618328a) Installer now uses a database configuration helper class which isolates the logic of checking the database away from the installer, this interface can be used by other databases like MSSQL and PostgreSQL. The installer now looks for a specific file inside each database module, provided it's configured in install.php MySQL is provided by default, as it lives in sapphire (from r98786) (Ingo Schommer) + * 2010-04-13 [a5dde23](https://github.com/silverstripe/sapphire/commit/a5dde23) Decimal now allows setting a default value properly MINOR Unit tests for Decimal field type default value through new test class DecimalTest (from r98056) (Ingo Schommer) + * 2010-04-12 [fc77fb9](https://github.com/silverstripe/sapphire/commit/fc77fb9) Moved GSTNumberField from sapphire/forms to new 'formfields_nz' module (from r97475) (Ingo Schommer) + * 2010-04-12 [a46b205](https://github.com/silverstripe/sapphire/commit/a46b205) Moved BankAccountField from sapphire/forms to new 'formfields_nz' module (from r97474) (Ingo Schommer) + * 2010-04-12 [e717044](https://github.com/silverstripe/sapphire/commit/e717044) Deprecated ContentController->LangAttributes(). Use ContentLocale() instead and write attribute names suitable to XHTML/HTML templates directly in the template. ENHANCEMENT Added ContentController->ContentLocale() to allow XHTML/HTML specific lang= attribute settings in custom template code (see #4858). Removed <meta http-equiv="Content-Language"...> tag in SiteTree->MetaTags(). ENHANCEMENT Updated blackcandy theme to use new $ContentLocale attribute to set the locale of the current page (in Page.ss) (from r97207) (Ingo Schommer) + * 2010-04-12 [41a1d19](https://github.com/silverstripe/sapphire/commit/41a1d19) <% _t() %> calls without a namespace no get the right filename when placed in an <% include %> block (actual fix in r100972) (Ingo Schommer) + * 2010-03-09 [c604341](https://github.com/silverstripe/sapphire/commit/c604341) Removed "auto-merging" of member records from Member->onBeforeWrite() due to security reasons - please use DataObject->merge() explicitly if this is desired behaviour (Ingo Schommer) + * 2009-12-16 [6be405f](https://github.com/silverstripe/sapphire/commit/6be405f) Renamed ViewableData->SecurityID() to getSecurityID() in order to get its value loading through Form->loadDataFrom() (from r94178) (Sean Harvey) + * 2009-11-22 [a5070b8](https://github.com/silverstripe/silverstripe-cms/commit/a5070b8) Removed CMSSiteTreeFilter->showInList(), using custom logic in CMSMain->SearchTreeForm() instead API CHANGE Returning arrays instead of Query resource from CMSSiteTreeFilter->pagesIncluded() MINOR Removed unused LeftAndMain->getMarkingFilter() and CMSMainMarkingFilter, now handled by CMSSiteTreeFilter and CMSMain->SearchTreeForm() ENHANCEMENT Moved 'page tree filter' dropdown logic into an additional option for CMSMain->SearchTreeForm() (originally implemented in r83674) (Ingo Schommer) + * 2009-11-21 [d92bbbe](https://github.com/silverstripe/sapphire/commit/d92bbbe) Refactored hiding of Permissions added in r92428. Added PermissionCheckboxSetField->setHiddenPermissions() (Ingo Schommer) + * 2009-11-21 [5832b46](https://github.com/silverstripe/silverstripe-installer/commit/5832b46) Removed jsparty/ directory after merging in jsrewrite feature branch changes. The contained folders are now located in cms/thirdparty and sapphire/thirdparty? (ischommer) + * 2009-11-21 [b943a65](https://github.com/silverstripe/silverstripe-cms/commit/b943a65) Moved SecurityAdmin/AssetAdmin doAdd() and AddForm() methods into a common base implementation on LeftAndMain (Ingo Schommer) + * 2009-11-21 [b9bfcc9](https://github.com/silverstripe/silverstripe-cms/commit/b9bfcc9) Renamed CMSMain->AddPageOptionsForm() to AddForm() (Ingo Schommer) + * 2009-11-21 [23bac6e](https://github.com/silverstripe/silverstripe-cms/commit/23bac6e) LeftAndMain->EditForm() returns EmptyForm() by default, as not all subclasses might want to implement the previously used getEditForm() method (e.g. ModelAdmin, which has its own sub-controllers to handle requests). Added specialized EditForm() overrides to AssetAdmin and CMSMain (Ingo Schommer) + * 2009-11-21 [94eada2](https://github.com/silverstripe/silverstripe-cms/commit/94eada2) Removed unnecessary CMSMain->getpagecount() method (Ingo Schommer) + * 2009-11-21 [6e20091](https://github.com/silverstripe/silverstripe-cms/commit/6e20091) Removed unused LeftAndMain->callPageMethod(), please use RequestHandler for this instead. (Ingo Schommer) + * 2009-11-21 [1308153](https://github.com/silverstripe/silverstripe-cms/commit/1308153) Deprecated LeftAndMain->getitem(), please use show() instead (Ingo Schommer) + * 2009-11-21 [25ba162](https://github.com/silverstripe/silverstripe-cms/commit/25ba162) Removed LeftAndMain->getLastFormIn(), please use Form->formHtmlContent() instead (Ingo Schommer) + * 2009-11-21 [758804e](https://github.com/silverstripe/silverstripe-cms/commit/758804e) Removed ajaxErrorHandler() javascript method from LeftAndMain.js, and changed two known references to custom code (Ingo Schommer) + * 2009-11-21 [01d06dd](https://github.com/silverstripe/silverstripe-cms/commit/01d06dd) Replaced CMSMain->LangSelector() with CMSMain->LangForm() to provide more accessible backend and properly wrap existing <select> tag in a form (Ingo Schommer) + * 2009-11-21 [2796a37](https://github.com/silverstripe/silverstripe-cms/commit/2796a37) Removed SideReport javascript class, replaced with concrete implementation in CMSMain.js ENHANCEMENT Using full form for 'site reports' panel in CMSMain->ReportForm(). Removed CMSMain->ReportSelector() (Ingo Schommer) + * 2009-11-21 [44e16b9](https://github.com/silverstripe/silverstripe-cms/commit/44e16b9) Removed CMSBatchAction->getDoingText(), is now using button loading indicators in the UI API CHANGE Removed LeftAndMain->BatchActionList(), no longer necessary as we're creating the batch actions form in the same class ENHANCEMENT Changed CMSBatchAction logic to return JSON status changes rather than eval'ed JavaScript via FormResponse ENHANCEMENT Ported batchactions in CMSMain_left.js to concrete javascript, and moved to new CMSMain.BatchActions.js file ENHANCEMENT Using native CMSMain->BatchActionsForm() to render form instead of custom template markup in CMSMain_TreeTools.ss (Ingo Schommer) + * 2009-11-21 [60451f7](https://github.com/silverstripe/silverstripe-cms/commit/60451f7) Replaced addpageclass javascript functionality with concrete implementation in CMSMain_left.js MINOR Renaming load() to loadForm() in LeftAndMain.EditForm.js, to avoid overloading jQuery's native methods MINOR Triggering jQuery events on top of prototype's Observable for better handling with concrete, in SecurityAdmin.js (Ingo Schommer) + * 2009-11-21 [150cd38](https://github.com/silverstripe/silverstripe-cms/commit/150cd38) Removed unused searchclass javascript class from CMSMain_left.js (Ingo Schommer) + * 2009-11-21 [dc4375a](https://github.com/silverstripe/silverstripe-cms/commit/dc4375a) Removed LeftAndMain->EditForm(), please use getEditForm() instead API CHANGE Returning LeftAndMain->EmptyForm() as a welcome/placeholder message from LeftAndMain->getEditForm() if no record is found. Removed this placeholder from LeftAndMain_right.ss ENHANCEMENT Allowing optional $id parameter in LeftAndMain->getEditForm() (and subclasses) (Ingo Schommer) + * 2009-11-21 [e30f92a](https://github.com/silverstripe/silverstripe-cms/commit/e30f92a) Returning empty form from getEditForm() method in CMSMain, AssetAdmin, SecurityAdmin to avoid an <% if %> condition in the template. The previous placeholder text is now always stored alongside the form template. This also allows for easier class overloading with different URLs, as the form action is no longer hardcoded in the template placeholder form. BUGFIX Adjusted AssetAdmin_left.ss, CommentAdmin_left.ss MINOR Removed CommentAdmin_right.ss, SecurityAdmin_right.ss - inherits a more generic LeftAndMain_right.ss instead MINOR Merged CommentAdmin_SiteTree.ss template back into CommentAdmin_left.ss (Ingo Schommer) + * 2009-11-21 [8b8867b](https://github.com/silverstripe/silverstripe-cms/commit/8b8867b) Changed <p id=statusMessage> to <div class=notice-wrap> in LeftAndMain_right.ss and subclasses ENHANCEMENT Using external jquery.notice library to handle status message updates in the CMS (Ingo Schommer) + * 2009-11-21 [fe82f39](https://github.com/silverstripe/silverstripe-cms/commit/fe82f39) Removed unused ajaxSubmitForm() javascript in LeftAndMain.js, please use LeftAndMain.EditForm.js instead (Ingo Schommer) + * 2009-11-21 [140fae5](https://github.com/silverstripe/silverstripe-cms/commit/140fae5) Removed AssetAdmin_right.ss template, using LeftAndMain_right.ss now (Ingo Schommer) + * 2009-11-21 [5aef49a](https://github.com/silverstripe/silverstripe-cms/commit/5aef49a) Removed ChangeTracker javascript class, superseded by jquery.changetracker API CHANGE Removed autoSave() javascript logic in CMS, superseded by custom code in LeftAndMain.EditForm.js ENHANCEMENT Using jquery.changetracker in LeftAndMain.EditForm.js, and overhauled window.unload logic to automatically trigger ajax saving after a user confirmation MINOR Changed unload confirmation text in CMS logic to adapt to new behaviour (Ingo Schommer) + * 2009-11-21 [773d7c9](https://github.com/silverstripe/silverstripe-cms/commit/773d7c9) Removed StageLink javascript class, replaced with 'concrete' implementation (Ingo Schommer) + * 2009-11-21 [4082561](https://github.com/silverstripe/silverstripe-cms/commit/4082561) Removed flashColor(), stopFlashing(), suggestStageLink() javascript methods, they were never used (Ingo Schommer) + * 2009-11-21 [07e8d2e](https://github.com/silverstripe/silverstripe-cms/commit/07e8d2e) Removed tinymce_removeAll() javacsript method in favour of a cleanup() method in #Form_EditForm (Ingo Schommer) + * 2009-11-21 [eba09df](https://github.com/silverstripe/silverstripe-cms/commit/eba09df) Removed windowName() javascript method (Ingo Schommer) + * 2009-11-21 [8d637e7](https://github.com/silverstripe/silverstripe-cms/commit/8d637e7) Removed unused showIndicator() and hideIndicator() javascript methods (Ingo Schommer) + * 2009-11-21 [f76fefa](https://github.com/silverstripe/silverstripe-cms/commit/f76fefa) Removed unused showResponseAsSuccessMessage() javascript method (Ingo Schommer) + * 2009-11-21 [9b1f5bc](https://github.com/silverstripe/silverstripe-cms/commit/9b1f5bc) Removed baseHref() javascript method (Ingo Schommer) + * 2009-11-21 [42daa43](https://github.com/silverstripe/silverstripe-cms/commit/42daa43) Moved jsparty/tinymce_ssbuttons to cms/javascript/tinymce_ssbuttons API CHANGE Moved jsparty/tinymce_ssmacron to cms/javascript/tinymce_ssmacron (Ingo Schommer) + * 2009-11-21 [1b312ae](https://github.com/silverstripe/silverstripe-cms/commit/1b312ae) Removed ajaxActionsAtTop() and prepareAjaxActions() javascript methods, to be replaced with new concrete implementation (Ingo Schommer) + * 2009-11-21 [7fd337f](https://github.com/silverstripe/silverstripe-cms/commit/7fd337f) Removed ajaxLoadPage(), ajaxLoadPage_success(), ajaxLink() javascript methods - were never used in core MINOR Moved ajaxSubmitFieldSet() javascript from LeftAndMain.js to MemberTableField.js (only place where its actually used) (Ingo Schommer) + * 2009-11-21 [908409a](https://github.com/silverstripe/silverstripe-cms/commit/908409a) Removed BaseForm javascript class, was never used in core (Ingo Schommer) + * 2009-11-21 [3731deb](https://github.com/silverstripe/silverstripe-cms/commit/3731deb) Removed isVisible() javascript method (Ingo Schommer) + * 2009-11-21 [d084505](https://github.com/silverstripe/silverstripe-cms/commit/d084505) Removed DraggableSeparator, SideTabs, SideTabItem javascript classeAPI CHANGE Removed DraggableSeparator, SideTabs, SideTabItem javascript classess (Ingo Schommer) + * 2009-11-21 [fca3fbd](https://github.com/silverstripe/silverstripe-cms/commit/fca3fbd) Removed ModalForm javascript class, obsolete (Ingo Schommer) + * 2009-11-21 [094c30e](https://github.com/silverstripe/silverstripe-cms/commit/094c30e) Removed ModalForm, ModalDialog, GBModalDialog javascript classes from cms, were superseded by a simple javascript alert a while ago (see r11727 and r12245) (Ingo Schommer) + * 2009-11-21 [edb8a0d](https://github.com/silverstripe/silverstripe-cms/commit/edb8a0d) Removed obsolete/broken ImageEditor functionality (Ingo Schommer) + * 2009-11-21 [393652a](https://github.com/silverstripe/sapphire/commit/393652a) Removed SiteTree->Status database field, and any manual setting of this value in SiteTree logic. Please use SiteTree->IsAddedToStage and similar dynamic getters for this purpose isntead. (Ingo Schommer) + * 2009-11-21 [204d4fb](https://github.com/silverstripe/sapphire/commit/204d4fb) D Changed SiteTree->TreeTitle() to getTreeTitle() to make it available as a dynamic property, e.g. for the CMS forms (Ingo Schommer) + * 2009-11-21 [a8fcb4b](https://github.com/silverstripe/sapphire/commit/a8fcb4b) Removed prototype15.js, its not used in core and can be downloaded separately for custom projects (Ingo Schommer) + * 2009-11-21 [9acde4e](https://github.com/silverstripe/sapphire/commit/9acde4e) Moved jsparty/tiny_mce/plugins/spellchecker to sapphire/thirdparty/tinymce-spellchecker (Ingo Schommer) + * 2009-11-21 [678502e](https://github.com/silverstripe/sapphire/commit/678502e) Moved tinymce-advcode plugin from jsparty/tinymce_advcode to sapphire/thirdparty/tinymce-advcode (Ingo Schommer) + * 2009-11-21 [3b97ce1](https://github.com/silverstripe/sapphire/commit/3b97ce1) Moved jsparty/jquery/plugins/fitheighttoparent to sapphire/thirdparty/jquery-fitheightoparent (Ingo Schommer) + * 2009-11-21 [0630051](https://github.com/silverstripe/sapphire/commit/0630051) Added jquery_improvements.js and prototype_improvements.js (moved from jsparty/ folder) (Ingo Schommer) + * 2009-11-15 [37685e6](https://github.com/silverstripe/sapphire/commit/37685e6) Removed RestfulService->connect(), use RestfulService->request() (Ingo Schommer) + * 2009-11-15 [ceeb9df](https://github.com/silverstripe/silverstripe-cms/commit/ceeb9df) Removed deprecated MemberTableField->addMembershipField() and MemberTableField->addPermissions(), use TableListField->setPermissions() instead (Ingo Schommer) + +### Features and Enhancements + + * 2011-04-30 [1e69d08](https://github.com/silverstripe/sapphire/commit/1e69d08) Added ClassManifest->getModules(), and removed limitation to toplevel modules in ClassManifest->handleFile() (necessary to detect new sapphire/admin/ "submodule") (Ingo Schommer) + * 2011-04-28 [8fe9283](https://github.com/silverstripe/silverstripe-cms/commit/8fe9283) Adding page ID as metadata in SiteTree->MetaTags() in order to provide context for CMS preview of pages (Ingo Schommer) + * 2011-04-28 [0fd6924](https://github.com/silverstripe/sapphire/commit/0fd6924) Preview changes of page edits in CMS on website (through <iframe> sidebar) (Ingo Schommer) + * 2011-04-24 [d916140](https://github.com/silverstripe/sapphire/commit/d916140) Added incompatibility notice for Internet Explorer 6 in LeftAndMain.js (Ingo Schommer) + * 2011-04-24 [9a09aaf](https://github.com/silverstripe/silverstripe-cms/commit/9a09aaf) Changed CMSMain->AddForm() to a modal dialog, showing page types and their descriptions as radiobuttons rather than a dropdown (Ingo Schommer) + * 2011-04-21 [58416e5](https://github.com/silverstripe/silverstripe-cms/commit/58416e5) Added CMSPagesController (Ingo Schommer) + * 2011-04-19 [0271652](https://github.com/silverstripe/sapphire/commit/0271652) Added default 'delete' action in LeftAndMain->getEditForm() if no other actions are set ('save' action was already present) (Ingo Schommer) + * 2011-04-19 [403d057](https://github.com/silverstripe/sapphire/commit/403d057) Using new *_Content templates for ModelAdmin and SecurityAdmin (Ingo Schommer) + * 2011-04-19 [4ddd69f](https://github.com/silverstripe/sapphire/commit/4ddd69f) Using SCSS variables for colour definitions in CMS, setting to greyscale theme for now in order to communicate the early status of the UI work (Ingo Schommer) + * 2011-04-16 [2e2e312](https://github.com/silverstripe/silverstripe-cms/commit/2e2e312) Splitting up CMSMain into CMSPageEditController and CMSPageSettingsController (Ingo Schommer) + * 2011-04-16 [03547fb](https://github.com/silverstripe/sapphire/commit/03547fb) Added FormField->setTemplate() and getTemplate(), using it in TabSet and other already template-driven FormField subclasses (Ingo Schommer) + * 2011-04-15 [ba4d709](https://github.com/silverstripe/sapphire/commit/ba4d709) Using custom CMSEditForm to render LeftAndMain->EditForm(), in order to place (fake) tab navigation alongside the layout manager areas (outside of actual edit form) (Ingo Schommer) + * 2011-04-15 [99a68dd](https://github.com/silverstripe/sapphire/commit/99a68dd) Started styles for new CMS (Ingo Schommer) + * 2011-04-14 [b273861](https://github.com/silverstripe/sapphire/commit/b273861) Implemented new jLayout layout manager, more expressive class names in LeftAndMain.ss (Ingo Schommer) + * 2011-04-07 [6016655](https://github.com/silverstripe/sapphire/commit/6016655) Added 'nochildren' support to new jstree implementation (Ingo Schommer) + * 2011-04-05 [ff29f3e](https://github.com/silverstripe/sapphire/commit/ff29f3e) Changed HtmlEditorField link/image/flash forms to use model jQuery.dialog instead of side panel - less side effects when switching focus between editor and side panels, and fits better in new design drafts (Ingo Schommer) + * 2011-04-05 [766adba](https://github.com/silverstripe/silverstripe-cms/commit/766adba) Removed tinymce_ssbuttons code which assumed a non-modal dialog (toggling between different link/image/flash forms) (Ingo Schommer) + * 2011-03-22 [2497f37](https://github.com/silverstripe/silverstripe-cms/commit/2497f37) Allowing checkboxes and their disabling on LeftAndMain.Tree.js (Ingo Schommer) + * 2011-03-21 [05403b1](https://github.com/silverstripe/sapphire/commit/05403b1) Using float positioning for TreeDropdownField panel until we have a solid way to determine correct absolute/relative position (with available space in surrounding form) (Ingo Schommer) + * 2011-03-18 [cfea011](https://github.com/silverstripe/silverstripe-cms/commit/cfea011) Fixed tree search (Ingo Schommer) + * 2011-03-16 [824f745](https://github.com/silverstripe/silverstripe-cms/commit/824f745) Supporting passing in objects in LeftAndMain->getRecord() (and subclasses) in order to reduce boilerplate code in controller actions (Ingo Schommer) + * 2011-03-10 [35100c3](https://github.com/silverstripe/sapphire/commit/35100c3) Allow submitting form data alongside TreeDropdownField ajax request, which can be used to retain state (Ingo Schommer) + * 2011-03-10 [7bda1ec](https://github.com/silverstripe/sapphire/commit/7bda1ec) Allowing JSTestDriver execution in tests/javascript/ by adding bash scripts and new Makefile command ("make jasmine") (Ingo Schommer) + * 2011-03-08 [7500891](https://github.com/silverstripe/sapphire/commit/7500891) Converted searchable and multiple selection behaviour of TreeDropdownField.js to jquery.entwine (Ingo Schommer) + * 2011-03-08 [f06480d](https://github.com/silverstripe/sapphire/commit/f06480d) Making TreeDropdownField and TreeMultiSelectField serverside markup more unobtrusive, adding DOM elements required by javascript through TreeDropdownField.js (Ingo Schommer) + * 2011-03-03 [a9cd7aa](https://github.com/silverstripe/silverstripe-cms/commit/a9cd7aa) Allow disabling of tree drag'n'drop via input box (Ingo Schommer) + * 2011-03-03 [4b9ab5c](https://github.com/silverstripe/sapphire/commit/4b9ab5c) Switched TreeDropdownField to use jquery.jstree instead of custom tree.js library. Rewrote TreeDropdownField.js from behaviour.js to jquery.entwine.js (Ingo Schommer) + * 2011-03-02 [564038b](https://github.com/silverstripe/silverstripe-cms/commit/564038b) Added drag'n'drop support for tree (Ingo Schommer) + * 2011-02-25 [9ea7e68](https://github.com/silverstripe/sapphire/commit/9ea7e68) Replaced Prototype show/hide functionality in ConfirmedPasswordField with jQuery. Added additional test case for show/hide markup. (Julian Seidenberg) + * 2011-02-22 [2d85a45](https://github.com/silverstripe/silverstripe-cms/commit/2d85a45) Replacing custom tree.js with jstree thirdparty library (Ingo Schommer) + * 2011-02-11 [3593ac2](https://github.com/silverstripe/sapphire/commit/3593ac2) Adjusted from-source documentation to github and piston (Ingo Schommer) + * 2010-12-21 [e1ad660](https://github.com/silverstripe/silverstripe-installer/commit/e1ad660) Installer now checks for magic_quotes_gpc being turned off. This option turned on can cause issues with serialized data in cookies when unserializing (sharvey) + * 2010-12-21 [6db82a8](https://github.com/silverstripe/sapphire/commit/6db82a8) HTTP_HOST server variable not filled out correctly when a port other than 80 is used on CLI (Sean Harvey) + * 2010-12-17 [fc31017](https://github.com/silverstripe/sapphire/commit/fc31017) Always encode email subject as UTF-8 (thanks syntax!) (Sean Harvey) + * 2010-12-16 [c7a9840](https://github.com/silverstripe/sapphire/commit/c7a9840) #5055 Convert unpredictability and replacing inconsistent conversion. Use htmlspecialchars() and html_entity_decode() wherever possible which are faster than str_replace() (Sean Harvey) + * 2010-12-16 [f056abc](https://github.com/silverstripe/sapphire/commit/f056abc) Added NullHTTPRequest as a placeholder for new RequestHandler/Controller instances that haven't handled a URL yet. This means RequestHandler->request can be safely called from singleton controllers (Ingo Schommer) + * 2010-12-16 [9681134](https://github.com/silverstripe/sapphire/commit/9681134) Added RequestHandler->setRequest() for easier testing of controllers (usually handled through handleRequest()). Moved $request definition from Controller into parent class (RequestHandler) (Ingo Schommer) + * 2010-12-15 [bffd187](https://github.com/silverstripe/sapphire/commit/bffd187) BASE_URL calculation now uses realpath() to calculate any symlinks in environment variable SCRIPT_FILENAME (Sean Harvey) + * 2010-12-13 [f48d685](https://github.com/silverstripe/sapphire/commit/f48d685) Allow setting secure session cookies when using SSL. Recent change r114567 made this impossible. (thanks simon_w!) (Sean Harvey) + * 2010-12-11 [ec2ce32](https://github.com/silverstripe/sapphire/commit/ec2ce32) #5442 SapphireTest now creates a "tmpdb" database name with a prefix, changed by defining SS_DATABASE_PREFIX. Defaults to "SS_" to namespace SilverStripe temporary database names (Sean Harvey) + * 2010-12-06 [1222b4d](https://github.com/silverstripe/sapphire/commit/1222b4d) 'bypassStaticCache' cookie set in Versioned is limited to httpOnly flag (no access by JS) to improve clientside security (Ingo Schommer) + * 2010-12-05 [1a3897a](https://github.com/silverstripe/sapphire/commit/1a3897a) Validation for uploaded files (from r113420) (Sam Minnee) + * 2010-12-05 [854e0e3](https://github.com/silverstripe/sapphire/commit/854e0e3) Added Form->enableSecurityToken() as a counterpart to the existing disableSecurityToken() (from r113284) (Sam Minnee) + * 2010-12-05 [9ec31ac](https://github.com/silverstripe/sapphire/commit/9ec31ac) Added SecurityToken to wrap CSRF protection via "SecurityID" request parameter (from r113272) (Sam Minnee) + * 2010-12-05 [8b220b9](https://github.com/silverstripe/sapphire/commit/8b220b9) Using RandomGenerator in Form->getExtraFields() "SecurityID" token creation (Ingo Schommer) + * 2010-12-05 [c378448](https://github.com/silverstripe/sapphire/commit/c378448) Added RandomGenerator for more secure CRSF tokens etc. (Ingo Schommer) + * 2010-12-05 [3f55474](https://github.com/silverstripe/silverstripe-installer/commit/3f55474) PHP requirements in installer now check for date.timezone correctly being set for PHP 5.3.0+. This option is *required* to be set starting with 5.3.0 and will cause an error during installation if not (from r114467) (sminnee) + * 2010-11-24 [65b3b14](https://github.com/silverstripe/silverstripe-cms/commit/65b3b14) Setting $this->request in ModelAdmin_RecordController->edit() instead of returning new response, so it can be altered by subclasses (Ingo Schommer) + * 2010-11-23 [b15019a](https://github.com/silverstripe/sapphire/commit/b15019a) Added SS_HTTPResponse->setStatusDescription() as equivalent to setStatusCode(). Added documentation. BUGFIX Strip newlines and carriage returns from SS_HTTPResponse->getStatusDescription() (fixes #6222, thanks mattclegg) (Ingo Schommer) + * 2010-11-18 [ab92919](https://github.com/silverstripe/sapphire/commit/ab92919) Allowing i18nTextCollector to discover entities in templates stored in themes/ directory (thanks nlou) (Ingo Schommer) + * 2010-10-19 [ef8419f](https://github.com/silverstripe/sapphire/commit/ef8419f) #4903 MemberLoginForm field for "You are logged in as %s" message customisation (thanks walec51!) (from r111891) (Sam Minnee) + * 2010-10-19 [6d423c9](https://github.com/silverstripe/sapphire/commit/6d423c9) #3775 Added getter to GD so you can retrieve the internal GD resource being used. Made setGD public so you can override the GD yourself as well (from r111887) (Sam Minnee) + * 2010-10-19 [fd7babe](https://github.com/silverstripe/sapphire/commit/fd7babe) Show "Database Configuration" section of installer requirements for reference (collapsed by default) (from r111873) (Sam Minnee) + * 2010-10-19 [d542ddb](https://github.com/silverstripe/sapphire/commit/d542ddb) Making "sake" script more portable by using "/usr/bin/env" shebang instead of "/bin/bash" (fixes #6045, thanks sychan) (from r111495) (Sam Minnee) + * 2010-10-19 [976f96e](https://github.com/silverstripe/sapphire/commit/976f96e) Added "module=" argument to FullTestSuite (to support comma-separated module lists) (from r111489) (Sam Minnee) + * 2010-10-19 [0200c75](https://github.com/silverstripe/sapphire/commit/0200c75) #6023 Shorten SSViewer cached template path for readability of the filenames, and also so Windows doesn't break on long paths (from r111086) (Sam Minnee) + * 2010-10-19 [ea2b86c](https://github.com/silverstripe/sapphire/commit/ea2b86c) Added custom test listener for PHPUnit in order to call setUpOnce() and tearDownOnce() on SapphireTest (from r111050) (Sam Minnee) + * 2010-10-19 [064ccec](https://github.com/silverstripe/sapphire/commit/064ccec) Allowing to run single tests via phpunit through new test bootstrap XML file (e.g. "phpunit sapphire/tests/api/RestfulServerTest.php" or "phpunit sapphire/tests/api") (from r111048) (Sam Minnee) + * 2010-10-19 [fedaaa9](https://github.com/silverstripe/silverstripe-cms/commit/fedaaa9) Added localisation for batch actions in javascript + translations (from r111915) (Sam Minnee) + * 2010-10-19 [d295d68](https://github.com/silverstripe/sapphire/commit/d295d68) #3828 500 server error page is created by default on dev/build (from r108644) (Sam Minnee) + * 2010-10-18 [684e76e](https://github.com/silverstripe/sapphire/commit/684e76e) Added argument to SQLQuery->leftJoin()/innerJoin() (#5802, thanks stojg) (from r108418) (Sam Minnee) + * 2010-10-18 [30efd55](https://github.com/silverstripe/sapphire/commit/30efd55) Added class to time icon in TimeField so it can be styled (from r107810) (Sam Minnee) + * 2010-10-15 [d67c43a](https://github.com/silverstripe/sapphire/commit/d67c43a) Using jQuery UI datepicker in DateField and DatetimeField instead of outdated DHTML calendar.js (fixes #5397) ENHANCEMENT Abstracted optional DateField->setConfig('showcalendar') logic to DateField_View_JQuery (from r107438) (Ingo Schommer) + * 2010-10-15 [ed67b2d](https://github.com/silverstripe/silverstripe-cms/commit/ed67b2d) #5352 CMS now uses the user's preferred date and time formatting in DateField and TimeField (from r107327) (Ingo Schommer) + * 2010-10-15 [ad7267a](https://github.com/silverstripe/sapphire/commit/ad7267a) Member_DatetimeOptionsetField toggle text is now translatable (from r107365) (Ingo Schommer) + * 2010-10-15 [0acb21d](https://github.com/silverstripe/sapphire/commit/0acb21d) Calling Image->deleteFormattedImages() in Image->onBeforeWrite() (#5423) (from r106705) (Ingo Schommer) + * 2010-10-15 [bcbe9c2](https://github.com/silverstripe/sapphire/commit/bcbe9c2) Allowing batch checkbox selection of TableListField rows with TableListField->Markable and TableListField->addSelectOptions() (from r105266) (Ingo Schommer) + * 2010-10-15 [8b39c98](https://github.com/silverstripe/silverstripe-cms/commit/8b39c98) 'Select all' and 'Select none' checkboxes for CommentTableField for easier batch handling of comments, improved its styling in CommentAdmin (from r105271) (Ingo Schommer) + * 2010-10-15 [72e7ce3](https://github.com/silverstripe/silverstripe-cms/commit/72e7ce3) Abbreviating comment text display in CommentAdmin to first 150 characters (from r105268) (Ingo Schommer) + * 2010-10-15 [e44ba25](https://github.com/silverstripe/sapphire/commit/e44ba25) Added CSSContentParser->getByXpath() (from r105126) (Ingo Schommer) + * 2010-10-15 [d2bcf47](https://github.com/silverstripe/silverstripe-installer/commit/d2bcf47) Installer exposes database type in "Database support" configuration (from r112247) (sminnee) + * 2010-10-15 [5dc52e9](https://github.com/silverstripe/silverstripe-installer/commit/5dc52e9) "Database Configuration" section in installer shows database version and database type (without the "Database" suffix) for reference (from r111874) (sminnee) + * 2010-10-15 [ec9ea4c](https://github.com/silverstripe/silverstripe-installer/commit/ec9ea4c) Added phpunit.xml.dist to avoid setting bootstrap includes and other SilverStripe specific configuration as CLI parameters and test-level includes (from r111055) (sminnee) + * 2010-10-15 [991ec35](https://github.com/silverstripe/silverstripe-installer/commit/991ec35) ErrorDocument in default .htaccess so Apache serves default 404 and 500 server error pages (from r108663) (sminnee) + * 2010-10-15 [b0d11f1](https://github.com/silverstripe/silverstripe-installer/commit/b0d11f1) Added variable for the server configuration file so the config-form can display it for the installation (from r105028) (sminnee) + * 2010-10-15 [26d3c34](https://github.com/silverstripe/silverstripe-installer/commit/26d3c34) Installer now supports requireDatabaseVersion() on each database configuration helper implementation, e.g. MySQLDatabaseConfigurationHelper. If it's not defined, the test is skipped. (from r104707) (sminnee) + * 2010-10-15 [05828ae](https://github.com/silverstripe/sapphire/commit/05828ae) box icon (from r104341) (Ingo Schommer) + * 2010-10-15 [1757ac1](https://github.com/silverstripe/sapphire/commit/1757ac1) Added cs_CZ javascript translations (#5540, thanks Pike) (from r104162) (Ingo Schommer) + * 2010-10-13 [174ac21](https://github.com/silverstripe/silverstripe-installer/commit/174ac21) #5080 SilverStripe can now be installed successfully on servers that do not have any rewrite capability (from r101343) (sminnee) + * 2010-10-13 [7a3be44](https://github.com/silverstripe/silverstripe-installer/commit/7a3be44) you can now choose your site locale at install time (from r100769) (sminnee) + * 2010-10-13 [9b1372a](https://github.com/silverstripe/silverstripe-installer/commit/9b1372a) show all database systems we support, along with messages if the user cannot use them. Also allow 3rd parties to register their own database classes to appear in this list. (from r100696) (sminnee) + * 2010-10-13 [0d5b969](https://github.com/silverstripe/silverstripe-installer/commit/0d5b969) IIS 7.x no longer throws a server error if the rewrite module isn't installed when first opening the SS installer - instead, the web.config file is written with rules during installation MINOR Tidied up installer, removing unused methods and clearly defining the web server support (from r100553) (sminnee) + * 2010-10-13 [cf647f4](https://github.com/silverstripe/silverstripe-installer/commit/cf647f4) #5024 Installer now checks that the user has entered a username and password correctly for the default admin, an additional button for re-checking requirements is now found at the bottom of the admin configuration section ENHANCEMENT Error messages for database AND admin configuration are now in the same place at the top of the installer (from r99841) (sminnee) + * 2010-10-13 [6a9193e](https://github.com/silverstripe/silverstripe-installer/commit/6a9193e) If the database type to install with doesn't allow creation of databases, allow for this case and inform the user they need to create it manually (from r99001) (sminnee) + * 2010-10-13 [dd015ff](https://github.com/silverstripe/silverstripe-installer/commit/dd015ff) Removed extension specific RewriteCond from .htaccess, install.php and rewritetest.php to allow for broader range of dynamically handled extensions (e.g. generating GIF files through SilverStripe controllers). See #2958 (from r97791) (sminnee) + * 2010-10-13 [eebff68](https://github.com/silverstripe/silverstripe-installer/commit/eebff68) Easier installation for IIS based configurations by providing the web.config file out of the box, an inaccessible file on Apache based web servers (from r93255) (sminnee) + * 2010-10-13 [3077816](https://github.com/silverstripe/silverstripe-installer/commit/3077816) #4576 Detection of IIS and the IIS URL Rewrite Module during SS install (from r93110) (sminnee) + * 2010-10-13 [95f1703](https://github.com/silverstripe/silverstripe-installer/commit/95f1703) #4742 Set lower timeout for mysql_connect to avoid long timeouts when mysql_connect can't find a MySQL server locally during SS install, and only do certain MySQL checks if the server can be found, greatly improving install performance (from r93106) (sminnee) + * 2010-10-13 [f2bbb4c](https://github.com/silverstripe/sapphire/commit/f2bbb4c) Added links to installation introduction text for sources of help and suggested web hosts (from r101378) (Sam Minnee) + * 2010-10-13 [9137539](https://github.com/silverstripe/sapphire/commit/9137539) Installer no longer asks for firstname and surname for default CMS admin account, this can be changed later on and doesn't need to be entered for installation (from r101314) (Sam Minnee) + * 2010-10-12 [46be185](https://github.com/silverstripe/sapphire/commit/46be185) Improved wording and styling in installer. Added links to server requirements, themes download, tutorial. Decreased vertical space before the "install" button to make it more obvious. (from r101246) (Sam Minnee) + * 2010-10-04 [5658cd6](https://github.com/silverstripe/sapphire/commit/5658cd6) #5694 New log writer SS_SysLogWriter for logging SilverStripe errors to the system log (thanks rorschach!) (Sean Harvey) + * 2010-10-04 [70105f0](https://github.com/silverstripe/silverstripe-cms/commit/70105f0) AssetAdmin now uses Upload_Validator instead of setting the rules directly on Upload (from r100058) (Sam Minnee) + * 2010-10-04 [201e6a5](https://github.com/silverstripe/silverstripe-cms/commit/201e6a5) batchactions can now implement confirmationDialog() to provide a custom confirmation dialog to the front end. MINOR added above confiration to batch setting expiry (from r97215) (from r98211) (Sam Minnee) + * 2010-10-04 [b212b5c](https://github.com/silverstripe/silverstripe-cms/commit/b212b5c) set file metadata on upload. (from r97780) (from r99117) (Sam Minnee) + * 2010-10-04 [5557622](https://github.com/silverstripe/sapphire/commit/5557622) Allowing SQLite selection in installer ENHANCEMENT Moved all Javascript containedin install.php and config-form.html to install.js, and using jQuery to simplify logic ENHANCEMENT Allow installer to attach custom form fields based on the install driver (as defined in _register_database.php) (from r101054) (Sam Minnee) + * 2010-10-04 [cb435df](https://github.com/silverstripe/sapphire/commit/cb435df) If no arguments specified for cli-script.php/sake, then provide a friendly message to the user on where to get help (from r100989) (Sam Minnee) + * 2010-10-04 [7285bbe](https://github.com/silverstripe/sapphire/commit/7285bbe) Added help text for "locale" setting in installer MINOR Changed <div> hierarchy in config-form.html to allow right-aligned help texts which horizontically align with their respective field sets on the left. (from r100940) (Sam Minnee) + * 2010-10-04 [94d98b1](https://github.com/silverstripe/sapphire/commit/94d98b1) Redirecting to translated page when original is requested with a 'locale' GET parameter (e.g. 'about-us/?locale=de_DE' will redirect to 'ueber-uns' with a 301 HTTP response). Implemented in ContentController->handleRequest(). (see #5001) (from r100937) (Sam Minnee) + * 2010-10-04 [726adb6](https://github.com/silverstripe/sapphire/commit/726adb6) Added _register_database.php to sapphire which sets the SS provided databases for DatabaseAdapterRegistry (from r100902) (Sam Minnee) + * 2010-08-03 [c57728a](https://github.com/silverstripe/sapphire/commit/c57728a) Only defining document.getElementsByClassName() in prototype.js if no native implementation exists (which speeds up the CMS). Ported from 'jquery13' module, thanks Hamish (from r100849) (Andreas Piening) + * 2010-08-03 [1941c60](https://github.com/silverstripe/sapphire/commit/1941c60) Creating default "Content Authors" group with limited rights if no other groups exist. MINOR Moved Permission->requireDefaultRecords() to Group->requireDefaultRecords() and Member->requireDefaultRecords(). MINOR Removed outdated checks for CanCMS and CanCMSAdmin from Permission->requireDefaultRecords() (from r100799) (Andreas Piening) + * 2010-06-03 [7e0daa8](https://github.com/silverstripe/silverstripe-cms/commit/7e0daa8) Allow extension of LeftAndMain->getEditForm() (and subclasses) through a new updateEditForm() hook (see r98736 for additions to AssetAdmin and CMSMain) (from r98737) (Ingo Schommer) + * 2010-05-25 [e78dc52](https://github.com/silverstripe/sapphire/commit/e78dc52) Allowing custom popup requirements in ComplexTableField without subclassing through $requirementsForPopupCallback MINOR Added getParentController() to TableListField_ItemRequest and ComplexTableField_Popup MINOR Extending ComplexTableField_ItemRequest from TableListField_ItemRequest to avoid redundant code (from r100774) (Ingo Schommer) + * 2010-05-25 [5c96533](https://github.com/silverstripe/sapphire/commit/5c96533) you can now choose your site locale at install time (from r100769) (Ingo Schommer) + * 2010-05-25 [c81a788](https://github.com/silverstripe/sapphire/commit/c81a788) Added 'updateImageForm', 'updateFlashForm', 'updateLinkForm' hooks to HtmlEditorField (the imageform hook was necessary to make the 'pixlr' module work) (see #3938) (from r100753) (Ingo Schommer) + * 2010-05-25 [e19b13a](https://github.com/silverstripe/sapphire/commit/e19b13a) show all database systems we support, along with messages if the user cannot use them. Also allow 3rd parties to register their own database classes to appear in this list. (from r100696) (Ingo Schommer) + * 2010-05-25 [94801d7](https://github.com/silverstripe/sapphire/commit/94801d7) Stored combined files in assets/_combinedfiles by default (from r100536) (Ingo Schommer) + * 2010-05-25 [3bab691](https://github.com/silverstripe/sapphire/commit/3bab691) Combined files now live in assets/.combinedfiles by default (from r100529) (Ingo Schommer) + * 2010-05-25 [d5e48d5](https://github.com/silverstripe/sapphire/commit/d5e48d5) #4599 DataObjectSet now uses more array functions instead of performing equivalent tasks - thanks simon_w! (from r100453) (Ingo Schommer) + * 2010-05-25 [30b2a95](https://github.com/silverstripe/sapphire/commit/30b2a95) Convert JSON functions now use the Services_JSON library where appropriate instead of custom code, and if json_decode() or json_encode() are available these are used MINOR Added unit tests for Convert JSON functions (from r100423) (Ingo Schommer) + * 2010-05-25 [3a19dc0](https://github.com/silverstripe/sapphire/commit/3a19dc0) you can now do coverage tests of single/multiple tests, or entire modules (from r99954) (Ingo Schommer) + * 2010-05-25 [1eb7959](https://github.com/silverstripe/sapphire/commit/1eb7959) #4787 Widget now respects updateCMSFields on extension classes so additional fields can be add (or existing ones removed) (from r99929) (Ingo Schommer) + * 2010-05-25 [593a87b](https://github.com/silverstripe/sapphire/commit/593a87b) #4043 Allow setting the from address for debug information in SS_LogEmailWriter - thanks Hamish! (from r99845) (Ingo Schommer) + * 2010-05-25 [4d2cc5d](https://github.com/silverstripe/sapphire/commit/4d2cc5d) #5024 Installer now checks that the user has entered a username and password correctly for the default admin, an additional button for re-checking requirements is now found at the bottom of the admin configuration section ENHANCEMENT Error messages for database AND admin configuration are now in the same place at the top of the installer (from r99841) (Ingo Schommer) + * 2010-05-08 [ecbee33](https://github.com/silverstripe/silverstripe-cms/commit/ecbee33) Moved cms/javascript documentation from JSDoc to NaturalDocs format (Ingo Schommer) + * 2010-04-14 [498c075](https://github.com/silverstripe/sapphire/commit/498c075) Allow locale/dateformat specific reordering of day, month, year input fields in DateField (from r99361) (Ingo Schommer) + * 2010-04-14 [195e341](https://github.com/silverstripe/sapphire/commit/195e341) set file metadata on upload. (from r97780) (from r99106) (Ingo Schommer) + * 2010-04-14 [47dfe8b](https://github.com/silverstripe/silverstripe-cms/commit/47dfe8b) Redirecting to new record from LeftAndMain/CMSMain->doAdd() if not called via ajax (Ingo Schommer) + * 2010-04-14 [de112bb](https://github.com/silverstripe/sapphire/commit/de112bb) Added checkbox to switch off using the environment during install if it's available (from r98677) (Ingo Schommer) + * 2010-04-14 [00f5f06](https://github.com/silverstripe/sapphire/commit/00f5f06) #3903 Initial changes to installer to support selection of different database drivers (from r98659) (Ingo Schommer) + * 2010-04-14 [f660634](https://github.com/silverstripe/sapphire/commit/f660634) you can now pass arbitrary CURL options to the request() method of RestfulService. (from r98656) (Ingo Schommer) + * 2010-04-14 [c0707cb](https://github.com/silverstripe/silverstripe-cms/commit/c0707cb) adapt the page dropdown based off the allowedChildren values (from r97745) (Ingo Schommer) + * 2010-04-13 [7246dc8](https://github.com/silverstripe/silverstripe-cms/commit/7246dc8) Added hover states to "Available widgets" boxes in the CMS for usability (from r97606) (Ingo Schommer) + * 2010-04-13 [addd1de](https://github.com/silverstripe/silverstripe-cms/commit/addd1de) Added visual elements to aid in the usability of the WidgetAreaEditor MINOR Added better help text underneath "Available Widgets" and "Widgets currently used" (from r97602) (Ingo Schommer) + * 2010-04-13 [3b50f8d](https://github.com/silverstripe/silverstripe-cms/commit/3b50f8d) Changed menu title from "Site Content" to "Pages" to be consistent with other menu labels ENHANCEMENT Changed tree root node in CMS to get title from SiteConfig rather than defaulting to "Site Content" ENHANCEMENT Changed tree panel headline in CMS from "Site Content and Structure" to "Page Tree" to stay consistent with new CMS menu title (from r97597) (Ingo Schommer) + * 2010-04-13 [51f9508](https://github.com/silverstripe/silverstripe-cms/commit/51f9508) Adjusted "Available Widgets" column to be narrower than "Widgets currently used", allowing more space for configuring widgets (from r97530) (Ingo Schommer) + * 2010-04-13 [031835a](https://github.com/silverstripe/sapphire/commit/031835a) roll batch permissions in to a generic function (from r97748) (from r98219) (Ingo Schommer) + * 2010-04-12 [1039cfa](https://github.com/silverstripe/sapphire/commit/1039cfa) Allowing translation of SiteConfig (including toplevel permission groups) BUGFIX Fixed SiteConfig->canView()/canEdit() to respect empty CanViewType/CanEditType assignments. (from r97370) (Ingo Schommer) + * 2010-02-23 [a4e14d3](https://github.com/silverstripe/sapphire/commit/a4e14d3) Allow DataObjectSet to remove duplicates based on any field (#5094, thanks mobiusnz) (Ingo Schommer) + * 2010-02-22 [f22f2e2](https://github.com/silverstripe/silverstripe-cms/commit/f22f2e2) Disabling/checking permission checkboxes in admin/security when 'ADMIN' permission is selected (Ingo Schommer) + * 2010-02-22 [09de9f7](https://github.com/silverstripe/sapphire/commit/09de9f7) Only show 'HTML Editor Config' dropdown in Group->getCMSFields() if more than one option exists BUGFIX Fixed bogus HTMLEditorConfig instance when get() is called without a valid identifier (due to NULL database columns) (Ingo Schommer) + * 2010-02-22 [9c00cac](https://github.com/silverstripe/sapphire/commit/9c00cac) Showing checkboxes as disabled for inherited roles in Group->getCMSFields() (Ingo Schommer) + * 2010-02-22 [93895a4](https://github.com/silverstripe/sapphire/commit/93895a4) Added OptionsetField->setDisabledItems() to allow specifically disabling certain checkboxes ENHANCEMENT Added CheckboxSetField->setDefaultItems() to tick specified checkboxes regardless of the value passed (Ingo Schommer) + * 2010-02-22 [11ad275](https://github.com/silverstripe/sapphire/commit/11ad275) Showing (readonly) permissions for a Member record in admin/security popup (Ingo Schommer) + * 2010-02-22 [705eaae](https://github.com/silverstripe/sapphire/commit/705eaae) PermissionCheckboxSetField_Readonly (with all checkboxes disabled) MINOR Re-adding support for Group and PermissionRole records in PermissionCheckboxSetField ENHANCEMENT Added 'assigned to...' label to group permissions in PermissionCheckboxSetField - used in Member->getCMSFields() readonly permission view (Ingo Schommer) + * 2010-02-22 [19336e2](https://github.com/silverstripe/sapphire/commit/19336e2) Allowing PermissionCheckboxSetField to inspect multiple group records for existing permissions (Ingo Schommer) + * 2010-02-22 [ca3b8d5](https://github.com/silverstripe/silverstripe-cms/commit/ca3b8d5) Saving group relations on SecurityAdmin->EditForm()/RootForm() through TreeMultiselectField instead of hidden 'Group'/'GroupID' values (Ingo Schommer) + * 2010-02-12 [fc8f413](https://github.com/silverstripe/silverstripe-cms/commit/fc8f413) Saving MemberTableField through new 'Groups' field added in Member->getCMSFields(). (Ingo Schommer) + * 2010-02-12 [aea2f94](https://github.com/silverstripe/sapphire/commit/aea2f94) View and select groups for a specific member via the member popup in admin/security (requires EDIT_PERMISSIONS) (Ingo Schommer) + * 2010-02-11 [555fcd9](https://github.com/silverstripe/silverstripe-cms/commit/555fcd9) Listing all members regardless of group membership by default in admin/security. Deleting a member from this list will delete it from the database instead of the group relationship API CHANGE Renamed SecurityAdmin->getEditForm() form action HTML identifier from #action_addmember to #Form_EditForm_action_addmember (Ingo Schommer) + * 2010-02-11 [1ba1c56](https://github.com/silverstripe/silverstripe-cms/commit/1ba1c56) Making setting optional in MemberTableField. Field instances without will list all members unfiltered, and remove members from the database rather than the group relation. ENHANCEMENT Allow disabling of 'inline add' formfields in a MemberTableField through setPermissions(array('inlineadd')) (Ingo Schommer) + * 2010-02-11 [c3e213b](https://github.com/silverstripe/sapphire/commit/c3e213b) Allow overriding TableListField_Item on TableListField by setting the property itemClass (merged from r98428) (Ingo Schommer) + * 2010-02-11 [37a9146](https://github.com/silverstripe/silverstripe-cms/commit/37a9146) Added help texts for MemberImportForm and GroupImportForm (Ingo Schommer) + * 2010-02-10 [19de418](https://github.com/silverstripe/silverstripe-cms/commit/19de418) Import groups from CSV in admin/security through the new GroupImportForm class (and GroupCsvBulkLoader) (Ingo Schommer) + * 2010-02-10 [49dd8dd](https://github.com/silverstripe/silverstripe-cms/commit/49dd8dd) Allowing custom 'root forms' when id values '0' or 'root' are passed from the tree selection. (Ingo Schommer) + * 2010-02-10 [89c9262](https://github.com/silverstripe/silverstripe-cms/commit/89c9262) Import members and their group assignments from CSV in admin/security through the new MemberImportForm class (Ingo Schommer) + * 2009-12-18 [f2d264c](https://github.com/silverstripe/sapphire/commit/f2d264c) #3049 Array notation on DataObjectSet is now possible MINOR Added unit tests for array notation to DataObjectSetTest MINOR Removed commented out tests from DataObjectSet (Sean Harvey) + * 2009-12-16 [c2403fc](https://github.com/silverstripe/silverstripe-cms/commit/c2403fc) Loading of tinymce_ssbuttons plugin via relative paths in HtmlEditorConfig rather than using the plugin name as a path spec (see r94060) API CHANGE Changed cms/javascript/tinymce_ssbuttons plugin name to "ssbuttons" (see r94060) API CHANGE Changed cms/javascript/tinymce_ssmacron plugin name to "ssmacron" (see r94060) (from r94062) (Sean Harvey) + * 2009-12-16 [d6e9931](https://github.com/silverstripe/sapphire/commit/d6e9931) Added MultipleOf and Modulus methods to ViewableData - useful for templating work (from r94063) (Sean Harvey) + * 2009-12-16 [1588da5](https://github.com/silverstripe/sapphire/commit/1588da5) Added support for loading external plugins (with relative paths) in HtmlEditorConfig. This means relative paths can be separate from the plugin name, and fixes a bug where paths containing dashes were ignored by TinyMCE.init(). ENHANCEMENT Changed sapphire/thirdparty/tinymce-advcode to use the original plugin name, and specify its relative path through HtmlEditorConfig instead. (from r94060) (Sean Harvey) + * 2009-12-02 [8bf1dc5](https://github.com/silverstripe/sapphire/commit/8bf1dc5) Added SiteTree->canViewStage() and using it in ContentController->init() (Ingo Schommer) + * 2009-12-02 [155e981](https://github.com/silverstripe/sapphire/commit/155e981) Added GroupCsvBulkLoader class to facilitate group imports with permission codes and hierarchy (Ingo Schommer) + * 2009-12-02 [fd86a0b](https://github.com/silverstripe/sapphire/commit/fd86a0b) MemberCsvBulkLoader for easy member import with group associations (Ingo Schommer) + * 2009-12-02 [ef28a27](https://github.com/silverstripe/sapphire/commit/ef28a27) Added BulkLoader->deleteExistingRecords(), removed unnecessary parameters from BulkLoader->load() ENHANCEMENT Decreased memory usage in BulkLoader->load() when deleting all records before importing MINOR Re-enabled CsvBulkloaderTest cases, were disabled by accident (Ingo Schommer) + * 2009-11-30 [ba344f2](https://github.com/silverstripe/sapphire/commit/ba344f2) Added SapphireTest->usesDatabase flag to explicitly request building of a test database for a test suite. This is necessitated by r93717, which removed the automatic building of these databases on every run. (Ingo Schommer) + * 2009-11-30 [43dd296](https://github.com/silverstripe/sapphire/commit/43dd296) Added parameter to DBLocale->Nice() ENHANCEMENT Added DBLocale->getNativeName() (from r93771) (Ingo Schommer) + * 2009-11-21 [7a1e3a9](https://github.com/silverstripe/silverstripe-cms/commit/7a1e3a9) Allowing to hide certain permission from showing in SecurityAdmin through add_hidden_permission() (refactored from r92428) (Ingo Schommer) + * 2009-11-21 [f793ffd](https://github.com/silverstripe/silverstripe-cms/commit/f793ffd) SideReportsHandler class for easier handling and templating of "side reprts" in the CMS interface API CHANGE Removed CMSMain->ReportFormParameters()/ReportForm()/sidereport(), replaced with new SideReportsHandler class (Ingo Schommer) + * 2009-11-21 [c44bc29](https://github.com/silverstripe/silverstripe-cms/commit/c44bc29) Adding ParentID and ClassName fields in LeftAndMain->getEditForm() if they're not already present. This ensures the UI can update state properly, e.g. to set the current tree element (Ingo Schommer) + * 2009-11-21 [e56852d](https://github.com/silverstripe/silverstripe-cms/commit/e56852d) Adjusted SecurityAdmin to new LeftAndMain API and jquery.concrete javascript. Changed 'delete' and 'create' interface to be more in line with CMSMain parent implementation, and increase code reuse. (Ingo Schommer) + * 2009-11-21 [c467c92](https://github.com/silverstripe/silverstripe-cms/commit/c467c92) Converted AssetAdmin and AssetTableField javascript to jquery-concrete MINOR Moved AssetAdmin->movemarked() logic to AssetTableField (Ingo Schommer) + * 2009-11-21 [26df8bd](https://github.com/silverstripe/silverstripe-cms/commit/26df8bd) Moved AssetAdmin->deletemarked() logic into AssetTableField (Ingo Schommer) + * 2009-11-21 [343044e](https://github.com/silverstripe/silverstripe-cms/commit/343044e) Using built-in TableListField javascript deletion for AssetTableField ENHANCEMENT Less template overloading in AssetTableField.ss (Ingo Schommer) + * 2009-11-21 [f15e2d8](https://github.com/silverstripe/silverstripe-cms/commit/f15e2d8) Reloading current edit form after 'look for new files' in AssetAdmin (Ingo Schommer) + * 2009-11-21 [dd52d7a](https://github.com/silverstripe/silverstripe-cms/commit/dd52d7a) Removed CheckboxRange javascript from AssetAdmin.js, unnecessary complication of the UI with legacy prototypejs-based code. (Ingo Schommer) + * 2009-11-21 [e47ce88](https://github.com/silverstripe/silverstripe-cms/commit/e47ce88) Making CMSBatchActionHandler specific to record class, in order to have different batch actions for AssetAdmin (removing folders). Added CMSBatchActionHandler->batchActions() and changed internal representation of batch actions (Ingo Schommer) + * 2009-11-21 [4c71322](https://github.com/silverstripe/silverstripe-cms/commit/4c71322) Added form.clickedButton to all forms triggered inside LeftAndMain javascript (Ingo Schommer) + * 2009-11-21 [650d44d](https://github.com/silverstripe/silverstripe-cms/commit/650d44d) Reimplemented ModelAdmin history feature as separate javascript file based on jQuery.concrete. It removes any dependencies to PHP code or existing markup, which means it can be disabled if not required. (Ingo Schommer) + * 2009-11-21 [1a5ed26](https://github.com/silverstripe/silverstripe-cms/commit/1a5ed26) Making jQuery.layout dimension settings in CMS configurable through CSS, to allow for easy overloading without using the javascript object (e.g. making the sidebar wider in ModelAdmin through ModelAdmin.css) (Ingo Schommer) + * 2009-11-21 [722fc1d](https://github.com/silverstripe/silverstripe-cms/commit/722fc1d) Allowing ModelAdmin to be rendered with different *_right.ss templates based on the class name (Ingo Schommer) + * 2009-11-21 [c65800a](https://github.com/silverstripe/silverstripe-cms/commit/c65800a) Using ->request in LeftAndMain->currentPageID() MINOR Documentation in LeftAndMain (Ingo Schommer) + * 2009-11-21 [44e3966](https://github.com/silverstripe/silverstripe-cms/commit/44e3966) Removed manual SiteTree->Status setting in LeftAndMain controllers, use specific getters like SiteTree->IsAddedToStage for this purpose (Ingo Schommer) + * 2009-11-21 [64e042a](https://github.com/silverstripe/silverstripe-cms/commit/64e042a) Removed unused LeftAndMain->DeleteItemsForm ENHANCEMENT Moved LeftAndMain->deleteitems() into SecurityAdmin, its the only place where its not replaced by CMSBatchAction yet (Ingo Schommer) + * 2009-11-21 [c7cca84](https://github.com/silverstripe/silverstripe-cms/commit/c7cca84) Updated LeftAndMain->ajaxupdateparent() and ajaxupdatesort() to return JSON data rather than FormResponse eval()ed javascript, and let the clientside handle any updates. Also updated to use HTTPRequest instead of superglobals. (Ingo Schommer) + * 2009-11-21 [3124388](https://github.com/silverstripe/silverstripe-cms/commit/3124388) Removed jquery.livequery.js dependency in LeftAndMain, is using jquery.concrete now. Moved only application of livequery (cms form buttons) to concrete (Ingo Schommer) + * 2009-11-21 [fec71a0](https://github.com/silverstripe/silverstripe-cms/commit/fec71a0) Moved sitetree filter functionality back into CMSMain->SearchForm() to simplify both serverside and clientside processing, and save precious UI real estate above the tree panel (Ingo Schommer) + * 2009-11-21 [898665e](https://github.com/silverstripe/silverstripe-cms/commit/898665e) Using jQuery.get() to ajax-refresh the CMS tree, to allow for concrete-style behaviour and global ajax error handling through jQuery instead of prototypejs (Ingo Schommer) + * 2009-11-21 [a4ae359](https://github.com/silverstripe/silverstripe-cms/commit/a4ae359) Added global ajax error handling to LeftAndMain.js (Ingo Schommer) + * 2009-11-21 [7400f8e](https://github.com/silverstripe/silverstripe-cms/commit/7400f8e) Using concrete for CMS loading screen javascript ENHANCEMENT Better styling for non-javascript message in CMS loading screen (Ingo Schommer) + * 2009-11-21 [c48c775](https://github.com/silverstripe/silverstripe-cms/commit/c48c775) Moving placeholder HTML for CMS EditForm out of the <form> tag, and picking it up for later usage in the EditForm javascript (Ingo Schommer) + * 2009-11-21 [5f8a164](https://github.com/silverstripe/silverstripe-cms/commit/5f8a164) Defaulting to action_save button in ajaxSubmit() javascript logic in CMS form ENHANCEMENT Making ajax options overrideable in ajaxSubmit() javascript logic in CMS form (Ingo Schommer) + * 2009-11-21 [b6dc2de](https://github.com/silverstripe/silverstripe-cms/commit/b6dc2de) Added initial implementation of jquery-changetracker as a replacement for the existing ChangeTracker behaviour/prototype javascript class (Ingo Schommer) + * 2009-11-21 [bc2cad4](https://github.com/silverstripe/silverstripe-cms/commit/bc2cad4) Floating tinymce toolbar icons in CMS to allow for smaller widths without having tinymce hide the tabset scrollbars (Ingo Schommer) + * 2009-11-21 [c2d24f9](https://github.com/silverstripe/silverstripe-cms/commit/c2d24f9) Changed CMSMain and LeftAndMain form submissions to return raw HTML instead of using FormResponse logic and evaluated javascript. This allows a more customizeable UI layer that is decoupled from the serverside logic. Any state changes should be propagated through the form itself. ENHANCEMENT Using new 'X-STATUS' HTTP response header for CMS form responses, as it is more robust for submitting variable length strings than the original 'Status' header. The status is evaluated in LeftAndMain.EditForm.js API CHANGE Removed CMSMain->tellBrowserAboutPublicationChange(), LeftAndMain->returnItemToUser(), LeftAndMain->getActionUpdateJS(), LeftAndMain->addTreeNodeJS(), LeftAndMain->deleteTreeNodeJS(). Use javascript to respond to state changes API CHANGE Removed CMSForm and CMSRightForm javascript classes, superseded by LeftAndMain.EditForm.js ENHANCEMENT Removed custom change detection in LeftAndMain->save(), this should be handled by DataObject->write() ENHANCEMENT Removed switch in LeftAndMain->save() which doesnt process saving if the record hasn't been altered, to simplify the saving logic ENHANCEMENT Removed custom add/remove tree node logic in LeftAndMain->save() which was retrieving state from DataObjectLog. This was never actively used, and should be handled by custom clientside logic. (Ingo Schommer) + * 2009-11-21 [41c1c49](https://github.com/silverstripe/silverstripe-cms/commit/41c1c49) Better response handling in LeftAndMain.EditForm BUGFIX Fixed event cancellation in LeftAndMain.EditForm javascript buttons (Ingo Schommer) + * 2009-11-21 [87a6e33](https://github.com/silverstripe/silverstripe-cms/commit/87a6e33) Disabling validator in CMSMain->getCMSFields() unless its explicitly set through SiteTree->getCMSValidator(). We don't fully support validation in the CMS (yet), and it causes unnecessary bloat in the document body for now. (Ingo Schommer) + * 2009-11-21 [021c8d4](https://github.com/silverstripe/silverstripe-cms/commit/021c8d4) Initialize the east layout panel in CMSMain.js as hidden, so users can't toggle it without going through tinyMCE buttons (Ingo Schommer) + * 2009-11-21 [dffaa08](https://github.com/silverstripe/silverstripe-cms/commit/dffaa08) Removed SitetreeAccess javascript functionality, replaced with tighter logic in CMSMain.js (Ingo Schommer) + * 2009-11-21 [f297ec9](https://github.com/silverstripe/silverstripe-cms/commit/f297ec9) Removed a.cmsEditLink javascript behaviour, do a full page load as normal links instead (Ingo Schommer) + * 2009-11-21 [0d5ee9d](https://github.com/silverstripe/silverstripe-cms/commit/0d5ee9d) Migrated translation dropdown javascript to concrete and renamed js include from LangSelector.js to CMSMain.Translatable.js (Ingo Schommer) + * 2009-11-21 [0b0e10d](https://github.com/silverstripe/silverstripe-cms/commit/0b0e10d) Better integration between new form javascript and tree in CMS MINOR Various event and property renamings in CMSMain.js (Ingo Schommer) + * 2009-11-21 [ddda071](https://github.com/silverstripe/silverstripe-cms/commit/ddda071) Replacing greybox library for admin/myprofile with a jQuery UI dialog, including iframe resizing and position/dimension saving into cookies (Ingo Schommer) + * 2009-11-21 [a3bfa49](https://github.com/silverstripe/silverstripe-cms/commit/a3bfa49) Saving layout state in CMS in cookie for left-hand panel (Ingo Schommer) + * 2009-11-21 [761760e](https://github.com/silverstripe/silverstripe-cms/commit/761760e) Storing tabs in LeftAndMain in cookie (Ingo Schommer) + * 2009-11-21 [9f4d0da](https://github.com/silverstripe/silverstripe-cms/commit/9f4d0da) Integrating right panels ('insert image', etc.) in CMS with new layout manager, adjusting title bar to jQuery UI styling, making panel content scrollable MINOR Updated cmsmain/leftandmain javascript to concrete API changes (Ingo Schommer) + * 2009-11-21 [2ccc366](https://github.com/silverstripe/silverstripe-cms/commit/2ccc366) Using a simple target=_blank for opening the logo link in CMS instead of javascript ENHANCEMENT Moved the "edit profile" popup link to concrete (Ingo Schommer) + * 2009-11-21 [c5eadd8](https://github.com/silverstripe/silverstripe-cms/commit/c5eadd8) Using jQuery UI tabs for tree tools like 'search' or 'batch actions' instead of custom JavaScript API CHANGE Removed 'treeactions' javascript global (Ingo Schommer) + * 2009-11-21 [df7713f](https://github.com/silverstripe/silverstripe-cms/commit/df7713f) Initial 'concrete' implementation of CMS forms incl. ajax saving, validation placeholders and session-pinging MINOR Removed 'innerLayout' from CMSMain.js javascript (Ingo Schommer) + * 2009-11-21 [042f4c2](https://github.com/silverstripe/silverstripe-cms/commit/042f4c2) Removed custom button styling in CMS, now replaced with standard jQuery UI buttons (Ingo Schommer) + * 2009-11-21 [58cfa9f](https://github.com/silverstripe/sapphire/commit/58cfa9f) Setting default group title in Group->populateDefaults() (Ingo Schommer) + * 2009-11-21 [b1300f7](https://github.com/silverstripe/sapphire/commit/b1300f7) Creating filesystem node in Folder->onBeforeWrite() (moved from AssetAdmin->add()) ENHANCEMENT Setting default folder title in Folder->populateDefaults() (Ingo Schommer) + * 2009-11-21 [ba281cf](https://github.com/silverstripe/sapphire/commit/ba281cf) Oncomplete ajax callbacks for TableListField.js->refresh() (Ingo Schommer) + * 2009-11-21 [46b0f0c](https://github.com/silverstripe/sapphire/commit/46b0f0c) Deleting formatted images in Image->onBeforeDelete() (Ingo Schommer) + * 2009-11-21 [d95f867](https://github.com/silverstripe/sapphire/commit/d95f867) Triggering jQuery events in TreeSelectorField.js in preparation to switching the tree logic to jQuery. This prevents developers from using the soon-to-be-deprecated Observable prototype (Ingo Schommer) + * 2009-11-21 [28109df](https://github.com/silverstripe/sapphire/commit/28109df) Removed UniqueField.js dependency to CMS-related statusMessage() javascript class, and using jQuery even triggers instead (Ingo Schommer) + * 2009-11-21 [0b25cb9](https://github.com/silverstripe/sapphire/commit/0b25cb9) Removed UpdateURL.js, moved logic to CMSMain.js ENHANCEMENT Using plain TextField for URLSegment in SiteTree->getCMSFields(), and using custom logic in CMSMain.js. The field didn't have any serverside validation anyway, and the remaining parts are quite custom (Ingo Schommer) + * 2009-11-21 [f60e94b](https://github.com/silverstripe/sapphire/commit/f60e94b) Using native jQuery.getScript() in customized jQuery.ondemand plugin. Moved processDemandHeaders() into jQuery namespace, and adjusted customized prototype.js library (Ingo Schommer) + * 2009-11-21 [0abe472](https://github.com/silverstripe/sapphire/commit/0abe472) Added SiteTree->getStageURLSegment() and SiteTree->getLiveURLSegment() to allow auto-population in the CMS edit form. This information is necessary to keep clientside UI state consistent. (Ingo Schommer) + * 2009-11-21 [9ecd359](https://github.com/silverstripe/sapphire/commit/9ecd359) Setting proper text/javascript content-type in FormResponse so clientside ajax-handling knows how to deal with it. (Ingo Schommer) + * 2009-11-21 [beb4efe](https://github.com/silverstripe/sapphire/commit/beb4efe) Disabling form validation for right-panel forms in CMS in HtmlEditorField. None of the fields have validation attached to them at the moment, so the generic validation output is unnecessary bloat. (Ingo Schommer) + * 2009-11-21 [757df30](https://github.com/silverstripe/sapphire/commit/757df30) Returning FALSE from Security->ping() if no valid user session exists, for more accurate login checking through the CMS javascript pinging (Ingo Schommer) + * 2009-11-21 [b1baa84](https://github.com/silverstripe/sapphire/commit/b1baa84) Using jQuery UI datepicker in CalendarDateField API CHANGE Removed javascript datepicker functionality in DMYCalendarDateField (Ingo Schommer) + * 2009-11-21 [2a53488](https://github.com/silverstripe/sapphire/commit/2a53488) Storing last selected tab in a cookie for TabSet.js. Requires jquery.cookie plugin. (Ingo Schommer) + * 2009-11-21 [32ada0f](https://github.com/silverstripe/sapphire/commit/32ada0f) Using "concrete" jQuery plugin for SilverStripe tabset (Ingo Schommer) + * 2009-11-21 [7856df5](https://github.com/silverstripe/sapphire/commit/7856df5) Using jQuery UI and "concrete" tabs for Security/login with multiple authentication methods (e.g. CMS-login and OpenID) (Ingo Schommer) + * 2009-11-21 [2a74a8b](https://github.com/silverstripe/sapphire/commit/2a74a8b) Using jQuery UI tabs in TabSet form field. Using custom javascript to ensure sizing of tabs within layout-managed containers. API CHANGE Changed CSS-class in TabSet template from "tabstrip" to "ss-tabset". (Ingo Schommer) + * 2009-11-21 [70deaa4](https://github.com/silverstripe/sapphire/commit/70deaa4) Changed markup of right panel forms in HtmlEditorField, titlebars and close buttons are now created through JavaScript. Also wrapped all fields in a container to make them easy to scroll in the panel (Ingo Schommer) + * 2009-11-21 [3b547ec](https://github.com/silverstripe/sapphire/commit/3b547ec) Using "concrete" jQuery plugin for tabbed Security/login view (in combination with jQuery UI tabs) (Ingo Schommer) + * 2009-11-21 [3e3fc3d](https://github.com/silverstripe/sapphire/commit/3e3fc3d) Using "concrete" jQuery plugin for SilverStripe tabset (Ingo Schommer) + * 2009-11-21 [deb691a](https://github.com/silverstripe/sapphire/commit/deb691a) Using jQuery UI tabs for Security/login with multiple authentication methods (e.g. CMS-login and OpenID) (Ingo Schommer) + * 2009-11-21 [b3f0a9a](https://github.com/silverstripe/sapphire/commit/b3f0a9a) Using jQuery UI tabs in TabSet form field. Using custom javascript to ensure sizing of tabs within layout-managed containers. API CHANGE Changed CSS-class in TabSet template from "tabstrip" to "ss-tabset". (Ingo Schommer) + * 2009-11-13 [426cebd] Using $SiteConfig for Title and Tagline fields in blackcandy Page.ss (Ingo Schommer) + +### Bugfixes + + * 2011-04-22 [b234b30](https://github.com/silverstripe/sapphire/commit/b234b30) Making DateField.js $.metadata() calls resilient against $.metadata.defaults changes (Ingo Schommer) + * 2011-04-16 [8af9c54](https://github.com/silverstripe/silverstripe-cms/commit/8af9c54) Added support for $fields parameter in CMSMain->getEditForm(), don't require 'ClassName' field in save() as its not included in getCMSFields() any longer. (Ingo Schommer) + * 2011-04-16 [ce05ce7](https://github.com/silverstripe/sapphire/commit/ce05ce7) Allow alternative (array-based) templates in Form->forTemplate() (Ingo Schommer) + * 2011-04-15 [0f7175f](https://github.com/silverstripe/sapphire/commit/0f7175f) Disabling add_sheet() on jstree, as its horribly slow (Ingo Schommer) + * 2011-04-15 [8183cc7](https://github.com/silverstripe/sapphire/commit/8183cc7) Checking file existence in LeftAndMain->init() for TinyMCE's content_css settings to avoid unnecessary clientside loading of files (Ingo Schommer) + * 2011-04-14 [d5efacb](https://github.com/silverstripe/sapphire/commit/d5efacb) Less fragile 'newness' check on Group->Code in Group->onBeforeWrite() (fixes #6595) (Ingo Schommer) + * 2011-04-06 [bde2696](https://github.com/silverstripe/sapphire/commit/bde2696) Checks if movedNode is in allowedChildren of newParent node before moving in tree (fixes #6578) (Frank Mullenger) + * 2011-04-06 [26813b9](https://github.com/silverstripe/sapphire/commit/26813b9) Reloads the item in a complex table field popup when clicking on its name after having saved it, rather than a blank popup fixes #6549 (Jean-Fabien) + * 2011-03-25 [9505be1](https://github.com/silverstripe/silverstripe-cms/commit/9505be1) Using SiteTree->MenuTitle in SiteTree->getCMSFields() parent page tree field, to stay consistent with CMS tree (fixes #6268) (copied from 2449a2b5c639384de75a55ef752e2efba8c513f3) (Ingo Schommer) + * 2011-03-23 [29afbea](https://github.com/silverstripe/sapphire/commit/29afbea) Fixed ComplexTableFieldTest to work without a valid root url (which breaks the AddForm() redirection) (Ingo Schommer) + * 2011-03-23 [5021311](https://github.com/silverstripe/sapphire/commit/5021311) Declaring has_many "Versions" relationship according to decorated class in Versioned->extraStatics() (Ingo Schommer) + * 2011-03-23 [357ea56](https://github.com/silverstripe/sapphire/commit/357ea56) Replaced hardcoded SiteTree dependency in DataObjectSet->groupWithParents() with method parameter (Ingo Schommer) + * 2011-03-23 [e1b249d](https://github.com/silverstripe/sapphire/commit/e1b249d) Allowing Security controller methods to work without Page or Page_Controller classes (now moved to 'cms' module) (Ingo Schommer) + * 2011-03-22 [d4dbb06](https://github.com/silverstripe/silverstripe-cms/commit/d4dbb06) Only select node after form reload if creating the node (Ingo Schommer) + * 2011-03-22 [6cfade0](https://github.com/silverstripe/silverstripe-cms/commit/6cfade0) Allowing "batch action" selection in new jstree implementations (first draft, doesn't reflect success/fail state on nodes afterwards) BUGFIX Passing native JSON array back from CMSBatchActionHandler in order to simplify clientside logic in LeftAndMain.BatchActions.js (Ingo Schommer) + * 2011-03-22 [6700abe](https://github.com/silverstripe/silverstripe-cms/commit/6700abe) Fixed 'onreset' behaviour for IE in CMSMain.js (Ingo Schommer) + * 2011-03-18 [15d320e](https://github.com/silverstripe/silverstripe-cms/commit/15d320e) Adding jstree ajax settings after initial load (Ingo Schommer) + * 2011-03-16 [09db4ba](https://github.com/silverstripe/sapphire/commit/09db4ba) Using setStatusCode() in HTTPResponse->redirect() in order to update status description accordingly (fixes #6495, thanks florian.thoma) (Ingo Schommer) + * 2011-03-16 [3b01a9a](https://github.com/silverstripe/silverstripe-cms/commit/3b01a9a) Allowing HTML titles in LeftAndMain.Tree.js (necessary for <span class="modified"> etc) (Ingo Schommer) + * 2011-03-16 [dc045d0](https://github.com/silverstripe/silverstripe-cms/commit/dc045d0) Allowing POST data in LeftAndMain->currentPageID() in order to fix stricter form submission validations in RequestHandler (checks for valid form action before executing e.g. 'save' command, hence needs to construct a correct form state) (Ingo Schommer) + * 2011-03-16 [4eac937](https://github.com/silverstripe/silverstripe-cms/commit/4eac937) Reconstruct form before returning from LeftAndMain and CMSMain controller actions, in order to avoid stale form fields or form actions (e.g. after hitting CMSMain->unpublish(), the 'unpublish' FormAction has to be removed from the existing form) (Ingo Schommer) + * 2011-03-16 [934c3f2](https://github.com/silverstripe/silverstripe-cms/commit/934c3f2) Re-selecting tabs when refreshing editform in LeftAndMain.EditForm.js (Ingo Schommer) + * 2011-03-16 [c6f3a08](https://github.com/silverstripe/sapphire/commit/c6f3a08) Set title automatically for empty groups in Group->populateDefaults() (Ingo Schommer) + * 2011-03-16 [a273699](https://github.com/silverstripe/silverstripe-cms/commit/a273699) Fixed AssetAdmin->SyncForm() execution by switching from calling dev/tasks/FilesystemSyncTask to doSync() (Ingo Schommer) + * 2011-03-11 [0a4aa9d](https://github.com/silverstripe/sapphire/commit/0a4aa9d) Renamed MySQLDatabase->clear_cached_fieldlist() to clearCachedFieldList() and moved to parent Database class in order to avoid breaking other database drivers (broken in 360176d2 by gmunn) (Ingo Schommer) + * 2011-03-10 [23cb199](https://github.com/silverstripe/silverstripe-cms/commit/23cb199) Reinstated create page functionality in LeftAndMain.Tree.js (Ingo Schommer) + * 2011-03-10 [ea0f8b0](https://github.com/silverstripe/silverstripe-cms/commit/ea0f8b0) Updated various CMS javascript functions to new jstree library (Ingo Schommer) + * 2011-03-10 [bde24b3](https://github.com/silverstripe/sapphire/commit/bde24b3) Allowing deselection of nodes in single select mode for TreeDropdownField (fixes #4981) (Ingo Schommer) + * 2011-03-10 [2449a2b](https://github.com/silverstripe/sapphire/commit/2449a2b) Using SiteTree->MenuTitle in SiteTree->getCMSFields() parent page tree field, to stay consistent with CMS tree (fixes #6268) (Ingo Schommer) + * 2011-03-10 [99099e8](https://github.com/silverstripe/sapphire/commit/99099e8) Passing through ignoreMethodDoesntExist parameter in jasmine.js, so we can use it in jasmine-ajax and avoid "xhr has already been spied upon" errors when executing tests through JSTestDriver (submitted patch to both projects) (Ingo Schommer) + * 2011-03-09 [4591503](https://github.com/silverstripe/sapphire/commit/4591503) Getting TreeDropdownField.js javascript tests to work with async jstree events (Ingo Schommer) + * 2011-03-09 [498e575](https://github.com/silverstripe/sapphire/commit/498e575) Avoid privilege escalation from EDIT_PERMISSIONS to ADMIN through TreeMultiselectField (in Member->getCMSFields()) by checking for admin groups in Member->onChangeGroups() (Ingo Schommer) + * 2011-03-08 [89a0b1b](https://github.com/silverstripe/sapphire/commit/89a0b1b) Added getAllResponseHeaders() to jasmine-ajax to get jQuery 1.5 compatibility (Ingo Schommer) + * 2011-03-08 [bfd4737](https://github.com/silverstripe/silverstripe-cms/commit/bfd4737) Remove EmulateIE7 <meta> tag from LeftAndMain.ss (mainly in order to get rendering compatibility with jstree.js) (Ingo Schommer) + * 2011-03-03 [eb030fa](https://github.com/silverstripe/silverstripe-cms/commit/eb030fa) Don't allow dragging tree nodes outside of the root node, don't allow moving the root node, don't access drag/drops from other trees. (Ingo Schommer) + * 2011-03-03 [11071ea](https://github.com/silverstripe/silverstripe-cms/commit/11071ea) Removed CSS classes duplication in <a> tags in LeftAndMain->getSiteTreeFor(), they're already applied to the parent list element, and confuse the styling of jstree.js (Ingo Schommer) + * 2011-03-03 [a00ccea](https://github.com/silverstripe/sapphire/commit/a00ccea) Checking for node existence in get_text() for jquery.jstree.js (Ingo Schommer) + * 2011-03-02 [0e9bf07](https://github.com/silverstripe/silverstripe-cms/commit/0e9bf07) Switching all ajax implementations to consistently use jQuery.ajax instead of Prototype's Ajax.Request() (AssetTableField, CommentTableField, MemberTableField, WidgetAreaEditor) (Ingo Schommer) + * 2011-03-02 [e78b700](https://github.com/silverstripe/sapphire/commit/e78b700) Switching all ajax implementations to consistently use jQuery.ajax instead of Prototype's Ajax.Request() (AjaxUniqueTextField, InlineFormAction, TableField, TableListField, TreeSelectorField) (Ingo Schommer) + * 2011-03-01 [f53fe81](https://github.com/silverstripe/silverstripe-cms/commit/f53fe81) Fixed regular expression to trim off last "</ul>" tag in LeftAndMain->getsubtree(), switched from deprecated ereg_replace() to preg_replace (Ingo Schommer) + * 2011-03-01 [57e1c41](https://github.com/silverstripe/silverstripe-cms/commit/57e1c41) Don't include firebug-lite.js by default in LeftAndMain->init() (Ingo Schommer) + * 2011-03-01 [c6af46f](https://github.com/silverstripe/sapphire/commit/c6af46f) jQuery 1.5 compatibility for jQuery.ondemand, by using jQuery.Deferred and the 'beforeSend' callback instead of monkeypatching jQuery.ajax (Ingo Schommer) + * 2011-02-22 [3495fc0](https://github.com/silverstripe/silverstripe-cms/commit/3495fc0) Fixing TinyMCE path enumeration which throws off its 'template' plugin by invalid spaces (fixes #6407, thanks drombolaget_fredric) (Ingo Schommer) + * 2011-02-22 [662c525](https://github.com/silverstripe/sapphire/commit/662c525) Fixed Group->collateAncestorIDs() handling of orphans (fixes #6413) (Ingo Schommer) + * 2011-01-26 [d8ee7bd](https://github.com/silverstripe/silverstripe-installer/commit/d8ee7bd) #6321 Whitelisted file extensions with uppercase extensions blocked by case sensitive FilesMatch directive in assets/.htaccess (does not affect IIS 7.x which uses web.config) (from r115816) (sharvey) + * 2011-01-11 [60d09a6](https://github.com/silverstripe/sapphire/commit/60d09a6) Incorrect call to weekday function in Date class (thanks webbower!) (from r115443) (Sean Harvey) + * 2011-01-11 [d099c7e](https://github.com/silverstripe/sapphire/commit/d099c7e) Unregistering custom Authenticators in SecurityTest->setUp() (Ingo Schommer) + * 2010-12-22 [f238823](https://github.com/silverstripe/sapphire/commit/f238823) #6287 open_basedir restriction breaks RandomGenerator when trying to read dev/urandom (from r115314) (Sean Harvey) + * 2010-12-20 [1e0579c](https://github.com/silverstripe/silverstripe-cms/commit/1e0579c) Removing form actions from $allowed_actions in AssetAdmin, CMSMain, LeftAndMain - handled through Form->httpSubmission() (Ingo Schommer) + * 2010-12-20 [102ba8b](https://github.com/silverstripe/silverstripe-cms/commit/102ba8b) Fixed ModelAdmin->getResultsTable() to only apply summary field formatting if at least one field exists, to avoid array_fill() errors (Ingo Schommer) + * 2010-12-20 [e4c586f](https://github.com/silverstripe/sapphire/commit/e4c586f) Checking for existence of FormAction in Form->httpSubmission() to avoid bypassing $allowed_actions definitions in controllers containing this form BUGFIX Checking for $allowed_actions in Form class, through Form->httpSubmission() (Ingo Schommer) + * 2010-12-19 [b13c561](https://github.com/silverstripe/silverstripe-installer/commit/b13c561) Fixed conflicting check of mysite directory with recommendation of removal of _config.php in installer (from r115169) (sharvey) + * 2010-12-17 [6faf418](https://github.com/silverstripe/sapphire/commit/6faf418) #6240 Line length of emails sent out by Mailer.php set too long and could cause emails to be marked as spam by certain filters (thanks florian.thoma!) (Sean Harvey) + * 2010-12-16 [ac2d6fa](https://github.com/silverstripe/sapphire/commit/ac2d6fa) Checking for existence of draft and live records in SilverStripeNavigatorItem_ArchiveLink->getHTML() (Ingo Schommer) + * 2010-12-16 [6e640d1](https://github.com/silverstripe/sapphire/commit/6e640d1) Setting $_REQUEST['url'] in cli-script.php to emulate normal request processing (Ingo Schommer) + * 2010-12-15 [b22a37d](https://github.com/silverstripe/silverstripe-cms/commit/b22a37d) Inspecting for AjaxSwitchView after form load, not before ajax request (in LeftAndMain.js) (Ingo Schommer) + * 2010-12-15 [145d285](https://github.com/silverstripe/sapphire/commit/145d285) RestfulService CURLOPT_FOLLOWLOCATION cannot be used when open_basedir option enabled in PHP (thanks jshipman!) (Sean Harvey) + * 2010-12-11 [089e28e](https://github.com/silverstripe/silverstripe-installer/commit/089e28e) Installer should check asp_tags is disabled, as it can cause issues with SilverStripe (from r114823) (sharvey) + * 2010-12-09 [ae2311b](https://github.com/silverstripe/sapphire/commit/ae2311b) Removed switch in MySQLDatabase->query() to directly echo queries with 'showqueries' parameter when request is called via ajax (Ingo Schommer) + * 2010-12-09 [43debfa](https://github.com/silverstripe/sapphire/commit/43debfa) Disallow web access to sapphire/silverstripe_version to avoid information leakage (Ingo Schommer) + * 2010-12-09 [f298fc2](https://github.com/silverstripe/silverstripe-cms/commit/f298fc2) Disallow web access to cms/silverstripe_version to avoid information leakage (Ingo Schommer) + * 2010-12-09 [4b2c64c](https://github.com/silverstripe/sapphire/commit/4b2c64c) Avoid potential referer leaking in Security->changepassword() form by storing Member->AutoLoginHash in session instead of 'h' GET parameter (Ingo Schommer) + * 2010-12-08 [fe126e1](https://github.com/silverstripe/silverstripe-cms/commit/fe126e1) Using UTF-8 compatible string parsing in CMSMain and MemberTableField for htmlentities() and htmlspecialchars() invocations (Ingo Schommer) + * 2010-12-08 [da909a0](https://github.com/silverstripe/sapphire/commit/da909a0) Fixed usage of htmlentities() and html_entity_decode() to be UTF8 compatible by default (Ingo Schommer) + * 2010-12-08 [2667fc6](https://github.com/silverstripe/sapphire/commit/2667fc6) HTMLText->LimitCharacters() to use UTF8 compatible htmlentities() and html_entity_decode() calls (Ingo Schommer) + * 2010-12-07 [09283fb](https://github.com/silverstripe/sapphire/commit/09283fb) Fixed DataObject->isEmpty() to only inspect custom fields (excluding "ClassName" etc), and use DBField->hasValue() for more type-specific emptyness checks (Ingo Schommer) + * 2010-12-05 [51ee52c](https://github.com/silverstripe/sapphire/commit/51ee52c) Using RandomGenerator class in SecurityToken->generate() for more random tokens (from r114500) (Sam Minnee) + * 2010-12-05 [312c7ae](https://github.com/silverstripe/sapphire/commit/312c7ae) #6201 Use of set_include_path() did not always include sapphire paths in some environments (from r113976) (Sam Minnee) + * 2010-12-05 [c24ed58](https://github.com/silverstripe/sapphire/commit/c24ed58) Better checking of file validity (#6093) Thanks Pigeon (from r113419) (Sam Minnee) + * 2010-12-05 [100e50c](https://github.com/silverstripe/sapphire/commit/100e50c) Ensure that SearchForm searchEngine() call properly escapes the Relevance field for ANSI compliance (from r113295) (Sam Minnee) + * 2010-12-05 [770281b](https://github.com/silverstripe/sapphire/commit/770281b) Clear static marking caches on Hierarchy->flushCache() (from r113277) (Sam Minnee) + * 2010-12-05 [38601b9](https://github.com/silverstripe/sapphire/commit/38601b9) Fixed ComplexTableField and TableListField GET actions against CSRF attacks (with Form_SecurityToken->checkRequest()) (from r113276) (Sam Minnee) + * 2010-12-05 [3f8a0ed](https://github.com/silverstripe/sapphire/commit/3f8a0ed) Using current controller for MemberTableField constructor in Group->getCMSFields() instead of passing in a wrong instance (Group) (from r113273) (Sam Minnee) + * 2010-12-05 [ecaa735](https://github.com/silverstripe/sapphire/commit/ecaa735) ModelViewer doesn't work due to minor bug introduced by making $_CLASS_MANIFEST keys lowercase (fixes #6144, thanks daniel.lindkvist) (from r113249) (Sam Minnee) + * 2010-12-05 [531fa04](https://github.com/silverstripe/sapphire/commit/531fa04) Limiting usage of mcrypt_create_iv() in RandomGenerator->generateEntropy() to *nix platforms to avoid fatal errors (specically in IIS) (Ingo Schommer) + * 2010-12-05 [a0a88af](https://github.com/silverstripe/sapphire/commit/a0a88af) Using RandomGenerator class in Member->logIn(), Member->autoLogin() and Member->generateAutologinHash() for better randomization of tokens. Increased VARCHAR length of 'RememberLoginToken' and 'AutoLoginHash' fields to 1024 characters to support longer token strings. (Ingo Schommer) + * 2010-12-05 [1dddd52](https://github.com/silverstripe/sapphire/commit/1dddd52) Using RandomGenerator class in PasswordEncryptor->salt() (Ingo Schommer) + * 2010-12-03 [5dbddba](https://github.com/silverstripe/sapphire/commit/5dbddba) File upload not working when open_basedir is set #5547 (Jean-Fabien Barrios) + * 2010-12-03 [9f2d488](https://github.com/silverstripe/silverstripe-cms/commit/9f2d488) File upload not working when open_basedir is set #5547 (Jean-Fabien Barrios) + * 2010-11-30 [32548a9](https://github.com/silverstripe/sapphire/commit/32548a9) Accepting 'index' as valid key in MySQLDatabase->createIndex() (same as PostgreSQLDatabase) (Ingo Schommer) + * 2010-11-24 [c579822](https://github.com/silverstripe/silverstripe-cms/commit/c579822) Don't re-add actions in ModelAdmin->EditForm if they're already present from DataObject->getCMSFields() (Ingo Schommer) + * 2010-11-24 [eeed9ce](https://github.com/silverstripe/sapphire/commit/eeed9ce) Don't call LinkTracking/ImageTracking relationships in HTMLEditorField->saveInto() unless we have internal links/files to save. This helps to improve CMS saving times on records with many HTMLEditorField instances (Ingo Schommer) + * 2010-11-24 [19f7484](https://github.com/silverstripe/sapphire/commit/19f7484) Don't rely on existence of REQUEST_URI in LogErrorEmailFormatter (not set on CLI calls) (Ingo Schommer) + * 2010-11-24 [f1bf0d0](https://github.com/silverstripe/sapphire/commit/f1bf0d0) Aborting marking in Hierarchy->markPartialTree() before loading nodes, if the expected node count would exceed the totals (regardless of the in-memory marking state) (Ingo Schommer) + * 2010-10-27 [46dcd20](https://github.com/silverstripe/sapphire/commit/46dcd20) Add PHPUnit includes to SapphireTest class (can be loaded outside of TestRunner for static calls, in which case the PHPUnit autoloaders/includes aren't in place yet) (Ingo Schommer) + * 2010-10-19 [c298990](https://github.com/silverstripe/sapphire/commit/c298990) #6089 Avoid javascript error when "Allow drag & drop reordering" enabled, and attempt to drag a file from one folder to another is performed (from r111932) (Sam Minnee) + * 2010-10-19 [f51f5bc](https://github.com/silverstripe/sapphire/commit/f51f5bc) Ensure that windows-style newlines ("\r\n") don't get converted to their XML entity representation through DOMDocument in SS_HTMLValue->setContent() (from r111878) (Sam Minnee) + * 2010-10-19 [89c3349](https://github.com/silverstripe/sapphire/commit/89c3349) More common defaults for en_US.xml used by Zend_DateFormat (and DateField/DatetimeField), with less error prone numerical format replacing the Zend default of shortened month names (fixes #6071, thanks dalesaurus) BUGFIX Correct locale mapping in DateField_View_JQuery for "en_US" and "en_NZ" MINOR Fixed form validation message in DateField to include actual date format, rather than a hardcoded value (from r111843) (Sam Minnee) + * 2010-10-19 [5e0b978](https://github.com/silverstripe/sapphire/commit/5e0b978) #6055 ErrorPage should always create static error page files when dev/build is called if they don't exist (from r111842) (Sam Minnee) + * 2010-10-19 [9bed2ca](https://github.com/silverstripe/sapphire/commit/9bed2ca) RFC 2822 compliant validation of email adresses in EmailField->jsValidation() and EmailField->validate() (fixes #6067, thanks paradigmincarnate) (from r111841) (Sam Minnee) + * 2010-10-19 [4e0450b](https://github.com/silverstripe/sapphire/commit/4e0450b) Changing File->Filename property from arbitrary limitation on VARCHAR (255 characters) to TEXT (65k characters) to ensure the framework can handle deeply nested filesystem trees (fixes #6015, thanks muzdowski) (from r111494) (Sam Minnee) + * 2010-10-19 [29515b2](https://github.com/silverstripe/sapphire/commit/29515b2) Removing overloaded TableField->sourceItems() method, which enables features of the underlying TableListField implementation, such as pagination and source item caching (fixed #5965, thanks martijn) (from r111492) (Sam Minnee) + * 2010-10-19 [cdb04f7](https://github.com/silverstripe/sapphire/commit/cdb04f7) Fixed quoting and GROUP BY statement in ManyManyComplexTableField->getQuery() for Postgres compatibility (from r111202) (Sam Minnee) + * 2010-10-19 [b9ab0e6](https://github.com/silverstripe/sapphire/commit/b9ab0e6) Force tidy to avoid wrapping long lines in CSSContentParser, it breaks our FunctionalTest string assertions (from r111176) (Sam Minnee) + * 2010-10-19 [3808b1f](https://github.com/silverstripe/sapphire/commit/3808b1f) Fixed PhpSyntaxTest not to rely on relative folder references (broken due to chdir() changes in cli-script.php and bootstrap.php) (from r111097) (Sam Minnee) + * 2010-10-19 [0d7d983](https://github.com/silverstripe/sapphire/commit/0d7d983) Fixed regression of dev/tests/all running a coverage report instead of just unit tests (from r111091) (Sam Minnee) + * 2010-10-19 [ffba082](https://github.com/silverstripe/sapphire/commit/ffba082) Fixed column names that were not quoted that broke PostgreSQL (from r110944) (Sam Minnee) + * 2010-10-19 [ef36436](https://github.com/silverstripe/sapphire/commit/ef36436) Protect MemberTest from side effects caused by auth_openid and forum modules (from r110894) (Sam Minnee) + * 2010-10-19 [31d442f](https://github.com/silverstripe/sapphire/commit/31d442f) Respecting field specific locale settings in DatetimeField and DateField when validating and saving values (fixes #5931, thanks Tjofras) (from r110889) (Sam Minnee) + * 2010-10-19 [2d82ae6](https://github.com/silverstripe/sapphire/commit/2d82ae6) Enforcing canEdit() checks in ComplexTableField_Popup - making form readonly if the current user can't edit (from r110857) (Sam Minnee) + * 2010-10-19 [2c60a67](https://github.com/silverstripe/sapphire/commit/2c60a67) Case insensitive DateField value navigation (fixes #5990, thanks gw0( (from r110838) (Sam Minnee) + * 2010-10-19 [9d4d730](https://github.com/silverstripe/sapphire/commit/9d4d730) Passing $name in MoneyField->FieldCurrency() (fixes #5982, thanks andersw) (from r110835) (Sam Minnee) + * 2010-10-19 [61bb2fe](https://github.com/silverstripe/sapphire/commit/61bb2fe) Removing "typography" class from HTMLEditorField container (should just apply to the contained <iframe>) (fixes #5949) (from r110809) (Sam Minnee) + * 2010-10-19 [1b95077](https://github.com/silverstripe/sapphire/commit/1b95077) Allowing $extraClass on CheckboxField FieldHolder (fixes #5939, thanks mobiusnz) (from r110808) (Sam Minnee) + * 2010-10-19 [2f159ce](https://github.com/silverstripe/sapphire/commit/2f159ce) MigrateSiteTreeLinkingTask now takes a direct map when querying the page tracked links instead of looping through the direct result set. This fixes SQL Server failing when MARS (Multiple Active Result Sets) is disabled (from r110197) (Sam Minnee) + * 2010-10-19 [12dd5b0](https://github.com/silverstripe/sapphire/commit/12dd5b0) Fixed missing "Save" action input label on ComplexTableField popup form (from r110165) (Sam Minnee) + * 2010-10-19 [fcc20b5](https://github.com/silverstripe/sapphire/commit/fcc20b5) Fixed ContentNegotiator to handle HTML and XHTML base tags properly when converting, regression from r108413 (from r108421) (Sam Minnee) + * 2010-10-19 [185e30a](https://github.com/silverstripe/silverstripe-cms/commit/185e30a) Disallow addition of members to groups with MemberTableField->addtogroup() when the editing member doesn't have permissions on the added member (from r110859) (Sam Minnee) + * 2010-10-19 [ad5a8e0](https://github.com/silverstripe/silverstripe-cms/commit/ad5a8e0) Don't suggest members in SecurityAdmin->autocomplete() that the current user doesn't have rights to edit (fixes #5651) (from r110858) (Sam Minnee) + * 2010-10-19 [a12b3f0](https://github.com/silverstripe/silverstripe-cms/commit/a12b3f0) #5852 Missing translation for SecurityAdmin save button causes it to have no text, should default to english "Save" (from r108407) (Sam Minnee) + * 2010-10-19 [00ff9c4](https://github.com/silverstripe/silverstripe-cms/commit/00ff9c4) Fixing default group selection in 'add member' dialog (in MemberTableField) (fixes #5836) (from r108099) (Sam Minnee) + * 2010-10-19 [4b1f71d](https://github.com/silverstripe/sapphire/commit/4b1f71d) NumericField javascript does not accept negatives, make use of isNaN built-in javascript function instead of custom regex (from r108633) (Sam Minnee) + * 2010-10-19 [f23921b](https://github.com/silverstripe/sapphire/commit/f23921b) #5627 Clear session on logout (from r108515) (Sam Minnee) + * 2010-10-19 [8fd8d87](https://github.com/silverstripe/sapphire/commit/8fd8d87) EMAIL_BOUNCEHANDLER_KEY cannot be defined (from r108513) (Sam Minnee) + * 2010-10-19 [c0e2017](https://github.com/silverstripe/sapphire/commit/c0e2017) Validator/RequiredFields should not regard "0" as an empty value (from r108512) (Sam Minnee) + * 2010-10-19 [c52dfd1](https://github.com/silverstripe/sapphire/commit/c52dfd1) Database password input in installer should be password, so that the password is obfuscated when input (from r108432) (Sam Minnee) + * 2010-10-18 [3ddd564](https://github.com/silverstripe/sapphire/commit/3ddd564) #5862 JSON output of JSONDataFormatter now uses quotes for keys to be safer (from r108409) (Sam Minnee) + * 2010-10-18 [066bf90](https://github.com/silverstripe/sapphire/commit/066bf90) Member_ProfileForm should fallback to english text for save button if no translation defined for current language (from r108408) (Sam Minnee) + * 2010-10-18 [f01cd57](https://github.com/silverstripe/sapphire/commit/f01cd57) #5837 cache_dir not writable by Zend when accessing the CMS, because of Windows default which should be the sapphire TEMP_FOLDER (from r108195) (Sam Minnee) + * 2010-10-18 [2ec9234](https://github.com/silverstripe/sapphire/commit/2ec9234) Bypass BasicAuth when in CLI mode so unit tests can run (regression from r104962) (from r108193) (Sam Minnee) + * 2010-10-18 [7254c00](https://github.com/silverstripe/sapphire/commit/7254c00) #5833 Duplicate IDs when two similar date formats in Member_DatetimeOptionsetField containing different delimiters (e.g / and .) replaced to an empty string (from r108001) (Sam Minnee) + * 2010-10-18 [ad68943](https://github.com/silverstripe/sapphire/commit/ad68943) dev/build always reporting index change because of a whitespace in the index column names (from r107831) (Sam Minnee) + * 2010-10-18 [ea50868](https://github.com/silverstripe/sapphire/commit/ea50868) Added a clearing div after the date and time fields, not the best way of doing it but the only way as the overflow css trick for clearing fields doesn't work with the time dropdown (from r107811) (Sam Minnee) + * 2010-10-18 [c5f4926](https://github.com/silverstripe/sapphire/commit/c5f4926) Fixed DateField->validate() with keyed, but empty array values MINOR Fixed DateField/TimeField validation message translation (wrong sprintf() nesting) (from r107789) (Sam Minnee) + * 2010-10-18 [171fdd6](https://github.com/silverstripe/sapphire/commit/171fdd6) Using actual date format settings in DateField/TimeField->validate() messages (from r107786) (Sam Minnee) + * 2010-10-18 [40bc9ce](https://github.com/silverstripe/sapphire/commit/40bc9ce) Limit 'showcalendar' javascript option to DateField instances (rather than applying to all available) (from r107785) (Sam Minnee) + * 2010-10-15 [a5103c3](https://github.com/silverstripe/silverstripe-cms/commit/a5103c3) Styling fixes for DateField/TimeField/DatetimeField in the CMS (from r107812) (Ingo Schommer) + * 2010-10-15 [b64015e](https://github.com/silverstripe/sapphire/commit/b64015e) Remove dummy entry created by Versioned if record is first written to Live stage (fixes #5596, thanks muzdowski) (from r107537) (Ingo Schommer) + * 2010-10-15 [577e82a](https://github.com/silverstripe/sapphire/commit/577e82a) Fixed Member->PasswordEncryption defaults when writing new Member without setting a password. Fixes critical issue with MemberTableField saving in admin/security, where new members are stored with a cleartext password by default instead of using the default SHA1 (see #5772) (from r107532) (Ingo Schommer) + * 2010-10-15 [e07d560](https://github.com/silverstripe/sapphire/commit/e07d560) Allowing DatetimeField->saveInto() to save a partial array notation with missing 'time' value (from r107441) (Ingo Schommer) + * 2010-10-15 [6351b16](https://github.com/silverstripe/sapphire/commit/6351b16) Added Locale hidden field to HTMLEditorField->LinkForm() in order to show correct context in "page on the site" dropdown (fixes #5743) (from r107390) (Ingo Schommer) + * 2010-10-15 [d99caf3](https://github.com/silverstripe/sapphire/commit/d99caf3) Fixed spelling error of $databaseConfig in cli-script.php causing database configuration to not load (thanks aimcom!) (from r107369) (Ingo Schommer) + * 2010-10-15 [35a3d79](https://github.com/silverstripe/sapphire/commit/35a3d79) Re-enabling theme in ErrorPage->doPublish() (it's usually disabled in the publication context through LeftAndMain->init()) MINOR Reverted r88633, it breaks <base> tag in static HTML for ErrorPage->doPublish() (from r106777) (Ingo Schommer) + * 2010-10-15 [ceb27c4](https://github.com/silverstripe/sapphire/commit/ceb27c4) Fixed ImageField->EditFileForm() to list subclasses of Image in tree dropdown (fixes #5708, thanks keeny) (from r106671) (Ingo Schommer) + * 2010-10-15 [4d665ce](https://github.com/silverstripe/sapphire/commit/4d665ce) Prevent DateField->performReadonlyTransformation() from segfaulting on PHP 5.2 due to broken __toString() casting (fixes #5713, thanks charden) (from r106666) (Ingo Schommer) + * 2010-10-15 [9c68b95](https://github.com/silverstripe/sapphire/commit/9c68b95) More specific regex in Requirements->includeInHTML() to avoid duplicating information by matching HTML5-style <header> tags instead of <head> (fixes #5640) (from r105667) (Ingo Schommer) + * 2010-10-15 [71209b7](https://github.com/silverstripe/silverstripe-cms/commit/71209b7) Can't set width or height on MemberTableField popup (fixes #5625, thanks smurkas) (from r105665) (Ingo Schommer) + * 2010-10-15 [a3cf47f](https://github.com/silverstripe/sapphire/commit/a3cf47f) Stricter object type checks in ViewableData->hasValue() and ViewableData->XMLval(). Broke in cases when SS_HTTPResponse is returned which doesn't extend from Object, hence doesn't have an exist() method (fixes #5524, thanks hamish) (from r105278) (Ingo Schommer) + * 2010-10-15 [1d7b62b](https://github.com/silverstripe/silverstripe-cms/commit/1d7b62b) Fixed publication of homepage with '/' URL through StaticPublisher (fixes #5514, thanks ktauber) (from r103960) (Ingo Schommer) + * 2010-10-15 [b78bc13](https://github.com/silverstripe/silverstripe-cms/commit/b78bc13) login BackURL wrong when using nested urls (fixes #5520, thanks ktauber) (from r103933) (Ingo Schommer) + * 2010-10-15 [163b358](https://github.com/silverstripe/sapphire/commit/163b358) Fixed correct input ID in install.js due to change in r105029 (from r105030) (Ingo Schommer) + * 2010-10-15 [55f1df0](https://github.com/silverstripe/sapphire/commit/55f1df0) Fixed inconsistent styling of reinstall actions at the bottom of the installer, and if using IIS, warn that this will overwrite the web.config file, not .htaccess (from r105029) (Ingo Schommer) + * 2010-10-15 [4d5c62d](https://github.com/silverstripe/silverstripe-installer/commit/4d5c62d) Installer now checks for session_start() and hash() support (from r111369) (sminnee) + * 2010-10-15 [3de082c](https://github.com/silverstripe/silverstripe-installer/commit/3de082c) Installer now checks for iconv support, which is required for DateField? (using Zend libraries) to function correctly (from r111266) (sminnee) + * 2010-10-15 [8888693](https://github.com/silverstripe/silverstripe-installer/commit/8888693) If database version can't be determined, just use the database adapter class (from r105726) (sminnee) + * 2010-10-15 [49bf141](https://github.com/silverstripe/silverstripe-installer/commit/49bf141) Install now supports sending database version if available from the helper (from r105711) (sminnee) + * 2010-10-15 [66dfdb9](https://github.com/silverstripe/silverstripe-installer/commit/66dfdb9) ss2stat URL not generated correctly (has NULL values) (from r105705) (sminnee) + * 2010-10-15 [19050a3](https://github.com/silverstripe/silverstripe-installer/commit/19050a3) Installer now checks the database version AFTER it has determined a connection can be established, which some databases require first BUGFIX Database version check failures are now a warning, so a user can install at their own risk (from r104793) (sminnee) + * 2010-10-15 [30b46e8](https://github.com/silverstripe/silverstripe-installer/commit/30b46e8) Fixed installation problem where version error didn't show (from r104720) (sminnee) + * 2010-10-14 [2bab8c8](https://github.com/silverstripe/sapphire/commit/2bab8c8) ViewableData->castingClass() cuts off last character of a casting definition if it has bracketed arguments (fixes #5536, thanks ajshort) (from r104063) (Ingo Schommer) + * 2010-10-14 [683cf79](https://github.com/silverstripe/sapphire/commit/683cf79) Bypass static caching through static-main.php when GET or POST parameters are set (regression from 2.3 API, fixes #5519, thanks ktauber) (from r103961) (Ingo Schommer) + * 2010-10-14 [80f609e](https://github.com/silverstripe/sapphire/commit/80f609e) Fixed Database->requireTable() for Mysql 4.1 (fixes #5517, thanks gw0) (from r103957) (Ingo Schommer) + * 2010-10-14 [d2c0961](https://github.com/silverstripe/sapphire/commit/d2c0961) Fixed double pragma after referer redirection on forms with Form->httpSubmission() (fixes #5509, thanks ktauber) (from r103936) (Ingo Schommer) + * 2010-10-14 [d25916b](https://github.com/silverstripe/sapphire/commit/d25916b) Trimming expected output of WebserverRoutingTest (newlines before the "ok" string were causing failures on PHP 5.3) (from r103912) (Ingo Schommer) + * 2010-10-14 [28a7b03](https://github.com/silverstripe/sapphire/commit/28a7b03) Disabled MemoryLimitTest for environments where memory_limit can't be freely set (e.g. PHP with suhosin patch) (from r103910) (Ingo Schommer) + * 2010-10-13 [2c798ff](https://github.com/silverstripe/silverstripe-installer/commit/2c798ff) Installer should check for DOMDocument (DOM/XML extension for PHP), as it's required to be there for sapphire to operate correctly (from r103471) (sminnee) + * 2010-10-13 [c63d9cc](https://github.com/silverstripe/silverstripe-installer/commit/c63d9cc) Fixed case where $_SERVER['SERVER_SIGNATURE'] was an empty string, use empty() instead of checking if it's set (which it is, but has an empty string) (from r101734) (sminnee) + * 2010-10-13 [4324131](https://github.com/silverstripe/silverstripe-installer/commit/4324131) Installer bug where apache_get_modules() doesn't exist (installing from IIS) (from r101357) (sminnee) + * 2010-10-13 [1af78e9](https://github.com/silverstripe/silverstripe-installer/commit/1af78e9) Fixed installer breaking if stats checkbox unchecked (from r101098) (sminnee) + * 2010-10-13 [3f34c41](https://github.com/silverstripe/silverstripe-installer/commit/3f34c41) Installer now looks in DatabaseRegistry for adapter when checking database requirements (from r100894) (sminnee) + * 2010-10-13 [45adbbb](https://github.com/silverstripe/silverstripe-installer/commit/45adbbb) Installer now checks for 5.1.0 PHP version at minimum. Anything less than 5.1.0 will probably have issues with SilverStripe (from r100660) (sminnee) + * 2010-10-13 [fbc6cd5](https://github.com/silverstripe/silverstripe-installer/commit/fbc6cd5) Webserver should be encoded properly when sending server stats to ss2stat during SS installation (from r100554) (sminnee) + * 2010-10-13 [08262a9](https://github.com/silverstripe/silverstripe-installer/commit/08262a9) If SS_DATABASE_CLASS is set to a database that doesn't exist, don't break the installer but fallback to MySQL (from r99598) (sminnee) + * 2010-10-13 [a40d190](https://github.com/silverstripe/sapphire/commit/a40d190) Rebuilding test database for postgresql in SearchFormTest and TranslatableSearchFormTest to avoid stale index information in the database (from r103803) (Sam Minnee) + * 2010-10-13 [35378e5](https://github.com/silverstripe/sapphire/commit/35378e5) CSSContentParser now reports better errors by using simplexml_load_string() instead of SimpleXMLElement directly (from r103552) (Sam Minnee) + * 2010-10-13 [752869e](https://github.com/silverstripe/sapphire/commit/752869e) Renamed Nested URLs are automatically redirected to their new location with 301 HTTP status code in ModelAsController/ContentController (fixes #5393, thanks cbarberis) (from r103461) (Sam Minnee) + * 2010-10-13 [da671c6](https://github.com/silverstripe/sapphire/commit/da671c6) Fixed CurrencyField->jsValidation() regex escaping (fixes #5462, thanks mobiusnz) (from r103451) (Sam Minnee) + * 2010-10-13 [a2f6487](https://github.com/silverstripe/sapphire/commit/a2f6487) DateField with setConfig('dmyfields') now validates TRUE for empty values (fixes #5458) (from r103450) (Sam Minnee) + * 2010-10-13 [044b0f0](https://github.com/silverstripe/silverstripe-installer/commit/044b0f0) If mod_rewrite isn't enabled on Apache, a 500 server error won't be generated which prevents the installer from opening and telling you there's no rewrite support (from r98887) (sminnee) + * 2010-10-13 [d2b7727](https://github.com/silverstripe/silverstripe-installer/commit/d2b7727) Installer does not require .htaccess file to be writable if using IIS 7 and 7.5. We assume any other server has some form of .htaccess file (from r98850) (sminnee) + * 2010-10-13 [7cec02c](https://github.com/silverstripe/silverstripe-installer/commit/7cec02c) Fixed unlink of mysite/_config.php and truncate it instead - when re-creating the file it may not get write permissions on Windows (from r98783) (sminnee) + * 2010-10-13 [3c8aba8](https://github.com/silverstripe/silverstripe-installer/commit/3c8aba8) Send the database in use (not just the MySQL version) to ss2stats in installer (from r98782) (sminnee) + * 2010-10-13 [7363fe5](https://github.com/silverstripe/silverstripe-installer/commit/7363fe5) Fixed MySQL connection in installer not detecting incorrect credentials (from r98760) (sminnee) + * 2010-10-13 [42144c2](https://github.com/silverstripe/silverstripe-installer/commit/42144c2) Installer should cache the database connection so queries testing database creation can be made properly (from r98744) (sminnee) + * 2010-10-13 [bf5e862](https://github.com/silverstripe/silverstripe-installer/commit/bf5e862) Check for existance of IIS rewrite module as a value that exists instead of being "1" (from r98031) (sminnee) + * 2010-10-13 [e8bb141](https://github.com/silverstripe/silverstripe-installer/commit/e8bb141) #4791 Potential issue with creating files in SS installer on IIS - use the "b" mode when using fopen() to be more portable on platforms (from r96826) (sminnee) + * 2010-10-13 [62d6260](https://github.com/silverstripe/silverstripe-installer/commit/62d6260) Sometimes SERVER_SIGNATURE isn't populated in PHP, so fall back to using SERVER_SOFTWARE to detect the webserver during SS install (from r93113) (sminnee) + * 2010-10-13 [64a561f](https://github.com/silverstripe/sapphire/commit/64a561f) Fixing RquestHandler->checkAccessAction() on PHP 5.2 - ReflectionMethod->class returns inconsisent results in older PHP versions. (see r102003) (from r102730) (Sam Minnee) + * 2010-10-13 [322a2da](https://github.com/silverstripe/sapphire/commit/322a2da) Float should always be not null and default 0 in the database (from r102686) (Sam Minnee) + * 2010-10-13 [268800d](https://github.com/silverstripe/sapphire/commit/268800d) #5316 Float and Double should never try to save NULL as the "null" value (from r102460) (Sam Minnee) + * 2010-10-13 [1d61bf7](https://github.com/silverstripe/sapphire/commit/1d61bf7) Prevent handling of controller actions which return $this avoid infinite loops in RequestHandler->handleRequest (thanks Hamish!) (from r102004) (Sam Minnee) + * 2010-10-13 [d99c2c7](https://github.com/silverstripe/sapphire/commit/d99c2c7) Resetting image sidepanel fields when opening the panel instead of inserting an image, to avoid losing focus of TinyMCE in IE. Using getBookmark() in TinyMCE to save the original location. (fixes #5263) (from r101975) (Sam Minnee) + * 2010-10-13 [1a12f98](https://github.com/silverstripe/sapphire/commit/1a12f98) avoid call to non-object (from r101794) (Sam Minnee) + * 2010-10-13 [aa5fc3d](https://github.com/silverstripe/sapphire/commit/aa5fc3d) fix #5320 (from r101758) (Sam Minnee) + * 2010-10-13 [9087f79](https://github.com/silverstripe/sapphire/commit/9087f79) Always including "Locale" field in Translatable->getCMSFields() regardless of "excluded" page types. Necessary to enable form state serialization for fields like TreeSelectorField on a VirtualPage (fixes #5269) (from r101747) (Sam Minnee) + * 2010-10-13 [fd8e004](https://github.com/silverstripe/sapphire/commit/fd8e004) Versioned->publish() with $createNewVersion=TRUE now increases version number of in-memory object (fixes #5261) (from r101739) (Sam Minnee) + * 2010-10-13 [1bbec96](https://github.com/silverstripe/sapphire/commit/1bbec96) Don't replace "home/" URLSegment in SiteTree->RelativeLink() if Translatable is enabled and the homepage is not on the root level (nested URLs allows you to have homepages called "en/home" and "ru/home") (fixes #5244) (from r101711) (Sam Minnee) + * 2010-10-13 [c08e277](https://github.com/silverstripe/sapphire/commit/c08e277) #5245 Sometimes page records will have a NULL ParentID value, it should be a number even if it's 0 (thanks wrossiter!) (from r101657) (Sam Minnee) + * 2010-10-13 [4414b8a](https://github.com/silverstripe/sapphire/commit/4414b8a) #5243 Undefined Convert functions in ViewableData replaced with working versions. Thanks benediktb! MINOR Updated ViewableDataTest to verify ViewableData changes (from r101638) (Sam Minnee) + * 2010-10-13 [135b65e](https://github.com/silverstripe/sapphire/commit/135b65e) Fixed SiteTree->Content link shortcode parsing introduced in r101093 (#5227) (from r101302) (Sam Minnee) + * 2010-10-12 [0d5a0e7](https://github.com/silverstripe/sapphire/commit/0d5a0e7) Checking for existence of "ShowInMenus" property in Folder->liveChildren() and stageChildren() (#5190) (from r101264) (Sam Minnee) + * 2010-10-12 [51e34da](https://github.com/silverstripe/sapphire/commit/51e34da) Don't delete index.php after successful installation - in ContentController->deleteinstallfiles(). URL routing might rely on it without mod_rewrite. BUGFIX Require ADMIN permissions for ContentController->deleteinstallfiles() - together with retaining index.php this removed a vulnerability where unauthenticated users can disrupt mod_rewrite-less URL routing. (from r101227) (Sam Minnee) + * 2010-10-12 [f8a5282](https://github.com/silverstripe/sapphire/commit/f8a5282) #5216 Installer has issues with click handlers applied to the entire li, be more specific and apply it to the label and input instead (from r101167) (Sam Minnee) + * 2010-10-12 [4354b86](https://github.com/silverstripe/sapphire/commit/4354b86) Removed references to "php5" and replace with "php" in Makefile (it's now consistent with 2.4 build branch) (Sean Harvey) + * 2010-10-04 [26f987e](https://github.com/silverstripe/silverstripe-cms/commit/26f987e) Fixed redirection in PageCommentInterface to use Link() instead of URLSegment (fixes 4200, thanks ktauber) (from r103518) (Sam Minnee) + * 2010-10-04 [7ee0ad5](https://github.com/silverstripe/silverstripe-cms/commit/7ee0ad5) Using try/catch in MemberTableField->saveComplexTableField() similiar to parent implementation, which means trying to save a Member duplicate doesn't end up in a fatal error (fixes #5444) (from r103336) (Sam Minnee) + * 2010-10-04 [9b2e9b6](https://github.com/silverstripe/silverstripe-cms/commit/9b2e9b6) Fixed CTF sorting in ModelAdmin results (was failing because of missing 'ResultAssembly' GET parameters (from r102712) (Sam Minnee) + * 2010-10-04 [3a7b510](https://github.com/silverstripe/silverstripe-cms/commit/3a7b510) #5255 LeftAndMain should include the correct editor.css file so typography from user selected theme in SiteConfig is shown in TinyMCE (from r102038) (Sam Minnee) + * 2010-10-04 [fc50b2d](https://github.com/silverstripe/silverstripe-cms/commit/fc50b2d) RedirectorPage types shouldn't appear in "Pages with no content" side report in the CMS Pages tab (from r101737) (Sam Minnee) + * 2010-10-04 [261b4b9](https://github.com/silverstripe/silverstripe-cms/commit/261b4b9) Only show "Roles" tab in admin/security if user has APPLY_ROLES permissions (fixes #5258) (from r101719) (Sam Minnee) + * 2010-10-04 [6f0743f](https://github.com/silverstripe/silverstripe-cms/commit/6f0743f) Fixed closing </div> which should have been a </td> for dragfile in AssetTableField (from r101375) (Sam Minnee) + * 2010-10-04 [deb88d1](https://github.com/silverstripe/sapphire/commit/deb88d1) #5202 Installer now properly populates database configuration inputs from request after user clicks "Re-check requirements" (from r101087) (Sam Minnee) + * 2010-10-04 [a96cb31](https://github.com/silverstripe/sapphire/commit/a96cb31) Fixed TableListField->print() - was unsetting $cachedSourceItems instead of null'ing it, which breaks later access to the property (from r101080) (Sam Minnee) + * 2010-10-04 [a729b86](https://github.com/silverstripe/sapphire/commit/a729b86) #5199 Duplicate file uploads have odd numbering attached to end of file (from r101068) (Sam Minnee) + * 2010-10-04 [81ce1e3](https://github.com/silverstripe/sapphire/commit/81ce1e3) Fixed Upload and checking for size with files that don't have any extension (from r101061) (Sam Minnee) + * 2010-10-04 [2ea0e3e](https://github.com/silverstripe/sapphire/commit/2ea0e3e) #5188 Upload and Folder don't handle the duplicate naming of files that have no extension (from r101050) (Sam Minnee) + * 2010-10-04 [9f2ca79](https://github.com/silverstripe/sapphire/commit/9f2ca79) Cookies set to a value other than NULL (effectively unsetting the cookie) will now use the httpOnly parameter by default for better XSS protection (from r101045) (from r101046) (Sam Minnee) + * 2010-10-04 [c54cce8](https://github.com/silverstripe/sapphire/commit/c54cce8) Disable javascript date validation via DateField->jsValidation() if locale is not 'en_NZ" (which is the only format it validates for). (from r100986) (Sam Minnee) + * 2010-10-04 [5f0fcc5](https://github.com/silverstripe/sapphire/commit/5f0fcc5) HTMLEditorField->saveInto() can now find images with urlencoded information for resample (e.g. spaces in filenames) (from r100985) (Sam Minnee) + * 2010-08-03 [9df87f3](https://github.com/silverstripe/silverstripe-cms/commit/9df87f3) Fixed resizing of $('.LeftAndMain') on edit forms by triggering a delayed resize on first load (Ingo Schommer) + * 2010-08-03 [76dcb97](https://github.com/silverstripe/sapphire/commit/76dcb97) #5176 Javascript error in IE for the installer - use "this" instead of e.target which doesn't work (from r100866) (Andreas Piening) + * 2010-08-03 [4ea1e6e](https://github.com/silverstripe/sapphire/commit/4ea1e6e) Use "wb" argument in ManifestBuilder fopen() calls for better cross-platform compatibility (from r100862) (Andreas Piening) + * 2010-08-03 [69ca614](https://github.com/silverstripe/silverstripe-cms/commit/69ca614) Checking for existence of $('SwitchView') (fixes #5282) (from r108436) (Ingo Schommer) + * 2010-08-03 [ccda3bb](https://github.com/silverstripe/sapphire/commit/ccda3bb) #5157 If paths are longer than 255 characters, fopen() produces an "Invalid argument" error, shorten the paths by using basename() instead of realpath() on the manifest filename when producing the cache path in ManifestBuilder (from r100861) (Andreas Piening) + * 2010-08-02 [983fb1f](https://github.com/silverstripe/sapphire/commit/983fb1f) #5157 strftime() %F format parameter does not work on Windows - use %Y-%m-%d instead (from r100795) (Andreas Piening) + * 2010-06-03 [ae6e0cf](https://github.com/silverstripe/silverstripe-cms/commit/ae6e0cf) fix for #5076 (from r98957) (Ingo Schommer) + * 2010-05-27 [53b02f6](https://github.com/silverstripe/sapphire/commit/53b02f6) Moved SiteTree?->ParentID property to Hierarchy extension (fixes #5638) (from r105668) (Ingo Schommer) + * 2010-05-25 [e3873ef](https://github.com/silverstripe/sapphire/commit/e3873ef) TreeSelectorField doubles up on concating base_url, doesn't include the security ID (#5164, thanks marcus) (from r100755) (Ingo Schommer) + * 2010-05-25 [c8ac8a2](https://github.com/silverstripe/sapphire/commit/c8ac8a2) #5099 FileIFrameField fails when using it with a locale different to the default (from r100747) (Ingo Schommer) + * 2010-05-25 [480c25a](https://github.com/silverstripe/sapphire/commit/480c25a) allow selection of database adpater (from r100727) (Ingo Schommer) + * 2010-05-25 [ae9cae6](https://github.com/silverstripe/sapphire/commit/ae9cae6) misspelled variable (from r100726) (Ingo Schommer) + * 2010-05-25 [e4dfc24](https://github.com/silverstripe/sapphire/commit/e4dfc24) Fixed SapphireTest->loginWithPermission() and MemberAuthenticatorTest to use existing Members based on their unique_identifier_field (if existing) to accommodate recent Member->onBeforeWrite() changes (see r100705) (from r100723) (Ingo Schommer) + * 2010-05-25 [53ed23d](https://github.com/silverstripe/sapphire/commit/53ed23d) If fixture file is NULL don't cause the test framework to break down because of it (from r100548) (Ingo Schommer) + * 2010-05-25 [4e87fb5](https://github.com/silverstripe/sapphire/commit/4e87fb5) get TreeMultiselectField working with an array of items, rather than a relation. (from r100525) (Ingo Schommer) + * 2010-05-25 [731720d](https://github.com/silverstripe/sapphire/commit/731720d) #5012 BasicAuth should check if there's already a current member logged in before asking for a login/password (from r100466) (Ingo Schommer) + * 2010-05-25 [28f80b8](https://github.com/silverstripe/sapphire/commit/28f80b8) #5121 Fixed cache flushing for FieldSet when removing fields - thanks paradigmincarnate! (from r100417) (Ingo Schommer) + * 2010-05-25 [d8478a8](https://github.com/silverstripe/sapphire/commit/d8478a8) SQL Error is a member is not part of any groups (from r100053) (Ingo Schommer) + * 2010-04-21 [d565c50](https://github.com/silverstripe/silverstripe-cms/commit/d565c50) Fixed overflow settings in jQuery.fitheighttoparent (Ingo Schommer) + * 2010-04-14 [e67c8d8](https://github.com/silverstripe/sapphire/commit/e67c8d8) Setting ID = -1 on Security/lostpassword to avoid showing toplevel navigation (see #5086) (from r99479) (Ingo Schommer) + * 2010-04-14 [568f0d3](https://github.com/silverstripe/sapphire/commit/568f0d3) Fixed MoneyField constructor - parent (FormField) constructor calls setValue() already, which needs to happen *after* setting certain field instances (from r99391) (Ingo Schommer) + * 2010-04-14 [c1f227b](https://github.com/silverstripe/sapphire/commit/c1f227b) Enforcing creation of temp database in SapphireTest->setUp() to avoid writing to production databases. This check should only kick in for single test case runs, as the temp database connection should be set in a dev/tests/all run after the first db-related test anyway. (see #5034) (from r99342) (Ingo Schommer) + * 2010-04-14 [a9c9aae](https://github.com/silverstripe/sapphire/commit/a9c9aae) use proper quotes for sep (from r96401) (from r99100) (Ingo Schommer) + * 2010-04-14 [3914952](https://github.com/silverstripe/sapphire/commit/3914952) Development server list should be retained when user submits installer form and gets redirected back (from r99005) (Ingo Schommer) + * 2010-04-14 [45c5163](https://github.com/silverstripe/sapphire/commit/45c5163) fix for #5076 (from r98957) (Ingo Schommer) + * 2010-04-14 [5049a87](https://github.com/silverstripe/sapphire/commit/5049a87) Fixed strpos() check in BASE_URL check (from r98897) (Ingo Schommer) + * 2010-04-14 [0a5321d](https://github.com/silverstripe/sapphire/commit/0a5321d) Installer now opens if mod_rewrite is disabled. Using index.php instead of rewriting the URL didn't quite work with the new BASE_URL, so we need to take this case into account as well (from r98895) (Ingo Schommer) + * 2010-04-14 [bf01c28](https://github.com/silverstripe/sapphire/commit/bf01c28) Fixed big problem on Windows when redirecting to install.php - because of SCRIPT_NAME backslashes caused a bit of havoc and need special treatment (from r98869) (Ingo Schommer) + * 2010-04-14 [081b05b](https://github.com/silverstripe/sapphire/commit/081b05b) Checkbox for overriding the install from environment now checks for the file existance properly (from r98688) (Ingo Schommer) + * 2010-04-14 [2ba7b18](https://github.com/silverstripe/sapphire/commit/2ba7b18) Fixed initial state of "use environment" checkbox in installer (from r98678) (Ingo Schommer) + * 2010-04-14 [bfb10b8](https://github.com/silverstripe/sapphire/commit/bfb10b8) Fixed missing third argument to ComplexTableField_Item when the parent class instantiates it (from r98448) (Ingo Schommer) + * 2010-04-13 [7f063a9](https://github.com/silverstripe/silverstripe-cms/commit/7f063a9) Fixed widgets not being clickable to use them in IE (from r97545) (Ingo Schommer) + * 2010-04-13 [03bbc1d](https://github.com/silverstripe/silverstripe-cms/commit/03bbc1d) Clicking available widgets now applies only to h3 elements BUGFIX Widgets are now prepended to the available widget stack by use of Insertion.Top (from r97541) (Ingo Schommer) + * 2010-04-13 [86f7525](https://github.com/silverstripe/silverstripe-cms/commit/86f7525) When adding a new widget by clicking one of the available widgets, add it to the top of the currently used widgets instead of the bottom (from r97522) (Ingo Schommer) + * 2010-04-13 [869e1d7](https://github.com/silverstripe/silverstripe-cms/commit/869e1d7) Fixed incorrect lables "TOADD" etc in WidgetAreaEditor (from r97507) (Ingo Schommer) + * 2010-04-13 [af2f81e](https://github.com/silverstripe/silverstripe-cms/commit/af2f81e) Setting 'Locale' as HiddenField in CMSMain->getEditForm() to support translatable SiteConfig records (see r97370, #4770) (from r97472) (Ingo Schommer) + * 2010-04-13 [afd8faf](https://github.com/silverstripe/silverstripe-cms/commit/afd8faf) #4857 Fixed potential bug where a file would just be uploaded to a random folder, also files can now be uploaded to the assets root properly (from r96993) (Ingo Schommer) + * 2010-04-13 [dc21cb9](https://github.com/silverstripe/sapphire/commit/dc21cb9) Fixed Hierarchy->loadDescendantIdList() to call setOwner() on the extension instance. This was necessary due to underlying Object/Extension changes in 2.4. MINOR Fixed HierarchyTest assertions around including grand children counts (from r98403) (Ingo Schommer) + * 2010-04-13 [7086e7d](https://github.com/silverstripe/sapphire/commit/7086e7d) Fixed ContentController->deleteinstallfiles (added to $allowed_actions, see #5040) (from r98324) (Ingo Schommer) + * 2010-04-13 [9fdc7cb](https://github.com/silverstripe/sapphire/commit/9fdc7cb) Don't allow translations of VirtualPage (until we can reliably copy data between locales) (see #5000) (from r98217) (Ingo Schommer) + * 2010-04-13 [19f5666](https://github.com/silverstripe/sapphire/commit/19f5666) pagination was being applied (with a limit of NULL) to print and export actions. This was due to $_REQUEST['methodname'] not existing. (from r97114) (from r98152) (Ingo Schommer) + * 2010-04-13 [64da35b](https://github.com/silverstripe/sapphire/commit/64da35b) TreeMultiselectField_Readonly now posts the correct value to the server (from r97100) (from r98150) (Ingo Schommer) + * 2010-04-13 [be4c42f](https://github.com/silverstripe/sapphire/commit/be4c42f) still use the correct methods to get a value, even if we're generating a CSV ($xmlSafe = false) (from r96212) (from r98136) (Ingo Schommer) + * 2010-04-13 [6c0efa6](https://github.com/silverstripe/sapphire/commit/6c0efa6) Allowing translations of VirtualPage by not copying over original Locale property (see #5000) (from r97912) (Ingo Schommer) + * 2010-04-13 [48bd1ff](https://github.com/silverstripe/sapphire/commit/48bd1ff) If a Group doesn't have any specific TRANSLATE_<locale> edit rights, but has general CMS access (CMS_ACCESS_CMSMain, CMS_ACCESS_LeftAndMain, ADMIN), then assign TRANSLATE_ALL permissions as a default. Necessary to avoid locking out CMS editors from their default language (see #4940 and 4941) (from r97911) (Ingo Schommer) + * 2010-04-13 [930b051](https://github.com/silverstripe/sapphire/commit/930b051) Checking that URL controller in HTTPRequest->match() is a subclass of Controller, not RequestHandler (which would include nested controllers like Form or FormField subclasses that shouldn't be accessible on their own toplevel URL namespace) (from r97881) (Ingo Schommer) + * 2010-04-12 [051878c](https://github.com/silverstripe/sapphire/commit/051878c) Fixed NumericField->jsValidation(), now accepts negative numbers, making it more like the equivalent phpValidation(), which is using is_numeric() (see #4874, thanks Allisone) (from r97482) (Ingo Schommer) + * 2010-04-12 [43ff00e](https://github.com/silverstripe/sapphire/commit/43ff00e) Enforcing creation of temp database in SapphireTest->setUp() to avoid writing to production databases. This check should only kick in for single test case runs, as the temp database connection should be set in a dev/tests/all run after the first db-related test anyway. (see #5034) (from r99342) (Ingo Schommer) + * 2010-04-12 [36dbefe](https://github.com/silverstripe/sapphire/commit/36dbefe) Fixed URLSegment access for translated homepages in SiteTree->RelativeLink (#4781, thanks martijn) (from r97211) (Ingo Schommer) + * 2010-04-12 [c726569](https://github.com/silverstripe/sapphire/commit/c726569) Version field weird'ed up rollback functionality (from r89464) (from r96715) (Ingo Schommer) + * 2010-04-12 [bf57bee](https://github.com/silverstripe/sapphire/commit/bf57bee) #4140 When clicking a tree node that was just dragged, "Stack overflow" error would be given in IE. Firebug would report "Too much recursion" (from r95973) (Ingo Schommer) + * 2010-03-09 [129ab60](https://github.com/silverstripe/silverstripe-cms/commit/129ab60) Unsetting 'ID' parameter in MemberTableField->addtogroup() to avoid confusion between Group and Member records (regression from r100716) (Ingo Schommer) + * 2010-03-09 [4eed136](https://github.com/silverstripe/silverstripe-cms/commit/4eed136) Fixed MemberTableField->addtogroup() to fetch existing Member records by ID or $unique_identifier_field instead of relying on the (now removed) "auto-merging" in Member->onBeforeWrite() (see r100705) (Ingo Schommer) + * 2010-03-09 [f4e284a](https://github.com/silverstripe/sapphire/commit/f4e284a) Fixing Member_ProfileForm to validate for existing members via Member_Validator to avoid CMS users to switch to another existing user account by using their email address (Ingo Schommer) + * 2010-02-25 [0b1fc5b](https://github.com/silverstripe/sapphire/commit/0b1fc5b) Quoting keys in JSONDataFormatter to ensure valid JSON (#5119) (Ingo Schommer) + * 2010-02-23 [7e6dfe1](https://github.com/silverstripe/silverstripe-cms/commit/7e6dfe1) Fixed MemberTableField limiting of , wasnt taking children groups into account (regression from r99684) (Ingo Schommer) + * 2010-02-23 [a9f8d55](https://github.com/silverstripe/silverstripe-cms/commit/a9f8d55) Falling back to currentPageID() in SecurityAdmin->getEditForm() to allow actions like MemberTableField->export() to pass the group ID as a POST parameter instead (Ingo Schommer) + * 2010-02-23 [fa04f03](https://github.com/silverstripe/silverstripe-cms/commit/fa04f03) Setting ID explicitly in MemberTableField-> to ensure getCsvQuery() correctly filters (the custom group filter was only implemented in sourceItems() before) (Ingo Schommer) + * 2010-02-22 [ae844c5](https://github.com/silverstripe/silverstripe-cms/commit/ae844c5) Changed sitetree default selection in LeftAndMain.Tree.js to fire on window.load instead of document.ready() through entwine. We need to ensure behaviour.js bindings are available before BUGFIX Automatically selecting root node in CMS trees (necessary because now we actually have forms on the root node, and its a valid click target) (Ingo Schommer) + * 2010-02-22 [fcfccf6](https://github.com/silverstripe/sapphire/commit/fcfccf6) Fixed TreeMultiselectField/TreeDropdownField saving with 'unchanged' default values from constructor (Ingo Schommer) + * 2010-02-12 [e26158c](https://github.com/silverstripe/sapphire/commit/e26158c) Fixed TreeMultiselectField->Field() to respect settings, and give them priority over existing relations through getItems(). This is used in MemberTableField to set default groups for 'add member' popups. (Ingo Schommer) + * 2010-02-12 [13d744e](https://github.com/silverstripe/sapphire/commit/13d744e) Added missing Requirements to TreeDropdownField->Field() and TreeMultiSelect->Field() (merged and modified from r98852) (Ingo Schommer) + * 2010-02-11 [2fc2d72](https://github.com/silverstripe/sapphire/commit/2fc2d72) Fixed DataObject->fieldLabels() to respect flag (Ingo Schommer) + * 2010-01-18 [5cd476c](https://github.com/silverstripe/silverstripe-cms/commit/5cd476c) Attribute escaping in PageCommentInterface_singlecomment.ss (Ingo Schommer) + * 2009-12-16 [05147ff](https://github.com/silverstripe/silverstripe-cms/commit/05147ff) #4847 Fixed ComplexTableField undefined in IE8 when opening a CTF popup in the Security section of the CMS (from r95091) (Sean Harvey) + * 2009-12-16 [e3e41a6](https://github.com/silverstripe/silverstripe-cms/commit/e3e41a6) #4848 Fixed ComplexTableField undefined error in IE8 when it is not available (from r95088) (Sean Harvey) + * 2009-12-16 [b52e49d](https://github.com/silverstripe/sapphire/commit/b52e49d) ComplexTableField - fixed sprintf() not enough arguments when the referrer has a % character in it, the referrer is now an argument instead of being hardcoded in the string (from r95093) (Sean Harvey) + * 2009-12-16 [b1bf03f](https://github.com/silverstripe/sapphire/commit/b1bf03f) #4848 FileIFrameField visual problem where the preview image is hidden if the TreeDropdownField gets too long for selecting a file (from r95084) (Sean Harvey) + * 2009-12-16 [f7dfa4d](https://github.com/silverstripe/sapphire/commit/f7dfa4d) Fixed undefined calls to URL() in SimpleImageField, replacing them with getURL() instead (from r94301) (Sean Harvey) + * 2009-12-16 [b39b85f](https://github.com/silverstripe/sapphire/commit/b39b85f) #4661 Fix SS temporary directory bug with Windows environments - the directory would always be "silverstripe-cache" instead of a namespaced one so that multiple SS sites don't conflict with eachother (from r94134) (Sean Harvey) + * 2009-12-16 [ed63022](https://github.com/silverstripe/sapphire/commit/ed63022) Modulus and MultipleOf should start at index 0 to match the iterator position, by default (from r94071) (Sean Harvey) + * 2009-12-16 [7377010](https://github.com/silverstripe/sapphire/commit/7377010) fixed reference to incorrect class (from r94061) (Sean Harvey) + * 2009-12-14 [103ebbb](https://github.com/silverstripe/sapphire/commit/103ebbb) Escaping Translatable->MetaTags() (#4826, thanks juanparati) (Ingo Schommer) + * 2009-11-30 [34d7b24](https://github.com/silverstripe/silverstripe-cms/commit/34d7b24) Removed code that relied on deprecated functions in MemberTableField (from r93707) (Ingo Schommer) + * 2009-11-30 [8ccbedc](https://github.com/silverstripe/sapphire/commit/8ccbedc) Fixed SearchContextTest failure (from r93777) (Ingo Schommer) + * 2009-11-30 [22bc682](https://github.com/silverstripe/sapphire/commit/22bc682) Fixed drag link event handling on ComplexTableField.js (#4737) (from r93754) (Ingo Schommer) + * 2009-11-27 [55f5cb6](https://github.com/silverstripe/sapphire/commit/55f5cb6) Fixed dev/build not redirecting properly on first install of SS website on IIS (from r93259) (Sean Harvey) + * 2009-11-27 [cef45bb](https://github.com/silverstripe/sapphire/commit/cef45bb) Fixed newlines for Windows when logging errors in LogErrorFileFormatter (from r93161) (Sean Harvey) + * 2009-11-27 [f3db094](https://github.com/silverstripe/sapphire/commit/f3db094) Escaping sprintf() arguments in ComplexTableField to avoid extraneous % characters in a referrer URL messing up the sprintf() invocation (Ingo Schommer) + * 2009-11-21 [2c7e4c1](https://github.com/silverstripe/silverstripe-cms/commit/2c7e4c1) Fixed 'add member' popup in SecurityAdmin (Ingo Schommer) + * 2009-11-21 [990ae9f](https://github.com/silverstripe/silverstripe-cms/commit/990ae9f) Fixed CMSMain.js search clearing logic, wasnt clearing the first field properly. Fixed LeftAndMain->getsubtree() filtering in AssetAdmin and SecurityAdmin. (Ingo Schommer) + * 2009-11-21 [0df7de0](https://github.com/silverstripe/silverstripe-cms/commit/0df7de0) Using getRecord() in LeftAndMain->getEditForm(), passing through ID request params from getitem() (Ingo Schommer) + * 2009-11-21 [d732ee4](https://github.com/silverstripe/silverstripe-cms/commit/d732ee4) Don't invoke statusMessage() in LeftAndMain.EditForm.js form save callbacks, its already handled in LeftAndMain.js for global ajax completion callbacks (Ingo Schommer) + * 2009-11-21 [0c52d36](https://github.com/silverstripe/silverstripe-cms/commit/0c52d36) Fixed undefined variable in CMSMain (Ingo Schommer) + * 2009-11-21 [45c31da](https://github.com/silverstripe/silverstripe-cms/commit/45c31da) Re-added session-based ID setting in LeftAndMain, it was necessary to for nested controllers like TableListField form fields (Ingo Schommer) + * 2009-11-21 [97ece94](https://github.com/silverstripe/silverstripe-cms/commit/97ece94) Fixed AssetAdmin->doUpload() javascript callbacks (Ingo Schommer) + * 2009-11-21 [9504fc1](https://github.com/silverstripe/silverstripe-cms/commit/9504fc1) Removed LeftAndMain.js requirement from AssetAdmin->uploadIframe(), unclear why its needed, and it breaks due to missing jquery/concrete dependencies (Ingo Schommer) + * 2009-11-21 [69f8bc5](https://github.com/silverstripe/silverstripe-cms/commit/69f8bc5) Fixed iframe removal javascript in LeftAndMain.EditForm.js (Ingo Schommer) + * 2009-11-21 [df46717](https://github.com/silverstripe/silverstripe-cms/commit/df46717) Fixed ClassName change detection in javascript (Ingo Schommer) + * 2009-11-21 [4decff9](https://github.com/silverstripe/silverstripe-cms/commit/4decff9) Fixed resizing problem with LeftAndMain.js->resizeChildren() caused by jQuery UI tabs and FOUC (Ingo Schommer) + * 2009-11-21 [e22fdb9](https://github.com/silverstripe/silverstripe-cms/commit/e22fdb9) Defaulting to current page ID in CMSMain->EditForm() (Ingo Schommer) + * 2009-11-21 [8b88bb7](https://github.com/silverstripe/silverstripe-cms/commit/8b88bb7) Re-initializing tabs in LeftAndMain.EditForm.js in order to get the correct height for resizeChildren() (Ingo Schommer) + * 2009-11-21 [d3172a0](https://github.com/silverstripe/silverstripe-cms/commit/d3172a0) Hiding LeftAndMain editform while loading new DOM through ajax, to avoid flash-of-unstyled-content issues (Ingo Schommer) + * 2009-11-21 [7580483](https://github.com/silverstripe/silverstripe-cms/commit/7580483) Only resizing form in LeftAndMain after showing tabs, to ensure we get the right dimensions. Concrete was applying the tabs styling too late and in an async fashion, so we cant use it here. (Ingo Schommer) + * 2009-11-21 [708f80a](https://github.com/silverstripe/silverstripe-cms/commit/708f80a) Fixed locale GET parameter concatenation in language selector javascript for the CMS (Ingo Schommer) + * 2009-11-21 [2678507](https://github.com/silverstripe/silverstripe-cms/commit/2678507) Don't reload the tree node if it is currently in selection-mode (in LeftAndMain_left.js) (Ingo Schommer) + * 2009-11-21 [5855dfe](https://github.com/silverstripe/silverstripe-cms/commit/5855dfe) Fixed onsubmit() concrete handlers in LeftAndMain.EditForm.js (Ingo Schommer) + * 2009-11-21 [351f2fd](https://github.com/silverstripe/silverstripe-cms/commit/351f2fd) Disabling horizontal overflow on tree with long node names in cms_left.css (Ingo Schommer) + * 2009-11-21 [ffb6790](https://github.com/silverstripe/silverstripe-cms/commit/ffb6790) Fixed duplicated 'confirm save' message in changetracker logic for LeftAndMain.EditForm.js (Ingo Schommer) + * 2009-11-21 [4c5e847](https://github.com/silverstripe/silverstripe-cms/commit/4c5e847) Fixes to CMS EditForm javascript change tracking and event triggering (Ingo Schommer) + * 2009-11-21 [f267dac](https://github.com/silverstripe/silverstripe-cms/commit/f267dac) Updated jquery.changetracker behaviour in LeftAndMain javascript to properly respond to window.onbeforeunload events (Ingo Schommer) + * 2009-11-21 [55ed72d](https://github.com/silverstripe/silverstripe-cms/commit/55ed72d) Made CMSMain.js EditForm concrete rule more specifc, to avoid problems with super() (Ingo Schommer) + * 2009-11-21 [54a7beb](https://github.com/silverstripe/silverstripe-cms/commit/54a7beb) Fixed fieldSelector logic in jquery.changetracker MINOR Fixed removeData() invocation in jquery.changetracker MINOR Removed debug code in jquery.changetracker (Ingo Schommer) + * 2009-11-21 [4726893](https://github.com/silverstripe/silverstripe-cms/commit/4726893) Adjusted WidgetAreaEditor javascript to new event names triggered by CMS forms (Ingo Schommer) + * 2009-11-21 [1bac2dc](https://github.com/silverstripe/silverstripe-cms/commit/1bac2dc) Fixed ParentType selector javascript in SiteTree->getCMSFields() (Ingo Schommer) + * 2009-11-21 [21160c6](https://github.com/silverstripe/silverstripe-cms/commit/21160c6) Fixed _setupPinging() javascript logic to comply to jQuery callback arguments (Ingo Schommer) + * 2009-11-21 [fef02e8](https://github.com/silverstripe/silverstripe-cms/commit/fef02e8) Changed TreeNodeAPI->setNodeIcon() javascript to not require the old classname to replace. All PHP classnames stored in CSS class strings now have the prefix 'class-' which makes them easy to detect without context (Ingo Schommer) + * 2009-11-21 [371abfd](https://github.com/silverstripe/silverstripe-cms/commit/371abfd) Monitoring form for locale changes in CMSMain.Translatable.js (Ingo Schommer) + * 2009-11-21 [b904136](https://github.com/silverstripe/silverstripe-cms/commit/b904136) Ensuring the padding rules for loading indicators in CMS action buttons are properly applied (Ingo Schommer) + * 2009-11-21 [bb6f4a9](https://github.com/silverstripe/silverstripe-cms/commit/bb6f4a9) Clearing field containers instead of just input fields in Tree Search javascript (Ingo Schommer) + * 2009-11-21 [6f2c919](https://github.com/silverstripe/silverstripe-cms/commit/6f2c919) Fixed jQuery assignments in Form_TreeFilterForm javascript (Ingo Schommer) + * 2009-11-21 [5173dc4](https://github.com/silverstripe/silverstripe-cms/commit/5173dc4) Added TabSet.js and ui.tabs dependency to LeftAndMain class (Ingo Schommer) + * 2009-11-21 [b7f0b40](https://github.com/silverstripe/silverstripe-cms/commit/b7f0b40) Fixed z-index of jquery.datepicker DIV element, which was hidden under the jquery.layout panels (Ingo Schommer) + * 2009-11-21 [8db33cc](https://github.com/silverstripe/silverstripe-cms/commit/8db33cc) Fixed ui.tabs saving into cookies in LeftAndMain.js and CMSMain.js (Ingo Schommer) + * 2009-11-21 [0935da6](https://github.com/silverstripe/silverstripe-cms/commit/0935da6) Fixed tree search reloading when all fields are cleared MINOR Documentation and refactoring for tree search javascript (Ingo Schommer) + * 2009-11-21 [8bc867c](https://github.com/silverstripe/silverstripe-cms/commit/8bc867c) Inclusing reset buttons in LeftAndMain jQuery styling (Ingo Schommer) + * 2009-11-21 [8b11599](https://github.com/silverstripe/sapphire/commit/8b11599) Ensuring ParentID is numeric in File->setParentID() (Ingo Schommer) + * 2009-11-21 [16f69c3](https://github.com/silverstripe/sapphire/commit/16f69c3) Fixed Folder singular/plural name i18n by overloading the statics inherited from File class (Ingo Schommer) + * 2009-11-21 [0231e8b](https://github.com/silverstripe/sapphire/commit/0231e8b) Fixed CalendarDateField.js concrete definition (Ingo Schommer) + * 2009-11-21 [b930fbf](https://github.com/silverstripe/sapphire/commit/b930fbf) Setting cookie name in TabSet.js to avoid writing new cookies with arbitrary identifiers on every page load (Ingo Schommer) + * 2009-11-21 [0808b16](https://github.com/silverstripe/sapphire/commit/0808b16) Extending $ for namespaced closures in jquery.concrete to allow for native jQuery calling through $ placeholder (Ingo Schommer) + * 2009-11-21 [863807a](https://github.com/silverstripe/sapphire/commit/863807a) Setting tinymce spellchecker rpc URL via HtmlEditorConfig rather than patching it into the plugin sourcecode (Ingo Schommer) + * 2009-11-21 [396a25b](https://github.com/silverstripe/sapphire/commit/396a25b) Renamed property "queue" to "ondemand_queue" to make compatible with jQuery 1.3 (Ingo Schommer) + * 2009-11-21 [ac9ed43](https://github.com/silverstripe/silverstripe-cms/commit/ac9ed43) FolderID was not present in post, so file would not be uploaded to the correct place. (from r91958) (Ingo Schommer) + * 2009-11-21 [7f65395](https://github.com/silverstripe/silverstripe-cms/commit/7f65395) Fixed PageComment boolean operators in WHERE SQL clauses that break MSSQL (from r91444) (Ingo Schommer) + * 2009-11-21 [abb04b2](https://github.com/silverstripe/sapphire/commit/abb04b2) Fixed newlines working properly across different platforms - Windows, for example, won't work properly with just \n so use PHP_EOL for a cross-platform solution MINOR Fixed appropriate failing tests to use PHP_EOL (from r92220) (Ingo Schommer) + * 2009-11-19 [60ff89d](https://github.com/silverstripe/silverstripe-installer/commit/60ff89d) Fixed $ escaping in passwords set by install.php in _config.php (#4676) (from r90883) (ischommer) + * 2009-11-19 [27c046a](https://github.com/silverstripe/silverstripe-installer/commit/27c046a) #4356 Removed string checking of PHP version and replaced with version_compare() in SS installer (from r81646) (ischommer) + * 2009-11-13 [6f14e76](https://github.com/silverstripe/sapphire/commit/6f14e76) Added deleteinstallfiles to $allowed_actions in ContentController (#4701) (Ingo Schommer) + * 2009-11-12 [03fb434](https://github.com/silverstripe/sapphire/commit/03fb434) MigrateSiteTreeLinkingTask returns duplicate results from databases like MSSQL - remove any duplicates that may be around (from r91418) (Sean Harvey) + * 2009-11-12 [2daf849](https://github.com/silverstripe/sapphire/commit/2daf849) Disabling security token in HtmlEditorField->FlashForm(), its not passed in by the ajax request (Ingo Schommer) + * 2009-11-09 [b3d4ca3](https://github.com/silverstripe/sapphire/commit/b3d4ca3) Added setup/teardown methods to SiteTreeBrokenLinksTest to make it work with Translatable enabled (Ingo Schommer) + * 2009-11-09 [e567b47](https://github.com/silverstripe/sapphire/commit/e567b47) Returning TRUE on Translatable->hasTranslation() if called on a record that is in the current locale (Ingo Schommer) + * 2009-11-06 [7b7d11d](https://github.com/silverstripe/sapphire/commit/7b7d11d) Added ContentController->successfullyinstalled() to $allowed_actions (from r90876) (Sam Minnee) + +### Minor changes + + * 2011-05-01 [e33576d](https://github.com/silverstripe/silverstripe-cms/commit/e33576d) Grouping date search fields in CMSMain->SearchForm (Ingo Schommer) + * 2011-04-30 [4f157e3](https://github.com/silverstripe/silverstripe-cms/commit/4f157e3) Fixed CreateToplevelGroups toggling in CMSMain.EditForm.js (Ingo Schommer) + * 2011-04-30 [1486bb0](https://github.com/silverstripe/sapphire/commit/1486bb0) Rendering DateField instances with button by default in CMS (Ingo Schommer) + * 2011-04-30 [ea7a6ff](https://github.com/silverstripe/sapphire/commit/ea7a6ff) Adding (optional) Compass_RebuildDecorator to LeftAndMain in order to rebuild admin stylesheets dynamically (Ingo Schommer) + * 2011-04-30 [bf8bc1d](https://github.com/silverstripe/silverstripe-cms/commit/bf8bc1d) Added CMSPageHistoryController, CMSPageReportsController, marked placeholders for new functionality in AssetAdmin (Ingo Schommer) + * 2011-04-30 [330255d](https://github.com/silverstripe/sapphire/commit/330255d) Fixed Member_ProfileForm styling, inlining into _style.css. Misc style fixes (Ingo Schommer) + * 2011-04-30 [5fc816f](https://github.com/silverstripe/sapphire/commit/5fc816f) Fixed panel styling for TreeDropdownField (Ingo Schommer) + * 2011-04-30 [b8ecc0c](https://github.com/silverstripe/sapphire/commit/b8ecc0c) Removed unnecessary headers from Member->getCMSFields() (Ingo Schommer) + * 2011-04-28 [51ba790](https://github.com/silverstripe/silverstripe-cms/commit/51ba790) Correct stage URL in CMSMain->EditForm (Ingo Schommer) + * 2011-04-27 [afa05f9](https://github.com/silverstripe/sapphire/commit/afa05f9) Background color fallbacks for IE (no gradient support) (Ingo Schommer) + * 2011-04-25 [dc2a120](https://github.com/silverstripe/sapphire/commit/dc2a120) Moved HTMLEditorField dialog title to jQuery UI compatible form attribute (Ingo Schommer) + * 2011-04-25 [43491c2](https://github.com/silverstripe/sapphire/commit/43491c2) Reducing number of asset downloads by combining files in LeftAndMain->init() and including full jquery.ui.css instead of multiple @import statements (Ingo Schommer) + * 2011-04-25 [2d88b53](https://github.com/silverstripe/silverstripe-cms/commit/2d88b53) Combining JavaScript files for CMSMain (Ingo Schommer) + * 2011-04-24 [663c49c](https://github.com/silverstripe/sapphire/commit/663c49c) Added temporary 'preview' header (Ingo Schommer) + * 2011-04-24 [2291d64](https://github.com/silverstripe/sapphire/commit/2291d64) Disabled "welcome" message in LeftAndMain->RootForm() (Ingo Schommer) + * 2011-04-24 [5bd35f7](https://github.com/silverstripe/sapphire/commit/5bd35f7) Moved LeftAndMain_EditForm.ss to templates/Includes/ in order to keep same template specificity as overloaded templates (Ingo Schommer) + * 2011-04-24 [035b68f](https://github.com/silverstripe/sapphire/commit/035b68f) Misc style improvements around batch actions and content tools display (Ingo Schommer) + * 2011-04-24 [94cb307](https://github.com/silverstripe/silverstripe-cms/commit/94cb307) Removed unused CMSMain_TreeTools.ss and CMSMain_left.ss templates (Ingo Schommer) + * 2011-04-22 [2c6e0c2](https://github.com/silverstripe/sapphire/commit/2c6e0c2) Adapted CMS batch actions form to work outside of tabset context (Ingo Schommer) + * 2011-04-22 [b08fc52](https://github.com/silverstripe/sapphire/commit/b08fc52) Wrapping cms-content-header <div> in order to provide overflows without line breaks (Ingo Schommer) + * 2011-04-22 [5a0208d](https://github.com/silverstripe/silverstripe-cms/commit/5a0208d) Wrapping cms-content-header <div> in order to provide overflows without line breaks (Ingo Schommer) + * 2011-04-22 [be6f56a](https://github.com/silverstripe/silverstripe-cms/commit/be6f56a) Removed unused CMSActionOptionsForm (Ingo Schommer) + * 2011-04-22 [b5a0c1c](https://github.com/silverstripe/silverstripe-cms/commit/b5a0c1c) Removed unnecessary (and unsemantic) element classes from forms in AssetAdmin and CMSMain (Ingo Schommer) + * 2011-04-22 [f0f7f8a](https://github.com/silverstripe/sapphire/commit/f0f7f8a) Removed unnecessary 'actionsparams' class from LeftAndMain forms (Ingo Schommer) + * 2011-04-22 [d21dce0](https://github.com/silverstripe/sapphire/commit/d21dce0) Documentation around new CSS conventions in CMS and layout panel customizations (Ingo Schommer) + * 2011-04-22 [be68450](https://github.com/silverstripe/sapphire/commit/be68450) Allowing NULL returns from getRecord() in LeftAndMain->getSiteTreeFor() (Ingo Schommer) + * 2011-04-21 [51c0228](https://github.com/silverstripe/sapphire/commit/51c0228) Moved edit-form specific jstree logic to LeftAndMain.EditForm.js (Ingo Schommer) + * 2011-04-19 [a527172](https://github.com/silverstripe/sapphire/commit/a527172) Added add.gif (Ingo Schommer) + * 2011-04-19 [1a9441f](https://github.com/silverstripe/sapphire/commit/1a9441f) Removed jquery.fitheighttoparent from LeftAndMain->init(), handled by layout manager now (Ingo Schommer) + * 2011-04-19 [98f5606](https://github.com/silverstripe/sapphire/commit/98f5606) Removed scriptaculous dependency from TableField and TableListField, added jQuery dependency (Ingo Schommer) + * 2011-04-19 [53a62e7](https://github.com/silverstripe/silverstripe-cms/commit/53a62e7) Moved 'access' field labels in SiteConfig->getCMSFields() and SiteTree->getCMSFields() from headlines to actual label elements in order to manage presentation easier (Ingo Schommer) + * 2011-04-19 [91fbcf8](https://github.com/silverstripe/silverstripe-cms/commit/91fbcf8) Added SASS files (Ingo Schommer) + * 2011-04-19 [895b981](https://github.com/silverstripe/sapphire/commit/895b981) Using jQuery ajax methods in AssetTableField and MemberTableField (instead of the prototype library functions which are not fully compatible with jQuery.ondemand at the moment). Fixed TableListField.js errors. (Ingo Schommer) + * 2011-04-19 [baa0c8a](https://github.com/silverstripe/silverstripe-cms/commit/baa0c8a) Fixed Hierarchy extension detection in AssetAdmin->doAdd() (Ingo Schommer) + * 2011-04-19 [b9fc626](https://github.com/silverstripe/silverstripe-cms/commit/b9fc626) Removed CommentTableField, moved to page-comments module (Ingo Schommer) + * 2011-04-19 [3c54434](https://github.com/silverstripe/sapphire/commit/3c54434) Making canEdit() method optional on objects handled by LeftAndMain subclasses (Ingo Schommer) + * 2011-04-19 [1ae9a31](https://github.com/silverstripe/silverstripe-cms/commit/1ae9a31) Changed ReportAdmin to new ReportAdmin_Content template, viewing available reports as unordered list instead of a tree (they can't be nested anyway) (Ingo Schommer) + * 2011-04-19 [5bd43af](https://github.com/silverstripe/sapphire/commit/5bd43af) Removed color/background information from ComplexTableField.css and TableListField.css (Ingo Schommer) + * 2011-04-19 [38bc2a9](https://github.com/silverstripe/sapphire/commit/38bc2a9) Removed unused SecurityAdmin.Tree.js (Ingo Schommer) + * 2011-04-17 [d48f21a](https://github.com/silverstripe/silverstripe-cms/commit/d48f21a) Renamed #sitetree_ul to .cms-tree in JavaScript logic (changed in LeftAndMain.ss base template) (Ingo Schommer) + * 2011-04-17 [8bee7a1](https://github.com/silverstripe/silverstripe-cms/commit/8bee7a1) Added markup semantics around constructive/destructive actions to SiteTree->getCMSActions() (Ingo Schommer) + * 2011-04-17 [614fb06](https://github.com/silverstripe/silverstripe-cms/commit/614fb06) AssetAdmin support for new cms layout changes (Ingo Schommer) + * 2011-04-17 [a2b39e5](https://github.com/silverstripe/sapphire/commit/a2b39e5) Removed unnecessary "type" field from LeftAndMain->AddForm(), added generic styles for buttons (Ingo Schommer) + * 2011-04-17 [f4cb6ae](https://github.com/silverstripe/sapphire/commit/f4cb6ae) Renamed #sitetree_ul to .cms-tree in templates, removed #sitetree from contained <ul> (unnecessary duplication) (Ingo Schommer) + * 2011-04-16 [7bee470](https://github.com/silverstripe/sapphire/commit/7bee470) Updated jquery-metadata to v2.1 (removed piston as the release is not contained in the canonical git repo) (Ingo Schommer) + * 2011-04-16 [bb4dbaa](https://github.com/silverstripe/silverstripe-cms/commit/bb4dbaa) Removed unused CMSMain_rightbottom.ss (Ingo Schommer) + * 2011-04-16 [87bdb0d](https://github.com/silverstripe/sapphire/commit/87bdb0d) Removed unused LeftAndMain_rightbottom.ss (Ingo Schommer) + * 2011-04-15 [53ed7c4](https://github.com/silverstripe/silverstripe-cms/commit/53ed7c4) Disallow nested ErrorPage instances via canAddChildren() (Ingo Schommer) + * 2011-04-15 [6dbfd5f](https://github.com/silverstripe/sapphire/commit/6dbfd5f) Renaming <div id="contentPanel"> to "cms-editor-dialogs" (Ingo Schommer) + * 2011-04-15 [dafb93f](https://github.com/silverstripe/sapphire/commit/dafb93f) Moved loading screen above layout initialization to avoid FOUC in LeftAndMain.js (Ingo Schommer) + * 2011-04-15 [f2f6ecc](https://github.com/silverstripe/sapphire/commit/f2f6ecc) Hardcoding jstree CSS url to avoid loading non-existant CSS files via ajax (through jstree library) (Ingo Schommer) + * 2011-04-14 [e4031aa](https://github.com/silverstripe/silverstripe-installer/commit/e4031aa) Using QSA RewriteRule flag in .htaccess instead of manually appending (fixes #6593, thanks smares) (Ingo Schommer) + * 2011-04-14 [85386b4](https://github.com/silverstripe/sapphire/commit/85386b4) Changed logo wording (Ingo Schommer) + * 2011-04-14 [cdb263e](https://github.com/silverstripe/sapphire/commit/cdb263e) Added jquery.sizes library (Ingo Schommer) + * 2011-04-14 [578f0ee](https://github.com/silverstripe/sapphire/commit/578f0ee) Removed unnecessary jlayout examples (Ingo Schommer) + * 2011-04-14 [253f90f](https://github.com/silverstripe/sapphire/commit/253f90f) Added jlayout dependency (Ingo Schommer) + * 2011-04-07 [470a284](https://github.com/silverstripe/silverstripe-cms/commit/470a284) Removed redundant allowedParents information from siteTreeHints, already contained in allowedChildren (Ingo Schommer) + * 2011-04-06 [fcca1d4](https://github.com/silverstripe/sapphire/commit/fcca1d4) Moved TransactionTest->testReadonlyTransaction() to PostgreSQLDatabase driver, which is the only one that actually supports it. We can't have tests failing for all other databases by default for this optional feature which can't be detected through the Database API. (Ingo Schommer) + * 2011-04-06 [446b8ba](https://github.com/silverstripe/silverstripe-cms/commit/446b8ba) Fixed SiteTreeTest->testCompareVersions() to work regardless of used HTMLCleaner implementation (was failing if lib_tidy wasn't available) (Ingo Schommer) + * 2011-04-06 [941863a](https://github.com/silverstripe/silverstripe-cms/commit/941863a) Removed tree key, to be replaced with bezels alongside the tree nodes MINOR Removed unnecessary #sitetree_holder classes from LeftAndMain templates (Ingo Schommer) + * 2011-04-06 [ddb9478](https://github.com/silverstripe/sapphire/commit/ddb9478) Misc CSS class changes in LeftAndMain (Ingo Schommer) + * 2011-04-06 [bdd831f](https://github.com/silverstripe/sapphire/commit/bdd831f) Changed <body class="stillLoading"> to loading (Ingo Schommer) + * 2011-04-05 [4ec0fa2](https://github.com/silverstripe/silverstripe-cms/commit/4ec0fa2) Changed #sitetree_ul to #sitetree in templates and javascript (Ingo Schommer) + * 2011-04-05 [35bd9f2](https://github.com/silverstripe/sapphire/commit/35bd9f2) Changed #sitetree_ul to #sitetree in templates and javascript (Ingo Schommer) + * 2011-04-05 [f6edcd1](https://github.com/silverstripe/sapphire/commit/f6edcd1) Setting base font size for CMS (Ingo Schommer) + * 2011-04-05 [bc88a44](https://github.com/silverstripe/silverstripe-cms/commit/bc88a44) Removed checkboxActionIndicator from CMSMain_TreeTools.ss, no longer used (in preparation for new batch action handling in SS3) (Ingo Schommer) + * 2011-04-05 [926aa8f](https://github.com/silverstripe/sapphire/commit/926aa8f) Removed leftover references to "image editor" functionality (removed in 2.3) from tiny_mce_improvements.js (Ingo Schommer) + * 2011-04-05 [a9e81c1](https://github.com/silverstripe/sapphire/commit/a9e81c1) Triggering change event on setValue() in TreeDropdownField.js (necessary for "insert image" form in the cms) (Ingo Schommer) + * 2011-04-05 [842c38f](https://github.com/silverstripe/silverstripe-cms/commit/842c38f) Disable ui-titlebar styling for link/image forms, as it breaks the "insert" button interactions (to be replaced with a new modal dialog implementation soon anyway) (Ingo Schommer) + * 2011-03-31 [0c81515](https://github.com/silverstripe/sapphire/commit/0c81515) Mocking sub-entries in CMSTopMenu (Ingo Schommer) + * 2011-03-31 [f6f658f](https://github.com/silverstripe/sapphire/commit/f6f658f) Moved profile and welcome message to CMSTopMenu instead of bottom bar (Ingo Schommer) + * 2011-03-31 [0661fa6](https://github.com/silverstripe/silverstripe-cms/commit/0661fa6) Renaming CMSMenu entries (Ingo Schommer) + * 2011-03-31 [bdd81e5](https://github.com/silverstripe/sapphire/commit/bdd81e5) Renaming CMSMenu entries (Ingo Schommer) + * 2011-03-31 [dad6169](https://github.com/silverstripe/sapphire/commit/dad6169) Using '.cms-edit-form' instead of '#Form_EditForm' selector (Ingo Schommer) + * 2011-03-31 [4fe07e9](https://github.com/silverstripe/silverstripe-cms/commit/4fe07e9) Using '.cms-edit-form' instead of '#Form_EditForm' selector (Ingo Schommer) + * 2011-03-31 [7b655d6](https://github.com/silverstripe/silverstripe-cms/commit/7b655d6) Moved cms/css into cms/css/_old for later reference, to prepare new CMS UI implementation (Ingo Schommer) + * 2011-03-31 [fd0c38c](https://github.com/silverstripe/sapphire/commit/fd0c38c) Added sapphire/admin/scss folder and started SCSS file architecture (Ingo Schommer) + * 2011-03-31 [c44deb0](https://github.com/silverstripe/sapphire/commit/c44deb0) Moved existing CSS files from sapphire/admin/css to sapphire/admin/css/_old folder, for later reference. Blocking them from controller inclusion to prepare CMS UI redesign (Ingo Schommer) + * 2011-03-31 [11a3b86](https://github.com/silverstripe/sapphire/commit/11a3b86) Removed jQuery.layout implementation (Ingo Schommer) + * 2011-03-31 [c193743](https://github.com/silverstripe/silverstripe-cms/commit/c193743) Removed jQuery.layout references (Ingo Schommer) + * 2011-03-30 [f4a16d3](https://github.com/silverstripe/sapphire/commit/f4a16d3) Making HTTPTest less fragile around global state. Improved test readability. (Ingo Schommer) + * 2011-03-30 [f547da2](https://github.com/silverstripe/silverstripe-cms/commit/f547da2) Relative $fixture_file links in cms/tests to facilitate moving files (Ingo Schommer) + * 2011-03-30 [60abe5f](https://github.com/silverstripe/silverstripe-cms/commit/60abe5f) Moved files into a more logical structure in cms/code (Ingo Schommer) + * 2011-03-30 [2870eb9](https://github.com/silverstripe/sapphire/commit/2870eb9) Changed $fixture_path to relative filenames in all sapphire test cases in order to allow easier file moving and less verbosity in tests (Ingo Schommer) + * 2011-03-30 [aef17ed](https://github.com/silverstripe/silverstripe-cms/commit/aef17ed) Fixed SiteTreeTest->testCompareVersions() to work with new Diff/HTMLCleaner implementation (Ingo Schommer) + * 2011-03-30 [fb4efaa](https://github.com/silverstripe/silverstripe-cms/commit/fb4efaa) Moving HTMLCleaner interface to sapphire (related to Diff class) (Ingo Schommer) + * 2011-03-30 [eda75a2](https://github.com/silverstripe/sapphire/commit/eda75a2) Fixed documentation for DatetimeField (Ingo Schommer) + * 2011-03-29 [8e6a385](https://github.com/silverstripe/silverstripe-cms/commit/8e6a385) Override CMSMain->CMSVersion() to check for cms/silverstripe_version (Ingo Schommer) + * 2011-03-29 [b1f27b4](https://github.com/silverstripe/sapphire/commit/b1f27b4) Updated image references in sapphire/ folder to local files, rather than requiring cms/ folder (copied a bunch of images files over for this) (Ingo Schommer) + * 2011-03-29 [d47913d](https://github.com/silverstripe/sapphire/commit/d47913d) Added default redirection of /admin to /admin/security in sapphire/admin/_config.php to provide a good default if 'cms' module (and CMSMain) is not installed (Ingo Schommer) + * 2011-03-29 [0d39a88](https://github.com/silverstripe/sapphire/commit/0d39a88) Removed references to ContentController from documentatin (Ingo Schommer) + * 2011-03-29 [b4affff](https://github.com/silverstripe/sapphire/commit/b4affff) Removed hard dependency on SiteConfig and VirtualPage in LeftAndMain (Ingo Schommer) + * 2011-03-29 [a467eda](https://github.com/silverstripe/sapphire/commit/a467eda) Making managed class configurable in CMSBatchAction in order to remove hard dependency to cms module (still defaults to SiteTree) (Ingo Schommer) + * 2011-03-29 [95dcc74](https://github.com/silverstripe/sapphire/commit/95dcc74) Removed reliance of sapphire/admin unit tests on SiteTree and CMSMain (Ingo Schommer) + * 2011-03-28 [65e7b83](https://github.com/silverstripe/sapphire/commit/65e7b83) Made login form redirection test in SecurityTest explicit, rather than implicit through testLogInAsSomeoneElse() (Ingo Schommer) + * 2011-03-28 [c2457c8](https://github.com/silverstripe/silverstripe-cms/commit/c2457c8) Moved jquery-changetracker from 'cms' to 'sapphire' (Ingo Schommer) + * 2011-03-28 [1a598fe](https://github.com/silverstripe/sapphire/commit/1a598fe) Removed obsolete 'usetestmanifest' flag from documentation and RestfulServiceTest (Ingo Schommer) + * 2011-03-25 [3380bc6](https://github.com/silverstripe/silverstripe-cms/commit/3380bc6) Removed unnecessary SiteTree->Status setting in ContentController, ErrorPage and SiteTree - now controlled via getters like isPublished() (copied from efe710e2d30c6cff8599a76de2b24f315b53a088) (Ingo Schommer) + * 2011-03-25 [0bcb57d](https://github.com/silverstripe/silverstripe-cms/commit/0bcb57d) Fixed merge errors (copied from 31d7a00eb785b9a570b33994dfdec82b930db236) (Ingo Schommer) + * 2011-03-25 [f6c5308](https://github.com/silverstripe/sapphire/commit/f6c5308) Removed Toolbar.png references from CSS files (Ingo Schommer) + * 2011-03-24 [519f062](https://github.com/silverstripe/sapphire/commit/519f062) Moved EditorToolbar from LeftAndMain to CMSMain (Ingo Schommer) + * 2011-03-24 [500624f](https://github.com/silverstripe/sapphire/commit/500624f) Removing unnecessary Requirements calls in SecurityAdmin (either already in place through LeftAndMain base class, or included by MemberTableField) (Ingo Schommer) + * 2011-03-24 [d37faf6](https://github.com/silverstripe/sapphire/commit/d37faf6) Declaring additional dependencies in ComplexTableField (Ingo Schommer) + * 2011-03-24 [358975e](https://github.com/silverstripe/sapphire/commit/358975e) Conditional checks on SiteConfig existence in LeftAndMain->init() (Ingo Schommer) + * 2011-03-24 [5da903e](https://github.com/silverstripe/silverstripe-cms/commit/5da903e) Moved LeftAndMain->EditorToolbar() to CMSMain, as its only relevant here (Ingo Schommer) + * 2011-03-24 [a73c9cc](https://github.com/silverstripe/sapphire/commit/a73c9cc) Moved CMSBatchAction class to sapphire module, but keeping SiteTree specific subclasses in cms (Ingo Schommer) + * 2011-03-24 [919c85d](https://github.com/silverstripe/silverstripe-cms/commit/919c85d) Moved CMSBatchAction class to sapphire module, but keeping SiteTree specific subclasses in cms (Ingo Schommer) + * 2011-03-24 [c142442](https://github.com/silverstripe/sapphire/commit/c142442) Removed CMSMain routing (Ingo Schommer) + * 2011-03-24 [0dfbec8](https://github.com/silverstripe/silverstripe-cms/commit/0dfbec8) Moved LeftAndMain, SecurityAdmin, ModelAdmin and related functionality from 'cms' module to sapphire/admin (Ingo Schommer) + * 2011-03-23 [885651c](https://github.com/silverstripe/silverstripe-cms/commit/885651c) Removed unused images from cms/images (Ingo Schommer) + * 2011-03-23 [5b0db7f](https://github.com/silverstripe/silverstripe-cms/commit/5b0db7f) Added necessary requirements paths to CMSMain after moving files to sapphire/admin (Ingo Schommer) + * 2011-03-23 [5f59b3a](https://github.com/silverstripe/sapphire/commit/5f59b3a) Fixed paths due to file moving into sapphire/admin (Ingo Schommer) + * 2011-03-23 [7ba2ea6](https://github.com/silverstripe/sapphire/commit/7ba2ea6) Temporarily including sapphire/admin/_config.php manually (Ingo Schommer) + * 2011-03-23 [2c50ba6](https://github.com/silverstripe/sapphire/commit/2c50ba6) Removed unnecessary TreeDropdownField customizations in Image_iframe.css (Ingo Schommer) + * 2011-03-23 [a1fb071](https://github.com/silverstripe/sapphire/commit/a1fb071) Moved LeftAndMain, SecurityAdmin, ModelAdmin and related functionality from 'cms' module to sapphire/admin (Ingo Schommer) + * 2011-03-23 [a9b1350](https://github.com/silverstripe/sapphire/commit/a9b1350) Removed dependency on SiteTree in various unit tests (Ingo Schommer) + * 2011-03-23 [1225426](https://github.com/silverstripe/sapphire/commit/1225426) Fixed @package declarations (Ingo Schommer) + * 2011-03-23 [b78b130](https://github.com/silverstripe/sapphire/commit/b78b130) Removing SiteTree dependency from FulltextSearchableTest (Ingo Schommer) + * 2011-03-23 [67cc18f](https://github.com/silverstripe/sapphire/commit/67cc18f) Optional dependency on ThumbnailStripField in HtmlEditorField, preparing the split of this field into a "basic" and "cms" version (Ingo Schommer) + * 2011-03-23 [41e51ab](https://github.com/silverstripe/sapphire/commit/41e51ab) Made HtmlEditorField dependency to SiteTree optional (to be moved into separate aspect, or down to DBField/model layer) (Ingo Schommer) + * 2011-03-23 [81881e1](https://github.com/silverstripe/silverstripe-cms/commit/81881e1) Added SitetreeHTMLEditorFieldTest to test HtmlEditorField functionality specific to SiteTree and link tracking (Ingo Schommer) + * 2011-03-23 [317ca6f](https://github.com/silverstripe/silverstripe-cms/commit/317ca6f) Added SiteTreeFolderDecorator and FolderUnusedAssetsField (moved functionality from Folder class in 'sapphire' module) (Ingo Schommer) + * 2011-03-23 [50e8467](https://github.com/silverstripe/sapphire/commit/50e8467) Moved Folder->getUnusedFilesListFilter() to new SiteTreeFolderDecorator class in 'cms' module MINOR Moved Folder_UnusedAssetsField to 'cms' module (Ingo Schommer) + * 2011-03-23 [463b23b](https://github.com/silverstripe/sapphire/commit/463b23b) Exception when SiteTree or File are not present in MySQLDatabase->searchEngine() (Ingo Schommer) + * 2011-03-23 [ecc28cb](https://github.com/silverstripe/sapphire/commit/ecc28cb) Moved MigrateSiteTreeLinkingTask from 'sapphire' to 'cms' module (Ingo Schommer) + * 2011-03-23 [7e5da27](https://github.com/silverstripe/sapphire/commit/7e5da27) Added comments to DataObject->can() (Ingo Schommer) + * 2011-03-23 [764c5a8](https://github.com/silverstripe/sapphire/commit/764c5a8) Moved Widget, WidgetArea and related files from 'sapphire' to 'cms' module (Ingo Schommer) + * 2011-03-23 [dd6a86c](https://github.com/silverstripe/silverstripe-cms/commit/dd6a86c) Moved Widget, WidgetArea and related files from 'sapphire' to 'cms' module (Ingo Schommer) + * 2011-03-23 [6d18e38](https://github.com/silverstripe/sapphire/commit/6d18e38) Checking for optional classes in 'cms' module in SapphireTest (Ingo Schommer) + * 2011-03-23 [1c21390](https://github.com/silverstripe/sapphire/commit/1c21390) Removed unnecessary SiteTree dependency from TransactionTest (Ingo Schommer) + * 2011-03-23 [d93025d](https://github.com/silverstripe/sapphire/commit/d93025d) Moved File->BackLinkTracking feature from 'sapphire' to 'cms' (Ingo Schommer) + * 2011-03-23 [7b038db](https://github.com/silverstripe/silverstripe-cms/commit/7b038db) Moved FileLinkTracking feature into new SiteTreeFileDecorator class in order to move it from 'sapphire' to 'cms' (Ingo Schommer) + * 2011-03-23 [42fa757](https://github.com/silverstripe/sapphire/commit/42fa757) Moved CurrentPageIdentifier from 'sapphire' to 'cms' module (Ingo Schommer) + * 2011-03-23 [0b5e9ba](https://github.com/silverstripe/silverstripe-cms/commit/0b5e9ba) Moved CurrentPageIdentifier from 'sapphire' to 'cms' module (Ingo Schommer) + * 2011-03-23 [f407c18](https://github.com/silverstripe/silverstripe-cms/commit/f407c18) Fixed paths for SilverStripeNavigator resources (from sapphire/ to cms/) (Ingo Schommer) + * 2011-03-23 [4adcdba](https://github.com/silverstripe/sapphire/commit/4adcdba) Moved SilverStripeNavigator from 'sapphire' to 'cms' (Ingo Schommer) + * 2011-03-23 [c660284](https://github.com/silverstripe/silverstripe-cms/commit/c660284) Moved SilverStripeNavigator from 'sapphire' to 'cms' (Ingo Schommer) + * 2011-03-22 [f1e1cbe](https://github.com/silverstripe/silverstripe-cms/commit/f1e1cbe) Fixed test fixture paths and @package from 'sapphire' to 'cms' (Ingo Schommer) + * 2011-03-22 [9b4f3aa](https://github.com/silverstripe/silverstripe-cms/commit/9b4f3aa) Moved ContentController, ModelAsController, RootURLController, NestedController from sapphire/core/control/ to cms module (Ingo Schommer) + * 2011-03-22 [16d818c](https://github.com/silverstripe/silverstripe-cms/commit/16d818c) Added ModelAsController director rule from 'sapphire' module to cms/_config.php (Ingo Schommer) + * 2011-03-22 [3dc5c2b](https://github.com/silverstripe/sapphire/commit/3dc5c2b) Added 3.0.0-alpha1 changelog (Ingo Schommer) + * 2011-03-22 [8847bed](https://github.com/silverstripe/sapphire/commit/8847bed) Moved SearchFormTest and ContentControllerSearchExtensionTest into 'cms' module (Ingo Schommer) + * 2011-03-22 [8c04baf](https://github.com/silverstripe/silverstripe-cms/commit/8c04baf) Added class_exists() check for Translatable, which has moved into a new 'translatable' module (Ingo Schommer) + * 2011-03-22 [b9c9dba](https://github.com/silverstripe/sapphire/commit/b9c9dba) Moved ModelAsController Director rule from 'sapphire' to 'cms' (Ingo Schommer) + * 2011-03-22 [7f06f97](https://github.com/silverstripe/sapphire/commit/7f06f97) Moved WidgetArea (and related tests) to "cms" module (Ingo Schommer) + * 2011-03-22 [71f117b](https://github.com/silverstripe/sapphire/commit/71f117b) Moved SearchForm, AdvancedSearchForm and ContentControllerSearchExtension to "cms" module (Ingo Schommer) + * 2011-03-22 [204fd2c](https://github.com/silverstripe/sapphire/commit/204fd2c) Moved SiteTree, SiteTreeDecorator, SiteConfig, ErrorPage, RedirectorPage, VirtualPage (and related tests) to "cms" module (Ingo Schommer) + * 2011-03-22 [5bf5b74](https://github.com/silverstripe/sapphire/commit/5bf5b74) Moved ContentController, ModelAsController, NestedController, RootURLController (and related tests) to "cms" module (Ingo Schommer) + * 2011-03-22 [49a76a0](https://github.com/silverstripe/silverstripe-cms/commit/49a76a0) Fixed ajax load binding to folder selection in ThumbnailStripField.js (was broken after move to jquery) (Ingo Schommer) + * 2011-03-21 [2808424](https://github.com/silverstripe/sapphire/commit/2808424) Improved patch documentation (Ingo Schommer) + * 2011-03-20 [021121f](https://github.com/silverstripe/sapphire/commit/021121f) Disabled window.onresize events in tiny_mce_improvements.js, method no longer exists and is replaced with event hanlers (Ingo Schommer) + * 2011-03-20 [03acbb7](https://github.com/silverstripe/silverstripe-cms/commit/03acbb7) Translatable strings in CMSMain (fixes #6523, thanks Tonyair) (Ingo Schommer) + * 2011-03-18 [dc6ecbd](https://github.com/silverstripe/silverstripe-cms/commit/dc6ecbd) Moved SiteTreeTest.yml from sapphire/tests to cms module cms/tests (Paul Meyrick) + * 2011-03-18 [62de2da](https://github.com/silverstripe/silverstripe-cms/commit/62de2da) Moved MigrateSiteTreeLinkingTask, RemoveOrphanedPagesTask, UpgradeSiteTreePermissionSchemaTask from /sapphire/tasks/ to cms module /cms/tasks/ (Paul Meyrick) + * 2011-03-18 [5de4f69](https://github.com/silverstripe/silverstripe-cms/commit/5de4f69) Moved ErrorPageTest from sapphire/tests/ to cms module cms/tests (Paul Meyrick) + * 2011-03-18 [69571d5](https://github.com/silverstripe/silverstripe-cms/commit/69571d5) Moved VirtualPageTest from sapphire/tests/model/ to cms module cms/tests (Paul Meyrick) + * 2011-03-18 [d4af221](https://github.com/silverstripe/silverstripe-cms/commit/d4af221) Moved from RedirectorPageTest, SiteTreeActionsTest, SiteTreeBackLinksTest, SiteTreePermissionsTest, SiteTreeTest, WidgetAreaTest /Sites/cgps/sapphire/tests to cms module cms/tests/ (Paul Meyrick) + * 2011-03-18 [e280929](https://github.com/silverstripe/silverstripe-cms/commit/e280929) Moved from /sapphire/tests/control/ to cms module cms/tests (Paul Meyrick) + * 2011-03-18 [766e652](https://github.com/silverstripe/silverstripe-cms/commit/766e652) Moved ContentControllerSearchExtension from sapphire/search/ to cms module (Paul Meyrick) + * 2011-03-18 [93bf302](https://github.com/silverstripe/silverstripe-cms/commit/93bf302) Moved ContentController template from sapphire/templates/ to cms/template in cms module (Paul Meyrick) + * 2011-03-18 [d3c5a30](https://github.com/silverstripe/silverstripe-cms/commit/d3c5a30) Moved ErrorPage, RedirectorPage, SiteConfig, SiteTree, SiteTreeDecorator, VirtualPage from sapphire/core/model/ to cms module (Paul Meyrick) + * 2011-03-18 [c905bcb](https://github.com/silverstripe/silverstripe-cms/commit/c905bcb) Moved AdvancedSearchForm, SearchForm from sapphire/search to cms module (Paul Meyrick) + * 2011-03-18 [fa7da8f](https://github.com/silverstripe/silverstripe-cms/commit/fa7da8f) Moved Diff class to sapphire module (Paul Meyrick) + * 2011-03-18 [251c1df](https://github.com/silverstripe/sapphire/commit/251c1df) Fixed SSViewerTest->testCurrentTheme() not to rely on SiteConfig (Paul Meyrick) + * 2011-03-18 [eb221ca](https://github.com/silverstripe/sapphire/commit/eb221ca) Moved Diff class from cms to sapphire module (cms/code/Diff.php)
 (Paul Meyrick) + * 2011-03-18 [dc36725](https://github.com/silverstripe/sapphire/commit/dc36725) Using BlankPage template in SecurityTest, BasicAuthTest to remove ContentController dependency MINOR Checking for SiteTree class existence in Security, Translatable MINOR Checking for ContentController existence in FulltextSearchable MINOR Removed unnecessary ContentController tests from ObjectTest MINOR Replaced CMS specific examples in PermissionCheckboxSetFieldTest, DataObjectTest MINOR Changed SecurityTest to make assertions against Security/login rather than relying on redirection from admin/cms (Paul Meyrick) + * 2011-03-18 [6e60314](https://github.com/silverstripe/silverstripe-cms/commit/6e60314) Adding classes and markup necessary to style tree before jstree.js loads (Ingo Schommer) + * 2011-03-18 [91995ad](https://github.com/silverstripe/silverstripe-cms/commit/91995ad) Disabled AssetAdmin form reload after uploading through iframe, relies on old tree.js library - UI will change anyway (Ingo Schommer) + * 2011-03-17 [ebe94ae](https://github.com/silverstripe/sapphire/commit/ebe94ae) Removed $allowedExtensions property from SimpleImageField which is deprecated (Sean Harvey) + * 2011-03-16 [d3c9d1b] Dynamic copyright year in footer (fixes #6459, thanks selfimilar) (Ingo Schommer) + * 2011-03-16 [2b7c633](https://github.com/silverstripe/sapphire/commit/2b7c633) Rewrite of PermissionCheckboxSetField.js from Behaviour.js to jQuery.entwine (Ingo Schommer) + * 2011-03-16 [efe710e](https://github.com/silverstripe/sapphire/commit/efe710e) Removed unnecessary SiteTree->Status setting in ContentController, ErrorPage and SiteTree - now controlled via getters like isPublished() (Ingo Schommer) + * 2011-03-16 [c9c794a](https://github.com/silverstripe/sapphire/commit/c9c794a) Removed thirdparty/calendar (falsely readded through 2.4 merge) (Ingo Schommer) + * 2011-03-16 [d96f2cb](https://github.com/silverstripe/sapphire/commit/d96f2cb) Fixed js error (Ingo Schommer) + * 2011-03-16 [5b104b7](https://github.com/silverstripe/silverstripe-cms/commit/5b104b7) Fixed LeftAndMain.Tree.js scope (Ingo Schommer) + * 2011-03-16 [6a2fe56](https://github.com/silverstripe/silverstripe-cms/commit/6a2fe56) Limited css scope for compare view styling to avoid clashes with jstree (Ingo Schommer) + * 2011-03-15 [31d7a00](https://github.com/silverstripe/sapphire/commit/31d7a00) Fixed merge errors (Ingo Schommer) + * 2011-03-15 [495e15b](https://github.com/silverstripe/silverstripe-cms/commit/495e15b) Fixed merge errors (Ingo Schommer) + * 2011-03-14 [dd6f9ed](https://github.com/silverstripe/sapphire/commit/dd6f9ed) Moved readonly section of TransactionTest into postgresql/ module (Ingo Schommer) + * 2011-03-10 [20427cd](https://github.com/silverstripe/silverstripe-cms/commit/20427cd) Using 'apple' theme in tree (until we decide on a proper redesign) (Ingo Schommer) + * 2011-03-10 [cfb83e4](https://github.com/silverstripe/silverstripe-cms/commit/cfb83e4) Wrapping LeftAndMain.Tree.js in entwine block (Ingo Schommer) + * 2011-03-10 [885597a](https://github.com/silverstripe/silverstripe-cms/commit/885597a) Removed legacy code from LeftAndMain.Tree.js, replaced with a list of @todo items (Ingo Schommer) + * 2011-03-10 [d22e80b](https://github.com/silverstripe/silverstripe-cms/commit/d22e80b) Replaced hardcoded URLs in LeftAndMain.Tree.js with data-url-* attributes (Ingo Schommer) + * 2011-03-10 [0b40bda](https://github.com/silverstripe/sapphire/commit/0b40bda) Changed TreeDropdownField markup from <div href="..."> to <div data-url-tree="..."> in order to support other URLs (e.g. reordering) - important for the main CMS tree (Ingo Schommer) + * 2011-03-10 [fb502d7](https://github.com/silverstripe/sapphire/commit/fb502d7) Added jasmine-jstd-adapter dependency (Ingo Schommer) + * 2011-03-08 [3f748de](https://github.com/silverstripe/sapphire/commit/3f748de) Documentation fixes (Ingo Schommer) + * 2011-03-08 [06089ed](https://github.com/silverstripe/sapphire/commit/06089ed) Added fix to test troubleshooting docs about PHPUnit 3.5 missing MockObject (Sean Harvey) + * 2011-03-08 [018830e](https://github.com/silverstripe/silverstripe-cms/commit/018830e) Removed debug code (Ingo Schommer) + * 2011-03-03 [a05de97](https://github.com/silverstripe/sapphire/commit/a05de97) Adding custom load icon for tree node ajax loading in TreeDropdownField.css (Ingo Schommer) + * 2011-03-03 [cf467d5](https://github.com/silverstripe/silverstripe-cms/commit/cf467d5) Disabled animation on tree (for performance reasons) (Ingo Schommer) + * 2011-03-03 [6d3cf21](https://github.com/silverstripe/silverstripe-cms/commit/6d3cf21) Removed unnecessary tree CSS styles, will be replaced by new styles based on jstree.js (Ingo Schommer) + * 2011-03-03 [8419ee8](https://github.com/silverstripe/silverstripe-cms/commit/8419ee8) Removed custom TreeDropdownField CSS styles (copypasted the entire block only to adjust widths), no longer necessary due to a flexible width system on the base styles (Ingo Schommer) + * 2011-03-03 [3dbe03c](https://github.com/silverstripe/silverstripe-cms/commit/3dbe03c) Reverted floating of TinyMCE icons, as they don't automatically break into multiple lines like other floated elements (Ingo Schommer) + * 2011-03-03 [a137360](https://github.com/silverstripe/silverstripe-cms/commit/a137360) Temporarily disabled onchange bindings in ThumbnailStripField, as they fail in IE7/IE8 (Ingo Schommer) + * 2011-03-03 [76d32cb](https://github.com/silverstripe/sapphire/commit/76d32cb) Removed window.onresize() call in tiny_mce_improvements.js, now handled by jQuery.layout (Ingo Schommer) + * 2011-03-03 [cea4183](https://github.com/silverstripe/sapphire/commit/cea4183) Fixed title escaping in 'built in page controls' documentation (Ingo Schommer) + * 2011-03-03 [e7ad682](https://github.com/silverstripe/sapphire/commit/e7ad682) Added javascript tests for TreeDropdownField.js (Ingo Schommer) + * 2011-03-03 [b5d2e10](https://github.com/silverstripe/sapphire/commit/b5d2e10) Added sapphire/thirdparty/jasmine for javascript testing (Ingo Schommer) + * 2011-03-02 [4f0c5d1](https://github.com/silverstripe/silverstripe-cms/commit/4f0c5d1) Added data-id=0 to root node in LeftAndMain->getSiteTreeAsUL() (Ingo Schommer) + * 2011-03-01 [cc795c4](https://github.com/silverstripe/sapphire/commit/cc795c4) Added jstree related classes to Hierarchy->markingClasses() (Ingo Schommer) + * 2011-03-01 [a306ccb](https://github.com/silverstripe/sapphire/commit/a306ccb) Updated sapphire/thirdparty/jstree from 1.0rc1 to trunk (Ingo Schommer) + * 2011-02-25 [2003888](https://github.com/silverstripe/sapphire/commit/2003888) Updated contributing guidelines (Ingo Schommer) + * 2011-02-23 [7cb687b](https://github.com/silverstripe/sapphire/commit/7cb687b) Added docs/ contributing notes (Ingo Schommer) + * 2011-02-21 [002e40b](https://github.com/silverstripe/sapphire/commit/002e40b) Added deprecated SapphireTest->assertType() in order to support PHPUnit 3.5 or newer, but stay backwards compatible to PHPUnit 3.4 (Ingo Schommer) + * 2011-02-16 [ca2e80e](https://github.com/silverstripe/sapphire/commit/ca2e80e) Updated 'from source' docs (Ingo Schommer) + * 2011-02-14 [6d7efc8](https://github.com/silverstripe/sapphire/commit/6d7efc8) Fixed blackcandy github links in docs (Ingo Schommer) + * 2011-02-14 [9354b4a](https://github.com/silverstripe/sapphire/commit/9354b4a) Removed reference to additional CSS download in tutorial 4, moved to the silverstripe-installer project (Ingo Schommer) + * 2011-02-14 [b3ac8cc](https://github.com/silverstripe/silverstripe-installer/commit/b3ac8cc) Moved additional CSS needed for tutorial 3 to themes/tutorials rather than sapphire/docs (Ingo Schommer) + * 2011-02-12 [7d1bd72](https://github.com/silverstripe/silverstripe-cms/commit/7d1bd72) Added README (Ingo Schommer) + * 2011-02-12 [a63215c](https://github.com/silverstripe/sapphire/commit/a63215c) Added README (Ingo Schommer) + * 2011-02-12 [7277461](https://github.com/silverstripe/silverstripe-installer/commit/7277461) Migrated COPYING, Changelog, INSTALL, UPGRADING into a new README.md (Ingo Schommer) + * 2011-02-12 [bbd3bf6](https://github.com/silverstripe/sapphire/commit/bbd3bf6) Fixed spacing in docs (Ingo Schommer) + * 2011-02-12 [044be50](https://github.com/silverstripe/sapphire/commit/044be50) Removed duplicated 'additional requirements' from docs (Ingo Schommer) + * 2011-02-11 [7d609f2](https://github.com/silverstripe/silverstripe-cms/commit/7d609f2) Replaced assertType() calls with assertInstanceOf(), deprecated in PHPUnit 3.6 (throws warnings as of 3.5.10) (Ingo Schommer) + * 2011-02-11 [65f6104](https://github.com/silverstripe/sapphire/commit/65f6104) Replaced assertType() calls with assertInstanceOf(), deprecated in PHPUnit 3.6 (throws warnings as of 3.5.10) (Ingo Schommer) + * 2011-02-07 [66bc928](https://github.com/silverstripe/sapphire/commit/66bc928) Fixing image links in docs/en/tutorials/ (Ingo Schommer) + * 2011-02-01 [949cadf](https://github.com/silverstripe/sapphire/commit/949cadf) Fixed broken links in docblocks (Ingo Schommer) + * 2011-01-26 [17f6f3f](https://github.com/silverstripe/sapphire/commit/17f6f3f) #6397 CoreTest should use test specific paths, otherwise conflicts can occur in certain environments (from r115854) (Sean Harvey) + * 2010-12-21 [b3bb0a7](https://github.com/silverstripe/sapphire/commit/b3bb0a7) Make test database name all lowercase in case some databases like PostgreSQL have issues trying to detect temp database in use (Sean Harvey) + * 2010-12-20 [172ad1e](https://github.com/silverstripe/silverstripe-cms/commit/172ad1e) More jQuery backwards compatible id attribute check in ModelAdmin.js (Ingo Schommer) + * 2010-12-16 [2d3bb7d](https://github.com/silverstripe/silverstripe-cms/commit/2d3bb7d) Making controller/response optional in CMSBatchAction->batchaction() in order to make the class more testable in isolation (Ingo Schommer) + * 2010-12-16 [2fa786d](https://github.com/silverstripe/sapphire/commit/2fa786d) Added it_IT javascript translation (fixes #6265, thanks giulio) (Ingo Schommer) + * 2010-12-16 [28ee63f](https://github.com/silverstripe/silverstripe-cms/commit/28ee63f) Partially reverted debug comments from r115109 (Ingo Schommer) + * 2010-12-16 [e8c8c94](https://github.com/silverstripe/sapphire/commit/e8c8c94) Don't add closing PHP tags in i18nTextCollector->writeMasterStringFile() (thanks Fred Condo) (Ingo Schommer) + * 2010-12-13 [7395271](https://github.com/silverstripe/sapphire/commit/7395271) Ensure php5-required.html template shows correct minimum and recommended PHP versions (thanks mattcleg!) (Sean Harvey) + * 2010-12-13 [8f4b816](https://github.com/silverstripe/silverstripe-cms/commit/8f4b816) Removed CommentAdmin from assertions in LeftAndMainTest (functionality moved into module) (Ingo Schommer) + * 2010-12-11 [073563a](https://github.com/silverstripe/sapphire/commit/073563a) Fixed unit test to use a better approach of array_keys() (Sean Harvey) + * 2010-12-09 [a11b1dd](https://github.com/silverstripe/silverstripe-cms/commit/a11b1dd) Updated SilverStripe logo to new design (Ingo Schommer) + * 2010-12-09 [e4a786e](https://github.com/silverstripe/sapphire/commit/e4a786e) Setting Content-Type to text/plain in various error responses for RestfulServer (Ingo Schommer) + * 2010-12-09 [f61a307](https://github.com/silverstripe/sapphire/commit/f61a307) Reverting Member "AutoLoginHash", "RememberLoginToken" and "Salt" to their original VARCHAR length to avoid problems with invalidated hashes due to shorter field length (Ingo Schommer) + * 2010-12-09 [674d8e0](https://github.com/silverstripe/sapphire/commit/674d8e0) Reduced VARCHAR length from 1024 to 40 bytes, which fits the sha1 hashes created by RandomGenerator. 1024 bytes caused problems with index lengths on MySQL (Ingo Schommer) + * 2010-12-08 [3535dec](https://github.com/silverstripe/silverstripe-cms/commit/3535dec) Removed unused code from Diff (Ingo Schommer) + * 2010-12-07 [2b63577](https://github.com/silverstripe/sapphire/commit/2b63577) Added DataObjectTest->testToMap() (Ingo Schommer) + * 2010-12-07 [c36ac42](https://github.com/silverstripe/sapphire/commit/c36ac42) Documentation in DataObject (Ingo Schommer) + * 2010-12-05 [ead9dce](https://github.com/silverstripe/sapphire/commit/ead9dce) Documentation in SS_Cache (Ingo Schommer) + * 2010-12-05 [b34286c](https://github.com/silverstripe/sapphire/commit/b34286c) Reverted r108515 (from r114079) (Sam Minnee) + * 2010-12-05 [05d6df2](https://github.com/silverstripe/sapphire/commit/05d6df2) Fixed php tag in SecurityTokenTest, should be "<?php" not "<?" (from r114016) (Sam Minnee) + * 2010-12-05 [e340ccb](https://github.com/silverstripe/sapphire/commit/e340ccb) Fixed PHP strict standard where non-variables cannot be passed by reference (from r113968) (Sam Minnee) + * 2010-12-05 [edc7a46](https://github.com/silverstripe/sapphire/commit/edc7a46) Fixed spaces with tabs in Core (from r113924) (Sam Minnee) + * 2010-12-05 [6874777](https://github.com/silverstripe/sapphire/commit/6874777) Updated cs_CZ and sk_SK translations in sapphire/javascript (fixes #6085, thanks Pike) (from r113690) (Sam Minnee) + * 2010-12-05 [400157c](https://github.com/silverstripe/sapphire/commit/400157c) Fixed RSSFeedTest which should put test configuration code into setUp() and tearDown() methods. If the test fails halfway through, these will get called to clean up the state (from r113430) (Sam Minnee) + * 2010-12-05 [c63b00f](https://github.com/silverstripe/sapphire/commit/c63b00f) Using SecurityToken in ViewableData->getSecurityID() (from r113274) (Sam Minnee) + * 2010-12-05 [c3fa740](https://github.com/silverstripe/sapphire/commit/c3fa740) Documentation (from r113241) (Sam Minnee) + * 2010-12-05 [50f8236](https://github.com/silverstripe/sapphire/commit/50f8236) Fixed regression from r114504 (Ingo Schommer) + * 2010-11-24 [b4ff8e7](https://github.com/silverstripe/silverstripe-cms/commit/b4ff8e7) LeftAndMain->LogoStyle() doesn't output empty background CSS if no logo is set (Ingo Schommer) + * 2010-11-24 [41dad50](https://github.com/silverstripe/sapphire/commit/41dad50) Documentation in FunctionalTest and TestSession (Ingo Schommer) + * 2010-11-24 [ab563c1](https://github.com/silverstripe/sapphire/commit/ab563c1) Using built-in ORM methods for GroupTest (Ingo Schommer) + * 2010-11-23 [6ccd6d6](https://github.com/silverstripe/sapphire/commit/6ccd6d6) Documentation for Aggregate caching (Ingo Schommer) + * 2010-11-22 [9ac9916](https://github.com/silverstripe/sapphire/commit/9ac9916) Merged r113933,113936-113937 from branches/2.4 (Sean Harvey) + * 2010-11-22 [73c6f1f](https://github.com/silverstripe/sapphire/commit/73c6f1f) Removed duplicate b/ directory, regression from r113918 (Ingo Schommer) + * 2010-11-21 [4868877](https://github.com/silverstripe/silverstripe-installer/commit/4868877) Merged r113913 through r113984 from phpinstaller/branches/2.4 (sharvey) + * 2010-11-18 [945a28f](https://github.com/silverstripe/silverstripe-installer/commit/945a28f) Merged r112269 through r113912 from phpinstaller/branches/2.4 (sharvey) + * 2010-11-13 [db64323](https://github.com/silverstripe/silverstripe-cms/commit/db64323) Reverted merge error from r111600 (windowName() method is no longer availabie) (Ingo Schommer) + * 2010-11-13 [7700b22](https://github.com/silverstripe/sapphire/commit/7700b22) Documentation for MoneyField (Ingo Schommer) + * 2010-10-20 [91d00c5](https://github.com/silverstripe/silverstripe-installer/commit/91d00c5) Fixed extraneous else statement in installer (sharvey) + * 2010-10-20 [2ed6a31](https://github.com/silverstripe/silverstripe-installer/commit/2ed6a31) Made _config.php work the same way as branches/2.4 phpinstaller (sharvey) + * 2010-10-19 [72037a8](https://github.com/silverstripe/sapphire/commit/72037a8) Removed "In line of " text in CLI test reporter which did not work. Details are in the backtrace below anyway, so it's not required (from r112321) (Sam Minnee) + * 2010-10-19 [75101d3](https://github.com/silverstripe/sapphire/commit/75101d3) Reverted regression in r112272 (from r112278) (Sam Minnee) + * 2010-10-19 [8222d72](https://github.com/silverstripe/sapphire/commit/8222d72) #6083 FileTest doesn't remove test folders and files created during test (from r111903) (Sam Minnee) + * 2010-10-19 [4af7d7a](https://github.com/silverstripe/sapphire/commit/4af7d7a) dev/build now shows database name and version next to "Building database ..." text (from r111851) (Sam Minnee) + * 2010-10-19 [1fc540c](https://github.com/silverstripe/sapphire/commit/1fc540c) Fixed regression from r111843 (i18nText, MemberDatetimeFieldTest, MemberTest) (from r111844) (Sam Minnee) + * 2010-10-19 [7d09ef3](https://github.com/silverstripe/sapphire/commit/7d09ef3) Change matchesRoughly threshold slightly in DbDatetimeTest to allow for slower database server connections (from r111821) (Sam Minnee) + * 2010-10-19 [3388642](https://github.com/silverstripe/sapphire/commit/3388642) Fixed documentation in CheckboxSetField (fixes #6068, thanks paradigmincarnate) (from r111788) (Sam Minnee) + * 2010-10-19 [8d5b417](https://github.com/silverstripe/sapphire/commit/8d5b417) Fixed documentation in Datetime (fixes #6062, thanks nicolaas) (from r111787) (Sam Minnee) + * 2010-10-19 [d6c1d3b](https://github.com/silverstripe/sapphire/commit/d6c1d3b) Fixed SQL quoting bug in FolderTest (caused by r111493) (from r111496) (Sam Minnee) + * 2010-10-19 [de795ba](https://github.com/silverstripe/sapphire/commit/de795ba) Code formatting in FullTestSuite (from r111133) (Sam Minnee) + * 2010-10-19 [b573414](https://github.com/silverstripe/sapphire/commit/b573414) Spelling corrections to Director comments (from r111123) (Sam Minnee) + * 2010-10-19 [8d0253a](https://github.com/silverstripe/sapphire/commit/8d0253a) PHPUnit annotations for PhpSyntaxTest (from r111116) (Sam Minnee) + * 2010-10-19 [ee9c205](https://github.com/silverstripe/sapphire/commit/ee9c205) Documentation for constants in Core.php (from r111052) (Sam Minnee) + * 2010-10-19 [b93fe40](https://github.com/silverstripe/sapphire/commit/b93fe40) Don't use chdir(), it confuses the hell out of phpunit (e.g. directory_exists() and realpath() no longer work as expected) (from r111051) (Sam Minnee) + * 2010-10-19 [12d8b69](https://github.com/silverstripe/sapphire/commit/12d8b69) Fixed SSViewerTest to initialize controller properly (from r111047) (Sam Minnee) + * 2010-10-19 [96beff5](https://github.com/silverstripe/sapphire/commit/96beff5) Remove all session data in TestSession that might've been set by the test harness (necessary for test runs through the phpunit binary) (from r111046) (Sam Minnee) + * 2010-10-19 [3c6512a](https://github.com/silverstripe/sapphire/commit/3c6512a) Check in TableListField->HighlightClasses() (fixes #5993, thanks lx) (from r110837) (Sam Minnee) + * 2010-10-19 [2f9192d](https://github.com/silverstripe/sapphire/commit/2f9192d) Avoid using ASP-style tags in SSViewer comments, it confuses PHP with asp_tags=ON (fixes #5976, thanks ezero) (from r110836) (Sam Minnee) + * 2010-10-19 [9d72145](https://github.com/silverstripe/sapphire/commit/9d72145) Warning about install.php existing for root site tree node as well (SiteConfig form) (from r110440) (Sam Minnee) + * 2010-10-19 [32783ef](https://github.com/silverstripe/sapphire/commit/32783ef) Make dev/build not constantly show a changed index because of whitespace between VersionID and Version in the index spec (from r110205) (Sam Minnee) + * 2010-10-19 [065155e](https://github.com/silverstripe/sapphire/commit/065155e) Removed removeDuplicates() call on linked pages DataObjectSet in MigrateSiteTreeLinkingTask which is no longer required, as the duplicate results were fixed in DataObject directly (from r110200) (Sam Minnee) + * 2010-10-19 [1023759](https://github.com/silverstripe/sapphire/commit/1023759) Remove whitespace if Surname field set on Member, but not FirstName (from r109334) (Sam Minnee) + * 2010-10-19 [f929d2e](https://github.com/silverstripe/sapphire/commit/f929d2e) phpDoc updates for SS_LogFileWriter and SS_LogEmailWriter (from r109165) (Sam Minnee) + * 2010-10-19 [a91726e](https://github.com/silverstripe/silverstripe-cms/commit/a91726e) #6090 FilesystemPublisherTest now stores temporary files in assets, which is writable, instead of the webroot which almost never has write permissions (from r111883) (Sam Minnee) + * 2010-10-19 [f491f17](https://github.com/silverstripe/silverstripe-cms/commit/f491f17) Fixed SS_Datetime references in BrokenLinksReport and CommentAdmin (fixes #6063, thanks nicolaas) (from r111786) (Sam Minnee) + * 2010-10-19 [7a53a14](https://github.com/silverstripe/silverstripe-cms/commit/7a53a14) Fixed indentation in PageCommentInterface.js (from r111497) (Sam Minnee) + * 2010-10-19 [6fb50a5](https://github.com/silverstripe/silverstripe-cms/commit/6fb50a5) Removing MemberImportFormTest, breaks PHPUnit test run, and doesnt have any assertions (from r111053) (Sam Minnee) + * 2010-10-19 [949d8b3](https://github.com/silverstripe/silverstripe-cms/commit/949d8b3) German translations for cms javascript (#5921, thanks bartlomiej) (from r110435) (Sam Minnee) + * 2010-10-19 [40eb39a](https://github.com/silverstripe/silverstripe-cms/commit/40eb39a) Disallowing more potentially active file extensions in cms/.htaccess (from r108206) (Sam Minnee) + * 2010-10-19 [43f4500](https://github.com/silverstripe/sapphire/commit/43f4500) Fixed tests not working on the web side as redirection to https would occur (from r108666) (Sam Minnee) + * 2010-10-19 [83e31e1](https://github.com/silverstripe/sapphire/commit/83e31e1) Fixed DirectorTest to restore it's REQUEST_URI state to the original one after each test method is run (from r108665) (Sam Minnee) + * 2010-10-19 [b7f2130](https://github.com/silverstripe/sapphire/commit/b7f2130) Fixed failing test as session being set before logging out and losing BackURL (from r108518) (Sam Minnee) + * 2010-10-19 [4aa299c](https://github.com/silverstripe/sapphire/commit/4aa299c) Making "todo" tab title translatable (from r108441) (Sam Minnee) + * 2010-10-19 [8d5c684](https://github.com/silverstripe/sapphire/commit/8d5c684) Reverted r108433 (from r108434) (Sam Minnee) + * 2010-10-19 [07329cc](https://github.com/silverstripe/sapphire/commit/07329cc) DirectorTest should not extend from FunctionalTest (regression from r108428) (from r108433) (Sam Minnee) + * 2010-10-18 [ce06d13](https://github.com/silverstripe/sapphire/commit/ce06d13) Cross-referencing some documentation (from r108375) (Sam Minnee) + * 2010-10-18 [2262f3f](https://github.com/silverstripe/sapphire/commit/2262f3f) Disallowing more potentially active file extensions in cms/.htaccess BUGFIX Re-allowing direct execution in sapphire/thirdparty/tinymce/plugins/spellchecker/rpc.php (necessary for cms spellchecker, was disabled by global .htaccess rule) (from r108207) (Sam Minnee) + * 2010-10-18 [507ade6](https://github.com/silverstripe/sapphire/commit/507ade6) Removed debug (from r108196) (Sam Minnee) + * 2010-10-18 [aa45038](https://github.com/silverstripe/sapphire/commit/aa45038) Documentation in CSVBulkLoader (from r108048) (Sam Minnee) + * 2010-10-18 [bd96d24](https://github.com/silverstripe/sapphire/commit/bd96d24) Fixed incorrect word "colon" with "dot" (from r108002) (Sam Minnee) + * 2010-10-18 [6101296](https://github.com/silverstripe/sapphire/commit/6101296) Fixed TimeField validation _t() entity name (from r107787) (Sam Minnee) + * 2010-10-15 [fd6fa62](https://github.com/silverstripe/sapphire/commit/fd6fa62) Fixed merge error (Ingo Schommer) + * 2010-10-15 [d236cbd](https://github.com/silverstripe/silverstripe-cms/commit/d236cbd) Disabled 'showcalendar' option on CMSMain->SiteTreeFilterDateField() - it causes the CMS to load jQuery UI javascript just for this (rarely used field). To be re-enabled once we work with jQuery UI on a broader scale. (from r107784) (Ingo Schommer) + * 2010-10-15 [78489ad](https://github.com/silverstripe/silverstripe-cms/commit/78489ad) Moved class-specific documentation from doc.silverstripe.org back into class-level PHPDoc (from r107726) (Ingo Schommer) + * 2010-10-15 [d402ca5](https://github.com/silverstripe/silverstripe-cms/commit/d402ca5) Removed debug code in MemberTableField (from r107525) (Ingo Schommer) + * 2010-10-15 [7d4f93f](https://github.com/silverstripe/silverstripe-cms/commit/7d4f93f) Fixed DatetimeField display in cms MINOR Removed obsolete .calendardate styles from cms_right.css (from r107442) (Ingo Schommer) + * 2010-10-15 [a0dd4ff](https://github.com/silverstripe/sapphire/commit/a0dd4ff) Moved class-specific documentation from doc.silverstripe.org back into class-level PHPDoc (from r107725) (Ingo Schommer) + * 2010-10-15 [9877ff6](https://github.com/silverstripe/silverstripe-cms/commit/9877ff6) Reverted r107305 (from r107307) (Ingo Schommer) + * 2010-10-15 [fa41758](https://github.com/silverstripe/silverstripe-cms/commit/fa41758) Removed trailing slash in BackURL, fixed error message sentence structure in PageCommentInterface.ss (fixes #5520) (from r106694) (Ingo Schommer) + * 2010-10-15 [1cc5c5e](https://github.com/silverstripe/silverstripe-cms/commit/1cc5c5e) Fixed merge error (Ingo Schommer) + * 2010-10-15 [66f2fad](https://github.com/silverstripe/silverstripe-cms/commit/66f2fad) Made CMSMainTest more resilient against database ID changes (Postgres doesn't have auto-increment resets across tests at the moment) (from r106248) (Ingo Schommer) + * 2010-10-15 [8f8de04](https://github.com/silverstripe/sapphire/commit/8f8de04) Documentation in DataObjectSet (from r107400) (Ingo Schommer) + * 2010-10-15 [380e0af](https://github.com/silverstripe/sapphire/commit/380e0af) Changed "no_NO" locale for Norwegian into the more commonly used "nb_NO" in i18n class, meaning translations from translate.silverstripe.com can actually be selected now (fixes #5746) (from r107394) (Ingo Schommer) + * 2010-10-15 [35b4170](https://github.com/silverstripe/sapphire/commit/35b4170) Better presentation of extension error message in File and UploadValidator (from r107274) (Ingo Schommer) + * 2010-10-15 [8ed5e18](https://github.com/silverstripe/sapphire/commit/8ed5e18) Changed ImageTest to use fixture files located in assets/ folder, the filesystem API doesn't support Folder objects with "sapphire/..." paths, which leads to inconsistent results (from r107272) (Ingo Schommer) + * 2010-10-15 [9d227ba](https://github.com/silverstripe/sapphire/commit/9d227ba) Making FileTest->setUp()/tearDown() more resilient against in-test file/folder renames (from r107271) (Ingo Schommer) + * 2010-10-15 [8b88f4a](https://github.com/silverstripe/sapphire/commit/8b88f4a) More identifiable file naming in FileTest (from r107270) (Ingo Schommer) + * 2010-10-15 [6cf5372](https://github.com/silverstripe/sapphire/commit/6cf5372) Removed File->setField(), doesn't have any overloaded functionality (from r107266) (Ingo Schommer) + * 2010-10-15 [2d12775](https://github.com/silverstripe/sapphire/commit/2d12775) Documentation in File and Folder class (from r107265) (Ingo Schommer) + * 2010-10-15 [68e98b4](https://github.com/silverstripe/sapphire/commit/68e98b4) Making $Email available in Security_passwordsent.ss template (fixes #5737) (from r106876) (Ingo Schommer) + * 2010-10-15 [dcb4024](https://github.com/silverstripe/sapphire/commit/dcb4024) Added FileTest->testValidateExtension() (related to #5693) (from r106805) (Ingo Schommer) + * 2010-10-15 [122549c](https://github.com/silverstripe/sapphire/commit/122549c) Documentation (from r106804) (Ingo Schommer) + * 2010-10-15 [d51627a](https://github.com/silverstripe/sapphire/commit/d51627a) Fixed hardcoded error message in PasswordValidator (fixes #5734) MINOR Added PasswordValidatorTest (from r106687) (Ingo Schommer) + * 2010-10-15 [5fe548f](https://github.com/silverstripe/sapphire/commit/5fe548f) Fixed memory limit setting in SapphireTest (regression from r106128) (from r106190) (Ingo Schommer) + * 2010-10-15 [7eaca24](https://github.com/silverstripe/sapphire/commit/7eaca24) Removed db/build legacy wording in DevelopmentAdmin (fixes #5676) (from r106083) (Ingo Schommer) + * 2010-10-15 [cf4a722](https://github.com/silverstripe/sapphire/commit/cf4a722) Show better message if couldn't find MySQL version in MySQLDatabaseConfigurationHelper (from r105516) (Ingo Schommer) + * 2010-10-15 [567143b](https://github.com/silverstripe/sapphire/commit/567143b) More solid markup testing in TableListFieldTest through xpath (from r105305) (Ingo Schommer) + * 2010-10-15 [1dc0675](https://github.com/silverstripe/sapphire/commit/1dc0675) Fixed TableListFieldTest->testSelectOptionsRendering() (from r105297) (Ingo Schommer) + * 2010-10-15 [2943c75](https://github.com/silverstripe/sapphire/commit/2943c75) Using ASSETS_DIR and THEMES_DIR constant in Image, ManifestBuilder, Requirements, File (fixes #5619) (from r105282) (Ingo Schommer) + * 2010-10-15 [daa0a42](https://github.com/silverstripe/sapphire/commit/daa0a42) Translations (from r105276) (Ingo Schommer) + * 2010-10-15 [68fcd8c](https://github.com/silverstripe/sapphire/commit/68fcd8c) Reverted r105264, breaks CompositeFieldTest, FieldSetTest, TranslatableTest (from r105274) (Ingo Schommer) + * 2010-10-15 [d3ebd0d](https://github.com/silverstripe/silverstripe-cms/commit/d3ebd0d) Using ASSETS_DIR constant in StaticPublisher (fixes #5619) (from r105281) (Ingo Schommer) + * 2010-10-15 [1700c77](https://github.com/silverstripe/silverstripe-cms/commit/1700c77) Translations (from r105277) (Ingo Schommer) + * 2010-10-15 [cc4160c](https://github.com/silverstripe/silverstripe-cms/commit/cc4160c) Updated TableListField sublcass template to work with new TableListField->SelectOptions() setting (from r105273) (Ingo Schommer) + * 2010-10-15 [d7409fa](https://github.com/silverstripe/silverstripe-cms/commit/d7409fa) Fixed _t() call in PageCommentInterface.ss (from r105272) (Ingo Schommer) + * 2010-10-15 [0ac0bec](https://github.com/silverstripe/silverstripe-cms/commit/0ac0bec) Added translations for BrokenLinksReport, ReportAdminForm.ss, AssetTableField.ss (fixes #5527, thanks Martimiz) (from r104980) (Ingo Schommer) + * 2010-10-15 [5f393e7](https://github.com/silverstripe/silverstripe-cms/commit/5f393e7) Translations in PageCommentInterface.ss (fixes #5598, thanks Pike) (from r104970) (Ingo Schommer) + * 2010-10-15 [ece834e](https://github.com/silverstripe/silverstripe-cms/commit/ece834e) Documentation (from r104402) (Ingo Schommer) + * 2010-10-15 [4c1938f](https://github.com/silverstripe/sapphire/commit/4c1938f) Added DbDatetimeTest cases to sapphire (these were previously in the sqlite3 module, but they actually test core Database functionality) (from r105196) (Ingo Schommer) + * 2010-10-15 [6354ea5](https://github.com/silverstripe/sapphire/commit/6354ea5) Documentation (from r105188) (Ingo Schommer) + * 2010-10-15 [93105a7](https://github.com/silverstripe/silverstripe-installer/commit/93105a7) Remove whitespace from generated _config.php file in installer (from r112268) (sminnee) + * 2010-10-15 [8d27740](https://github.com/silverstripe/sapphire/commit/8d27740) Documentation (from r105011) (Ingo Schommer) + * 2010-10-15 [3df7734](https://github.com/silverstripe/silverstripe-installer/commit/3df7734) Documentation for phpunit.xml.dist (from r111491) (sminnee) + * 2010-10-15 [72abcd0](https://github.com/silverstripe/sapphire/commit/72abcd0) Documentation (from r105009) (Ingo Schommer) + * 2010-10-15 [352d308](https://github.com/silverstripe/sapphire/commit/352d308) Documentation (from r105005) (Ingo Schommer) + * 2010-10-15 [df024e5](https://github.com/silverstripe/silverstripe-installer/commit/df024e5) Exclude "sanity check" type tests by default from PHPUnit runs (e.g. PhpSyntaxTest) (from r111117) (sminnee) + * 2010-10-15 [a66c159](https://github.com/silverstripe/sapphire/commit/a66c159) Documentation (from r104996) (Ingo Schommer) + * 2010-10-15 [267bec9](https://github.com/silverstripe/sapphire/commit/267bec9) Language master file (from r104993) (Ingo Schommer) + * 2010-10-15 [4f798d4](https://github.com/silverstripe/sapphire/commit/4f798d4) Removed duplicated code in i18nTextCollector, more defensive checks for get_owner_module() (from r104992) (Ingo Schommer) + * 2010-10-15 [a213ce7](https://github.com/silverstripe/sapphire/commit/a213ce7) Allowing translation of "save" button in SiteConfig->getCMSActions() (from r104978) (Ingo Schommer) + * 2010-10-15 [55d6682](https://github.com/silverstripe/silverstripe-installer/commit/55d6682) Changed unknown web server text (from r108571) (sminnee) + * 2010-10-15 [83567dc](https://github.com/silverstripe/silverstripe-installer/commit/83567dc) Removed double up of similar logic in InstallRequirements (from r108569) (sminnee) + * 2010-10-15 [f9d29bd](https://github.com/silverstripe/silverstripe-installer/commit/f9d29bd) Simplified discovery of webserver during install (from r108568) (sminnee) + * 2010-10-15 [2a78807](https://github.com/silverstripe/silverstripe-installer/commit/2a78807) Removed unncessary isset() check (from r108561) (sminnee) + * 2010-10-15 [d135ae6](https://github.com/silverstripe/sapphire/commit/d135ae6) Reverted r104923, as current database releases of mssql and sqlite3 modules don't support this yet (from r104924) (Ingo Schommer) + * 2010-10-15 [7b040c4](https://github.com/silverstripe/silverstripe-installer/commit/7b040c4) Disallowing more potentially active file extensions in mysite/.htaccess (from r108208) (sminnee) + * 2010-10-15 [e5f41ca](https://github.com/silverstripe/sapphire/commit/e5f41ca) Fixed hidden mbstring reliance in SiteTree->generateURLSegment() (broken in r104679) (from r104883) (Ingo Schommer) + * 2010-10-15 [c402bb9](https://github.com/silverstripe/silverstripe-installer/commit/c402bb9) Tweaking of installer text to avoid misleading information about "exists" when there's actually an error (from r107366) (sminnee) + * 2010-10-15 [820c49e](https://github.com/silverstripe/silverstripe-installer/commit/820c49e) Installer should not repeat "Could not determine your database version" twice in slightly varied words (from r105517) (sminnee) + * 2010-10-15 [0c2f4d3](https://github.com/silverstripe/silverstripe-installer/commit/0c2f4d3) Installing screen now has a page title called "Installing SilverStripe..." instead of "PHP 5 is required" (from r104710) (sminnee) + * 2010-10-15 [d5e8eed](https://github.com/silverstripe/silverstripe-installer/commit/d5e8eed) Removed double returns in installer (redundant code) (from r104709) (sminnee) + * 2010-10-15 [cf31776](https://github.com/silverstripe/silverstripe-installer/commit/cf31776) Renamed checkdatabase method to checkDatabase to be consistent (from r104708) (sminnee) + * 2010-10-15 [2341f3f](https://github.com/silverstripe/sapphire/commit/2341f3f) Fixed SiteTreeTest and SiteTreePermissionsTest to work alongside subsites module (SiteTreeSubsites changes the canEdit() behaviour) (from r104798) (Ingo Schommer) + * 2010-10-15 [689494d](https://github.com/silverstripe/sapphire/commit/689494d) Fixed SiteConfigTest to work alongsite subsites module (SiteTreeSubsites changes the canEdit() behaviour) (from r104796) (Ingo Schommer) + * 2010-10-15 [94032c6](https://github.com/silverstripe/sapphire/commit/94032c6) Documentation (from r104795) (Ingo Schommer) + * 2010-10-15 [5dc8b97](https://github.com/silverstripe/sapphire/commit/5dc8b97) Documentation (from r104769) (Ingo Schommer) + * 2010-10-15 [0b6feff](https://github.com/silverstripe/sapphire/commit/0b6feff) Documentation (from r104767) (Ingo Schommer) + * 2010-10-15 [ecb758d](https://github.com/silverstripe/sapphire/commit/ecb758d) Added DirectorTest->testURLParam() and DirectorTest->testURLParams() (from r104711) (Ingo Schommer) + * 2010-10-15 [537f181](https://github.com/silverstripe/sapphire/commit/537f181) Show install MySQL version at 5.0+ as 4.1 does not work properly with SilverStripe (from r104705) (Ingo Schommer) + * 2010-10-15 [0e99090](https://github.com/silverstripe/sapphire/commit/0e99090) Tweaks to positioning of help text in installer (from r104704) (Ingo Schommer) + * 2010-10-15 [eb0de3c](https://github.com/silverstripe/sapphire/commit/eb0de3c) Fixed merge error from r112365 (Ingo Schommer) + * 2010-10-15 [bfe44b3](https://github.com/silverstripe/sapphire/commit/bfe44b3) Documentation (from r104610) (Ingo Schommer) + * 2010-10-15 [3a6b79a](https://github.com/silverstripe/sapphire/commit/3a6b79a) Fixed wrong _t() notation in ChangePasswordForm (broken in r103226 and r104596) (from r104598) (Ingo Schommer) + * 2010-10-15 [079167c](https://github.com/silverstripe/sapphire/commit/079167c) Making strings in ContentControllerSearchExtension translatable (from r104596) (Ingo Schommer) + * 2010-10-15 [59ae019](https://github.com/silverstripe/sapphire/commit/59ae019) Defensive coding in MigrateSiteTreeLinkingTask (from r104594) (Ingo Schommer) + * 2010-10-15 [4b3fa8f](https://github.com/silverstripe/sapphire/commit/4b3fa8f) Documentation (from r104483) (Ingo Schommer) + * 2010-10-15 [a191019](https://github.com/silverstripe/sapphire/commit/a191019) Documentation (from r104404) (Ingo Schommer) + * 2010-10-14 [82b5b17](https://github.com/silverstripe/sapphire/commit/82b5b17) Documentation migrated from doc.ss.org (from r104158) (Ingo Schommer) + * 2010-10-14 [32afc29](https://github.com/silverstripe/sapphire/commit/32afc29) Migrated various API-style documentation from doc.ss.org (from r104157) (Ingo Schommer) + * 2010-10-13 [bdb865e](https://github.com/silverstripe/silverstripe-installer/commit/bdb865e) Changed text "mod_rewrite enabled" to "URL rewriting support" which makes more sense as a requirement (from r101348) (sminnee) + * 2010-10-13 [61d3293](https://github.com/silverstripe/silverstripe-installer/commit/61d3293) Removed whitespace in writing of htaccess file for output (from r101344) (sminnee) + * 2010-10-13 [0cd2083](https://github.com/silverstripe/silverstripe-installer/commit/0cd2083) Removed traces of "firstname" and "surname" from installer (these were removed in config-form in r101314) (from r101315) (sminnee) + * 2010-10-13 [55c0e7e](https://github.com/silverstripe/silverstripe-installer/commit/55c0e7e) Added todo for exception handling done with default admin (from r101086) (sminnee) + * 2010-10-13 [aba0caf](https://github.com/silverstripe/silverstripe-installer/commit/aba0caf) Temporary fix for exception thrown in installer when existing admin account exists, temp fix just leaves existing admin account intact (from r101085) (sminnee) + * 2010-10-13 [8169456](https://github.com/silverstripe/silverstripe-installer/commit/8169456) Fixed incorrect name "FileSystem" replacing with "Filesystem" (from r101084) (sminnee) + * 2010-10-13 [77137e1](https://github.com/silverstripe/silverstripe-installer/commit/77137e1) Additional fixes for install.php (see r101063) (from r101067) (sminnee) + * 2010-10-13 [c5dc242](https://github.com/silverstripe/silverstripe-installer/commit/c5dc242) Fixed install.php to accept "typed" database configuration (see r101054) (from r101063) (sminnee) + * 2010-10-13 [dd1af76](https://github.com/silverstripe/silverstripe-installer/commit/dd1af76) Installer generated mysite/_config.php file now has consistent code formatting (from r100984) (sminnee) + * 2010-10-13 [8654d46](https://github.com/silverstripe/silverstripe-installer/commit/8654d46) Removed registered databases from installer, these are autodiscovered from sapphire/_register_database.php now (from r100903) (sminnee) + * 2010-10-13 [51d4836](https://github.com/silverstripe/silverstripe-installer/commit/51d4836) Updated registered databases in installer from changes to DatabaseRegistry in r100898 (from r100899) (sminnee) + * 2010-10-13 [b9bf36c](https://github.com/silverstripe/silverstripe-installer/commit/b9bf36c) Fixed improper quoting in locale setting (from r100839) (sminnee) + * 2010-10-13 [24887b1](https://github.com/silverstripe/silverstripe-installer/commit/24887b1) Code formatting (from r100802) (sminnee) + * 2010-10-13 [454d58a](https://github.com/silverstripe/silverstripe-installer/commit/454d58a) phpDoc update for Page (from r100735) (sminnee) + * 2010-10-13 [7f9d487](https://github.com/silverstripe/silverstripe-installer/commit/7f9d487) Code formatting fixes for default Page pagetype (from r100734) (sminnee) + * 2010-10-13 [03edb8b](https://github.com/silverstripe/silverstripe-installer/commit/03edb8b) remove the sqlite databases from the installer list. (from r100697) (sminnee) + * 2010-10-13 [b69d0a9](https://github.com/silverstripe/silverstripe-installer/commit/b69d0a9) Show "Unknown web server" if server couldn't be determined (from r100636) (sminnee) + * 2010-10-13 [15d13b6](https://github.com/silverstripe/silverstripe-installer/commit/15d13b6) Fixed place where IIS was used instead of checking for 7 (from r100635) (sminnee) + * 2010-10-13 [322be54](https://github.com/silverstripe/silverstripe-installer/commit/322be54) Check for IIS/7 specifically, as IIS 6 has a completely different way of installing (from r100634) (sminnee) + * 2010-10-13 [34fa1f0](https://github.com/silverstripe/silverstripe-installer/commit/34fa1f0) Removed ecommerce and payment from "make getallmodules" (from r100559) (sminnee) + * 2010-10-13 [e3360ab](https://github.com/silverstripe/silverstripe-installer/commit/e3360ab) Fixed character glitch in UPGRADING file (from r100558) (sminnee) + * 2010-10-13 [0243a2a](https://github.com/silverstripe/silverstripe-installer/commit/0243a2a) Fixed location to tutorials in INSTALL file which went to an empty page (from r100557) (sminnee) + * 2010-10-13 [5a10c7a](https://github.com/silverstripe/silverstripe-installer/commit/5a10c7a) Removed lighthttpd from INSTALL notes since this server isn't supported during installer process (more details on the server requirements wiki page) (from r100556) (sminnee) + * 2010-10-13 [0cd01f3](https://github.com/silverstripe/silverstripe-installer/commit/0cd01f3) Updated INSTALL notes with minimum PHP version (from r100555) (sminnee) + * 2010-10-13 [216b934](https://github.com/silverstripe/silverstripe-installer/commit/216b934) Updated INSTALL notes (from r100388) (sminnee) + * 2010-10-13 [c153aa6](https://github.com/silverstripe/silverstripe-installer/commit/c153aa6) Made the database types clearer by setting the minimum version required alongside the name - e.g. "MySQL 4.1+" (from r100381) (sminnee) + * 2010-10-13 [88d6823](https://github.com/silverstripe/silverstripe-cms/commit/88d6823) Fixed CMSMainTest for postgres by not hardcoding fixture IDs (from r103818) (Sam Minnee) + * 2010-10-13 [e40661c](https://github.com/silverstripe/silverstripe-cms/commit/e40661c) Unsetting state in FilesystemPublisherTest (regression from r103745) (from r103763) (Sam Minnee) + * 2010-10-13 [5b15f9e](https://github.com/silverstripe/silverstripe-cms/commit/5b15f9e) Improved help texts around permissions (from r100783) (Sam Minnee) + * 2010-10-13 [d7ffd8c](https://github.com/silverstripe/sapphire/commit/d7ffd8c) Fixed TranslatableSearchFormTest for postgresql (strict type assertions) (from r103821) (Sam Minnee) + * 2010-10-13 [cde2f6e](https://github.com/silverstripe/sapphire/commit/cde2f6e) Fixed TranslatableTest for postgresql database driver (mostly ordering issues) (from r103819) (Sam Minnee) + * 2010-10-13 [94158ef](https://github.com/silverstripe/sapphire/commit/94158ef) Removed mysql specific functionality from DataObjectSchemaGenerationTest and moved it to a new MySQLDatabaseTest (from r103799) (Sam Minnee) + * 2010-10-13 [5fe546d](https://github.com/silverstripe/sapphire/commit/5fe546d) Fixed TranslatableTest for postgresql database driver (mostly ordering issues) (from r103798) (Sam Minnee) + * 2010-10-13 [f5fb01d](https://github.com/silverstripe/sapphire/commit/f5fb01d) Fixed AggregateTest for MSSQLDatabase (wrong date formatting) (from r103640) (Sam Minnee) + * 2010-10-13 [077a119](https://github.com/silverstripe/sapphire/commit/077a119) Database quoting in TreeDropdownField (fixes #5484) (from r103515) (Sam Minnee) + * 2010-10-13 [a45a483](https://github.com/silverstripe/sapphire/commit/a45a483) Reverted accidental commit of date_default_timezone_set() to Pacific/Auckland (see r89164) (from r103345) (Sam Minnee) + * 2010-10-13 [eb43fb1](https://github.com/silverstripe/sapphire/commit/eb43fb1) Returning ValidationResult from Member->onBeforeWrite() to ensure the ValidationException is compatible with MemberTableField (related to r103336) (from r103337) (Sam Minnee) + * 2010-10-13 [1379f13](https://github.com/silverstripe/sapphire/commit/1379f13) Enum DBField class should default to ExactMatchFilter to avoid wrong results with overlapping Enum values in LIKE queries (see #5434) (from r103322) (Sam Minnee) + * 2010-10-13 [c91949e](https://github.com/silverstripe/silverstripe-installer/commit/c91949e) Removed unused method in installer (from r99006) (sminnee) + * 2010-10-13 [f61920a](https://github.com/silverstripe/silverstripe-installer/commit/f61920a) Updated UPGRADING notes (#5063) (from r98910) (sminnee) + * 2010-10-13 [de519f3](https://github.com/silverstripe/silverstripe-installer/commit/de519f3) Removed unnecessary check for conflicting classes Query and HTTPResponse in installer, these are now namespaced as SS_Query and SS_HTTPResponse (from r98896) (sminnee) + * 2010-10-13 [ae4cf3b](https://github.com/silverstripe/silverstripe-installer/commit/ae4cf3b) Removed unncessary ?> tag in generated _config.php file (from r98894) (sminnee) + * 2010-10-13 [22ed5df](https://github.com/silverstripe/silverstripe-installer/commit/22ed5df) Removed unnecessary end tag which the original _config.php doesn't have anyway (from r98891) (sminnee) + * 2010-10-13 [4997c0a](https://github.com/silverstripe/silverstripe-installer/commit/4997c0a) Removed MySQL specific checking from the installer until we can figure out how to do it well across different databases. The only remaining MySQL specifics in the installer is the sending of the server information to ss2stats (from r98877) (sminnee) + * 2010-10-13 [1a2f989](https://github.com/silverstripe/silverstripe-installer/commit/1a2f989) Removed check for MySQL function in the main PHP configuration - this is done separately by database helper classes (from r98875) (sminnee) + * 2010-10-13 [2f452bf](https://github.com/silverstripe/silverstripe-installer/commit/2f452bf) Reverted r98850 which broke the installer on Windows (from r98862) (sminnee) + * 2010-10-13 [c4de1cb](https://github.com/silverstripe/silverstripe-installer/commit/c4de1cb) Renamed keys to database configuration results (from r98795) (sminnee) + * 2010-10-13 [6368a4f](https://github.com/silverstripe/silverstripe-installer/commit/6368a4f) Amendments to installer database configuration and small issue detecting database support in PHP (from r98794) (sminnee) + * 2010-10-13 [73964a8](https://github.com/silverstripe/silverstripe-installer/commit/73964a8) Removed warning that appears during installation steps (regression from recent changes) (from r98793) (sminnee) + * 2010-10-13 [0c0fe50](https://github.com/silverstripe/silverstripe-installer/commit/0c0fe50) Doc for database configuration helper (from r98789) (sminnee) + * 2010-10-13 [e013e75](https://github.com/silverstripe/silverstripe-installer/commit/e013e75) Convert crlf (Windows) line endings to lf (UNIX) for install.php (from r93895) (sminnee) + * 2010-10-13 [9b34021](https://github.com/silverstripe/silverstripe-installer/commit/9b34021) Added location on where to download the MS URL rewrite module when installing on IIS (from r93244) (sminnee) + * 2010-10-13 [44be8c3](https://github.com/silverstripe/silverstripe-installer/commit/44be8c3) Fixed ambiguous statements about the database in installation, refer to MySQL specifically since that's what it's checking for (from r93107) (sminnee) + * 2010-10-13 [be07c8c](https://github.com/silverstripe/silverstripe-installer/commit/be07c8c) Fixed grammar mistake in install (from r92304) (sminnee) + * 2010-10-13 [b0b542d](https://github.com/silverstripe/silverstripe-cms/commit/b0b542d) Fixed SapphireTest->logInWithPermission() spelling (from r99492) (Sam Minnee) + * 2010-10-13 [fdef9b0](https://github.com/silverstripe/silverstripe-cms/commit/fdef9b0) (Sam Minnee) + * 2010-10-13 [83f117f](https://github.com/silverstripe/sapphire/commit/83f117f) Using canView() instead of deprecated can('view') in ContentController (from r102909) (Sam Minnee) + * 2010-10-13 [6c3bcc3](https://github.com/silverstripe/sapphire/commit/6c3bcc3) Fixed spelling mistake in ConfigureFromEnv class documentation (from r102045) (Sam Minnee) + * 2010-10-13 [0cc6d2b](https://github.com/silverstripe/sapphire/commit/0cc6d2b) Fixed VersionedTest arguments in test case (from r102018) (Sam Minnee) + * 2010-10-13 [e8e7065](https://github.com/silverstripe/sapphire/commit/e8e7065) Fixed indentation (from r102009) (Sam Minnee) + * 2010-10-13 [bbdad42](https://github.com/silverstripe/sapphire/commit/bbdad42) take advantage of an alternate path for error pages (from r101883) (Sam Minnee) + * 2010-10-13 [5fd242a](https://github.com/silverstripe/sapphire/commit/5fd242a) TreeTitle really should return title, not name. (from r101882) (Sam Minnee) + * 2010-10-13 [7d765fc](https://github.com/silverstripe/sapphire/commit/7d765fc) Fixed JSONDataFormatter excaping (fixes #5309, thanks briley) (from r101811) (Sam Minnee) + * 2010-10-13 [328b3d2](https://github.com/silverstripe/sapphire/commit/328b3d2) Removed unnecessary "show" icons in "Roles" and "Member" ComplexTableFields (from r101751) (Sam Minnee) + * 2010-10-13 [b88f462](https://github.com/silverstripe/sapphire/commit/b88f462) Fixed tab naming in Group->getCMSFields() (from r101718) (Sam Minnee) + * 2010-10-13 [d25e326](https://github.com/silverstripe/sapphire/commit/d25e326) Removed fullstop where it wasn't needed (from r101688) (Sam Minnee) + * 2010-10-13 [c4e8624](https://github.com/silverstripe/sapphire/commit/c4e8624) Tidied up the layout of the Themes area of the installer slightly - now consistent helptext as other areas (from r101687) (Sam Minnee) + * 2010-10-13 [d3129b8](https://github.com/silverstripe/sapphire/commit/d3129b8) Updated CMS Admin Account text to be more precise (from r101686) (Sam Minnee) + * 2010-10-13 [d07297a](https://github.com/silverstripe/sapphire/commit/d07297a) Altered wording in installer for localised interface (from r101683) (Sam Minnee) + * 2010-10-13 [6ba3268](https://github.com/silverstripe/sapphire/commit/6ba3268) Reverted r101670 as it broke assumptions made in RedirectorPageTest (from r101671) (Sam Minnee) + * 2010-10-13 [6f69357](https://github.com/silverstripe/sapphire/commit/6f69357) Made the default database directory relative to assets ".db" which is more precise than ".sqlitedb" (from r101619) (Sam Minnee) + * 2010-10-13 [2bf9d6f](https://github.com/silverstripe/sapphire/commit/2bf9d6f) Made SQLite path in installer use DIRECTORY_SEPARATOR so it shows as correct on Windows using backslashes instead of forwardslashes - this is more of a cosmetic thing, as slashes can be interchanged and still parsed correctly by PHP (from r101618) (Sam Minnee) + * 2010-10-13 [559a05b](https://github.com/silverstripe/sapphire/commit/559a05b) Removed rewritest.php places in sapphire since it's no longer part of the phpinstaller/branches/2.4 package (from r101353) (Sam Minnee) + * 2010-10-13 [252321f](https://github.com/silverstripe/sapphire/commit/252321f) Made reinstall message more precise by adding web.config to the files that will get overwritten (from r101341) (Sam Minnee) + * 2010-10-13 [875197b](https://github.com/silverstripe/sapphire/commit/875197b) Moved "theme" section further down in the installer, its much less likely to be changed than the database connection and admin account fields. (from r101282) (Sam Minnee) + * 2010-10-12 [1dcc540](https://github.com/silverstripe/sapphire/commit/1dcc540) Fixed missing closing <div> in ContentController->successfullyinstalled() (from r101254) (Sam Minnee) + * 2010-10-12 [cfae8d5](https://github.com/silverstripe/sapphire/commit/cfae8d5) Fixed regression in install.js option selection (see r101173) (from r101251) (Sam Minnee) + * 2010-10-10 [3f2cc79](https://github.com/silverstripe/sapphire/commit/3f2cc79) More common language in Date->TimeDiff() ("in 2 hours" instead of "2 hours away") (fixes #5402) (Ingo Schommer) + * 2010-10-10 [96fe7ba](https://github.com/silverstripe/sapphire/commit/96fe7ba) Removed debug code (Ingo Schommer) + * 2010-10-04 [a447f71](https://github.com/silverstripe/silverstripe-cms/commit/a447f71) Fixed phpdoc documentation (from r103397) (Sam Minnee) + * 2010-10-04 [ba79558](https://github.com/silverstripe/silverstripe-cms/commit/ba79558) Saving TinyMCE editor focus in tinymce_ssbuttons plugin when sidepanel is opened (see #5263) (from r101974) (Sam Minnee) + * 2010-10-04 [dea5cdd](https://github.com/silverstripe/silverstripe-cms/commit/dea5cdd) Removed unnecessary "show" icons in "Roles" and "Member" ComplexTableFields (from r101752) (Sam Minnee) + * 2010-10-04 [d53ea50](https://github.com/silverstripe/silverstripe-cms/commit/d53ea50) Fixed multifile.js non-standard forEach() reference, using jQuery.each() instead (from r101135) (Sam Minnee) + * 2010-10-04 [18add37](https://github.com/silverstripe/silverstripe-cms/commit/18add37) Fixed wrong default value for AssetAdmin (see r101106) (from r101111) (Sam Minnee) + * 2010-10-04 [10081b2](https://github.com/silverstripe/silverstripe-cms/commit/10081b2) Fixed merge error from r99117 (from r101076) (Sam Minnee) + * 2010-10-04 [8ea6ddd](https://github.com/silverstripe/silverstripe-cms/commit/8ea6ddd) Fixed permission language code regression (from r101062) (Sam Minnee) + * 2010-10-04 [5176cdd](https://github.com/silverstripe/silverstripe-cms/commit/5176cdd) Adjusted CMSMain->getRootForm() to SiteConfig API changes (from r100974) (Sam Minnee) + * 2010-10-04 [75c6413](https://github.com/silverstripe/silverstripe-cms/commit/75c6413) Removed underscores from combined files in LeftAndMain, made redundant by r100536 (from r100537) (Sam Minnee) + * 2010-10-04 [f04470d](https://github.com/silverstripe/silverstripe-cms/commit/f04470d) LeftAndMain combined files don't need to be prefixed with "assets" because default combined folder is set in sapphire/_config.php (from r100530) (Sam Minnee) + * 2010-10-04 [2010923](https://github.com/silverstripe/silverstripe-cms/commit/2010923) add extendability to SecurityAdmin (from r100360) (Sam Minnee) + * 2010-10-04 [d98563e](https://github.com/silverstripe/silverstripe-cms/commit/d98563e) add pass thru group and sort methods (from r99497) (Sam Minnee) + * 2010-10-04 [f609416](https://github.com/silverstripe/silverstripe-cms/commit/f609416) Moved timezone coupling in SS_Report labels into timezoneawareness module (from r99178) (Sam Minnee) + * 2010-10-04 [405a9c4](https://github.com/silverstripe/silverstripe-cms/commit/405a9c4) Localized reports (from r99137) (Sam Minnee) + * 2010-10-04 [11fac7c](https://github.com/silverstripe/silverstripe-cms/commit/11fac7c) refactored setting/getting strict hierarchy setting. (from r98654) (from r99126) (Sam Minnee) + * 2010-10-04 [2d02afc](https://github.com/silverstripe/silverstripe-cms/commit/2d02afc) more unit tests around loose hierarchy (from r98509) (from r99121) (Sam Minnee) + * 2010-10-04 [9cec4a0](https://github.com/silverstripe/sapphire/commit/9cec4a0) Documentation relating to r101106 (from r101107) (Sam Minnee) + * 2010-10-04 [37629a9](https://github.com/silverstripe/sapphire/commit/37629a9) Improved wording of SQLite installer (from r101057) (Sam Minnee) + * 2010-10-04 [f9c8884](https://github.com/silverstripe/sapphire/commit/f9c8884) phpDoc change for Upload (from r101052) (Sam Minnee) + * 2010-10-04 [848faf2](https://github.com/silverstripe/sapphire/commit/848faf2) tests can now require default records on classes (from r101025) (Sam Minnee) + * 2010-10-04 [0abbef5](https://github.com/silverstripe/sapphire/commit/0abbef5) UploadTest now cleans up after itself when it creates a custom folder relative to assets (from r100991) (Sam Minnee) + * 2010-10-04 [7f147f9](https://github.com/silverstripe/sapphire/commit/7f147f9) Added tests for Upload_Validator/UploadTest_Validator for allowed extensions validation (from r100990) (Sam Minnee) + * 2010-10-04 [390d9b4](https://github.com/silverstripe/sapphire/commit/390d9b4) Updated required version to 5.1 in php5-required template (from r100988) (Sam Minnee) + * 2010-10-04 [387d34f](https://github.com/silverstripe/sapphire/commit/387d34f) Removed whitespace from "Development servers" textarea for installer (from r100978) (Sam Minnee) + * 2010-10-04 [30037f2](https://github.com/silverstripe/sapphire/commit/30037f2) Updated r100966 to include spaces on ternary operator for readability and coding conventions (from r100975) (Sam Minnee) + * 2010-10-04 [0598665](https://github.com/silverstripe/sapphire/commit/0598665) Renamed SiteTree->getEditFormFields() to getCMSFields() (including new decorator hook for 'updateCMSFields'). Renamed SiteTree->getEditFormActions() to getCMSActions() (including new decorator hook for 'updateCMSActions'). Old API was never released (from r100967) (Sam Minnee) + * 2010-10-04 [11b1367](https://github.com/silverstripe/sapphire/commit/11b1367) Fixed "disabled" styling for database options in config-form.html (showed all as green when "use _ss_environment" was ticked (from r100965) (Sam Minnee) + * 2010-10-04 [ae66792](https://github.com/silverstripe/sapphire/commit/ae66792) Added jQuery requirement to TreeDropdownField (see #5139) (from r100946) (Sam Minnee) + * 2010-10-04 [1c6e0c3](https://github.com/silverstripe/sapphire/commit/1c6e0c3) Changed the way DatabaseAdapterRegistry accepts databases (from r100898) (Sam Minnee) + * 2010-10-04 [e55102e](https://github.com/silverstripe/sapphire/commit/e55102e) Using jquery.live instead of livequery on ImageFormAction.js (from r100886) (Sam Minnee) + * 2010-08-03 [0d66807](https://github.com/silverstripe/silverstripe-cms/commit/0d66807) Removed debug coe (Ingo Schommer) + * 2010-08-03 [229ab46](https://github.com/silverstripe/silverstripe-cms/commit/229ab46) Don't move $('#Form_VersionsForm') buttons to top, they disappear (Ingo Schommer) + * 2010-08-03 [802ad59](https://github.com/silverstripe/silverstripe-cms/commit/802ad59) Fixed FilesystemPublisherTest to have self-contained extension settings, and not rely on static publishing being enable in mysite/_config.php already. Fixed login permissions for doPublish() calls in test case. (from r99347) (Ingo Schommer) + * 2010-06-03 [1be6520](https://github.com/silverstripe/silverstripe-cms/commit/1be6520) Removed nested mergeinfo (Ingo Schommer) + * 2010-06-03 [653d162](https://github.com/silverstripe/silverstripe-cms/commit/653d162) pingStatus ping frequency reduced MINOR updated lang file for SiteConfig MINOR improved documentation in StaticPublisher MINOR improved documentation in CMSMain surrounding reports and siteconfig MINOR migrated headers in SiteConfig to i18n'd (from r86429) (from r99112) (Ingo Schommer) + * 2010-06-03 [9a05d59](https://github.com/silverstripe/silverstripe-cms/commit/9a05d59) Added Requirements for SilverStripeNavigator (see r99080) (from r99098) (Ingo Schommer) + * 2010-06-03 [90ff558](https://github.com/silverstripe/silverstripe-cms/commit/90ff558) make static caching smarter around cacheSubdirs (from r99076) (Ingo Schommer) + * 2010-06-03 [2020a17](https://github.com/silverstripe/silverstripe-cms/commit/2020a17) disable real-time static publishing (from r99008) (Ingo Schommer) + * 2010-06-03 [e35c941](https://github.com/silverstripe/silverstripe-cms/commit/e35c941) Added implied javascript requirements to ThumbnailStripField->FieldHolder() (Ingo Schommer) + * 2010-06-03 [a3940b4](https://github.com/silverstripe/silverstripe-cms/commit/a3940b4) Fixed SS_HTTPResponse references in CMSBatchActionHandler (from r98285) (Ingo Schommer) + * 2010-05-28 [f3dbe12](https://github.com/silverstripe/silverstripe-cms/commit/f3dbe12) Merge error (Ingo Schommer) + * 2010-05-28 [d98e20f](https://github.com/silverstripe/silverstripe-cms/commit/d98e20f) Removed argument to getDescendantIDList() in ThumbnailStripField that doesn't exist on the method (from r98390) (Ingo Schommer) + * 2010-05-28 [2423e7d](https://github.com/silverstripe/silverstripe-cms/commit/2423e7d) Documentation (from r98284) (Ingo Schommer) + * 2010-05-28 [d1101b0](https://github.com/silverstripe/silverstripe-cms/commit/d1101b0) set Print flag correctly on TLF MINOR custom print template for SSReport TLF's that exposes the report title, and filters set (from r97138) (from r98208) (Ingo Schommer) + * 2010-05-28 [1bff281](https://github.com/silverstripe/silverstripe-cms/commit/1bff281) fix dropdown labels (from r97063) (from r98206) (Ingo Schommer) + * 2010-05-28 [65a35d9](https://github.com/silverstripe/silverstripe-cms/commit/65a35d9) using better sorting api (from r96483) (from r98197) (Ingo Schommer) + * 2010-05-28 [2e0afb8](https://github.com/silverstripe/silverstripe-cms/commit/2e0afb8) fix sorting in this report. (from r96481) (from r98196) (Ingo Schommer) + * 2010-05-28 [388d474](https://github.com/silverstripe/silverstripe-cms/commit/388d474) make site checking clearer on broken links report (from r96456) (from r98195) (Ingo Schommer) + * 2010-05-28 [8500e31](https://github.com/silverstripe/silverstripe-cms/commit/8500e31) typo fixes, adding missing columns (from r96433) (from r98193) (Ingo Schommer) + * 2010-05-28 [b5e3c6a](https://github.com/silverstripe/silverstripe-cms/commit/b5e3c6a) remove sort direction when running canSortBy. Also added test coverage for this. (from r96428) (from r98192) (Ingo Schommer) + * 2010-05-28 [0a003df](https://github.com/silverstripe/silverstripe-cms/commit/0a003df) improved wording on reports (from r96258) (from r98189) (Ingo Schommer) + * 2010-05-28 [95346c7](https://github.com/silverstripe/silverstripe-cms/commit/95346c7) added broken links report (from r96139) (from r98187) (Ingo Schommer) + * 2010-05-25 [e430852](https://github.com/silverstripe/silverstripe-cms/commit/e430852) Better error checking in SiteTreeNode javasceript (Ingo Schommer) + * 2010-05-25 [06f1848](https://github.com/silverstripe/sapphire/commit/06f1848) Improved help texts around permissions (from r100784) (Ingo Schommer) + * 2010-05-25 [1d80d77](https://github.com/silverstripe/sapphire/commit/1d80d77) Fixed regression from r100774 (from r100775) (Ingo Schommer) + * 2010-05-25 [9f6bf69](https://github.com/silverstripe/sapphire/commit/9f6bf69) dont copy embargo or expiry to virtual page (from r100772) (Ingo Schommer) + * 2010-05-25 [787a7d9](https://github.com/silverstripe/sapphire/commit/787a7d9) Removed "only advanced users" notice in Group->getCMSFields() - this field is now sufficiently useable for all admins with access to admin/security without knowing about permission codes (from r100770) (Ingo Schommer) + * 2010-05-25 [d87964f](https://github.com/silverstripe/sapphire/commit/d87964f) make cache header clearer (from r100732) (Ingo Schommer) + * 2010-05-25 [ee0be99](https://github.com/silverstripe/sapphire/commit/ee0be99) remove the sqlite databases from the installer list. (from r100697) (Ingo Schommer) + * 2010-05-25 [14d1e8e](https://github.com/silverstripe/sapphire/commit/14d1e8e) Added note about other databases (from r100669) (Ingo Schommer) + * 2010-05-25 [dc97df6](https://github.com/silverstripe/sapphire/commit/dc97df6) BasicAuth - removed unncessary extending of Object since this class only has a bunch of static functions (from r100626) (Ingo Schommer) + * 2010-05-25 [4ec18cc](https://github.com/silverstripe/sapphire/commit/4ec18cc) Cookie - removed unncessary extending of Object since this class only has a bunch of static functions (from r100625) (Ingo Schommer) + * 2010-05-25 [2e5b681](https://github.com/silverstripe/sapphire/commit/2e5b681) Convert - removed unncessary extending of Object since this class only has a bunch of static functions (from r100624) (Ingo Schommer) + * 2010-05-25 [3f14112](https://github.com/silverstripe/sapphire/commit/3f14112) ArrayLib - removed unncessary extending of Object since this class only has a bunch of static functions (from r100623) (Ingo Schommer) + * 2010-05-25 [67c7b7a](https://github.com/silverstripe/sapphire/commit/67c7b7a) When the installer is using the environment for configuration, disable the development servers textarea as it's automatically configured from environment (from r100622) (Ingo Schommer) + * 2010-05-25 [0f2a698](https://github.com/silverstripe/sapphire/commit/0f2a698) Wording change in installer for database details not correct (from r100552) (Ingo Schommer) + * 2010-05-25 [dd8d0c1](https://github.com/silverstripe/sapphire/commit/dd8d0c1) Fixed undefined variable $error in MySQLDatabaseConfigurationHelper (from r100550) (Ingo Schommer) + * 2010-05-25 [b3b3a38](https://github.com/silverstripe/sapphire/commit/b3b3a38) Reverted default location for combined JS/CSS as you can't customise this easily (from r100534) (Ingo Schommer) + * 2010-05-25 [a030d33](https://github.com/silverstripe/sapphire/commit/a030d33) Removed whitespace (from r100517) (Ingo Schommer) + * 2010-05-25 [7d8ac76](https://github.com/silverstripe/sapphire/commit/7d8ac76) Removed end php tag for Requirements and RequirementsTest (from r100514) (Ingo Schommer) + * 2010-05-25 [5934489](https://github.com/silverstripe/sapphire/commit/5934489) can always create top level if admin (from r100511) (Ingo Schommer) + * 2010-05-25 [93d405c](https://github.com/silverstripe/sapphire/commit/93d405c) Fixed tabbing in DataObjectSet (from r100491) (Ingo Schommer) + * 2010-05-25 [45d8433](https://github.com/silverstripe/sapphire/commit/45d8433) Pushed @deprecated 2.3 items out to 2.5 since they're still in use for now (from r100486) (Ingo Schommer) + * 2010-05-25 [f7c34fc](https://github.com/silverstripe/sapphire/commit/f7c34fc) phpDoc bits for Convert Services_JSON functions (from r100424) (Ingo Schommer) + * 2010-05-25 [a560865](https://github.com/silverstripe/sapphire/commit/a560865) Use "email" instead of username for validation of admin account during install (from r100418) (Ingo Schommer) + * 2010-05-25 [23e7a9a](https://github.com/silverstripe/sapphire/commit/23e7a9a) Geoip class no longer extends Object, as it's not necessary (from r100409) (Ingo Schommer) + * 2010-05-25 [cf5afb4](https://github.com/silverstripe/sapphire/commit/cf5afb4) Updated installer to use "CMS / Framework" instead of just "CMS" MINOR Updated copyright year to current year (from r100387) (Ingo Schommer) + * 2010-05-25 [179641d](https://github.com/silverstripe/sapphire/commit/179641d) correct order of OBW (from r100323) (Ingo Schommer) + * 2010-05-25 [3bd1142](https://github.com/silverstripe/sapphire/commit/3bd1142) added Rfc2822 method to SS_Datetime. Fixed bug where dates in DataObject would not set times. (from r100032) (Ingo Schommer) + * 2010-05-25 [052f71f](https://github.com/silverstripe/sapphire/commit/052f71f) LastEdited/Created dates are now mockable via SS_Datetime (from r100008) (Ingo Schommer) + * 2010-05-25 [f86c05b](https://github.com/silverstripe/sapphire/commit/f86c05b) Reinstated UploadTest (from r99862) (Ingo Schommer) + * 2010-05-25 [b3409a2](https://github.com/silverstripe/sapphire/commit/b3409a2) Reverted r99522 as this will cause problems if File records are deleted when the resampled images are linked to in the content fields (from r99823) (Ingo Schommer) + * 2010-05-25 [290284d](https://github.com/silverstripe/sapphire/commit/290284d) Reverted r105528 (Group->CMSTreeClasses() was already defined) (Ingo Schommer) + * 2010-05-25 [f2c49f6](https://github.com/silverstripe/sapphire/commit/f2c49f6) Added Group->CMSTreeClasses() (required for GroupCsvBulkLoader refresh in SecurityAdmin) (from r99801) (Ingo Schommer) + * 2010-05-25 [df405f2](https://github.com/silverstripe/sapphire/commit/df405f2) Cleaned up tabbing and code formatting in automated task classes (from r99753) (Ingo Schommer) + * 2010-05-08 [84d7032](https://github.com/silverstripe/silverstripe-cms/commit/84d7032) Documentation (Ingo Schommer) + * 2010-05-03 [54ecf20](https://github.com/silverstripe/sapphire/commit/54ecf20) Allowing querystring arguments in sapphire/Makefile (from r103744) (Ingo Schommer) + * 2010-05-03 [317e179](https://github.com/silverstripe/silverstripe-installer/commit/317e179) Added querystring option to Makefile (from r103746) (ischommer) + * 2010-04-28 [429e242](https://github.com/silverstripe/silverstripe-installer/commit/429e242) Temporarily added legacydatetimefields module to trunk until 2.4 is merged back (ischommer) + * 2010-04-28 [24fb77a](https://github.com/silverstripe/silverstripe-cms/commit/24fb77a) Fixed typo (Ingo Schommer) + * 2010-04-28 [0f0f29c](https://github.com/silverstripe/sapphire/commit/0f0f29c) Fixed typo (Ingo Schommer) + * 2010-04-23 [e4eca9c](https://github.com/silverstripe/sapphire/commit/e4eca9c) Fixed phpdoc documentation (Ingo Schommer) + * 2010-04-23 [271584e](https://github.com/silverstripe/sapphire/commit/271584e) Fixed phpdoc documentation (Ingo Schommer) + * 2010-04-23 [6460d09](https://github.com/silverstripe/sapphire/commit/6460d09) Fixed phpdoc documentation (Ingo Schommer) + * 2010-04-23 [01b0296](https://github.com/silverstripe/silverstripe-cms/commit/01b0296) Fixed phpdoc documentation (Ingo Schommer) + * 2010-04-14 [af88731](https://github.com/silverstripe/sapphire/commit/af88731) Merge error (Ingo Schommer) + * 2010-04-14 [4703aa6](https://github.com/silverstripe/sapphire/commit/4703aa6) Fixed SapphireTest->logInWithPermission() spelling (from r99491) (Ingo Schommer) + * 2010-04-14 [76d57b6](https://github.com/silverstripe/sapphire/commit/76d57b6) Temporarily disabled nested url specific cases inTranslatableTest->testAlternateGetByLink(), unclear functionality requirements (from r99350) (Ingo Schommer) + * 2010-04-14 [e99d56d](https://github.com/silverstripe/sapphire/commit/e99d56d) Localized File->uploadMetadataFields() (from r99111) (Ingo Schommer) + * 2010-04-14 [ae7439a](https://github.com/silverstripe/sapphire/commit/ae7439a) ability to customize the text that comes out of Member->Title MINOR updated workflow reports (from r96352) (from r99099) (Ingo Schommer) + * 2010-04-14 [3dc4486](https://github.com/silverstripe/sapphire/commit/3dc4486) Added Requirements for SilverStripeNavigator (see r99080) (from r99097) (Ingo Schommer) + * 2010-04-14 [ec983ae](https://github.com/silverstripe/sapphire/commit/ec983ae) make static caching smarter around cacheSubdirs (from r99076) (Ingo Schommer) + * 2010-04-14 [7c057cb](https://github.com/silverstripe/sapphire/commit/7c057cb) adjustments to ensure that the cached permissions were actually hit (from r98835) (from r99068) (Ingo Schommer) + * 2010-04-14 [000d892](https://github.com/silverstripe/sapphire/commit/000d892) refactored setting/getting strict hierarchy setting. (from r98654) (from r99064) (Ingo Schommer) + * 2010-04-14 [a5c2a3e](https://github.com/silverstripe/sapphire/commit/a5c2a3e) more unit tests around loose hierarchy (from r98509) (from r99062) (Ingo Schommer) + * 2010-04-14 [658e24e](https://github.com/silverstripe/sapphire/commit/658e24e) added enforce_strict_hierarchy option, and tests around not cascading deletions (from r98498) (from r99059) (Ingo Schommer) + * 2010-04-14 [6663e12](https://github.com/silverstripe/sapphire/commit/6663e12) force a specific cache subdirectory (from r99009) (Ingo Schommer) + * 2010-04-14 [728a401](https://github.com/silverstripe/sapphire/commit/728a401) fix typo (from r98980) (Ingo Schommer) + * 2010-04-14 [0759568](https://github.com/silverstripe/sapphire/commit/0759568) Added brackets around strpos() check just to be sure it works (from r98898) (Ingo Schommer) + * 2010-04-14 [03201e6](https://github.com/silverstripe/sapphire/commit/03201e6) Fixed clearing issue in installer that was recently removed (from r98872) (Ingo Schommer) + * 2010-04-14 [e89e377](https://github.com/silverstripe/sapphire/commit/e89e377) Removed return of connection and changed variables to conincide with r98795 (from r98800) (Ingo Schommer) + * 2010-04-14 [c1dc70b](https://github.com/silverstripe/sapphire/commit/c1dc70b) Removed whitespace in textarea value that caused an empty string in the development servers list in installer (regression from recent change) (from r98792) (Ingo Schommer) + * 2010-04-14 [6bd64ad](https://github.com/silverstripe/sapphire/commit/6bd64ad) Styling on installer (from r98781) (Ingo Schommer) + * 2010-04-14 [74a21c6](https://github.com/silverstripe/sapphire/commit/74a21c6) Reverted broken variables in installer for checking environment (from r98679) (Ingo Schommer) + * 2010-04-14 [6ea662c](https://github.com/silverstripe/silverstripe-cms/commit/6ea662c) Changed CMSMainTest to use new LeftAndMain->doAdd() controller actions, not the removed addform() (Ingo Schommer) + * 2010-04-14 [b54937e](https://github.com/silverstripe/sapphire/commit/b54937e) Removed debug code (Ingo Schommer) + * 2010-04-14 [944d013](https://github.com/silverstripe/sapphire/commit/944d013) Fixed SiteTree->canViewStage(), merge error from r94253 (Ingo Schommer) + * 2010-04-14 [53d5a04](https://github.com/silverstripe/sapphire/commit/53d5a04) Install template cleanup (from r98670) (Ingo Schommer) + * 2010-04-14 [c7528a3](https://github.com/silverstripe/sapphire/commit/c7528a3) Styling for help text in the installer (from r98668) (Ingo Schommer) + * 2010-04-14 [e6c94e5](https://github.com/silverstripe/sapphire/commit/e6c94e5) Styling fixes for installer (from r98667) (Ingo Schommer) + * 2010-04-14 [8a1e52c](https://github.com/silverstripe/sapphire/commit/8a1e52c) Tidy up of install template (from r98666) (Ingo Schommer) + * 2010-04-14 [55708cb](https://github.com/silverstripe/sapphire/commit/55708cb) Changed config-form to HTML 4.01 and validated the page minus a few issues with the form field placement (from r98662) (Ingo Schommer) + * 2010-04-14 [55c4c90](https://github.com/silverstripe/sapphire/commit/55c4c90) disable form fields if they are set from _ss_environment. See #5054 (from r98643) (Ingo Schommer) + * 2010-04-14 [74643c8](https://github.com/silverstripe/sapphire/commit/74643c8) Partially reverted accidental commit r102759 (Ingo Schommer) + * 2010-04-14 [6c300f5](https://github.com/silverstripe/silverstripe-cms/commit/6c300f5) added locking to static publisher to avoid two queues running at the same time. (from r87792) (from r98164) (Ingo Schommer) + * 2010-04-14 [d87a652](https://github.com/silverstripe/silverstripe-cms/commit/d87a652) updated detection for an empty report (from r87362) (from r98160) (Ingo Schommer) + * 2010-04-14 [ca7d870](https://github.com/silverstripe/silverstripe-cms/commit/ca7d870) when you delete a user from a group, they are also removed from any sub groups. (from r87119) (from r98158) (Ingo Schommer) + * 2010-04-14 [c1aa73b](https://github.com/silverstripe/silverstripe-cms/commit/c1aa73b) applied correct decorators MINOR Page.ss now takes advantage of the SiteConfig FEATURE audit trails MINOR fixed JS error around concurrent editing MINOR ability to disable sorting on tablelistfield MINOR added default timezone to static-main.php to avoid PHP warnings MINOR only display Roles tab on groups if there are roles in the system MINOR publishing activity report ENHANCEMENT ability to parameterize SSReport's (from r85903) (from r98156) (Ingo Schommer) + * 2010-04-13 [8c06bda](https://github.com/silverstripe/silverstripe-cms/commit/8c06bda) Cursor is now a pointer for available widgets, as you need to click them to add to the available widget stack (from r97540) (Ingo Schommer) + * 2010-04-13 [3c505bd](https://github.com/silverstripe/silverstripe-cms/commit/3c505bd) Removed end php tag from WidgetAreaEditor (from r97532) (Ingo Schommer) + * 2010-04-13 [cad9f67](https://github.com/silverstripe/silverstripe-cms/commit/cad9f67) Changed wording for WidgetAreaEditor.TOADD advising users to "click" instead of drag widgets (from r97511) (Ingo Schommer) + * 2010-04-13 [658cfa9](https://github.com/silverstripe/silverstripe-cms/commit/658cfa9) Fixed default wording of WidgetAreaEditor.TOADD "drag them here from the left" (from r97509) (Ingo Schommer) + * 2010-04-13 [2e1b39d](https://github.com/silverstripe/silverstripe-cms/commit/2e1b39d) Backwards compat fix for sprintf() call in CMSMain->providePermissions() (#4764) (from r97485) (Ingo Schommer) + * 2010-04-13 [ffbcc5d](https://github.com/silverstripe/silverstripe-cms/commit/ffbcc5d) Reverted 'single instance only' feature from r79868, delayed until later release (see #4277) (from r97182) (Ingo Schommer) + * 2010-04-13 [bce6ff8](https://github.com/silverstripe/silverstripe-cms/commit/bce6ff8) Removed 'print' button from CMSMain->getEditForm() for display of older versions (see #4745) (from r97178) (Ingo Schommer) + * 2010-04-13 [168589a](https://github.com/silverstripe/silverstripe-cms/commit/168589a) Updated jQuery.concrete references to point to the new "entwine" name (Ingo Schommer) + * 2010-04-13 [8256228](https://github.com/silverstripe/sapphire/commit/8256228) Upgraded jQuery.entwine (formerly known as jQuery.concrete) to the latest trunk MINOR Updated jQuery.concrete references to point to the new "entwine" name (Ingo Schommer) + * 2010-04-13 [c2bd020](https://github.com/silverstripe/silverstripe-cms/commit/c2bd020) Blocked r96806, not necessary due to UI change (moved tree filter dropdown in 'search' tab, which can only be triggered modally, not when in batch action mode) (Ingo Schommer) + * 2010-04-13 [cc522e0](https://github.com/silverstripe/silverstripe-cms/commit/cc522e0) moved allowed_extensions and friends to the model layer (from r92046) (from r96816) (Ingo Schommer) + * 2010-04-13 [bfef132](https://github.com/silverstripe/silverstripe-cms/commit/bfef132) moved File validation to the model (from r92044) (from r96815) (Ingo Schommer) + * 2010-04-13 [caed94d](https://github.com/silverstripe/silverstripe-cms/commit/caed94d) implement the allowedExtensions functionality of AssetAdmin when you rename a file (from r92037) (from r96814) (Ingo Schommer) + * 2010-04-13 [1e972ed](https://github.com/silverstripe/silverstripe-cms/commit/1e972ed) add a hidden field to attach the subsite ID, rather than relying on the session (from r91014) (from r96808) (Ingo Schommer) + * 2010-04-13 [56fc2d5](https://github.com/silverstripe/sapphire/commit/56fc2d5) Fixed SiteTreeBacklinksTest on Windows (from r98427) (Ingo Schommer) + * 2010-04-13 [2d01b35](https://github.com/silverstripe/sapphire/commit/2d01b35) Fixed HTTPTest->testSetGetVar() (from r98409) (Ingo Schommer) + * 2010-04-13 [67305d2](https://github.com/silverstripe/sapphire/commit/67305d2) Fixed HTTPTest->testSetGetVar() (from r98407) (Ingo Schommer) + * 2010-04-13 [6a1cb91](https://github.com/silverstripe/sapphire/commit/6a1cb91) Partially reverted r98382 which added unnecessarily defensive checking to Hierarchy->allChildren() (from r98404) (Ingo Schommer) + * 2010-04-13 [804c588](https://github.com/silverstripe/sapphire/commit/804c588) Fixed HTTPTest when invoked through dev/tests/all or with GET parameters (see r98373) (from r98383) (Ingo Schommer) + * 2010-04-13 [e43f6d8](https://github.com/silverstripe/sapphire/commit/e43f6d8) Documentation (from r98372) (Ingo Schommer) + * 2010-04-13 [4f84761](https://github.com/silverstripe/sapphire/commit/4f84761) Fixed test case name in Hierarchy (from r98370) (Ingo Schommer) + * 2010-04-13 [f34bdad](https://github.com/silverstripe/sapphire/commit/f34bdad) Use 'b' mode for fopen() where possible for better portability (from r98321) (Ingo Schommer) + * 2010-04-13 [b73d75f](https://github.com/silverstripe/sapphire/commit/b73d75f) Adding SiteConfig as Translatable dependency in SiteTreeTest and TranslatableTest (from r98228) (Ingo Schommer) + * 2010-04-13 [5ff636c](https://github.com/silverstripe/sapphire/commit/5ff636c) make showing virtual pages tab conditional MINOR made virtual page tracking sitetree tablelistfield subsite agnostic (from r98005) (from r98223) (Ingo Schommer) + * 2010-04-13 [a2883d0](https://github.com/silverstripe/sapphire/commit/a2883d0) removed redundant method call (from r97817) (from r98222) (Ingo Schommer) + * 2010-04-13 [447ec71](https://github.com/silverstripe/sapphire/commit/447ec71) better error reporting for broken redirector & virtual pages (from r97185) (from r98155) (Ingo Schommer) + * 2010-04-13 [b3e30ac](https://github.com/silverstripe/sapphire/commit/b3e30ac) set Print flag correctly on TLF MINOR custom print template for SSReport TLF's that exposes the report title, and filters set (from r97138) (from r98154) (Ingo Schommer) + * 2010-04-13 [87990bd](https://github.com/silverstripe/sapphire/commit/87990bd) Blocked unnecessary revisions (Ingo Schommer) + * 2010-04-13 [99be47c](https://github.com/silverstripe/sapphire/commit/99be47c) if the $fieldname to DOS->sort has a direction in it, split it out, and pass it. (from r96482) (from r98140) (Ingo Schommer) + * 2010-04-13 [864a15d](https://github.com/silverstripe/sapphire/commit/864a15d) redirector link tracking is more intelligent (from r96461) (from r98139) (Ingo Schommer) + * 2010-04-13 [9b650a4](https://github.com/silverstripe/sapphire/commit/9b650a4) remove sort direction when running canSortBy. Also added test coverage for this. (from r96428) (from r98138) (Ingo Schommer) + * 2010-04-13 [10537d5](https://github.com/silverstripe/sapphire/commit/10537d5) move sort column&direction into their own vars, otherwise, canSortBy(Date DESC) will always return false, since DESC is not part of the column name. (from r96411) (from r98137) (Ingo Schommer) + * 2010-04-13 [4f461e4](https://github.com/silverstripe/sapphire/commit/4f461e4) fix field escaping in CSV export of TableListField (from r96157) (from r98135) (Ingo Schommer) + * 2010-04-13 [049735b](https://github.com/silverstripe/sapphire/commit/049735b) Update en_US with SiteConfig.THEME and SiteConfig.DEFAULTTHEME translatable entities (from r98128) (Ingo Schommer) + * 2010-04-13 [334b83d](https://github.com/silverstripe/sapphire/commit/334b83d) Added DecimalTest (merged from 2.4) (Ingo Schommer) + * 2010-04-13 [1e20e55](https://github.com/silverstripe/sapphire/commit/1e20e55) don't HTML-format queries from showqueries if this is an AJAX request. (from r95855) (from r98097) (Ingo Schommer) + * 2010-04-13 [0ee0244](https://github.com/silverstripe/sapphire/commit/0ee0244) added direct links to items in the backlinks report (from r88277) (from r98085) (Ingo Schommer) + * 2010-04-13 [39615a4](https://github.com/silverstripe/sapphire/commit/39615a4) unit test for getting members by permission via roles (from r88276) (from r98084) (Ingo Schommer) + * 2010-04-13 [8ce43e4](https://github.com/silverstripe/sapphire/commit/8ce43e4) Partially reverted accidental commit from r97920 (unconditionally requiring ADMIN login via BasicAuth in DevelopmentAdmin) (from r98079) (Ingo Schommer) + * 2010-04-13 [6fb2a2a](https://github.com/silverstripe/sapphire/commit/6fb2a2a) Removed debug code (from r97910) (Ingo Schommer) + * 2010-04-12 [279031c](https://github.com/silverstripe/sapphire/commit/279031c) fix call to undefined method when a virtual page picks up the wrong object. (from r97875) (Ingo Schommer) + * 2010-04-12 [7312699](https://github.com/silverstripe/sapphire/commit/7312699) PHP notice error (from r97838) (Ingo Schommer) + * 2010-04-12 [3000087](https://github.com/silverstripe/sapphire/commit/3000087) Removed debug code (from r97825) (Ingo Schommer) + * 2010-04-12 [95350bc](https://github.com/silverstripe/sapphire/commit/95350bc) fix file iframe upload width (from r97596) (Ingo Schommer) + * 2010-04-12 [6994e71](https://github.com/silverstripe/sapphire/commit/6994e71) If CurrencyField->setValue() passed a null or empty value, default to 0.00 so number_format() has no issues converting the number (from r97566) (Ingo Schommer) + * 2010-04-12 [bb3012a](https://github.com/silverstripe/silverstripe-cms/commit/bb3012a) Fixed some jQuery.concrete getters (Ingo Schommer) + * 2010-04-12 [f29f09a](https://github.com/silverstripe/sapphire/commit/f29f09a) Updated master translation file (from r97486) (Ingo Schommer) + * 2010-04-12 [8a0f639](https://github.com/silverstripe/silverstripe-cms/commit/8a0f639) Fixed merge error (Ingo Schommer) + * 2010-04-12 [791dc22](https://github.com/silverstripe/silverstripe-cms/commit/791dc22) added batch deletion back for workflow (from r88916) (from r96789) (Ingo Schommer) + * 2010-04-12 [ef65bf7](https://github.com/silverstripe/silverstripe-cms/commit/ef65bf7) rename deleted pages report (from r88333) (from r96786) (Ingo Schommer) + * 2010-04-12 [ce9d927](https://github.com/silverstripe/silverstripe-cms/commit/ce9d927) Fixed merge error (Ingo Schommer) + * 2010-04-12 [6c0caee](https://github.com/silverstripe/silverstripe-cms/commit/6c0caee) create the ability to have some roles only be able to be applied by admins (from r88090) (from r96784) (Ingo Schommer) + * 2010-04-12 [8fb9fac](https://github.com/silverstripe/silverstripe-cms/commit/8fb9fac) Set url variable in TreeAPI.reload as local variable in LeftAndMain_left.js (from r95971) (Ingo Schommer) + * 2010-04-12 [956df37](https://github.com/silverstripe/sapphire/commit/956df37) Fixed merge error (see r99654) (Ingo Schommer) + * 2010-04-12 [592acba](https://github.com/silverstripe/sapphire/commit/592acba) Merge error (see r99737) (Ingo Schommer) + * 2010-04-12 [a6362eb](https://github.com/silverstripe/sapphire/commit/a6362eb) Fixed MemberAuthenticatorTest, was setting global state in r97357 (from r97369) (Ingo Schommer) + * 2010-04-12 [3fe5af8](https://github.com/silverstripe/sapphire/commit/3fe5af8) Reverted 'single instance only' feature from r79868, delayed until later release (see #4277) (from r97182) (Ingo Schommer) + * 2010-04-12 [745a724](https://github.com/silverstripe/sapphire/commit/745a724) Ensure DropdownField option elements have escaped the title correctly (from r96882) (Ingo Schommer) + * 2010-04-12 [31bf50d](https://github.com/silverstripe/sapphire/commit/31bf50d) when a parent page is unpublished, unpublish all related virtual pages, includes test coverage (from r94777) (from r96771) (Ingo Schommer) + * 2010-04-12 [112fe3c](https://github.com/silverstripe/sapphire/commit/112fe3c) track virtual pages that link to the current page (from r94700) (from r96768) (Ingo Schommer) + * 2010-04-12 [2ac34cc](https://github.com/silverstripe/sapphire/commit/2ac34cc) moved allowed_extensions and friends to the model layer (from r92046) (from r96743) (Ingo Schommer) + * 2010-04-12 [1bb7bfa](https://github.com/silverstripe/sapphire/commit/1bb7bfa) moved File validation to the model (from r92044) (from r96742) (Ingo Schommer) + * 2010-04-12 [6f8f7ba](https://github.com/silverstripe/sapphire/commit/6f8f7ba) if looking at a specific stage, set a cooking to bypass static cacheing (from r91006) (from r96738) (Ingo Schommer) + * 2010-04-12 [4a3986a](https://github.com/silverstripe/sapphire/commit/4a3986a) virtual pages are now marked as broken if their pointer page is deleted (from r90996) (from r96737) (Ingo Schommer) + * 2010-04-12 [8618c3c](https://github.com/silverstripe/sapphire/commit/8618c3c) Fixed merge error (Ingo Schommer) + * 2010-04-12 [cec98c6](https://github.com/silverstripe/sapphire/commit/cec98c6) fix syntax error (from r89472) (from r96716) (Ingo Schommer) + * 2010-04-12 [1ed1348](https://github.com/silverstripe/sapphire/commit/1ed1348) update merge info, merged in r87119 (from r88839) (from r96714) (Ingo Schommer) + * 2010-04-12 [670bd4b](https://github.com/silverstripe/sapphire/commit/670bd4b) changed the method to get a page's siteconfig, it is now subsite aware. (from r89870) (from r96710) (Ingo Schommer) + * 2010-04-12 [6491e3d](https://github.com/silverstripe/sapphire/commit/6491e3d) Mergeinfo (Ingo Schommer) + * 2010-02-26 [3053074](https://github.com/silverstripe/silverstripe-installer/commit/3053074) Reverting back to a much more boring documentation link (ischommer) + * 2010-02-23 [9c75acb](https://github.com/silverstripe/silverstripe-cms/commit/9c75acb) Fixed MemberTableField regression from r99706 (Ingo Schommer) + * 2010-02-23 [ddbc3e9](https://github.com/silverstripe/sapphire/commit/ddbc3e9) Fixed OptionsetField->disabledItems omission from r99596 (Ingo Schommer) + * 2010-02-23 [03b9434](https://github.com/silverstripe/sapphire/commit/03b9434) Removed message alteration from ValidationResult->error() to make it more predictable for string matching in unit tests like SecurityTest (merged from r98275) (Ingo Schommer) + * 2010-02-23 [61e2783](https://github.com/silverstripe/sapphire/commit/61e2783) Fixed unit tests after change Member->checkPassword() to return ValidationResult instead of boolean (see r98268) (merged from r98274) (Ingo Schommer) + * 2010-02-23 [41c04fe](https://github.com/silverstripe/sapphire/commit/41c04fe) Making parameter optional for ComplexTableField_Item (Ingo Schommer) + * 2010-02-22 [67205b0](https://github.com/silverstripe/silverstripe-cms/commit/67205b0) Fixed disabled behaviour in MemberTableField.js permission toggles (Ingo Schommer) + * 2010-02-22 [f90f66a](https://github.com/silverstripe/silverstripe-cms/commit/f90f66a) Moved permission checkbox logic from SecurityAdmin.js to MemberTableField.js in order to have it working in the member popup as well (Ingo Schommer) + * 2010-02-22 [8a1b196](https://github.com/silverstripe/sapphire/commit/8a1b196) Placing 'ADMIN' permission in new 'Administrator' group at the top of the permissions list (Ingo Schommer) + * 2010-02-22 [4a93c9f](https://github.com/silverstripe/sapphire/commit/4a93c9f) Localized strings in PermissionCheckboxSetField (Ingo Schommer) + * 2010-02-22 [246e866](https://github.com/silverstripe/sapphire/commit/246e866) Using localized titles for permission formfields in PermissionRole and Member (Ingo Schommer) + * 2010-02-22 [17272c2](https://github.com/silverstripe/sapphire/commit/17272c2) Using TreeMultiselectField instead of MemberTableField->relationAutoSetting in Group->getCMSFields() (Ingo Schommer) + * 2010-02-22 [26ca64a](https://github.com/silverstripe/sapphire/commit/26ca64a) Added ComponentSetTest (Ingo Schommer) + * 2010-02-12 [d68bbc2](https://github.com/silverstripe/silverstripe-cms/commit/d68bbc2) Fixed height of MemberTableField 'Groups' tab to allow enough room for TreeMultiSelectField expansion (Ingo Schommer) + * 2010-02-12 [ecab219](https://github.com/silverstripe/silverstripe-cms/commit/ecab219) Moved generic .TreeDropdownField styling from cms/css/cms_right.css to sapphire/css/TreeDropdownField.css (Ingo Schommer) + * 2010-02-12 [e6aa5b8](https://github.com/silverstripe/sapphire/commit/e6aa5b8) Moved generic .TreeDropdownField styling from cms/css/cms_right.css to sapphire/css/TreeDropdownField.css MINOR Fixed .TreeDropdownField styling (borders and margins) in TreeDropdownField.css (was assumed to be inherited from LeftAndMain/CMS stylesheets) (Ingo Schommer) + * 2010-02-12 [bc40788](https://github.com/silverstripe/silverstripe-cms/commit/bc40788) Moved ul.tree rules from cms/css/cms_left.css to sapphire/javascript/tree/tree.css (particularly around multiselect tickbox styling) (see r98854) (merged from r98855) (Ingo Schommer) + * 2010-02-12 [89982fa](https://github.com/silverstripe/sapphire/commit/89982fa) Moved ul.tree rules from cms/css/cms_left.css to sapphire/javascript/tree/tree.css (particularly around multiselect tickbox styling) (merged from r98854) (Ingo Schommer) + * 2010-02-12 [e12e57e](https://github.com/silverstripe/sapphire/commit/e12e57e) Mergeinfo (Ingo Schommer) + * 2010-02-12 [d552bec](https://github.com/silverstripe/sapphire/commit/d552bec) Added MemberCsvBulkLoaderTest->testCleartextPasswordsAreHashedWithDefaultAlgo() (Ingo Schommer) + * 2010-02-11 [021c5af](https://github.com/silverstripe/sapphire/commit/021c5af) Allow custom TitleText on TableListField_Item.ss (e.g. to show a description of the 'delete' button) (Ingo Schommer) + * 2010-02-11 [735ed96](https://github.com/silverstripe/sapphire/commit/735ed96) Setting new 'inlineadd' permissions on MemberTableField instance in Group->getCMSFields() (Ingo Schommer) + * 2010-02-10 [52c5e35](https://github.com/silverstripe/silverstripe-cms/commit/52c5e35) Defensive scripting in LeftAndMain.Tree.js (Ingo Schommer) + * 2010-01-18 [6f9177e](https://github.com/silverstripe/sapphire/commit/6f9177e) fixed validation on CurrencyField. Will no longer parse non-numeric characters out of input. Added test coverage. (Tom Rix) + * 2010-01-14 [28277e9](https://github.com/silverstripe/silverstripe-installer/commit/28277e9) Reverted r96950 (sharvey) + * 2009-12-18 [d8b67c4](https://github.com/silverstripe/sapphire/commit/d8b67c4) Removed whitespace from DirectorTest (Sean Harvey) + * 2009-12-16 [e623c3d](https://github.com/silverstripe/silverstripe-cms/commit/e623c3d) make widgetarea/editor more suitable for generic use (from r95086) (Sean Harvey) + * 2009-12-16 [223dd0f](https://github.com/silverstripe/silverstripe-cms/commit/223dd0f) adding maori macron button back (from r94986) (Sean Harvey) + * 2009-12-16 [a56f977](https://github.com/silverstripe/silverstripe-cms/commit/a56f977) fixed bug where widget area editor would not be activated (from r94829) (Sean Harvey) + * 2009-12-16 [70b26c2](https://github.com/silverstripe/silverstripe-cms/commit/70b26c2) fixed widget area MINOR added select box listing anchors in text (from r94198) (Sean Harvey) + * 2009-12-16 [3a98249](https://github.com/silverstripe/sapphire/commit/3a98249) make widgetarea/editor more suitable for generic use (from r95086) (Sean Harvey) + * 2009-12-16 [99c4609](https://github.com/silverstripe/sapphire/commit/99c4609) Fixed misspelled acronym for "Cross-site request forgery" (from r94420) (Sean Harvey) + * 2009-12-16 [3665c59](https://github.com/silverstripe/sapphire/commit/3665c59) Documentation updates to SS_Log (from r94418) (Sean Harvey) + * 2009-12-16 [afb06e4](https://github.com/silverstripe/sapphire/commit/afb06e4) #4973 Automatically generate URLSegment for default records on SiteTree and ErrorPage instead of explicitly setting them (from r94352) (Sean Harvey) + * 2009-12-16 [f29c079](https://github.com/silverstripe/sapphire/commit/f29c079) fixed widget area MINOR added select box listing anchors in text (from r94198) (Sean Harvey) + * 2009-12-16 [a4e858a](https://github.com/silverstripe/sapphire/commit/a4e858a) Less obtrusive tests for testing the SS temp directory (from r94135) (Sean Harvey) + * 2009-12-02 [ed6334d](https://github.com/silverstripe/silverstripe-cms/commit/ed6334d) Added pl_PL.js translation (#4788, thanks qlex) (Ingo Schommer) + * 2009-11-30 [38c71c5](https://github.com/silverstripe/sapphire/commit/38c71c5) Added flag to remaining SapphireTest subclasses (Ingo Schommer) + * 2009-11-30 [b534139](https://github.com/silverstripe/silverstripe-cms/commit/b534139) Mergeinfo (Ingo Schommer) + * 2009-11-30 [330d2bb](https://github.com/silverstripe/sapphire/commit/330d2bb) Mergeinfo (Ingo Schommer) + * 2009-11-30 [c340d9a](https://github.com/silverstripe/sapphire/commit/c340d9a) Fixed tabs (from r93859) (Ingo Schommer) + * 2009-11-30 [a0092fb](https://github.com/silverstripe/sapphire/commit/a0092fb) Fixed reference to fieldExists() on SearchFilter which was removed from DataObject (from r93738) (Ingo Schommer) + * 2009-11-27 [0f8c47c](https://github.com/silverstripe/sapphire/commit/0f8c47c) Moved static functions in ContentNegotiator above the instance methods (from r93641) (Sean Harvey) + * 2009-11-27 [162c607](https://github.com/silverstripe/sapphire/commit/162c607) Update mergeinfo to ignore jsparty changes in 2.4 (Sean Harvey) + * 2009-11-27 [ae083e3](https://github.com/silverstripe/sapphire/commit/ae083e3) Update the main.php PHP version numbers at the top doc block (from r93449) (Sean Harvey) + * 2009-11-27 [487bb76](https://github.com/silverstripe/sapphire/commit/487bb76) Fixed PHP notice (#4765) (Ingo Schommer) + * 2009-11-27 [3b9fef2](https://github.com/silverstripe/silverstripe-installer/commit/3b9fef2) Removed jsparty from mergesources (sharvey) + * 2009-11-26 [64faf66](https://github.com/silverstripe/silverstripe-installer/commit/64faf66) Removed checks for jsparty/ directory, which is no longer required (ischommer) + * 2009-11-26 [7ca8524](https://github.com/silverstripe/sapphire/commit/7ca8524) Moved jsparty/tiny_mce to sapphire/thirdparty/tinymce (Ingo Schommer) + * 2009-11-22 [fe66ca6](https://github.com/silverstripe/silverstripe-cms/commit/fe66ca6) Updated language master table, including all changes from jsrewrite refactoring (Ingo Schommer) + * 2009-11-22 [b29d887](https://github.com/silverstripe/silverstripe-cms/commit/b29d887) l10n in CMSMain.php, CMSMain.js and CMSSiteTreeFilter.php (Ingo Schommer) + * 2009-11-22 [d0cc476](https://github.com/silverstripe/silverstripe-cms/commit/d0cc476) Merged CanOrganiseSitetree permission into CMSMain_TreeTools.ss (originally implemented in r84073) (Ingo Schommer) + * 2009-11-22 [fdc7366](https://github.com/silverstripe/silverstripe-cms/commit/fdc7366) Syntax (Ingo Schommer) + * 2009-11-21 [a0cedd3](https://github.com/silverstripe/silverstripe-installer/commit/a0cedd3) Partially reverted r92439, accidental commit to .htaccess (ischommer) + * 2009-11-21 [21fe999](https://github.com/silverstripe/sapphire/commit/21fe999) Removed Metadata related fields from RedirectorPage->getCMSFields() (#4747) (Ingo Schommer) + * 2009-11-21 [af41180](https://github.com/silverstripe/sapphire/commit/af41180) Fixed capitalization of JSMin.php include (Ingo Schommer) + * 2009-11-21 [8e8f9c5](https://github.com/silverstripe/silverstripe-cms/commit/8e8f9c5) Fixed Requirements path references in LeftAndMain and AssetAdmin (Ingo Schommer) + * 2009-11-21 [ea8fa50](https://github.com/silverstripe/sapphire/commit/ea8fa50) Added simpletest thirdparty library (previously included as an external) (Ingo Schommer) + * 2009-11-21 [239d65a](https://github.com/silverstripe/sapphire/commit/239d65a) Removed .gitignore (Ingo Schommer) + * 2009-11-21 [e3a51fe](https://github.com/silverstripe/silverstripe-cms/commit/e3a51fe) Bugfixes for SWFUpload (Ingo Schommer) + * 2009-11-21 [394e0c0](https://github.com/silverstripe/silverstripe-cms/commit/394e0c0) Removed cms/thirdparty/swfupload, moved to sapphire/thirdparty (Ingo Schommer) + * 2009-11-21 [683dfa9](https://github.com/silverstripe/silverstripe-cms/commit/683dfa9) Styling of side reports and tree area in CMS (Ingo Schommer) + * 2009-11-21 [1bc268e](https://github.com/silverstripe/silverstripe-cms/commit/1bc268e) Only fetching EditForm in LeftAndMain->show() if called by ajax, the customize() call for non-ajax views confuses the renderer otherwise (Ingo Schommer) + * 2009-11-21 [32d6342](https://github.com/silverstripe/silverstripe-cms/commit/32d6342) Fixed merge errors (Ingo Schommer) + * 2009-11-21 [8f92ee3](https://github.com/silverstripe/silverstripe-cms/commit/8f92ee3) Fixed Requirements paths in LeftAndMain.php (Ingo Schommer) + * 2009-11-21 [c189230](https://github.com/silverstripe/silverstripe-cms/commit/c189230) Fixed merge error (Ingo Schommer) + * 2009-11-21 [3a14e1d](https://github.com/silverstripe/silverstripe-cms/commit/3a14e1d) Removed unused SecurityAdmin->deleteitems() method (Ingo Schommer) + * 2009-11-21 [2d82a2f](https://github.com/silverstripe/silverstripe-cms/commit/2d82a2f) Syntax error and documentation (Ingo Schommer) + * 2009-11-21 [7569c53](https://github.com/silverstripe/silverstripe-cms/commit/7569c53) Removed unnecessary Requirements in AssetAdmin->init() - they are now included by jquery.ondemand (Ingo Schommer) + * 2009-11-21 [98ce1b1](https://github.com/silverstripe/silverstripe-cms/commit/98ce1b1) Moved batch actions code from AssetAdmin/CMSMain to a common LeftAndMain parent (which is now reused by SecurityAdmin as well) (Ingo Schommer) + * 2009-11-21 [1581d93](https://github.com/silverstripe/silverstripe-cms/commit/1581d93) Missed a _super() call in LeftAndMain.js (Ingo Schommer) + * 2009-11-21 [233e6e9](https://github.com/silverstripe/silverstripe-cms/commit/233e6e9) Using global ajaxComplete handlers for LeftAndMain instead of limiting to error handlers to allow usage of X-Status messages throughout the CMS (Ingo Schommer) + * 2009-11-21 [1036329](https://github.com/silverstripe/silverstripe-cms/commit/1036329) Fixed jquery-concrete path (Ingo Schommer) + * 2009-11-21 [9be25f8](https://github.com/silverstripe/silverstripe-cms/commit/9be25f8) Fixed CommentAdmin_left.ss links (Ingo Schommer) + * 2009-11-21 [e503a9c](https://github.com/silverstripe/silverstripe-cms/commit/e503a9c) Removed obsolete CommentAdmin_right.js file, behaviour is inherited from parent implementation (Ingo Schommer) + * 2009-11-21 [615494f](https://github.com/silverstripe/silverstripe-cms/commit/615494f) Wrapped AssetAdmin.BatchActions javascript in document.load (Ingo Schommer) + * 2009-11-21 [90c6c08](https://github.com/silverstripe/silverstripe-cms/commit/90c6c08) Changed title width (Ingo Schommer) + * 2009-11-21 [f12db27](https://github.com/silverstripe/silverstripe-cms/commit/f12db27) Removed debug code from multifile.js (Ingo Schommer) + * 2009-11-21 [555863a](https://github.com/silverstripe/silverstripe-cms/commit/555863a) Removed css background with new logo for now (Ingo Schommer) + * 2009-11-21 [5738c57](https://github.com/silverstripe/silverstripe-cms/commit/5738c57) Fixed ParentID setting in AssetAdmin->doAdd() and using instead of (Ingo Schommer) + * 2009-11-21 [6aae0aa](https://github.com/silverstripe/silverstripe-cms/commit/6aae0aa) Moved sitetree state setting javascript to LeftAndMain.Tree.js, used in AssetAdmin as well (Ingo Schommer) + * 2009-11-21 [175ceaf](https://github.com/silverstripe/silverstripe-cms/commit/175ceaf) Moved AddForm javascript logic to new LeftAndMain.AddForm.js file which is shared by CMSMain and AssetAdmin (Ingo Schommer) + * 2009-11-21 [2e7f100](https://github.com/silverstripe/silverstripe-cms/commit/2e7f100) Moved LeftAndMain.BatchActions.js to LeftAndMain, its used in AssetAdmin as well (Ingo Schommer) + * 2009-11-21 [284de94](https://github.com/silverstripe/silverstripe-cms/commit/284de94) Moved some form logic from AssetAdmin.js to AssetTableField.js (Ingo Schommer) + * 2009-11-21 [f4e2dcb](https://github.com/silverstripe/silverstripe-cms/commit/f4e2dcb) Removed deletefolder javascript in AssetAdmin.js, superseded by LeftAndMain.BatchActions.js (Ingo Schommer) + * 2009-11-21 [18f54bb](https://github.com/silverstripe/silverstripe-cms/commit/18f54bb) Added javascript confirmation for 'delete folders' batch action in AssetAdmin.js (Ingo Schommer) + * 2009-11-21 [ba93170](https://github.com/silverstripe/silverstripe-cms/commit/ba93170) Defensive programming in multifile.js (Ingo Schommer) + * 2009-11-21 [c2e1c12](https://github.com/silverstripe/silverstripe-cms/commit/c2e1c12) Moved 'delete files' logic from AssetAdmin.DragDrop.js into AssetTableField.js (Ingo Schommer) + * 2009-11-21 [58cd7be](https://github.com/silverstripe/silverstripe-cms/commit/58cd7be) Renamed CMSMain->addpage() to CMSMain->doAdd() (Ingo Schommer) + * 2009-11-21 [c9c67d4](https://github.com/silverstripe/silverstripe-cms/commit/c9c67d4) Moved AssetAdmin.js dragdrop logic in new file (Ingo Schommer) + * 2009-11-21 [34f8f9e](https://github.com/silverstripe/silverstripe-cms/commit/34f8f9e) Moved batch actions javascript from CMSMain.BatchAction.js to LeftAndMain.BatchActions.js to make it reuseable in AssetAdmin (Ingo Schommer) + * 2009-11-21 [a9adcbe](https://github.com/silverstripe/silverstripe-cms/commit/a9adcbe) Overloading 'create' button for AssetAdmin.js to perform action instead of opening a tab. MINOR Moved drag/drop functionality into new AssetAdmin.DragDrop.js location (will most likely be temporary until we switch to jQuery drag/drop) (Ingo Schommer) + * 2009-11-21 [8d0c82b](https://github.com/silverstripe/silverstripe-cms/commit/8d0c82b) Syntax in LeftAndMain.js (Ingo Schommer) + * 2009-11-21 [2fce8cf](https://github.com/silverstripe/silverstripe-cms/commit/2fce8cf) Adjusted AssetAdmin->getEditForm() to comply with changed javascript - it returns the rendered form now (Ingo Schommer) + * 2009-11-21 [97f7476](https://github.com/silverstripe/silverstripe-cms/commit/97f7476) Removed duplicate greybox.css requirement from AssetAdmin (Ingo Schommer) + * 2009-11-21 [1ce99bc](https://github.com/silverstripe/silverstripe-cms/commit/1ce99bc) Removed unused refreshAsset() javascript from AssetAdmin.js (Ingo Schommer) + * 2009-11-21 [927c28b](https://github.com/silverstripe/silverstripe-cms/commit/927c28b) Removed 'delete unused items' javascript from AssetAdmin.js (Ingo Schommer) + * 2009-11-21 [4d4f2ce](https://github.com/silverstripe/silverstripe-cms/commit/4d4f2ce) Added jquery-live-extensions plugin to support 'change' events in concrete (Ingo Schommer) + * 2009-11-21 [52d56fd](https://github.com/silverstripe/silverstripe-cms/commit/52d56fd) Making full result table rows in ModelAdmin selectable (Ingo Schommer) + * 2009-11-21 [17392ff](https://github.com/silverstripe/silverstripe-cms/commit/17392ff) Fixed LeftAndMain.EditForm.js button onclick, concrete is buggy (Ingo Schommer) + * 2009-11-21 [5ab645e](https://github.com/silverstripe/silverstripe-cms/commit/5ab645e) Formatting (Ingo Schommer) + * 2009-11-21 [2683a5a](https://github.com/silverstripe/silverstripe-cms/commit/2683a5a) Making full result table rows in ModelAdmin selectable (Ingo Schommer) + * 2009-11-21 [c9646d8](https://github.com/silverstripe/silverstripe-cms/commit/c9646d8) Respecting FormField->extraClass() settings in AssetTableField.ss, CommentTableField.ss and MemberTableField.ss (Ingo Schommer) + * 2009-11-21 [7223c85](https://github.com/silverstripe/silverstripe-cms/commit/7223c85) Added loading indicator to search button in ModelAdmin (Ingo Schommer) + * 2009-11-21 [233221e](https://github.com/silverstripe/silverstripe-cms/commit/233221e) More robust width/height detectino for layout manager in LeftAndMain.js (Ingo Schommer) + * 2009-11-21 [6f2927b](https://github.com/silverstripe/silverstripe-cms/commit/6f2927b) Passing through url parameter in custom event for Form_EditForm javascript (Ingo Schommer) + * 2009-11-21 [3fb7c27](https://github.com/silverstripe/silverstripe-cms/commit/3fb7c27) Ussing currentPageID() in ReportAdmin instead of hardcoding to (Ingo Schommer) + * 2009-11-21 [e13bb58](https://github.com/silverstripe/silverstripe-cms/commit/e13bb58) concrete specs in LeftAndMain.EditForm.js (Ingo Schommer) + * 2009-11-21 [05510ca](https://github.com/silverstripe/silverstripe-cms/commit/05510ca) Rounded corners for notice-wrap layer in CMS (Ingo Schommer) + * 2009-11-21 [59790b1](https://github.com/silverstripe/silverstripe-cms/commit/59790b1) Formatting in ModelAdmin.js (Ingo Schommer) + * 2009-11-21 [62ff958](https://github.com/silverstripe/silverstripe-cms/commit/62ff958) Only refresh versions side panel on new tree selection if its visible - regression from javascript refactoring, this was already the case in the old CMS logic (Ingo Schommer) + * 2009-11-21 [d0d676b](https://github.com/silverstripe/silverstripe-cms/commit/d0d676b) Fixed remaining references to jsparty/ directory in CSS and PHP files (Ingo Schommer) + * 2009-11-21 [cfcaa54](https://github.com/silverstripe/silverstripe-cms/commit/cfcaa54) Moved jsparty/multifile to cms/thirdparty/multifile (Ingo Schommer) + * 2009-11-21 [31c2aa9](https://github.com/silverstripe/silverstripe-cms/commit/31c2aa9) Formatting and documentation in LeftAndMain.php (Ingo Schommer) + * 2009-11-21 [420d0a5](https://github.com/silverstripe/silverstripe-cms/commit/420d0a5) Removed unused LeftAndMain->PublishItemsForm(), has been replaced by CMSBatchAction a while ago (Ingo Schommer) + * 2009-11-21 [d081a4b](https://github.com/silverstripe/silverstripe-cms/commit/d081a4b) Fixed CMSBatchAction ID retrieval (Ingo Schommer) + * 2009-11-21 [57b0bbc](https://github.com/silverstripe/silverstripe-cms/commit/57b0bbc) Removed debug code (Ingo Schommer) + * 2009-11-21 [8f82a04](https://github.com/silverstripe/silverstripe-cms/commit/8f82a04) Updated jquery.concrete paths in LeftAndMain.php (Ingo Schommer) + * 2009-11-21 [4aa80af](https://github.com/silverstripe/silverstripe-cms/commit/4aa80af) Fixed spacing in CMS bottom bar template (LeftAndMain.ss) (Ingo Schommer) + * 2009-11-21 [cf6181a](https://github.com/silverstripe/silverstripe-cms/commit/cf6181a) Fixed positioning in ParentType field in CMS editform (Ingo Schommer) + * 2009-11-21 [66e1d71](https://github.com/silverstripe/silverstripe-cms/commit/66e1d71) Moved ss_MainLayout javascript global in correct file (Ingo Schommer) + * 2009-11-21 [c50e2fc](https://github.com/silverstripe/silverstripe-cms/commit/c50e2fc) Moved form related javascript from CMSMain.js to new CMSMain.EditForm.js (Ingo Schommer) + * 2009-11-21 [1760759](https://github.com/silverstripe/silverstripe-cms/commit/1760759) Moved LeftAndMain_left.js to LeftAndMain.Tree.js MINOR Moved CMSMain_left.js to CMSMain.Tree.js (Ingo Schommer) + * 2009-11-21 [49ff164](https://github.com/silverstripe/silverstripe-cms/commit/49ff164) Fixed parameters in CMSMain->getfilteredsubtree() (Ingo Schommer) + * 2009-11-21 [8d5dc11](https://github.com/silverstripe/silverstripe-cms/commit/8d5dc11) Using native AddPageOptionsForm rendering in CMSMain_TreeTools.ss (Ingo Schommer) + * 2009-11-21 [c329a8e](https://github.com/silverstripe/silverstripe-cms/commit/c329a8e) Setting concrete warning level in LeftAndMain.js (Ingo Schommer) + * 2009-11-21 [7f285e2](https://github.com/silverstripe/silverstripe-cms/commit/7f285e2) Unsetting any validation for LeftAndMain->EmptyForm() (Ingo Schommer) + * 2009-11-21 [eef51ed](https://github.com/silverstripe/silverstripe-cms/commit/eef51ed) Re-added LeftAndMain->EditForm() as a complement to getEditForm() - it is necessary for form submissions as well as for template getters (Ingo Schommer) + * 2009-11-21 [9e88dbb](https://github.com/silverstripe/silverstripe-cms/commit/9e88dbb) Adding css classes to CMSMain->AddPageOptionsForm (Ingo Schommer) + * 2009-11-21 [fef2f77](https://github.com/silverstripe/silverstripe-cms/commit/fef2f77) Removed unused action_upload_right() and save() overloading in AssetAdmin.js (Ingo Schommer) + * 2009-11-21 [8c37f08](https://github.com/silverstripe/silverstripe-cms/commit/8c37f08) Fixed removal of loading screen via javascript (Ingo Schommer) + * 2009-11-21 [81e3fd0](https://github.com/silverstripe/silverstripe-cms/commit/81e3fd0) Triggering LeftAndMain.EditForm.js load() callback after loading the response - this makes more sense, as the inserted HTML can be parsed at this point (Ingo Schommer) + * 2009-11-21 [05d1f6e](https://github.com/silverstripe/silverstripe-cms/commit/05d1f6e) Moved layout javascript logic from CMSMain.js to LeftAndMain.js, so other subclasses of LeftAndMain can use it as well (Ingo Schommer) + * 2009-11-21 [40e3f96](https://github.com/silverstripe/silverstripe-cms/commit/40e3f96) PHP Notice in CMSMain (Ingo Schommer) + * 2009-11-21 [9794b83](https://github.com/silverstripe/silverstripe-cms/commit/9794b83) Fixed height of loading screen for IE6 (Ingo Schommer) + * 2009-11-21 [7561dc6](https://github.com/silverstripe/silverstripe-cms/commit/7561dc6) Fixed height of loading screen for IE6 (Ingo Schommer) + * 2009-11-21 [febe9f6](https://github.com/silverstripe/silverstripe-cms/commit/febe9f6) Removed unnecessary CMSMain_right.js javascript, was only used for form changetracking which has changed its API since (Ingo Schommer) + * 2009-11-21 [d478f17](https://github.com/silverstripe/silverstripe-cms/commit/d478f17) Layout manager tweaks (Ingo Schommer) + * 2009-11-21 [5e4fa55](https://github.com/silverstripe/silverstripe-cms/commit/5e4fa55) Moved tinymce initialization from LeftAndMain.js to LeftAndMain.EditForm.js and converted to use concrete (Ingo Schommer) + * 2009-11-21 [42a5de8](https://github.com/silverstripe/silverstripe-cms/commit/42a5de8) Removed unused _AJAX_LOADING global from LeftAndMain.js javascript (Ingo Schommer) + * 2009-11-21 [bf6ff4a](https://github.com/silverstripe/silverstripe-cms/commit/bf6ff4a) Moved tree context menu javascript from LeftAndMain.js into LeftAndMain_left.js (Ingo Schommer) + * 2009-11-21 [471afa4](https://github.com/silverstripe/silverstripe-cms/commit/471afa4) Changed statusMessage container in LeftAndMain_right.ss to a <div> so we can save ourselves the CSS styling defaults (Ingo Schommer) + * 2009-11-21 [73e9d88](https://github.com/silverstripe/silverstripe-cms/commit/73e9d88) Removing commented out StatusTitle logic in LeftAndMain.js (Ingo Schommer) + * 2009-11-21 [6514dc3](https://github.com/silverstripe/silverstripe-cms/commit/6514dc3) Removed debug code (Ingo Schommer) + * 2009-11-21 [3725a98](https://github.com/silverstripe/silverstripe-cms/commit/3725a98) Added check for presence of origData in LeftAndMain event handler javascript (Ingo Schommer) + * 2009-11-21 [d90d672](https://github.com/silverstripe/silverstripe-cms/commit/d90d672) Syntax (Ingo Schommer) + * 2009-11-21 [a397804](https://github.com/silverstripe/silverstripe-cms/commit/a397804) Set loading state on icons for CMS form loading javascript (Ingo Schommer) + * 2009-11-21 [8b89a26](https://github.com/silverstripe/silverstripe-cms/commit/8b89a26) Removed defunct param parsing in LeftAndMain->show(), wasn't working since we switched to RequestHandler in 2.2 (Ingo Schommer) + * 2009-11-21 [0b9f4ab](https://github.com/silverstripe/silverstripe-cms/commit/0b9f4ab) Adjusted to SiteTree->getTreeTitle() api change (Ingo Schommer) + * 2009-11-21 [a9c257b](https://github.com/silverstripe/silverstripe-cms/commit/a9c257b) Re-enabled statusmessage in CMSMain_right.ss template (Ingo Schommer) + * 2009-11-21 [e8f5b3f](https://github.com/silverstripe/silverstripe-cms/commit/e8f5b3f) documentations (Ingo Schommer) + * 2009-11-21 [df31382](https://github.com/silverstripe/silverstripe-cms/commit/df31382) Fixed unload logic in MainMenu javascript (Ingo Schommer) + * 2009-11-21 [59999e1](https://github.com/silverstripe/silverstripe-cms/commit/59999e1) Supporting override attributes in hidden form fields in LeftAndMain.EditForm.js (Ingo Schommer) + * 2009-11-21 [d03eb54](https://github.com/silverstripe/silverstripe-cms/commit/d03eb54) Remove text for LeftAndMain.EditForm.js (Ingo Schommer) + * 2009-11-21 [b96a69d](https://github.com/silverstripe/silverstripe-cms/commit/b96a69d) Setting ID fields in CMSMain->getEditForm() (Ingo Schommer) + * 2009-11-21 [61a3d03](https://github.com/silverstripe/silverstripe-cms/commit/61a3d03) Fixed indentation and documentation in CMSMain (Ingo Schommer) + * 2009-11-21 [48bbfef](https://github.com/silverstripe/silverstripe-cms/commit/48bbfef) Temporary workaround for event handling in namespaces for concrete library (Ingo Schommer) + * 2009-11-21 [4809523](https://github.com/silverstripe/silverstripe-cms/commit/4809523) JavaScript code indentation and formatting (Ingo Schommer) + * 2009-11-21 [e37b788](https://github.com/silverstripe/silverstripe-cms/commit/e37b788) Changed left panel size in CMSMain to resemble old interface (Ingo Schommer) + * 2009-11-21 [baf23e5](https://github.com/silverstripe/silverstripe-cms/commit/baf23e5) Refactored onSessionLost() javascript functionality (Ingo Schommer) + * 2009-11-21 [48068e1](https://github.com/silverstripe/silverstripe-cms/commit/48068e1) Syntax in CMSMain.Translatable.js (Ingo Schommer) + * 2009-11-21 [d5d4d73](https://github.com/silverstripe/silverstripe-cms/commit/d5d4d73) Fixed javascript syntax in CMSMain.js and LeftAndMain.js (Ingo Schommer) + * 2009-11-21 [ccb7e89](https://github.com/silverstripe/silverstripe-cms/commit/ccb7e89) Showing 'edit member profile' popup as a ghost when dragged, to avoid performance problems with iframe (Ingo Schommer) + * 2009-11-21 [502855c](https://github.com/silverstripe/silverstripe-cms/commit/502855c) Method renaming in CMSMain.js (Ingo Schommer) + * 2009-11-21 [c5895ca](https://github.com/silverstripe/silverstripe-cms/commit/c5895ca) Documentation for CMSMain.js and LeftAndMain.js (Ingo Schommer) + * 2009-11-21 [205939d](https://github.com/silverstripe/silverstripe-cms/commit/205939d) Adjusted path to jquery.ondemand.js in LeftAndMain.php (Ingo Schommer) + * 2009-11-21 [ba0e2ff](https://github.com/silverstripe/silverstripe-cms/commit/ba0e2ff) Removed layout_helpers.js dependency (Ingo Schommer) + * 2009-11-21 [81fe7a2](https://github.com/silverstripe/silverstripe-cms/commit/81fe7a2) Removed loader.js dependencies (Ingo Schommer) + * 2009-11-21 [1395d10](https://github.com/silverstripe/silverstripe-cms/commit/1395d10) Using jquery.layout.state.js to save layout-managed state in LeftAndMain (Ingo Schommer) + * 2009-11-21 [56cb4b3](https://github.com/silverstripe/silverstripe-cms/commit/56cb4b3) Fixed height of bottom panel in CMS (Ingo Schommer) + * 2009-11-21 [b50f1a5](https://github.com/silverstripe/silverstripe-cms/commit/b50f1a5) Removed obsolete css rules for tree search in left panel (Ingo Schommer) + * 2009-11-21 [94d0355](https://github.com/silverstripe/silverstripe-cms/commit/94d0355) Moved tab overflow logic from TabSet.js into more specific CMSMain.js, its not necessary outside of a layout-managed CMS context (Ingo Schommer) + * 2009-11-21 [bc55ad3](https://github.com/silverstripe/silverstripe-cms/commit/bc55ad3) Removed debug code (Ingo Schommer) + * 2009-11-21 [7f0e529](https://github.com/silverstripe/silverstripe-cms/commit/7f0e529) Javascript syntax error (Ingo Schommer) + * 2009-11-21 [538ff9b](https://github.com/silverstripe/silverstripe-cms/commit/538ff9b) Moved jquery-fitheighttoparent, jquery-layout, swfupload from sapphire into cms (Ingo Schommer) + * 2009-11-21 [e17b09b](https://github.com/silverstripe/silverstripe-cms/commit/e17b09b) Changed paths to moved thirdparty dependencies (mostly from /jsparty to /sapphire/thirdparty, /cms/javascript and /sapphire/javascript) (Ingo Schommer) + * 2009-11-21 [ba05455](https://github.com/silverstripe/silverstripe-cms/commit/ba05455) Documentation (Ingo Schommer) + * 2009-11-21 [d5ec175](https://github.com/silverstripe/silverstripe-cms/commit/d5ec175) Updated cms javascript to new concrete API around namespaces and properties (Ingo Schommer) + * 2009-11-21 [d973510](https://github.com/silverstripe/silverstripe-cms/commit/d973510) Removed .thumbnailstrip 100% width, which breaks the right panel forms in CMS (Ingo Schommer) + * 2009-11-21 [e70571d](https://github.com/silverstripe/silverstripe-cms/commit/e70571d) Removed concrete namespace for submit actions in CMS (Ingo Schommer) + * 2009-11-21 [5d4e5de](https://github.com/silverstripe/silverstripe-cms/commit/5d4e5de) Removed 100% width from tabsets in CMS, was messing up jQuery UI border styling (Ingo Schommer) + * 2009-11-21 [d45da27](https://github.com/silverstripe/silverstripe-cms/commit/d45da27) Added styling for CMS actions (Ingo Schommer) + * 2009-11-21 [0f6d2b0](https://github.com/silverstripe/silverstripe-cms/commit/0f6d2b0) Disabled rewriteHashlinks in CMS templates to avoid breaking jQuery tabs which detect URLs like 'admin/asets/#mytab' as an ajax-URL (Ingo Schommer) + * 2009-11-21 [df79a94](https://github.com/silverstripe/silverstripe-cms/commit/df79a94) Removed usage of deprecated ajaxLink() javascript method in AssetAdmin.js (Ingo Schommer) + * 2009-11-21 [081802e](https://github.com/silverstripe/silverstripe-cms/commit/081802e) Reverted removal of placeholder <form> tab in CMSMain_right.ss - its still needed for the CMS javascript MINOR Reverted north/south inner layouts in CMSMain_right.ss (Ingo Schommer) + * 2009-11-21 [612dbe0](https://github.com/silverstripe/silverstripe-cms/commit/612dbe0) Added 'ss-ui-button' class to all #TreeActions buttons in the CMS to allow for jQuery UI native styling (Ingo Schommer) + * 2009-11-21 [e7562ba](https://github.com/silverstripe/silverstripe-cms/commit/e7562ba) Removed #SearchControls dropdown width to allow for full title display within the UI element (Ingo Schommer) + * 2009-11-21 [22d4141](https://github.com/silverstripe/silverstripe-cms/commit/22d4141) Reordering and indentation in cms_right.css (Ingo Schommer) + * 2009-11-21 [61be99c](https://github.com/silverstripe/silverstripe-cms/commit/61be99c) Removed CMS specific tab styling, now handled by jQuery UI tabs MINOR New CMS specific styling for CMS buttons (Ingo Schommer) + * 2009-11-21 [a730383](https://github.com/silverstripe/silverstripe-cms/commit/a730383) Added 'concrete' and 'fitheighttoparent' javascript libraries to LeftAndMain and all subclasses (Ingo Schommer) + * 2009-11-21 [2b55a91](https://github.com/silverstripe/silverstripe-cms/commit/2b55a91) Removed unused translation CSS in CMS (Ingo Schommer) + * 2009-11-21 [63e1fed](https://github.com/silverstripe/silverstripe-cms/commit/63e1fed) Changed to CMS layout (Ingo Schommer) + * 2009-11-21 [ae2efc5](https://github.com/silverstripe/silverstripe-cms/commit/ae2efc5) Removed #PageType dropdown width limitation to allow for longer page type titles (Ingo Schommer) + * 2009-11-21 [5ff353a](https://github.com/silverstripe/silverstripe-cms/commit/5ff353a) Removed obsolete ImageEditor.css (Ingo Schommer) + * 2009-11-21 [83427e5](https://github.com/silverstripe/silverstripe-cms/commit/83427e5) Removed references to unused hover.js behaviour in LeftAndMain and CMSMain (Ingo Schommer) + * 2009-11-21 [e68fca1](https://github.com/silverstripe/silverstripe-cms/commit/e68fca1) Removed references to empty CMSMain.js (Ingo Schommer) + * 2009-11-21 [4593120](https://github.com/silverstripe/silverstripe-cms/commit/4593120) Deleted unused ForumAdmin.js (Ingo Schommer) + * 2009-11-21 [fba5841](https://github.com/silverstripe/sapphire/commit/fba5841) Updated SWFUpload library to 2.5.0 alpha (see r91302) (Ingo Schommer) + * 2009-11-21 [d016131](https://github.com/silverstripe/sapphire/commit/d016131) Added readme and license for tree.js (manual jsparty merge from r87745) (Ingo Schommer) + * 2009-11-21 [84125b4](https://github.com/silverstripe/sapphire/commit/84125b4) Added CMSTreeClasses() methods to Group and Folder, to mirror SiteTree behaviour and allow reusage in CMS tree implementations (Ingo Schommer) + * 2009-11-21 [ffe57db](https://github.com/silverstripe/sapphire/commit/ffe57db) Removed UniqueTextfieldTest (Ingo Schommer) + * 2009-11-21 [83267cd](https://github.com/silverstripe/sapphire/commit/83267cd) Updated jquery-concrete to 0.9 release (Ingo Schommer) + * 2009-11-21 [0e93bce](https://github.com/silverstripe/sapphire/commit/0e93bce) Moved 'delete files' button from Folder->getCMSFields() to AssetTableField (Ingo Schommer) + * 2009-11-21 [78ec0cb](https://github.com/silverstripe/sapphire/commit/78ec0cb) Updated jquery-concrete (Ingo Schommer) + * 2009-11-21 [1afe18a](https://github.com/silverstripe/sapphire/commit/1afe18a) Formatting in TabSet.js (Ingo Schommer) + * 2009-11-21 [f418cdd](https://github.com/silverstripe/sapphire/commit/f418cdd) Added jquery live extensions, necessary for 'change' event in jquery.concrete (Ingo Schommer) + * 2009-11-21 [22bf4f8](https://github.com/silverstripe/sapphire/commit/22bf4f8) Respecting FormField->extraClass() settings in TableListField.ss, ComplexTableField.ss and RelationComplexTableField.ss (Ingo Schommer) + * 2009-11-21 [926834d](https://github.com/silverstripe/sapphire/commit/926834d) Removed redundant jquery-ui.js dependency from TabSet.php and Security.php (Ingo Schommer) + * 2009-11-21 [29f375a](https://github.com/silverstripe/sapphire/commit/29f375a) Added Zend_Log thirdparty dependency (merge from r84322) (Ingo Schommer) + * 2009-11-21 [32c44b0](https://github.com/silverstripe/sapphire/commit/32c44b0) Added prototypefix helper scripts from jquery13 module to fix document.getElementsByClassName() override by prototypejs (Ingo Schommer) + * 2009-11-21 [76d2886](https://github.com/silverstripe/sapphire/commit/76d2886) Moved tiny_mce_imrpovements.js from jsparty/ to sapphire/javascript (Ingo Schommer) + * 2009-11-21 [b56f493](https://github.com/silverstripe/sapphire/commit/b56f493) Moved jsparty/greybox to sapphire/thirdparty/greybox (Ingo Schommer) + * 2009-11-21 [f7cff27](https://github.com/silverstripe/sapphire/commit/f7cff27) Moved jsparty/tree to cms/javascript/tree (Ingo Schommer) + * 2009-11-21 [f7f3bc7](https://github.com/silverstripe/sapphire/commit/f7f3bc7) Removed unused cmsCleanup_parentChanged() callback from Group, Folder and SiteTree classes (Ingo Schommer) + * 2009-11-21 [4b12937](https://github.com/silverstripe/sapphire/commit/4b12937) Using jquery.concrete and jquery.selector on github through piston dependency management (Ingo Schommer) + * 2009-11-21 [241bff3](https://github.com/silverstripe/sapphire/commit/241bff3) Updated jquery.concrete (Ingo Schommer) + * 2009-11-21 [b661b40](https://github.com/silverstripe/sapphire/commit/b661b40) Wrapping ParentType selector in its own CompositeField in SiteTree->getCMSFields() to make it easier to apply javascript behaviour to (Ingo Schommer) + * 2009-11-21 [7ecf3fe](https://github.com/silverstripe/sapphire/commit/7ecf3fe) Adjusted to changed TreeNodeAPI->setNodeIcon() arguments - using 'class-' prefix to denote PHP classes in the tree DOM now (Ingo Schommer) + * 2009-11-21 [353dc66](https://github.com/silverstripe/sapphire/commit/353dc66) Removed SitetreeAccess.js dependency from SiteTree->getCMSFields(), is now handled in CMSMain.js (Ingo Schommer) + * 2009-11-21 [0009b54](https://github.com/silverstripe/sapphire/commit/0009b54) Markup changes to Translatable->getCMSField() to better support clientside language selection (Ingo Schommer) + * 2009-11-21 [18bd505](https://github.com/silverstripe/sapphire/commit/18bd505) Removed windowName() manual setting in ContentController->SilverstripeNavigator() (Ingo Schommer) + * 2009-11-21 [817d1a0](https://github.com/silverstripe/sapphire/commit/817d1a0) Removed usage of deprecated baseHref() in InlineFormAction.js (Ingo Schommer) + * 2009-11-21 [9889ba5](https://github.com/silverstripe/sapphire/commit/9889ba5) Moved Function.prototype.create from tree.js into behaviour.js (Ingo Schommer) + * 2009-11-21 [146979b](https://github.com/silverstripe/sapphire/commit/146979b) Documentation and code formatting for jquery.ondemand.js (Ingo Schommer) + * 2009-11-21 [073ebbe](https://github.com/silverstripe/sapphire/commit/073ebbe) Moved sapphire/javascript/core to sapphire/javascript/jquery-ondemand to fit with patterns in sapphire/thirdparty (Ingo Schommer) + * 2009-11-21 [fd1cb12](https://github.com/silverstripe/sapphire/commit/fd1cb12) Removed unused sapphire/thirdparty/jquery.ondemand.js library, we use a heavily customized version in sapphire/javascript/jquery-ondemand instead (Ingo Schommer) + * 2009-11-21 [5d6233a](https://github.com/silverstripe/sapphire/commit/5d6233a) Indentation in customized jquery.ondemand.js (Ingo Schommer) + * 2009-11-21 [1b138d6](https://github.com/silverstripe/sapphire/commit/1b138d6) Removed layout_helpers.js dependency (Ingo Schommer) + * 2009-11-21 [df1766b](https://github.com/silverstripe/sapphire/commit/df1766b) Removed unused css/CalendarDateField.css (Ingo Schommer) + * 2009-11-21 [2fc966c](https://github.com/silverstripe/sapphire/commit/2fc966c) Removed loader.js dependencies (Ingo Schommer) + * 2009-11-21 [e233b4b](https://github.com/silverstripe/sapphire/commit/e233b4b) Removed tab overflow setting from TabSet.js, now located in CMSMain.js (Ingo Schommer) + * 2009-11-21 [c9cb5dd](https://github.com/silverstripe/sapphire/commit/c9cb5dd) Added json-js library to provide a cross-browser JSON implementation. We need this for jquery.layout.state.js at the moment. (Ingo Schommer) + * 2009-11-21 [dd07406](https://github.com/silverstripe/sapphire/commit/dd07406) Moved css specific to Security/login in Security_login.css (shouldnt be in the generic Form.css declarations) (Ingo Schommer) + * 2009-11-21 [a32d473](https://github.com/silverstripe/sapphire/commit/a32d473) Added jquery.cookie library to allow saving of last selected jQuery UI tab (Ingo Schommer) + * 2009-11-21 [4e91eae](https://github.com/silverstripe/sapphire/commit/4e91eae) Re-added jquery.metadata plugin, updated from 2.0 to 2.1 (Ingo Schommer) + * 2009-11-21 [48afb22](https://github.com/silverstripe/sapphire/commit/48afb22) Temporarily removed jquery.metadata plugin, to switch piston externals from svn to git (Ingo Schommer) + * 2009-11-21 [d27e3e7](https://github.com/silverstripe/sapphire/commit/d27e3e7) Moved jquery-layout and swfupload libraries to cms/thirdparty MINOR Moved jquery-fitheighttoparent library to cms/javascript (Ingo Schommer) + * 2009-11-21 [a11db29](https://github.com/silverstripe/sapphire/commit/a11db29) Changed paths to moved thirdparty dependencies (mostly from /jsparty to /sapphire/thirdparty, /cms/javascript and /sapphire/javascript) (Ingo Schommer) + * 2009-11-21 [566643f](https://github.com/silverstripe/sapphire/commit/566643f) Added sapphire/thirdparty/behaviour (Ingo Schommer) + * 2009-11-21 [f811d9d](https://github.com/silverstripe/sapphire/commit/f811d9d) Added sapphire/thirdparty/firebug-lite (Ingo Schommer) + * 2009-11-21 [75d3815](https://github.com/silverstripe/sapphire/commit/75d3815) Removed unnecessary files from sapphire/thirdpary/spyc (Ingo Schommer) + * 2009-11-21 [2f32c87](https://github.com/silverstripe/sapphire/commit/2f32c87) Moved sapphire/thirdparty/simplepie from an external to a piston-managed module API CHANGE Renamed sapphire/thirdparty/simplepie/SimplePie.php to simplepie.inc (Ingo Schommer) + * 2009-11-21 [67f50e1](https://github.com/silverstripe/sapphire/commit/67f50e1) Added .gitignore (Ingo Schommer) + * 2009-11-21 [4b1027d](https://github.com/silverstripe/sapphire/commit/4b1027d) Replaced sapphire/thirdparty/Zend external with piston-managed version (Ingo Schommer) + * 2009-11-21 [5ebe8ec](https://github.com/silverstripe/sapphire/commit/5ebe8ec) Moved sapphire/thirdparty/spyc from an external into piston-managed source tree (Ingo Schommer) + * 2009-11-21 [86bb4df](https://github.com/silverstripe/sapphire/commit/86bb4df) Moved sapphire/thirdparty/json from an external into source tree (Ingo Schommer) + * 2009-11-21 [9ea55f2](https://github.com/silverstripe/sapphire/commit/9ea55f2) Moved sapphire/thirdparty/jsmin from an external into source tree (Ingo Schommer) + * 2009-11-21 [036b77a](https://github.com/silverstripe/sapphire/commit/036b77a) Removed absolete concrete triggers (Ingo Schommer) + * 2009-11-21 [fe6c80c](https://github.com/silverstripe/sapphire/commit/fe6c80c) Removed absolete concrete triggers (Ingo Schommer) + * 2009-11-21 [053431a](https://github.com/silverstripe/sapphire/commit/053431a) Using jquery-latest.js in FileIframeField and RemoveOrphanedPagesTask (Ingo Schommer) + * 2009-11-21 [5451fba](https://github.com/silverstripe/silverstripe-cms/commit/5451fba) Mergeinfo (Ingo Schommer) + * 2009-11-21 [c14e7df](https://github.com/silverstripe/silverstripe-cms/commit/c14e7df) added stubs to allow widgets to use treedropdown fields (from r91850) (Ingo Schommer) + * 2009-11-21 [61eb69f](https://github.com/silverstripe/silverstripe-cms/commit/61eb69f) Changed silverstripe.com references to silverstripe.org (from r90887) (Ingo Schommer) + * 2009-11-21 [0d0956b](https://github.com/silverstripe/silverstripe-installer/commit/0d0956b) Mergeinfo (ischommer) + * 2009-11-21 [1d3feb9](https://github.com/silverstripe/sapphire/commit/1d3feb9) added stubs to allow widgets to use treedropdown fields (from r91850) (Ingo Schommer) + * 2009-11-21 [eccf13e](https://github.com/silverstripe/sapphire/commit/eccf13e) Whitespace change (from r91261) (Ingo Schommer) + * 2009-11-21 [78ebd1e](https://github.com/silverstripe/sapphire/commit/78ebd1e) Mergeinfo (Ingo Schommer) + * 2009-11-21 [4322aeb](https://github.com/silverstripe/silverstripe-installer/commit/4322aeb) Mergeinfo (ischommer) + * 2009-11-21 [3181e81](https://github.com/silverstripe/silverstripe-cms/commit/3181e81) Mergeinfo (Ingo Schommer) + * 2009-11-21 [125080d](https://github.com/silverstripe/sapphire/commit/125080d) Mergeinfo (Ingo Schommer) + * 2009-11-21 [ed7a77a](https://github.com/silverstripe/silverstripe-installer/commit/ed7a77a) Mergeinfo (ischommer) + * 2009-11-19 [4b3bc19](https://github.com/silverstripe/silverstripe-installer/commit/4b3bc19) Fixed merge errors and omissions from branches/2.3 (ischommer) + * 2009-11-19 [43ab9ea](https://github.com/silverstripe/silverstripe-installer/commit/43ab9ea) Mergeinfo (ischommer) + * 2009-11-19 [a6a7023](https://github.com/silverstripe/silverstripe-installer/commit/a6a7023) Changed silverstripe.com references to silverstripe.org (from r90887) (ischommer) + * 2009-11-19 [1dcca6e](https://github.com/silverstripe/silverstripe-installer/commit/1dcca6e) Removed unnecessary mergeinfo from themes subfolders (ischommer) + * 2009-11-19 [48fe08f](https://github.com/silverstripe/silverstripe-installer/commit/48fe08f) Mergeinfo (ischommer) + * 2009-11-19 [2c15f4b](https://github.com/silverstripe/silverstripe-installer/commit/2c15f4b) Reverted accidental commits in r71146, r71147, r71148, r71149, r71150, r71151 - thought I was committing to another repository... (from r71152) (ischommer) + * 2009-11-19 [6765f0a](https://github.com/silverstripe/silverstripe-installer/commit/6765f0a) Fixed comma where it should've been a dot (from r83449) (ischommer) + * 2009-11-19 [7d37918](https://github.com/silverstripe/silverstripe-installer/commit/7d37918) Mergeinfo (ischommer) + * 2009-11-19 [d8cbb36](https://github.com/silverstripe/silverstripe-installer/commit/d8cbb36) Added mergetracking info (ischommer) + * 2009-11-15 [64d74e0](https://github.com/silverstripe/silverstripe-cms/commit/64d74e0) Fixed merge error from r91584 (Ingo Schommer) + * 2009-11-15 [2cc517d](https://github.com/silverstripe/sapphire/commit/2cc517d) Removed invalid deprecation note (Ingo Schommer) + * 2009-11-12 [87e7599](https://github.com/silverstripe/silverstripe-cms/commit/87e7599) Fixed casing of swfupload.js reference which was breaking LeftAndMainTest (Ingo Schommer) + * 2009-11-11 [7dd0de7](https://github.com/silverstripe/sapphire/commit/7dd0de7) revert r91306 (Tom Rix) + * 2009-11-11 [5f548f5](https://github.com/silverstripe/silverstripe-cms/commit/5f548f5) fixed undefined var (Tom Rix) + * 2009-11-11 [a1848c2](https://github.com/silverstripe/sapphire/commit/a1848c2) revert r89202 from sminnee, broke multiselects, as there is no method called selectNode on tree. (Tom Rix) + * 2009-11-11 [9c67f3e](https://github.com/silverstripe/silverstripe-cms/commit/9c67f3e) update lang files (Tom Rix) + * 2009-11-11 [947fcc4](https://github.com/silverstripe/sapphire/commit/947fcc4) update lang files (Tom Rix) + * 2009-11-10 [94b0ab5](https://github.com/silverstripe/sapphire/commit/94b0ab5) reverted changes to i18nTextCollector, and updated documentation (Tom Rix) + * 2009-11-10 [0526124](https://github.com/silverstripe/sapphire/commit/0526124) removed concurrent editing (Tom Rix) + * 2009-11-10 [d22e4d1](https://github.com/silverstripe/silverstripe-cms/commit/d22e4d1) removed concurrent editing (Tom Rix) + * 2009-11-06 [4252067](https://github.com/silverstripe/sapphire/commit/4252067) Changed silverstripe.com references to silverstripe.org MINOR Fixed broken wiki links (#4672) (from r90886) (Sam Minnee) + * 2009-11-05 [6608616](https://github.com/silverstripe/silverstripe-installer/commit/6608616) Added 2.4 as mergesource target (ischommer) + +### Other + + * 2011-04-30 [4621210](https://github.com/silverstripe/sapphire/commit/4621210) merge styles (Ingo Schommer) + * 2011-04-30 [0085101](https://github.com/silverstripe/sapphire/commit/0085101) merge menu (Ingo Schommer) + * 2011-04-26 [c2d3da6](https://github.com/silverstripe/sapphire/commit/c2d3da6) Change path directory in comment (Hugues Lamy) + * 2011-04-25 [14c60c5](https://github.com/silverstripe/sapphire/commit/14c60c5) Landing pull request 17. Fixes Call to a member function setValue() on a non-object in ConfirmedPasswordField Fixes #????. (Will Rossiter) + * 2011-04-06 [940df33](https://github.com/silverstripe/silverstripe-installer/commit/940df33) Updated the installer to reflect the moved Sapphire files (Howard Grigg) + * 2011-03-29 [9b8594a](https://github.com/silverstripe/sapphire/commit/9b8594a) Triage of Template Tags rendering syntactically incorrect, per Disqus comment (d57) + * 2011-03-30 [c5ce75f](https://github.com/silverstripe/silverstripe-installer/commit/c5ce75f) Added a default .gitignore (Sam Minnee) + * 2011-03-22 [6bd9c56](https://github.com/silverstripe/silverstripe-cms/commit/6bd9c56) Moved ContentControllerSearchExtensionTest and SearchFormTest from sapphire/tests/search into "cms" module (Ingo Schommer) + * 2011-03-18 [77fa855](https://github.com/silverstripe/sapphire/commit/77fa855) Allowing success and error callbacks in refresh() (Ingo Schommer) + * 2011-03-11 [a220d37](https://github.com/silverstripe/silverstripe-cms/commit/a220d37) Revert "MINOR Replaced assertType() calls with assertInstanceOf(), deprecated in PHPUnit 3.6 (throws warnings as of 3.5.10)" - causing too many issues in mixed build environments with other projects requiring PHPUnit 3.4 (Ingo Schommer) + * 2011-03-11 [2184acf](https://github.com/silverstripe/sapphire/commit/2184acf) Revert "MINOR Replaced assertType() calls with assertInstanceOf(), deprecated in PHPUnit 3.6 (throws warnings as of 3.5.10)" - cased too many problems with mixed build environments that require PHP 3.4 (Ingo Schommer) + * 2011-03-11 [9d10e88](https://github.com/silverstripe/sapphire/commit/9d10e88) Revert "API CHANGE Removing support for PHPUnit 3.4 (3.5.0 has been released in Sept 2010). Removing PhpUnitWrapper_3_4, and adding better version detection." - too many complications with our build environments running mixed versions of SilverStripe (Ingo Schommer) + * 2011-03-11 [b2e4fdd](https://github.com/silverstripe/silverstripe-cms/commit/b2e4fdd) MINR Fixed double generation of tree via 'data' parameter (Ingo Schommer) + * 2011-03-09 [626980a](https://github.com/silverstripe/sapphire/commit/626980a) Small text changes, added api links, cont. updating images for tutorials, fixed tutorials from member feedback (Michael Andrewartha) + * 2011-03-08 [1fca5c5](https://github.com/silverstripe/sapphire/commit/1fca5c5) Fixed infinite loops in onmatch() and onunmatch() when using $.entwine.synchronous_mode() with DOM manipulations in these methods. Allowing $.entwine.synchronous_mode() to be turned off again (Ingo Schommer) + * 2010-12-13 [88aea2f](https://github.com/silverstripe/silverstripe-installer/commit/88aea2f) Removed temporary datetimefields from externals (sharvey) + * 2010-10-19 [3c681b0](https://github.com/silverstripe/sapphire/commit/3c681b0) #4029 On the fly form validation works in Opera as well (from r111880) (Sam Minnee) + * 2010-10-19 [83561f2](https://github.com/silverstripe/silverstripe-cms/commit/83561f2) Added doc for static help_link (from r111879) (Sam Minnee) + * 2010-10-19 [0d6cb29](https://github.com/silverstripe/sapphire/commit/0d6cb29) Added dev/tests/emptydb to clear out test session databases. (from r109099) (Sam Minnee) + * 2010-10-15 [8d07a8e](https://github.com/silverstripe/sapphire/commit/8d07a8e) MINOT Translation in SiteTree (#5603, thanks Pike) (from r105057) (Ingo Schommer) + * 2010-10-15 [5a20fbe](https://github.com/silverstripe/silverstripe-installer/commit/5a20fbe) #5870 Block web requests to silverstripe-cache directory via htaccess RedirectMatch rule or web.config hiddenSegments functionality if using IIS 7.x (from r110241) (sminnee) + * 2010-10-15 [e73918f](https://github.com/silverstripe/sapphire/commit/e73918f) Added explicit bash handler to sake (from r104667) (Ingo Schommer) + * 2010-10-15 [8f2d920](https://github.com/silverstripe/sapphire/commit/8f2d920) Multi-use redemption page created (from r104442) (Ingo Schommer) + * 2010-10-04 [f8f18f4](https://github.com/silverstripe/silverstripe-cms/commit/f8f18f4) Several merges from branches/2.4 (Sam Minnee) + * 2010-10-04 [00a5a5b](https://github.com/silverstripe/silverstripe-cms/commit/00a5a5b) Reverted r111624 (Sam Minnee) + * 2010-05-25 [f4a5459](https://github.com/silverstripe/silverstripe-cms/commit/f4a5459) Nicer dates (from r95776) (from r98172) (Ingo Schommer) + * 2010-04-13 [cf4fa3a](https://github.com/silverstripe/silverstripe-cms/commit/cf4fa3a) <a ... /> tag which is not so nice (from r96926) (Ingo Schommer) + * 2010-04-13 [2ae6f89](https://github.com/silverstripe/sapphire/commit/2ae6f89) Add some nice date formats (from r95772) (from r98093) (Ingo Schommer) + * 2010-04-13 [ee4174c](https://github.com/silverstripe/sapphire/commit/ee4174c) Added values for new permission code 'VIEW_DRAFT_CONTENT' test (from r97898) (Ingo Schommer) + * 2010-04-13 [9a04ca6](https://github.com/silverstripe/sapphire/commit/9a04ca6) Added test for new permission code. (from r97897) (Ingo Schommer) + * 2010-04-12 [603657b](https://github.com/silverstripe/sapphire/commit/603657b) MERGE merged back a whole bunch of defect fixes from trunk (from r87846) (from r96712) (Ingo Schommer) + * 2010-02-26 [5157a61](https://github.com/silverstripe/silverstripe-installer/commit/5157a61) w00t (ischommer) + * 2010-02-26 [1f80831](https://github.com/silverstripe/silverstripe-installer/commit/1f80831) 2 (ischommer) + * 2010-02-26 [8230e7b](https://github.com/silverstripe/silverstripe-installer/commit/8230e7b) 3 (ischommer) + * 2010-02-03 [6751714](https://github.com/silverstripe/sapphire/commit/6751714) SECURITY Removed various PHP files from sapphire/thirdparty to reduce XSS attack surface (see r98027 and r98028) (Ingo Schommer) + * 2010-01-21 [7de9460] Reverted r97231 (Will Rossiter) + * 2010-01-21 [1cb2814](https://github.com/silverstripe/silverstripe-installer/commit/1cb2814) Reverted r97231 (wrossiter) + * 2009-11-21 [604c979](https://github.com/silverstripe/silverstripe-cms/commit/604c979) removed overflow from top menu bar (was showing a scrollbar) (Ingo Schommer) + * 2009-11-21 [08dc3f0](https://github.com/silverstripe/silverstripe-cms/commit/08dc3f0) evenly pad out action buttons at bottom (Ingo Schommer) + * 2009-11-21 [7d8c349](https://github.com/silverstripe/silverstripe-cms/commit/7d8c349) made the west panel default a little wider to allow for new tab padding (Ingo Schommer) + * 2009-11-21 [3b8767e](https://github.com/silverstripe/silverstripe-cms/commit/3b8767e) align text on welcome screen (Ingo Schommer) + * 2009-11-21 [0ae8539](https://github.com/silverstripe/silverstripe-cms/commit/0ae8539) styles for empty form on load/no pages open (Ingo Schommer) + * 2009-11-21 [50d058b](https://github.com/silverstripe/silverstripe-cms/commit/50d058b) styles for righthand content panel to match sitetree (Ingo Schommer) + * 2009-11-21 [6ce44db](https://github.com/silverstripe/silverstripe-cms/commit/6ce44db) removed unnecessary background colour on treepanes (Ingo Schommer) + * 2009-11-21 [9fdf14a](https://github.com/silverstripe/silverstripe-cms/commit/9fdf14a) Added base overrides for jquery-ui (Ingo Schommer) + * 2009-11-21 [1192d5b](https://github.com/silverstripe/silverstripe-cms/commit/1192d5b) Reimplementation for reports (#49) - removing unneeded code and remaking the template to use standard SiteTree functionality. (Ingo Schommer) + * 2009-11-21 [dca8c0c](https://github.com/silverstripe/sapphire/commit/dca8c0c) merging (Ingo Schommer) + * 2009-11-19 [5959603](https://github.com/silverstripe/silverstripe-installer/commit/5959603) Disable PHP in the assets directory, regardless of virtual-host config (from r74816) (ischommer) + * 2009-11-19 [f3258df](https://github.com/silverstripe/silverstripe-installer/commit/f3258df) Added additional switch for a slight variation of the URL parsing code. (from r73224) (ischommer) + * 2009-11-19 [aa780a5](https://github.com/silverstripe/silverstripe-installer/commit/aa780a5) ... (from r71151) (ischommer) + * 2009-11-19 [4e16f38](https://github.com/silverstripe/silverstripe-installer/commit/4e16f38) fixed label display for optionsetfields (from r71149) (ischommer) + * 2009-11-19 [19c7e11](https://github.com/silverstripe/silverstripe-installer/commit/19c7e11) added mysite theme (from r71148) (ischommer) + * 2009-11-19 [e361bea](https://github.com/silverstripe/silverstripe-installer/commit/e361bea) removed tutorial files (from r71147) (ischommer) + * 2009-11-19 [3c07e8b](https://github.com/silverstripe/silverstripe-installer/commit/3c07e8b) ... (from r71146) (ischommer) + * 2009-11-19 [5bb0d9b](https://github.com/silverstripe/silverstripe-installer/commit/5bb0d9b) Removed DirectorySlash update from installer's default htaccess as it breaks some installation targets (from r67085) (ischommer) \ No newline at end of file diff --git a/docs/en/howto/index.md b/docs/en/howto/index.md index 39ae810fa..5a3308986 100644 --- a/docs/en/howto/index.md +++ b/docs/en/howto/index.md @@ -10,6 +10,7 @@ the language and functions which are used in the guides. * [Dynamic Default Fields](dynamic-default-fields). Pre populate a [api:DataObject] with data. * [Grouping DataObjectSets](grouping-dataobjectsets). Group results in a [api:DataObjectSet] to create sub sections. * [PHPUnit Configuration](phpunit-configuration). How to setup your testing environment with PHPUnit +* [Extend the CMS Interface](extend-cms-interface). ## Feedback From 71bc87fa1e5d76ff030227c149dd27358f9107f3 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Sun, 1 May 2011 22:20:30 +1200 Subject: [PATCH 23/48] MINOR Making SiteConfig dependency optional in LeftAndMain->SiteConfig() --- admin/code/LeftAndMain.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/code/LeftAndMain.php b/admin/code/LeftAndMain.php index 0a8997567..e23113e95 100644 --- a/admin/code/LeftAndMain.php +++ b/admin/code/LeftAndMain.php @@ -1092,7 +1092,7 @@ class LeftAndMain extends Controller { * @return SiteConfig */ function SiteConfig() { - return SiteConfig::current_site_config(); + return (class_exists('SiteConfig')) ? SiteConfig::current_site_config() : null; } /** From b21dbd96411986d5ea13e2c47f482e4eee925aec Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Mon, 2 May 2011 08:44:09 +1200 Subject: [PATCH 24/48] MINOR Fixed from-source docs, added 'preview' release cycle to release-process docs --- docs/en/installation/from-source.md | 3 ++- docs/en/misc/release-process.md | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/en/installation/from-source.md b/docs/en/installation/from-source.md index 38258c7f3..ff965781c 100644 --- a/docs/en/installation/from-source.md +++ b/docs/en/installation/from-source.md @@ -149,7 +149,8 @@ Please replace `` below with your github username. cd my-silverstripe-project git clone git@github.com:/sapphire.git sapphire git clone git@github.com:/silverstripe-cms.git cms - git clone git@github.com:/silverstripe-blackcandy.git themes/blackcandy + rm -rf themes + git clone git@github.com:/silverstripe-blackcandy.git themes Now you need to add the original repository as `upstream`, so you can keep your fork updated later on. diff --git a/docs/en/misc/release-process.md b/docs/en/misc/release-process.md index d0c498cc9..ca516974f 100644 --- a/docs/en/misc/release-process.md +++ b/docs/en/misc/release-process.md @@ -37,6 +37,8 @@ for stability and regression testing. Naming convention is *A.B.C-alpha* and *A. * Major, minor and micro releases can have one or more *release candidates (RC)*, to be used by the wider community. A release candidate signifies that the core team thinks the release is ready without further changes. The actual release should be a identical copy of the latest RC. Naming convention is *A.B.C-rc1* (and further increments). +* Major releases may have a *preview* cycle which is a early snapshot of the codebase for developers before +going into the *alpha* cycle. Preview releases are named *A.B.C-pr1* (and further increments). ### Major releases From f94647197b6d6da5a129f55e33b7b88f59b3db47 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Mon, 2 May 2011 11:43:34 +1200 Subject: [PATCH 25/48] MINOR Loading indication for buttons in CMS (overrides jQuery UI backgrounds) --- admin/scss/_forms.scss | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/admin/scss/_forms.scss b/admin/scss/_forms.scss index 6489ead3e..72099a4ea 100644 --- a/admin/scss/_forms.scss +++ b/admin/scss/_forms.scss @@ -65,7 +65,9 @@ input, textarea { padding: 3px; } -input.loading { +input.loading, +input.ui-state-default.loading, .ui-widget-content input.ui-state-default.loading, +.ui-widget-header input.ui-state-default.loading { padding-left: 16px; background: $color-widget-bg url(../../images/network-save.gif) no-repeat center left; } From ff1c961ead91898f6368a3731119f4639d8a0217 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Mon, 2 May 2011 11:43:51 +1200 Subject: [PATCH 26/48] MINOR CMS Preview fixes --- admin/css/screen.css | 4 +++- admin/javascript/LeftAndMain.Preview.js | 21 +++++++++++++++++---- admin/scss/_style.scss | 6 ++++++ admin/templates/LeftAndMain.ss | 2 +- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/admin/css/screen.css b/admin/css/screen.css index ef80f42cd..070205aa3 100644 --- a/admin/css/screen.css +++ b/admin/css/screen.css @@ -159,7 +159,7 @@ form.nostyle .middleColumn { margin-left: 0; } input, textarea { -moz-border-radius: 5px; -webkit-border-radius: 5px; -o-border-radius: 5px; -ms-border-radius: 5px; -khtml-border-radius: 5px; border-radius: 5px; background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #ebeff1), color-stop(50%, #ffffff), color-stop(100%, #ebeff1)); background-image: -moz-linear-gradient(top, #ebeff1 0%, #ffffff 50%, #ebeff1 100%); background-image: linear-gradient(top, #ebeff1 0%, #ffffff 50%, #ebeff1 100%); border: 1px solid #aaaaaa; padding: 3px; } -input.loading { padding-left: 16px; background: #ebeff1 url(../../images/network-save.gif) no-repeat center left; } +input.loading, input.ui-state-default.loading, .ui-widget-content input.ui-state-default.loading, .ui-widget-header input.ui-state-default.loading { padding-left: 16px; background: #ebeff1 url(../../images/network-save.gif) no-repeat center left; } .ss-ui-button.ss-ui-action-constructive, .ui-widget-content .ss-ui-button.ss-ui-action-constructive, .ui-widget-header .ss-ui-button.ss-ui-action-constructive { background: none; background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #77b53f), color-stop(100%, #456925)); background-image: -moz-linear-gradient(top, #77b53f 0%, #456925 100%); background-image: linear-gradient(top, #77b53f 0%, #456925 100%); color: white; } @@ -261,3 +261,5 @@ form.member-profile-form .formattingHelpText li { font-size: 11px; color: #333; .cms-preview { background-color: #b0bfc6; } .cms-preview .cms-preview-toggle { cursor: pointer; } .cms-preview .cms-preview-toggle a { color: white; font-weight: bold; text-decoration: none; } + +.cms-switch-view a { padding-right: 1em; } diff --git a/admin/javascript/LeftAndMain.Preview.js b/admin/javascript/LeftAndMain.Preview.js index d238a6d4e..a6ab43c28 100644 --- a/admin/javascript/LeftAndMain.Preview.js +++ b/admin/javascript/LeftAndMain.Preview.js @@ -2,6 +2,8 @@ $.entwine('ss', function($){ $('.LeftAndMain .cms-preview').entwine({ + SharedWidth: null, + onmatch: function() { var self = this, layoutContainer = this.parent(); // this.resizable({ @@ -11,6 +13,9 @@ // } // }); + // TODO Compute dynamically + this.setSharedWidth(500); + // Create layout and controls this.prepend(''); this.find('iframe').addClass('center'); @@ -50,14 +55,13 @@ if(id && form.find(':input[name=ID]').val() != id) form.loadForm('admin/page/edit/show/' + id); }, - toggle: function() { + toggle: function(bool) { var self = this, width = this.width(), relayout = function() {$('.cms-container').layout({resize: false});}, minWidth = this.find('.cms-preview-toggle').width(), - wasCollapsed = (width <= minWidth), - sharedWidth = $('.cms-content').width() / 2, // half of content area by default - newWidth = wasCollapsed ? sharedWidth : minWidth, + wasCollapsed = (bool === true || bool === false) ? bool : (width <= minWidth), + newWidth = wasCollapsed ? this.getSharedWidth() : minWidth, newOverflow = wasCollapsed ? 'auto' : 'hidden'; this.css('overflow', newOverflow).width(newWidth); @@ -98,5 +102,14 @@ this.parents('.cms-preview').toggle(); } }); + + $('.LeftAndMain .cms-switch-view a').entwine({ + onclick: function(e) { + e.preventDefault(); + var preview = $('.cms-preview'); + preview.toggle(true); + preview.loadUrl($(e.target).attr('href')); + } + }); }); }(jQuery)); \ No newline at end of file diff --git a/admin/scss/_style.scss b/admin/scss/_style.scss index 4491f734c..4170d8a75 100644 --- a/admin/scss/_style.scss +++ b/admin/scss/_style.scss @@ -341,4 +341,10 @@ form.member-profile-form { text-decoration: none; } } +} + +.cms-switch-view { + a { + padding-right: 1em; + } } \ No newline at end of file diff --git a/admin/templates/LeftAndMain.ss b/admin/templates/LeftAndMain.ss index 1fe5b11fb..165b9938a 100644 --- a/admin/templates/LeftAndMain.ss +++ b/admin/templates/LeftAndMain.ss @@ -27,7 +27,7 @@ <% if currentPage %>
    - +
    <% end_if %> From 485ea3e41da1a0fa2ec23f22d4d16f1ffffdfaa6 Mon Sep 17 00:00:00 2001 From: Sam Minnee Date: Mon, 2 May 2011 12:34:06 +1200 Subject: [PATCH 27/48] Updated changelog to include more removed classes --- docs/en/changelogs/3.0.0.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/en/changelogs/3.0.0.md b/docs/en/changelogs/3.0.0.md index c50fcbd2a..9029dd06a 100644 --- a/docs/en/changelogs/3.0.0.md +++ b/docs/en/changelogs/3.0.0.md @@ -110,6 +110,10 @@ Alternatively, you can enforce database usage by setting `SapphireTest->usesData ### Removed Classes ### - * `ConfirmedFormAction` - * `QueuedEmail`, `QueuedEmailDispatchTask` - * `RestrictedTextField`, `UniqueTextField`, `UniqueRestrictedTextField`, `AutocompleteTextField`: Use custom fields instead \ No newline at end of file + * `QueuedEmail`, `QueuedEmailDispatchTask`: If you make use of these, copy the classes from 2.4 into your project. + * `RestrictedTextField`, `UniqueTextField`, `UniqueRestrictedTextField`, `AutocompleteTextField`, `ConfirmedFormAction`: Use custom fields instead + * `TreeSelectorField`: Use `TreeDropdownField` instead. + * `Notifications`: If you make use of this, copy the classes from 2.4 into your project. + * `Archive`, `TarballArchive`: If you make use of these, copy the classes from 2.4 into your project. + * `XML`: Use PHP's built-in SimpleXML instead + * `DataObjectLog`: There is no replacement for this. \ No newline at end of file From 54a5fc6a74695e4424635e87096d26ed47811f8b Mon Sep 17 00:00:00 2001 From: ajshort Date: Tue, 19 Apr 2011 13:52:20 +1000 Subject: [PATCH 28/48] BUGFIX: Fixed the manifest not parsing interfaces which extended from multiple interfaces. --- core/manifest/ClassManifest.php | 8 +------- tests/core/manifest/TokenisedRegularExpressionTest.php | 8 ++++++-- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/core/manifest/ClassManifest.php b/core/manifest/ClassManifest.php index 9221a2e56..f4f512038 100644 --- a/core/manifest/ClassManifest.php +++ b/core/manifest/ClassManifest.php @@ -60,13 +60,7 @@ class SS_ClassManifest { return new TokenisedRegularExpression(array( 0 => T_INTERFACE, 1 => T_WHITESPACE, - 2 => array(T_STRING, 'can_jump_to' => 7, 'save_to' => 'interfaceName'), - 3 => T_WHITESPACE, - 4 => T_EXTENDS, - 5 => T_WHITESPACE, - 6 => array(T_STRING, 'save_to' => 'extends'), - 7 => array(T_WHITESPACE, 'optional' => true), - 8 => '{', + 2 => array(T_STRING, 'save_to' => 'interfaceName') )); } diff --git a/tests/core/manifest/TokenisedRegularExpressionTest.php b/tests/core/manifest/TokenisedRegularExpressionTest.php index 473b5710b..509c1e211 100644 --- a/tests/core/manifest/TokenisedRegularExpressionTest.php +++ b/tests/core/manifest/TokenisedRegularExpressionTest.php @@ -43,6 +43,10 @@ implements InterfaceA, InterfaceB { } +interface InterfaceC extends InterfaceA, InterfaceB { +} +interface InterfaceD extends InterfaceA, InterfaceB, InterfaceC { +} ?> PHP ); @@ -88,8 +92,8 @@ PHP if($matches) foreach($matches as $match) $interfaces[$match['interfaceName']] = $match; $this->assertArrayHasKey('InterfaceA', $interfaces); - $this->assertArrayHasKey('InterfaceB', $interfaces); - $this->assertEquals('Something', $interfaces['InterfaceB']['extends']); + $this->assertArrayHasKey('InterfaceC', $interfaces); + $this->assertArrayHasKey('InterfaceD', $interfaces); } } \ No newline at end of file From 40786cddd346208d8fc408d89f097aa6a2f468a4 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Mon, 2 May 2011 12:36:16 +1200 Subject: [PATCH 29/48] BUGFIX Allowing 'root' as ID parameter in LeftAndMain->getEditForm() (necessary for AssetAdmin root folders etc.) --- admin/code/LeftAndMain.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/admin/code/LeftAndMain.php b/admin/code/LeftAndMain.php index e23113e95..574beb158 100644 --- a/admin/code/LeftAndMain.php +++ b/admin/code/LeftAndMain.php @@ -459,6 +459,8 @@ class LeftAndMain extends Controller { $className = $this->stat('tree_class'); if($className && $id instanceof $className) { return $id; + } else if($id == 'root') { + return singleton($className); } else if(is_numeric($id)) { return DataObject::get_by_id($className, $id); } else { @@ -751,7 +753,7 @@ class LeftAndMain extends Controller { if(is_object($id)) { $record = $id; } else { - $record = ($id && $id != "root") ? $this->getRecord($id) : null; + $record = $this->getRecord($id); if($record && !$record->canView()) return Security::permissionFailure($this); } From 4d99686081fd0c9c1d705a0bc0d1cf7b77d53899 Mon Sep 17 00:00:00 2001 From: Colin Burns Date: Tue, 3 May 2011 22:56:34 -0700 Subject: [PATCH 30/48] Editing the /sapphire/email/mime.types file to allow Microsoft Office 2010 file extensions which were not previously in this file. This prevented these files from being sent as attachments on emails. I have added in the basic extensions of .docx, .pptx, .xlsx but also the additional extensions that Office 2010 have from this page - http://office.microsoft.com/en-us/help/introduction-to-new-file-name-extensions-HA010006935.aspx#BM1 I have no idea if the macro enabled file extensions like .xltm or .docm pose a security threat, but thought that if I was adding the basic types in I should add the others as well. I'll let someone else decide this as I have no idea :) --- email/mime.types | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/email/mime.types b/email/mime.types index 4164bba31..c71d20f90 100644 --- a/email/mime.types +++ b/email/mime.types @@ -10,7 +10,7 @@ application/mac-binhex40 hqx application/mac-compactpro cpt application/mathematica nb application/msaccess mdb -application/msword doc dot +application/msword doc dot docx docm dotx dotm application/octet-stream bin application/oda oda application/ogg ogg @@ -29,10 +29,10 @@ application/xhtml+xml xhtml xht application/xml xml xsl application/zip zip application/vnd.mozilla.xul+xml xul -application/vnd.ms-excel xls xlb xlt +application/vnd.ms-excel xls xlb xlt xlsx xlsm xltx xltm xlsb xlam application/vnd.ms-pki.seccat cat application/vnd.ms-pki.stl stl -application/vnd.ms-powerpoint ppt pps +application/vnd.ms-powerpoint ppt pps pptx pptm potx potm ppam ppsx ppsm sldx sldm thmx application/vnd.oasis.opendocument.chart odc application/vnd.oasis.opendocument.database odb application/vnd.oasis.opendocument.formula odf From 0b8f8a3c8add5a728191117d1d81d72519a1656b Mon Sep 17 00:00:00 2001 From: Frank Mullenger Date: Sun, 8 May 2011 16:02:28 +1200 Subject: [PATCH 31/48] ENHANCEMENT Checking allowed parents/children in tree dragging. Using 'data' attributes to encode metadata on the tree element (fixes #6578) --- admin/javascript/LeftAndMain.AddForm.js | 47 ++++++++++++------------- admin/javascript/LeftAndMain.Tree.js | 15 +++++--- 2 files changed, 32 insertions(+), 30 deletions(-) diff --git a/admin/javascript/LeftAndMain.AddForm.js b/admin/javascript/LeftAndMain.AddForm.js index f65526d3c..896f0e47b 100644 --- a/admin/javascript/LeftAndMain.AddForm.js +++ b/admin/javascript/LeftAndMain.AddForm.js @@ -107,49 +107,46 @@ /** * Function: refresh + * This is called after each change event of PageType dropdown * * Parameters: * (DOMElement) selectedNode */ refresh: function(selectedNode) { - // Note: Uses siteTreeHints global + var tree = this.getTree(), selectedNode = selectedNode || $(tree).jstree('get_selected') origOptions = this.getOrigOptions(), - dropdown = this.find('select[name=PageType]'); + dropdown = this.find('select[name=PageType]'), + disallowed = [], + className = (selectedNode) ? selectedNode.getClassname() : null, + siteTreeHints = $.parseJSON($('#sitetree_ul').attr('data-hints')), + disableDropDown = true, + selectedOption = dropdown.val(); // Clear all existing ')); - } - } else { - // No tree node selected, reset to original elements - $.each(origOptions, function(i, optProps) { - if(optProps) dropdown.append($('')); - }); + //Use tree hints to find allowed children for this node + if (className && typeof siteTreeHints !== 'undefined') { + disallowed = siteTreeHints[className].disallowedChildren; } - // TODO Re-select the currently selected element + $.each(origOptions, function(i, optProps) { + if ($.inArray(i, disallowed) === -1 && optProps) { + dropdown.append($('')); + disableDropDown = false; + } + }); // Disable dropdown if no elements are selectable - if(allowed) dropdown.removeAttr('disabled'); + if (!disableDropDown) dropdown.removeAttr('disabled'); else dropdown.attr('disabled', 'disabled'); - + + //Re-select the currently selected element + if (selectedOption) dropdown.val(selectedOption); + // Set default child (optional) if(selectedNode.hints && selectedNode.hints.defaultChild) { dropdown.val(selectedNode.hints.defaultChild); diff --git a/admin/javascript/LeftAndMain.Tree.js b/admin/javascript/LeftAndMain.Tree.js index e5cf99189..dae05e6af 100755 --- a/admin/javascript/LeftAndMain.Tree.js +++ b/admin/javascript/LeftAndMain.Tree.js @@ -3,20 +3,24 @@ */ (function($) { - + $.entwine('ss', function($){ $('.cms-tree').entwine({ + + Hints: null, + onmatch: function() { this._super(); + this.setHints($.parseJSON(this.attr('data-hints'))); + /** * @todo Icon and page type hover support * @todo Sorting of sub nodes (originally placed in context menu) * @todo Refresh after language '); + }); + + it( 'calls onchange', function() { + var a = 0; + + $('#i').entwine({onchange: function(){ a += 1; }}); + + // Can't just "click()" - it's not the same as an actual click event + $('#i').trigger('focusin'); $('#i')[0].click(); + expect(a).toEqual(1); + }); + + it( 'calls onchange only once per change', function() { + var a = 0; + + $('#i').entwine({onchange: function(){ a += 1; }}); + + $('#i').trigger('focusin'); $('#i')[0].click(); + expect(a).toEqual(1); + + $('#i').trigger('focusout'); $('#i').trigger('focusin'); $('#i').trigger('focusout'); + expect(a).toEqual(1); + + $('#i')[0].click(); + expect(a).toEqual(2); + + }); + + it( 'calls onchange even if checked attribute altered in mean time', function() { + var a = 0; + + $('#i').entwine({onchange: function(){ a += 1; }}); + + $('#i').trigger('focusin'); $('#i')[0].click(); + expect(a).toEqual(1); + + $('#i').removeAttr('checked'); + + $('#i').trigger('focusin'); $('#i')[0].click(); + expect(a).toEqual(2); + }); + }); + }); }); \ No newline at end of file diff --git a/thirdparty/jquery-entwine/spec/spec.entwine.properties.js b/thirdparty/jquery-entwine/spec/spec.entwine.properties.js index a8b9089dd..312ae1788 100644 --- a/thirdparty/jquery-entwine/spec/spec.entwine.properties.js +++ b/thirdparty/jquery-entwine/spec/spec.entwine.properties.js @@ -33,6 +33,16 @@ describe('Entwine', function() { }); expect($('.a').getFoo()).toEqual(1); }); + it('can override a default value with a true-ish value', function() { + $('#a').entwine({ Foo: 1 }); + $('#a').setFoo(2); + expect($('.a').getFoo()).toEqual(2); + }); + it('can override a default value with a false-ish value', function() { + $('#a').entwine({ Foo: 1 }); + $('#a').setFoo(0); + expect($('.a').getFoo()).toEqual(0); + }); it('should manage proprties in namespaces without clashing', function() { $('#a').entwine({ Foo: 1 diff --git a/thirdparty/jquery-entwine/src/jquery.entwine.events.js b/thirdparty/jquery-entwine/src/jquery.entwine.events.js index 037d1d4ce..e23428299 100644 --- a/thirdparty/jquery-entwine/src/jquery.entwine.events.js +++ b/thirdparty/jquery-entwine/src/jquery.entwine.events.js @@ -1,9 +1,23 @@ (function($) { - /* If we are any browser other than IE or Safari, we don't have to do anything special to handle - * onchange delegation */ - $.support.bubblingChange = !($.browser.msie || $.browser.safari); - + /** Taken from jQuery 1.5.2 for backwards compatibility */ + if ($.support.changeBubbles == undefined) { + $.support.changeBubbles = true; + + var el = document.createElement("div"); + eventName = "onchange"; + + if (el.attachEvent) { + var isSupported = (eventName in el); + if (!isSupported) { + el.setAttribute(eventName, "return;"); + isSupported = typeof el[eventName] === "function"; + } + + $.support.changeBubbles = isSupported; + } + } + /* Return true if node b is the same as, or is a descendant of, node a */ if (document.compareDocumentPosition) { var is_or_contains = function(a, b) { @@ -64,46 +78,104 @@ build_change_proxy: function(name) { var one = this.one(name, 'func'); - - var prxy = function(e) { - var el = e.target; - // If this is a keydown event, only worry about the enter key, since browsers only trigger onchange on enter or focus loss - if (e.type === 'keydown' && e.keyCode !== 13) return; - // Make sure this is event is for an input type we're interested in - if (el.tagName !== 'INPUT' && el.tagName !== 'TEXTAREA' && el.tagName !== 'SELECT') return; - - var $el = $(el), nowVal, oldVal = $el.data('changeVal'); - - // Detect changes on checkboxes & radiobuttons, which have different value logic. We don't use el.value, since el is part - // of a set, and we only want to raise onchange once for a single user action. - if (el.type == 'checkbox' || el.type == 'radio') { - if (!el.disabled && e.type === 'click') { - nowVal = el.checked; - // If radio, we get two changes - the activation, and the deactivation. We only want to fire one change though - if ((el.type === 'checkbox' || nowVal === true) && oldVal !== nowVal) e.type = 'change'; + + /* + This change bubble emulation code is taken mostly from jQuery 1.6 - unfortunately we can't easily reuse any of + it without duplication, so we'll have to re-migrate any bugfixes + */ + + // Get the value of an item. Isn't supposed to be interpretable, just stable for some value, and different + // once the value changes + var getVal = function( elem ) { + var type = elem.type, val = elem.value; + + if (type === "radio" || type === "checkbox") { + val = elem.checked; + } + else if (type === "select-multiple") { + val = ""; + if (elem.selectedIndex > -1) { + val = jQuery.map(elem.options, function(elem){ return elem.selected; }).join("-"); } } - // Detect changes on other input types. In this case value is OK. - else { - nowVal = el.value; - if (oldVal !== undefined && oldVal !== nowVal) e.type = 'change'; + else if (jQuery.nodeName(elem, "select")) { + val = elem.selectedIndex; } - - // Save the current value for next time - if (nowVal !== undefined) $el.data('changeVal', nowVal); - - // And if we decided that a change happened, do the actual triggering - if (e.type == 'change') { - while (el && el.nodeType == 1 && !e.isPropagationStopped()) { - var ret = one(el, arguments); + + return val; + }; + + // Test if a node name is a form input + var rformElems = /^(?:textarea|input|select)$/i; + + // Check if this event is a change, and bubble the change event if it is + var testChange = function(e) { + var elem = e.target, data, val; + + if (!rformElems.test(elem.nodeName) || elem.readOnly) return; + + data = jQuery.data(elem, "_entwine_change_data"); + val = getVal(elem); + + // the current data will be also retrieved by beforeactivate + if (e.type !== "focusout" || elem.type !== "radio") { + jQuery.data(elem, "_entwine_change_data", val); + } + + if (data === undefined || val === data) return; + + if (data != null || val) { + e.type = "change"; + + while (elem && elem.nodeType == 1 && !e.isPropagationStopped()) { + var ret = one(elem, arguments); if (ret !== undefined) e.result = ret; if (ret === false) { e.preventDefault(); e.stopPropagation(); } - - el = el.parentNode; + + elem = elem.parentNode; } } }; - + + // The actual proxy - responds to several events, some of which triger a change check, some + // of which just store the value for future change checks + var prxy = function(e) { + var event = e.type, elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : ""; + + switch (event) { + case 'focusout': + case 'beforedeactivate': + testChange.apply(this, arguments); + break; + + case 'click': + if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) { + testChange.apply(this, arguments); + } + break; + + // Change has to be called before submit + // Keydown will be called before keypress, which is used in submit-event delegation + case 'keydown': + if ( + (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) || + (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || + type === "select-multiple" + ) { + testChange.apply(this, arguments); + } + break; + + // Beforeactivate happens also before the previous element is blurred + // with this event you can't trigger a change event, but you can store + // information + case 'focusin': + case 'beforeactivate': + jQuery.data( elem, "_entwine_change_data", getVal(elem) ); + break; + } + } + return prxy; }, @@ -124,9 +196,9 @@ event = 'mouseout'; break; case 'onchange': - if (!$.support.bubblingChange) { + if (!$.support.changeBubbles) { proxies[name] = this.build_change_proxy(name); - event = 'click focusin focusout keydown'; + event = 'click keydown focusin focusout beforeactivate beforedeactivate'; } break; case 'onsubmit': @@ -139,8 +211,8 @@ // If none of the special handlers created a proxy, use the generic proxy if (!proxies[name]) proxies[name] = this.build_event_proxy(name); - - $(document).bind(event+'.entwine', proxies[name]); + + $(document).bind(event.replace(/(\s+|$)/g, '.entwine$1'), proxies[name]); } } }); diff --git a/thirdparty/jquery-entwine/src/jquery.entwine.js b/thirdparty/jquery-entwine/src/jquery.entwine.js index 93118e62b..98667d7ea 100644 --- a/thirdparty/jquery-entwine/src/jquery.entwine.js +++ b/thirdparty/jquery-entwine/src/jquery.entwine.js @@ -1,4 +1,9 @@ -var console; +try { + console.log; +} +catch (e) { + window.console = undefined; +} (function($) { diff --git a/thirdparty/jquery-entwine/src/jquery.entwine.properties.js b/thirdparty/jquery-entwine/src/jquery.entwine.properties.js index 03bdef831..eaffce4be 100644 --- a/thirdparty/jquery-entwine/src/jquery.entwine.properties.js +++ b/thirdparty/jquery-entwine/src/jquery.entwine.properties.js @@ -58,7 +58,7 @@ var getterName = 'get'+k; var setterName = 'set'+k; - this.bind_proxy(selector, getterName, function() { return this.entwineData(k) || v ; }); + this.bind_proxy(selector, getterName, function() { var r = this.entwineData(k); return r === undefined ? v : r; }); this.bind_proxy(selector, setterName, function(v){ return this.entwineData(k, v); }); // Get the get and set proxies we just created diff --git a/thirdparty/jquery-entwine/vendor/jquery-1.5.js b/thirdparty/jquery-entwine/vendor/jquery-1.5.2.js similarity index 89% rename from thirdparty/jquery-entwine/vendor/jquery-1.5.js rename to thirdparty/jquery-entwine/vendor/jquery-1.5.2.js index 5c99a8d4a..ae0234d2b 100644 --- a/thirdparty/jquery-entwine/vendor/jquery-1.5.js +++ b/thirdparty/jquery-entwine/vendor/jquery-1.5.2.js @@ -1,5 +1,5 @@ /*! - * jQuery JavaScript Library v1.5 + * jQuery JavaScript Library v1.5.2 * http://jquery.com/ * * Copyright 2011, John Resig @@ -11,7 +11,7 @@ * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * - * Date: Mon Jan 31 08:31:29 2011 -0500 + * Date: Thu Mar 31 15:28:23 2011 -0400 */ (function( window, undefined ) { @@ -69,15 +69,9 @@ var jQuery = function( selector, context ) { // For matching the engine and version of the browser browserMatch, - // Has the ready events already been bound? - readyBound = false, - // The deferred used on DOM ready readyList, - // Promise methods - promiseMethods = "then done fail isResolved isRejected promise".split( " " ), - // The ready event handler DOMContentLoaded, @@ -202,7 +196,7 @@ jQuery.fn = jQuery.prototype = { selector: "", // The current version of jQuery being used - jquery: "1.5", + jquery: "1.5.2", // The default length of a jQuery object is 0 length: 0, @@ -313,7 +307,7 @@ jQuery.fn = jQuery.prototype = { jQuery.fn.init.prototype = jQuery.fn; jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, + var options, name, src, copy, copyIsArray, clone, target = arguments[0] || {}, i = 1, length = arguments.length, @@ -427,11 +421,11 @@ jQuery.extend({ }, bindReady: function() { - if ( readyBound ) { + if ( readyList ) { return; } - readyBound = true; + readyList = jQuery._Deferred(); // Catch cases where $(document).ready() is called after the // browser event has already occurred. @@ -585,10 +579,8 @@ jQuery.extend({ if ( data && rnotwhite.test(data) ) { // Inspired by code by Andrea Giammarchi // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html - var head = document.getElementsByTagName("head")[0] || document.documentElement, - script = document.createElement("script"); - - script.type = "text/javascript"; + var head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement, + script = document.createElement( "script" ); if ( jQuery.support.scriptEval() ) { script.appendChild( document.createTextNode( data ) ); @@ -813,155 +805,6 @@ jQuery.extend({ return (new Date()).getTime(); }, - // Create a simple deferred (one callbacks list) - _Deferred: function() { - var // callbacks list - callbacks = [], - // stored [ context , args ] - fired, - // to avoid firing when already doing so - firing, - // flag to know if the deferred has been cancelled - cancelled, - // the deferred itself - deferred = { - - // done( f1, f2, ...) - done: function() { - if ( !cancelled ) { - var args = arguments, - i, - length, - elem, - type, - _fired; - if ( fired ) { - _fired = fired; - fired = 0; - } - for ( i = 0, length = args.length; i < length; i++ ) { - elem = args[ i ]; - type = jQuery.type( elem ); - if ( type === "array" ) { - deferred.done.apply( deferred, elem ); - } else if ( type === "function" ) { - callbacks.push( elem ); - } - } - if ( _fired ) { - deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] ); - } - } - return this; - }, - - // resolve with given context and args - resolveWith: function( context, args ) { - if ( !cancelled && !fired && !firing ) { - firing = 1; - try { - while( callbacks[ 0 ] ) { - callbacks.shift().apply( context, args ); - } - } - finally { - fired = [ context, args ]; - firing = 0; - } - } - return this; - }, - - // resolve with this as context and given arguments - resolve: function() { - deferred.resolveWith( jQuery.isFunction( this.promise ) ? this.promise() : this, arguments ); - return this; - }, - - // Has this deferred been resolved? - isResolved: function() { - return !!( firing || fired ); - }, - - // Cancel - cancel: function() { - cancelled = 1; - callbacks = []; - return this; - } - }; - - return deferred; - }, - - // Full fledged deferred (two callbacks list) - Deferred: function( func ) { - var deferred = jQuery._Deferred(), - failDeferred = jQuery._Deferred(), - promise; - // Add errorDeferred methods, then and promise - jQuery.extend( deferred, { - then: function( doneCallbacks, failCallbacks ) { - deferred.done( doneCallbacks ).fail( failCallbacks ); - return this; - }, - fail: failDeferred.done, - rejectWith: failDeferred.resolveWith, - reject: failDeferred.resolve, - isRejected: failDeferred.isResolved, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj , i /* internal */ ) { - if ( obj == null ) { - if ( promise ) { - return promise; - } - promise = obj = {}; - } - i = promiseMethods.length; - while( i-- ) { - obj[ promiseMethods[ i ] ] = deferred[ promiseMethods[ i ] ]; - } - return obj; - } - } ); - // Make sure only one callback list will be used - deferred.then( failDeferred.cancel, deferred.cancel ); - // Unexpose cancel - delete deferred.cancel; - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - return deferred; - }, - - // Deferred helper - when: function( object ) { - var args = arguments, - length = args.length, - deferred = length <= 1 && object && jQuery.isFunction( object.promise ) ? - object : - jQuery.Deferred(), - promise = deferred.promise(), - resolveArray; - - if ( length > 1 ) { - resolveArray = new Array( length ); - jQuery.each( args, function( index, element ) { - jQuery.when( element ).then( function( value ) { - resolveArray[ index ] = arguments.length > 1 ? slice.call( arguments, 0 ) : value; - if( ! --length ) { - deferred.resolveWith( promise, resolveArray ); - } - }, deferred.reject ); - } ); - } else if ( deferred !== object ) { - deferred.resolve( object ); - } - return promise; - }, - // Use of jQuery.browser is frowned upon. // More details: http://docs.jquery.com/Utilities/jQuery.browser uaMatch: function( ua ) { @@ -1000,9 +843,6 @@ jQuery.extend({ browser: {} }); -// Create readyList deferred -readyList = jQuery._Deferred(); - // Populate the class2type map jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); @@ -1071,11 +911,183 @@ function doScrollCheck() { } // Expose jQuery to the global object -return (window.jQuery = window.$ = jQuery); +return jQuery; })(); +var // Promise methods + promiseMethods = "then done fail isResolved isRejected promise".split( " " ), + // Static reference to slice + sliceDeferred = [].slice; + +jQuery.extend({ + // Create a simple deferred (one callbacks list) + _Deferred: function() { + var // callbacks list + callbacks = [], + // stored [ context , args ] + fired, + // to avoid firing when already doing so + firing, + // flag to know if the deferred has been cancelled + cancelled, + // the deferred itself + deferred = { + + // done( f1, f2, ...) + done: function() { + if ( !cancelled ) { + var args = arguments, + i, + length, + elem, + type, + _fired; + if ( fired ) { + _fired = fired; + fired = 0; + } + for ( i = 0, length = args.length; i < length; i++ ) { + elem = args[ i ]; + type = jQuery.type( elem ); + if ( type === "array" ) { + deferred.done.apply( deferred, elem ); + } else if ( type === "function" ) { + callbacks.push( elem ); + } + } + if ( _fired ) { + deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] ); + } + } + return this; + }, + + // resolve with given context and args + resolveWith: function( context, args ) { + if ( !cancelled && !fired && !firing ) { + // make sure args are available (#8421) + args = args || []; + firing = 1; + try { + while( callbacks[ 0 ] ) { + callbacks.shift().apply( context, args ); + } + } + finally { + fired = [ context, args ]; + firing = 0; + } + } + return this; + }, + + // resolve with this as context and given arguments + resolve: function() { + deferred.resolveWith( this, arguments ); + return this; + }, + + // Has this deferred been resolved? + isResolved: function() { + return !!( firing || fired ); + }, + + // Cancel + cancel: function() { + cancelled = 1; + callbacks = []; + return this; + } + }; + + return deferred; + }, + + // Full fledged deferred (two callbacks list) + Deferred: function( func ) { + var deferred = jQuery._Deferred(), + failDeferred = jQuery._Deferred(), + promise; + // Add errorDeferred methods, then and promise + jQuery.extend( deferred, { + then: function( doneCallbacks, failCallbacks ) { + deferred.done( doneCallbacks ).fail( failCallbacks ); + return this; + }, + fail: failDeferred.done, + rejectWith: failDeferred.resolveWith, + reject: failDeferred.resolve, + isRejected: failDeferred.isResolved, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + if ( obj == null ) { + if ( promise ) { + return promise; + } + promise = obj = {}; + } + var i = promiseMethods.length; + while( i-- ) { + obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ]; + } + return obj; + } + } ); + // Make sure only one callback list will be used + deferred.done( failDeferred.cancel ).fail( deferred.cancel ); + // Unexpose cancel + delete deferred.cancel; + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + return deferred; + }, + + // Deferred helper + when: function( firstParam ) { + var args = arguments, + i = 0, + length = args.length, + count = length, + deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? + firstParam : + jQuery.Deferred(); + function resolveFunc( i ) { + return function( value ) { + args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + if ( !( --count ) ) { + // Strange bug in FF4: + // Values changed onto the arguments object sometimes end up as undefined values + // outside the $.when method. Cloning the object into a fresh array solves the issue + deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) ); + } + }; + } + if ( length > 1 ) { + for( ; i < length; i++ ) { + if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) { + args[ i ].promise().then( resolveFunc(i), deferred.reject ); + } else { + --count; + } + } + if ( !count ) { + deferred.resolveWith( deferred, args ); + } + } else if ( deferred !== firstParam ) { + deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); + } + return deferred.promise(); + } +}); + + + + (function() { jQuery.support = {}; @@ -1088,7 +1100,8 @@ return (window.jQuery = window.$ = jQuery); var all = div.getElementsByTagName("*"), a = div.getElementsByTagName("a")[0], select = document.createElement("select"), - opt = select.appendChild( document.createElement("option") ); + opt = select.appendChild( document.createElement("option") ), + input = div.getElementsByTagName("input")[0]; // Can't get basic test support if ( !all || !all.length || !a ) { @@ -1127,7 +1140,7 @@ return (window.jQuery = window.$ = jQuery); // Make sure that if no value is specified for a checkbox // that it defaults to "on". // (WebKit defaults to "" instead) - checkOn: div.getElementsByTagName("input")[0].value === "on", + checkOn: input.value === "on", // Make sure that a selected-by-default option has a working selected property. // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) @@ -1137,48 +1150,50 @@ return (window.jQuery = window.$ = jQuery); deleteExpando: true, optDisabled: false, checkClone: false, - _scriptEval: null, noCloneEvent: true, + noCloneChecked: true, boxModel: null, inlineBlockNeedsLayout: false, shrinkWrapBlocks: false, - reliableHiddenOffsets: true + reliableHiddenOffsets: true, + reliableMarginRight: true }; + input.checked = true; + jQuery.support.noCloneChecked = input.cloneNode( true ).checked; + // Make sure that the options inside disabled selects aren't marked as disabled // (WebKit marks them as diabled) select.disabled = true; jQuery.support.optDisabled = !opt.disabled; + var _scriptEval = null; jQuery.support.scriptEval = function() { - if ( jQuery.support._scriptEval === null ) { + if ( _scriptEval === null ) { var root = document.documentElement, script = document.createElement("script"), id = "script" + jQuery.now(); - script.type = "text/javascript"; + // Make sure that the execution of code works by injecting a script + // tag with appendChild/createTextNode + // (IE doesn't support this, fails, and uses .text instead) try { script.appendChild( document.createTextNode( "window." + id + "=1;" ) ); } catch(e) {} root.insertBefore( script, root.firstChild ); - // Make sure that the execution of code works by injecting a script - // tag with appendChild/createTextNode - // (IE doesn't support this, fails, and uses .text instead) if ( window[ id ] ) { - jQuery.support._scriptEval = true; + _scriptEval = true; delete window[ id ]; } else { - jQuery.support._scriptEval = false; + _scriptEval = false; } root.removeChild( script ); - // release memory in IE - root = script = id = null; } - return jQuery.support._scriptEval; + return _scriptEval; }; // Test to see if it's possible to delete an expando from an element @@ -1190,7 +1205,7 @@ return (window.jQuery = window.$ = jQuery); jQuery.support.deleteExpando = false; } - if ( div.attachEvent && div.fireEvent ) { + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { div.attachEvent("onclick", function click() { // Cloning a node shouldn't copy over any // bound event handlers (IE does this) @@ -1260,6 +1275,17 @@ return (window.jQuery = window.$ = jQuery); jQuery.support.reliableHiddenOffsets = jQuery.support.reliableHiddenOffsets && tds[0].offsetHeight === 0; div.innerHTML = ""; + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. For more + // info see bug #3333 + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + if ( document.defaultView && document.defaultView.getComputedStyle ) { + div.style.width = "1px"; + div.style.marginRight = "0"; + jQuery.support.reliableMarginRight = ( parseInt(document.defaultView.getComputedStyle(div, null).marginRight, 10) || 0 ) === 0; + } + body.removeChild( div ).style.display = "none"; div = tds = null; }); @@ -1283,8 +1309,6 @@ return (window.jQuery = window.$ = jQuery); el.setAttribute(eventName, "return;"); isSupported = typeof el[eventName] === "function"; } - el = null; - return isSupported; }; @@ -1321,7 +1345,7 @@ jQuery.extend({ hasData: function( elem ) { elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; - return !!elem && !jQuery.isEmptyObject(elem); + return !!elem && !isEmptyDataObject( elem ); }, data: function( elem, name, data, pvt /* Internal Use Only */ ) { @@ -1361,11 +1385,18 @@ jQuery.extend({ if ( !cache[ id ] ) { cache[ id ] = {}; + + // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery + // metadata on plain JS objects when the object is serialized using + // JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } } // An object can be passed to jQuery.data instead of a key/value pair; this gets // shallow copied over onto the existing cache - if ( typeof name === "object" ) { + if ( typeof name === "object" || typeof name === "function" ) { if ( pvt ) { cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name); } else { @@ -1427,7 +1458,7 @@ jQuery.extend({ // If there is no data left in the cache, we want to continue // and let the cache object itself get destroyed - if ( !jQuery.isEmptyObject(thisCache) ) { + if ( !isEmptyDataObject(thisCache) ) { return; } } @@ -1439,7 +1470,7 @@ jQuery.extend({ // Don't destroy the parent cache unless the internal data object // had been the only thing left in it - if ( !jQuery.isEmptyObject(cache[ id ]) ) { + if ( !isEmptyDataObject(cache[ id ]) ) { return; } } @@ -1460,6 +1491,13 @@ jQuery.extend({ // data if it existed if ( internalCache ) { cache[ id ] = {}; + // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery + // metadata on plain JS objects when the object is serialized using + // JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + cache[ id ][ internalKey ] = internalCache; // Otherwise, we need to eliminate the expando on the node to avoid @@ -1588,6 +1626,19 @@ function dataAttr( elem, key, data ) { return data; } +// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON +// property to be considered empty objects; this property always exists in +// order to make sure JSON.stringify does not expose internal metadata +function isEmptyDataObject( obj ) { + for ( var name in obj ) { + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + @@ -1888,6 +1939,11 @@ jQuery.fn.extend({ } } + // Fixes Bug #2551 -- select.val() broken in IE after form.reset() + if ( one && !values.length && options.length ) { + return jQuery( options[ index ] ).val(); + } + return values; } @@ -2081,8 +2137,7 @@ var rnamespaces = /\.(.*)$/, rescape = /[^\w\s.|`]/g, fcleanup = function( nm ) { return nm.replace(rescape, "\\$&"); - }, - eventKey = "events"; + }; /* * A number of helper functions used for managing events. @@ -2098,17 +2153,22 @@ jQuery.event = { return; } - // For whatever reason, IE has trouble passing the window object - // around, causing it to be cloned in the process - if ( jQuery.isWindow( elem ) && ( elem !== window && !elem.frameElement ) ) { - elem = window; + // TODO :: Use a try/catch until it's safe to pull this out (likely 1.6) + // Minor release fix for bug #8018 + try { + // For whatever reason, IE has trouble passing the window object + // around, causing it to be cloned in the process + if ( jQuery.isWindow( elem ) && ( elem !== window && !elem.frameElement ) ) { + elem = window; + } } + catch ( e ) {} if ( handler === false ) { handler = returnFalse; } else if ( !handler ) { // Fixes bug #7229. Fix recommended by jdalton - return; + return; } var handleObjIn, handleObj; @@ -2132,31 +2192,18 @@ jQuery.event = { return; } - var events = elemData[ eventKey ], + var events = elemData.events, eventHandle = elemData.handle; - if ( typeof events === "function" ) { - // On plain objects events is a fn that holds the the data - // which prevents this data from being JSON serialized - // the function does not need to be called, it just contains the data - eventHandle = events.handle; - events = events.events; - - } else if ( !events ) { - if ( !elem.nodeType ) { - // On plain objects, create a fn that acts as the holder - // of the values to avoid JSON serialization of event data - elemData[ eventKey ] = elemData = function(){}; - } - + if ( !events ) { elemData.events = events = {}; } if ( !eventHandle ) { - elemData.handle = eventHandle = function() { + elemData.handle = eventHandle = function( e ) { // Handle the second event of a trigger and when // an event is called after a page has unloaded - return typeof jQuery !== "undefined" && !jQuery.event.triggered ? + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? jQuery.event.handle.apply( eventHandle.elem, arguments ) : undefined; }; @@ -2249,17 +2296,12 @@ jQuery.event = { var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, elemData = jQuery.hasData( elem ) && jQuery._data( elem ), - events = elemData && elemData[ eventKey ]; + events = elemData && elemData.events; if ( !elemData || !events ) { return; } - if ( typeof events === "function" ) { - elemData = events; - events = events.events; - } - // types is actually an event object here if ( types && types.type ) { handler = types.handler; @@ -2359,10 +2401,7 @@ jQuery.event = { delete elemData.events; delete elemData.handle; - if ( typeof elemData === "function" ) { - jQuery.removeData( elem, eventKey, true ); - - } else if ( jQuery.isEmptyObject( elemData ) ) { + if ( jQuery.isEmptyObject( elemData ) ) { jQuery.removeData( elem, undefined, true ); } } @@ -2403,7 +2442,7 @@ jQuery.event = { // points to jQuery.expando var internalKey = jQuery.expando, internalCache = this[ internalKey ]; - if ( internalCache && internalCache.events && internalCache.events[type] ) { + if ( internalCache && internalCache.events && internalCache.events[ type ] ) { jQuery.event.trigger( event, data, internalCache.handle.elem ); } }); @@ -2429,9 +2468,7 @@ jQuery.event = { event.currentTarget = elem; // Trigger the event, it is assumed that "handle" is a function - var handle = elem.nodeType ? - jQuery._data( elem, "handle" ) : - (jQuery._data( elem, eventKey ) || {}).handle; + var handle = jQuery._data( elem, "handle" ); if ( handle ) { handle.apply( elem, data ); @@ -2473,7 +2510,7 @@ jQuery.event = { target[ "on" + targetType ] = null; } - jQuery.event.triggered = true; + jQuery.event.triggered = event.type; target[ targetType ](); } @@ -2484,7 +2521,7 @@ jQuery.event = { target[ "on" + targetType ] = old; } - jQuery.event.triggered = false; + jQuery.event.triggered = undefined; } } }, @@ -2509,11 +2546,7 @@ jQuery.event = { event.namespace = event.namespace || namespace_sort.join("."); - events = jQuery._data(this, eventKey); - - if ( typeof events === "function" ) { - events = events.events; - } + events = jQuery._data(this, "events"); handlers = (events || {})[ event.type ]; @@ -2680,7 +2713,7 @@ jQuery.Event = function( src ) { // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || + this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse; // Event type @@ -2755,6 +2788,12 @@ var withinElement = function( event ) { // Firefox sometimes assigns relatedTarget a XUL element // which we cannot access the parentNode property of try { + + // Chrome does something similar, the parentNode property + // can be accessed but is null. + if ( parent && parent !== document && !parent.parentNode ) { + return; + } // Traverse up the tree while ( parent && parent !== this ) { parent = parent.parentNode; @@ -2805,8 +2844,7 @@ if ( !jQuery.support.submitBubbles ) { type = elem.type; if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { - e.liveFired = undefined; - return trigger( "submit", this, arguments ); + trigger( "submit", this, arguments ); } }); @@ -2815,8 +2853,7 @@ if ( !jQuery.support.submitBubbles ) { type = elem.type; if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { - e.liveFired = undefined; - return trigger( "submit", this, arguments ); + trigger( "submit", this, arguments ); } }); @@ -2879,7 +2916,7 @@ if ( !jQuery.support.changeBubbles ) { if ( data != null || val ) { e.type = "change"; e.liveFired = undefined; - return jQuery.event.trigger( e, arguments[1], elem ); + jQuery.event.trigger( e, arguments[1], elem ); } }; @@ -2893,7 +2930,7 @@ if ( !jQuery.support.changeBubbles ) { var elem = e.target, type = elem.type; if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) { - return testChange.call( this, e ); + testChange.call( this, e ); } }, @@ -2905,7 +2942,7 @@ if ( !jQuery.support.changeBubbles ) { if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") || (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || type === "select-multiple" ) { - return testChange.call( this, e ); + testChange.call( this, e ); } }, @@ -2944,26 +2981,50 @@ if ( !jQuery.support.changeBubbles ) { } function trigger( type, elem, args ) { - args[0].type = type; - return jQuery.event.handle.apply( elem, args ); + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + // Don't pass args or remember liveFired; they apply to the donor event. + var event = jQuery.extend( {}, args[ 0 ] ); + event.type = type; + event.originalEvent = {}; + event.liveFired = undefined; + jQuery.event.handle.call( elem, event ); + if ( event.isDefaultPrevented() ) { + args[ 0 ].preventDefault(); + } } // Create "bubbling" focus and blur events if ( document.addEventListener ) { jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0; + jQuery.event.special[ fix ] = { setup: function() { - this.addEventListener( orig, handler, true ); - }, - teardown: function() { - this.removeEventListener( orig, handler, true ); + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } } }; - function handler( e ) { - e = jQuery.event.fix( e ); + function handler( donor ) { + // Donor event is always a native one; fix it and switch its type. + // Let focusin/out handler cancel the donor focus/blur event. + var e = jQuery.event.fix( donor ); e.type = fix; - return jQuery.event.handle.call( this, e ); + e.originalEvent = {}; + jQuery.event.trigger( e, null, e.target ); + if ( e.isDefaultPrevented() ) { + donor.preventDefault(); + } } }); } @@ -3148,11 +3209,7 @@ function liveHandler( event ) { var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret, elems = [], selectors = [], - events = jQuery._data( this, eventKey ); - - if ( typeof events === "function" ) { - events = events.events; - } + events = jQuery._data( this, "events" ); // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911) if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) { @@ -3186,7 +3243,7 @@ function liveHandler( event ) { for ( j = 0; j < live.length; j++ ) { handleObj = live[j]; - if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) ) { + if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) { elem = close.elem; related = null; @@ -3269,7 +3326,9 @@ var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[ done = 0, toString = Object.prototype.toString, hasDuplicate = false, - baseHasDuplicate = true; + baseHasDuplicate = true, + rBackslash = /\\/g, + rNonWord = /\W/; // Here we check if the JavaScript engine is using some sort of // optimization where it does not always call our comparision @@ -3468,7 +3527,7 @@ Sizzle.find = function( expr, context, isXML ) { match.splice( 1, 1 ); if ( left.substr( left.length - 1 ) !== "\\" ) { - match[1] = (match[1] || "").replace(/\\/g, ""); + match[1] = (match[1] || "").replace( rBackslash, "" ); set = Expr.find[ type ]( match, context, isXML ); if ( set != null ) { @@ -3607,13 +3666,16 @@ var Expr = Sizzle.selectors = { attrHandle: { href: function( elem ) { return elem.getAttribute( "href" ); + }, + type: function( elem ) { + return elem.getAttribute( "type" ); } }, relative: { "+": function(checkSet, part){ var isPartStr = typeof part === "string", - isTag = isPartStr && !/\W/.test( part ), + isTag = isPartStr && !rNonWord.test( part ), isPartStrNotTag = isPartStr && !isTag; if ( isTag ) { @@ -3641,7 +3703,7 @@ var Expr = Sizzle.selectors = { i = 0, l = checkSet.length; - if ( isPartStr && !/\W/.test( part ) ) { + if ( isPartStr && !rNonWord.test( part ) ) { part = part.toLowerCase(); for ( ; i < l; i++ ) { @@ -3675,7 +3737,7 @@ var Expr = Sizzle.selectors = { doneName = done++, checkFn = dirCheck; - if ( typeof part === "string" && !/\W/.test(part) ) { + if ( typeof part === "string" && !rNonWord.test( part ) ) { part = part.toLowerCase(); nodeCheck = part; checkFn = dirNodeCheck; @@ -3689,7 +3751,7 @@ var Expr = Sizzle.selectors = { doneName = done++, checkFn = dirCheck; - if ( typeof part === "string" && !/\W/.test( part ) ) { + if ( typeof part === "string" && !rNonWord.test( part ) ) { part = part.toLowerCase(); nodeCheck = part; checkFn = dirNodeCheck; @@ -3732,7 +3794,7 @@ var Expr = Sizzle.selectors = { }, preFilter: { CLASS: function( match, curLoop, inplace, result, not, isXML ) { - match = " " + match[1].replace(/\\/g, "") + " "; + match = " " + match[1].replace( rBackslash, "" ) + " "; if ( isXML ) { return match; @@ -3755,11 +3817,11 @@ var Expr = Sizzle.selectors = { }, ID: function( match ) { - return match[1].replace(/\\/g, ""); + return match[1].replace( rBackslash, "" ); }, TAG: function( match, curLoop ) { - return match[1].toLowerCase(); + return match[1].replace( rBackslash, "" ).toLowerCase(); }, CHILD: function( match ) { @@ -3790,14 +3852,14 @@ var Expr = Sizzle.selectors = { }, ATTR: function( match, curLoop, inplace, result, not, isXML ) { - var name = match[1] = match[1].replace(/\\/g, ""); + var name = match[1] = match[1].replace( rBackslash, "" ); if ( !isXML && Expr.attrMap[name] ) { match[1] = Expr.attrMap[name]; } // Handle if an un-quoted value was used - match[4] = ( match[4] || match[5] || "" ).replace(/\\/g, ""); + match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); if ( match[2] === "~=" ) { match[4] = " " + match[4] + " "; @@ -3852,7 +3914,9 @@ var Expr = Sizzle.selectors = { selected: function( elem ) { // Accessing this property makes selected-by-default // options in Safari work properly - elem.parentNode.selectedIndex; + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } return elem.selected === true; }, @@ -3874,8 +3938,12 @@ var Expr = Sizzle.selectors = { }, text: function( elem ) { - return "text" === elem.type; + var attr = elem.getAttribute( "type" ), type = elem.type; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return "text" === type && ( attr === type || attr === null ); }, + radio: function( elem ) { return "radio" === elem.type; }, @@ -4407,7 +4475,8 @@ if ( document.querySelectorAll ) { // and working up from there (Thanks to Andrew Dupont for the technique) // IE 8 doesn't work on object elements } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - var old = context.getAttribute( "id" ), + var oldContext = context, + old = context.getAttribute( "id" ), nid = old || id, hasParent = context.parentNode, relativeHierarchySelector = /^\s*[+~]/.test( query ); @@ -4429,7 +4498,7 @@ if ( document.querySelectorAll ) { } catch(pseudoError) { } finally { if ( !old ) { - context.removeAttribute( "id" ); + oldContext.removeAttribute( "id" ); } } } @@ -4449,19 +4518,23 @@ if ( document.querySelectorAll ) { (function(){ var html = document.documentElement, - matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector, - pseudoWorks = false; - - try { - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( document.documentElement, "[test!='']:sizzle" ); - - } catch( pseudoError ) { - pseudoWorks = true; - } + matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; if ( matches ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9 fails this) + var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), + pseudoWorks = false; + + try { + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( document.documentElement, "[test!='']:sizzle" ); + + } catch( pseudoError ) { + pseudoWorks = true; + } + Sizzle.matchesSelector = function( node, expr ) { // Make sure that attribute selectors are quoted expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); @@ -4469,7 +4542,15 @@ if ( document.querySelectorAll ) { if ( !Sizzle.isXML( node ) ) { try { if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { - return matches.call( node, expr ); + var ret = matches.call( node, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || !disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9, so check for that + node.document && node.document.nodeType !== 11 ) { + return ret; + } } } catch(e) {} } @@ -4845,11 +4926,11 @@ jQuery.each({ }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { var ret = jQuery.map( this, fn, until ), - // The variable 'args' was introduced in - // https://github.com/jquery/jquery/commit/52a0238 - // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed. - // http://code.google.com/p/v8/issues/detail?id=1050 - args = slice.call(arguments); + // The variable 'args' was introduced in + // https://github.com/jquery/jquery/commit/52a0238 + // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed. + // http://code.google.com/p/v8/issues/detail?id=1050 + args = slice.call(arguments); if ( !runtil.test( name ) ) { selector = until; @@ -4959,7 +5040,7 @@ var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, rtbody = /", "" ], @@ -5111,7 +5192,7 @@ jQuery.fn.extend({ } if ( elem.parentNode ) { - elem.parentNode.removeChild( elem ); + elem.parentNode.removeChild( elem ); } } } @@ -5136,7 +5217,7 @@ jQuery.fn.extend({ }, clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? true : dataAndEvents; + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; return this.map( function () { @@ -5213,7 +5294,9 @@ jQuery.fn.extend({ } }); } else { - return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ); + return this.length ? + this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) : + this; } }, @@ -5305,8 +5388,8 @@ function cloneCopyEvent( src, dest ) { } var internalKey = jQuery.expando, - oldData = jQuery.data( src ), - curData = jQuery.data( dest, oldData ); + oldData = jQuery.data( src ), + curData = jQuery.data( dest, oldData ); // Switch to use the internal data object, if it exists, for the next // stage of data copying @@ -5320,7 +5403,7 @@ function cloneCopyEvent( src, dest ) { for ( var type in events ) { for ( var i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ], events[ type ][ i ].data ); + jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data ); } } } @@ -5441,6 +5524,18 @@ jQuery.each({ }; }); +function getAll( elem ) { + if ( "getElementsByTagName" in elem ) { + return elem.getElementsByTagName( "*" ); + + } else if ( "querySelectorAll" in elem ) { + return elem.querySelectorAll( "*" ); + + } else { + return []; + } +} + jQuery.extend({ clone: function( elem, dataAndEvents, deepDataAndEvents ) { var clone = elem.cloneNode(true), @@ -5448,17 +5543,20 @@ jQuery.extend({ destElements, i; - if ( !jQuery.support.noCloneEvent && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { + if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) && + (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { // IE copies events bound via attachEvent when using cloneNode. // Calling detachEvent on the clone will also remove the events // from the original. In order to get around this, we use some // proprietary methods to clear the events. Thanks to MooTools // guys for this hotness. + cloneFixAttributes( elem, clone ); + // Using Sizzle here is crazy slow, so we use getElementsByTagName // instead - srcElements = elem.getElementsByTagName("*"); - destElements = clone.getElementsByTagName("*"); + srcElements = getAll( elem ); + destElements = getAll( clone ); // Weird iteration because IE will replace the length property // with an element if you are cloning the body and one of the @@ -5466,30 +5564,25 @@ jQuery.extend({ for ( i = 0; srcElements[i]; ++i ) { cloneFixAttributes( srcElements[i], destElements[i] ); } - - cloneFixAttributes( elem, clone ); } // Copy the events from the original to the clone if ( dataAndEvents ) { - cloneCopyEvent( elem, clone ); - if ( deepDataAndEvents && "getElementsByTagName" in elem ) { + if ( deepDataAndEvents ) { + srcElements = getAll( elem ); + destElements = getAll( clone ); - srcElements = elem.getElementsByTagName("*"); - destElements = clone.getElementsByTagName("*"); - - if ( srcElements.length ) { - for ( i = 0; srcElements[i]; ++i ) { - cloneCopyEvent( srcElements[i], destElements[i] ); - } + for ( i = 0; srcElements[i]; ++i ) { + cloneCopyEvent( srcElements[i], destElements[i] ); } } } + // Return the cloned set return clone; - }, +}, clean: function( elems, context, fragment, scripts ) { context = context || document; @@ -5650,7 +5743,8 @@ function evalScript( i, elem ) { var ralpha = /alpha\([^)]*\)/i, ropacity = /opacity=([^)]*)/, rdashAlpha = /-([a-z])/ig, - rupper = /([A-Z])/g, + // fixed for IE9, see #8346 + rupper = /([A-Z]|^ms)/g, rnumpx = /^-?\d+(?:px)?$/i, rnum = /^-?\d/, @@ -5887,6 +5981,28 @@ if ( !jQuery.support.opacity ) { }; } +jQuery(function() { + // This hook cannot be added until DOM ready because the support test + // for it is not run until after DOM ready + if ( !jQuery.support.reliableMarginRight ) { + jQuery.cssHooks.marginRight = { + get: function( elem, computed ) { + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + // Work around by temporarily setting element display to inline-block + var ret; + jQuery.swap( elem, { "display": "inline-block" }, function() { + if ( computed ) { + ret = curCSS( elem, "margin-right", "marginRight" ); + } else { + ret = elem.style.marginRight; + } + }); + return ret; + } + }; + } +}); + if ( document.defaultView && document.defaultView.getComputedStyle ) { getComputedStyle = function( elem, newName, name ) { var ret, defaultView, computedStyle; @@ -5910,7 +6026,7 @@ if ( document.defaultView && document.defaultView.getComputedStyle ) { if ( document.documentElement.currentStyle ) { currentStyle = function( elem, name ) { - var left, + var left, ret = elem.currentStyle && elem.currentStyle[ name ], rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ], style = elem.style; @@ -5988,8 +6104,10 @@ var r20 = /%20/g, rbracket = /\[\]$/, rCRLF = /\r?\n/g, rhash = /#.*$/, - rheaders = /^(.*?):\s*(.*?)\r?$/mg, // IE leaves an \r character at EOL + rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i, + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|widget):$/, rnoContent = /^(?:GET|HEAD)$/, rprotocol = /^\/\//, rquery = /\?/, @@ -5997,7 +6115,11 @@ var r20 = /%20/g, rselectTextarea = /^(?:select|textarea)/i, rspacesAjax = /\s+/, rts = /([?&])_=[^&]*/, - rurl = /^(\w+:)\/\/([^\/?#:]+)(?::(\d+))?/, + rucHeaders = /(^|\-)([a-z])/g, + rucHeadersFunc = function( _, $1, $2 ) { + return $1 + $2.toUpperCase(); + }, + rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/, // Keep a copy of the old load method _load = jQuery.fn.load, @@ -6018,7 +6140,28 @@ var r20 = /%20/g, * 2) the catchall symbol "*" can be used * 3) selection will start with transport dataType and THEN go to "*" if needed */ - transports = {}; + transports = {}, + + // Document location + ajaxLocation, + + // Document location segments + ajaxLocParts; + +// #8138, IE may throw an exception when accessing +// a field from document.location if document.domain has been set +try { + ajaxLocation = document.location.href; +} catch( e ) { + // Use the href attribute of an A element + // since IE will modify it given document.location + ajaxLocation = document.createElement( "a" ); + ajaxLocation.href = ""; + ajaxLocation = ajaxLocation.href; +} + +// Segment location into parts +ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || []; // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport function addToPrefiltersOrTransports( structure ) { @@ -6057,7 +6200,7 @@ function addToPrefiltersOrTransports( structure ) { } //Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jXHR, +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR, dataType /* internal */, inspected /* internal */ ) { dataType = dataType || options.dataTypes[ 0 ]; @@ -6072,16 +6215,16 @@ function inspectPrefiltersOrTransports( structure, options, originalOptions, jXH selection; for(; i < length && ( executeOnly || !selection ); i++ ) { - selection = list[ i ]( options, originalOptions, jXHR ); + selection = list[ i ]( options, originalOptions, jqXHR ); // If we got redirected to another dataType - // we try there if not done already + // we try there if executing only and not done already if ( typeof selection === "string" ) { - if ( inspected[ selection ] ) { + if ( !executeOnly || inspected[ selection ] ) { selection = undefined; } else { options.dataTypes.unshift( selection ); selection = inspectPrefiltersOrTransports( - structure, options, originalOptions, jXHR, selection, inspected ); + structure, options, originalOptions, jqXHR, selection, inspected ); } } } @@ -6089,7 +6232,7 @@ function inspectPrefiltersOrTransports( structure, options, originalOptions, jXH // we try the catchall dataType if not done already if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) { selection = inspectPrefiltersOrTransports( - structure, options, originalOptions, jXHR, "*", inspected ); + structure, options, originalOptions, jqXHR, "*", inspected ); } // unnecessary when only executing (prefilters) // but it'll be ignored by the caller in that case @@ -6121,7 +6264,7 @@ jQuery.fn.extend({ if ( jQuery.isFunction( params ) ) { // We assume that it's the callback callback = params; - params = null; + params = undefined; // Otherwise, build a param string } else if ( typeof params === "object" ) { @@ -6139,14 +6282,14 @@ jQuery.fn.extend({ dataType: "html", data: params, // Complete callback (responseText is used internally) - complete: function( jXHR, status, responseText ) { - // Store the response as specified by the jXHR object - responseText = jXHR.responseText; + complete: function( jqXHR, status, responseText ) { + // Store the response as specified by the jqXHR object + responseText = jqXHR.responseText; // If successful, inject the HTML into all the matched elements - if ( jXHR.isResolved() ) { + if ( jqXHR.isResolved() ) { // #4825: Get the actual response in case // a dataFilter is present in ajaxSettings - jXHR.done(function( r ) { + jqXHR.done(function( r ) { responseText = r; }); // See if a selector was specified @@ -6165,7 +6308,7 @@ jQuery.fn.extend({ } if ( callback ) { - self.each( callback, [ responseText, status, jXHR ] ); + self.each( callback, [ responseText, status, jqXHR ] ); } } }); @@ -6213,7 +6356,7 @@ jQuery.each( [ "get", "post" ], function( i, method ) { if ( jQuery.isFunction( data ) ) { type = type || callback; callback = data; - data = null; + data = undefined; } return jQuery.ajax({ @@ -6229,22 +6372,39 @@ jQuery.each( [ "get", "post" ], function( i, method ) { jQuery.extend({ getScript: function( url, callback ) { - return jQuery.get( url, null, callback, "script" ); + return jQuery.get( url, undefined, callback, "script" ); }, getJSON: function( url, data, callback ) { return jQuery.get( url, data, callback, "json" ); }, - ajaxSetup: function( settings ) { - jQuery.extend( true, jQuery.ajaxSettings, settings ); - if ( settings.context ) { - jQuery.ajaxSettings.context = settings.context; + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function ( target, settings ) { + if ( !settings ) { + // Only one parameter, we extend ajaxSettings + settings = target; + target = jQuery.extend( true, jQuery.ajaxSettings, settings ); + } else { + // target was provided, we extend into it + jQuery.extend( true, target, jQuery.ajaxSettings, settings ); } + // Flatten fields we don't want deep extended + for( var field in { context: 1, url: 1 } ) { + if ( field in settings ) { + target[ field ] = settings[ field ]; + } else if( field in jQuery.ajaxSettings ) { + target[ field ] = jQuery.ajaxSettings[ field ]; + } + } + return target; }, ajaxSettings: { - url: location.href, + url: ajaxLocation, + isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ), global: true, type: "GET", contentType: "application/x-www-form-urlencoded", @@ -6259,7 +6419,6 @@ jQuery.extend({ cache: null, traditional: false, headers: {}, - crossDomain: null, */ accepts: { @@ -6306,9 +6465,8 @@ jQuery.extend({ // Main method ajax: function( url, options ) { - // If options is not an object, - // we simulate pre-1.5 signature - if ( typeof options !== "object" ) { + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { options = url; url = undefined; } @@ -6317,19 +6475,22 @@ jQuery.extend({ options = options || {}; var // Create the final options object - s = jQuery.extend( true, {}, jQuery.ajaxSettings, options ), - // Callbacks contexts - // We force the original context if it exists - // or take it from jQuery.ajaxSettings otherwise - // (plain objects used as context get extended) - callbackContext = - ( s.context = ( "context" in options ? options : jQuery.ajaxSettings ).context ) || s, - globalEventContext = callbackContext === s ? jQuery.event : jQuery( callbackContext ), + s = jQuery.ajaxSetup( {}, options ), + // Callbacks context + callbackContext = s.context || s, + // Context for global events + // It's the callbackContext if one was provided in the options + // and if it's a DOM node or a jQuery collection + globalEventContext = callbackContext !== s && + ( callbackContext.nodeType || callbackContext instanceof jQuery ) ? + jQuery( callbackContext ) : jQuery.event, // Deferreds deferred = jQuery.Deferred(), completeDeferred = jQuery._Deferred(), // Status-dependent callbacks statusCode = s.statusCode || {}, + // ifModified key + ifModifiedKey, // Headers (they are sent all at once) requestHeaders = {}, // Response headers @@ -6340,22 +6501,22 @@ jQuery.extend({ // timeout handle timeoutTimer, // Cross-domain detection vars - loc = document.location, - protocol = loc.protocol || "http:", parts, - // The jXHR state + // The jqXHR state state = 0, + // To know if global events are to be dispatched + fireGlobals, // Loop variable i, // Fake xhr - jXHR = { + jqXHR = { readyState: 0, // Caches the header setRequestHeader: function( name, value ) { - if ( state === 0 ) { - requestHeaders[ name.toLowerCase() ] = value; + if ( !state ) { + requestHeaders[ name.toLowerCase().replace( rucHeaders, rucHeadersFunc ) ] = value; } return this; }, @@ -6377,7 +6538,15 @@ jQuery.extend({ } match = responseHeaders[ key.toLowerCase() ]; } - return match || null; + return match === undefined ? null : match; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( !state ) { + s.mimeType = type; + } + return this; }, // Cancel the request @@ -6394,7 +6563,7 @@ jQuery.extend({ // Callback for when everything is done // It is defined here because jslint complains if it is declared // at the end of the function (which would be more logical and readable) - function done( status, statusText, responses, headers) { + function done( status, statusText, responses, headers ) { // Called once if ( state === 2 ) { @@ -6410,19 +6579,19 @@ jQuery.extend({ } // Dereference transport for early garbage collection - // (no matter how long the jXHR object will be used) + // (no matter how long the jqXHR object will be used) transport = undefined; // Cache response headers responseHeadersString = headers || ""; // Set readyState - jXHR.readyState = status ? 4 : 0; + jqXHR.readyState = status ? 4 : 0; var isSuccess, success, error, - response = responses ? ajaxHandleResponses( s, jXHR, responses ) : undefined, + response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined, lastModified, etag; @@ -6432,11 +6601,11 @@ jQuery.extend({ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. if ( s.ifModified ) { - if ( ( lastModified = jXHR.getResponseHeader( "Last-Modified" ) ) ) { - jQuery.lastModified[ s.url ] = lastModified; + if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) { + jQuery.lastModified[ ifModifiedKey ] = lastModified; } - if ( ( etag = jXHR.getResponseHeader( "Etag" ) ) ) { - jQuery.etag[ s.url ] = etag; + if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) { + jQuery.etag[ ifModifiedKey ] = etag; } } @@ -6463,7 +6632,7 @@ jQuery.extend({ // We extract error from statusText // then normalize statusText and status for non-aborts error = statusText; - if( status ) { + if( !statusText || status ) { statusText = "error"; if ( status < 0 ) { status = 0; @@ -6472,30 +6641,30 @@ jQuery.extend({ } // Set data for the fake xhr object - jXHR.status = status; - jXHR.statusText = statusText; + jqXHR.status = status; + jqXHR.statusText = statusText; // Success/Error if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jXHR ] ); + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); } else { - deferred.rejectWith( callbackContext, [ jXHR, statusText, error ] ); + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); } // Status-dependent callbacks - jXHR.statusCode( statusCode ); + jqXHR.statusCode( statusCode ); statusCode = undefined; - if ( s.global ) { + if ( fireGlobals ) { globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ), - [ jXHR, s, isSuccess ? success : error ] ); + [ jqXHR, s, isSuccess ? success : error ] ); } // Complete - completeDeferred.resolveWith( callbackContext, [ jXHR, statusText ] ); + completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] ); - if ( s.global ) { - globalEventContext.trigger( "ajaxComplete", [ jXHR, s] ); + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s] ); // Handle the global AJAX counter if ( !( --jQuery.active ) ) { jQuery.event.trigger( "ajaxStop" ); @@ -6504,13 +6673,13 @@ jQuery.extend({ } // Attach deferreds - deferred.promise( jXHR ); - jXHR.success = jXHR.done; - jXHR.error = jXHR.fail; - jXHR.complete = completeDeferred.done; + deferred.promise( jqXHR ); + jqXHR.success = jqXHR.done; + jqXHR.error = jqXHR.fail; + jqXHR.complete = completeDeferred.done; // Status-dependent callbacks - jXHR.statusCode = function( map ) { + jqXHR.statusCode = function( map ) { if ( map ) { var tmp; if ( state < 2 ) { @@ -6518,8 +6687,8 @@ jQuery.extend({ statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ]; } } else { - tmp = map[ jXHR.status ]; - jXHR.then( tmp, tmp ); + tmp = map[ jqXHR.status ]; + jqXHR.then( tmp, tmp ); } } return this; @@ -6528,18 +6697,18 @@ jQuery.extend({ // Remove hash character (#7531: and string promotion) // Add protocol if not provided (#5866: IE7 issue with protocol-less urls) // We also use the url parameter if available - s.url = ( "" + ( url || s.url ) ).replace( rhash, "" ).replace( rprotocol, protocol + "//" ); + s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" ); // Extract dataTypes list s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax ); // Determine if a cross-domain request is in order - if ( !s.crossDomain ) { + if ( s.crossDomain == null ) { parts = rurl.exec( s.url.toLowerCase() ); s.crossDomain = !!( parts && - ( parts[ 1 ] != protocol || parts[ 2 ] != loc.hostname || + ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] || ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) != - ( loc.port || ( protocol === "http:" ? 80 : 443 ) ) ) + ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) ) ); } @@ -6549,7 +6718,15 @@ jQuery.extend({ } // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jXHR ); + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefiler, stop there + if ( state === 2 ) { + return false; + } + + // We can fire global events as of now if asked to + fireGlobals = s.global; // Uppercase the type s.type = s.type.toUpperCase(); @@ -6558,7 +6735,7 @@ jQuery.extend({ s.hasContent = !rnoContent.test( s.type ); // Watch for a new set of requests - if ( s.global && jQuery.active++ === 0 ) { + if ( fireGlobals && jQuery.active++ === 0 ) { jQuery.event.trigger( "ajaxStart" ); } @@ -6570,6 +6747,9 @@ jQuery.extend({ s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data; } + // Get ifModifiedKey before adding the anti-cache parameter + ifModifiedKey = s.url; + // Add anti-cache in url if needed if ( s.cache === false ) { @@ -6584,77 +6764,77 @@ jQuery.extend({ // Set the correct header, if data is being sent if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - requestHeaders[ "content-type" ] = s.contentType; + requestHeaders[ "Content-Type" ] = s.contentType; } // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. if ( s.ifModified ) { - if ( jQuery.lastModified[ s.url ] ) { - requestHeaders[ "if-modified-since" ] = jQuery.lastModified[ s.url ]; + ifModifiedKey = ifModifiedKey || s.url; + if ( jQuery.lastModified[ ifModifiedKey ] ) { + requestHeaders[ "If-Modified-Since" ] = jQuery.lastModified[ ifModifiedKey ]; } - if ( jQuery.etag[ s.url ] ) { - requestHeaders[ "if-none-match" ] = jQuery.etag[ s.url ]; + if ( jQuery.etag[ ifModifiedKey ] ) { + requestHeaders[ "If-None-Match" ] = jQuery.etag[ ifModifiedKey ]; } } // Set the Accepts header for the server, depending on the dataType - requestHeaders.accept = s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ? + requestHeaders.Accept = s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ? s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", */*; q=0.01" : "" ) : s.accepts[ "*" ]; // Check for headers option for ( i in s.headers ) { - requestHeaders[ i.toLowerCase() ] = s.headers[ i ]; + jqXHR.setRequestHeader( i, s.headers[ i ] ); } // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jXHR, s ) === false || state === 2 ) ) { + if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) { // Abort if not done already - done( 0, "abort" ); - // Return false - jXHR = false; + jqXHR.abort(); + return false; + } + + // Install callbacks on deferreds + for ( i in { success: 1, error: 1, complete: 1 } ) { + jqXHR[ i ]( s[ i ] ); + } + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); } else { - - // Install callbacks on deferreds - for ( i in { success: 1, error: 1, complete: 1 } ) { - jXHR[ i ]( s[ i ] ); + jqXHR.readyState = 1; + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = setTimeout( function(){ + jqXHR.abort( "timeout" ); + }, s.timeout ); } - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - // Set state as sending - state = jXHR.readyState = 1; - // Send global event - if ( s.global ) { - globalEventContext.trigger( "ajaxSend", [ jXHR, s ] ); - } - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = setTimeout( function(){ - jXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - transport.send( requestHeaders, done ); - } catch (e) { - // Propagate exception as error if not done - if ( status < 2 ) { - done( -1, e ); - // Simply rethrow otherwise - } else { - jQuery.error( e ); - } + try { + state = 1; + transport.send( requestHeaders, done ); + } catch (e) { + // Propagate exception as error if not done + if ( status < 2 ) { + done( -1, e ); + // Simply rethrow otherwise + } else { + jQuery.error( e ); } } } - return jXHR; + + return jqXHR; }, // Serialize an array of form elements or a set of @@ -6673,7 +6853,7 @@ jQuery.extend({ } // If an array was passed in, assume that it is an array of form elements. - if ( jQuery.isArray( a ) || a.jquery ) { + if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { // Serialize the form elements jQuery.each( a, function() { add( this.name, this.value ); @@ -6720,9 +6900,9 @@ function buildParams( prefix, obj, traditional, add ) { // Serialize object item. } else { - jQuery.each( obj, function( k, v ) { - buildParams( prefix + "[" + k + "]", v, traditional, add ); - }); + for ( var name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } } } else { @@ -6749,7 +6929,7 @@ jQuery.extend({ * - finds the right dataType (mediates between content-type and expected dataType) * - returns the corresponding response */ -function ajaxHandleResponses( s, jXHR, responses ) { +function ajaxHandleResponses( s, jqXHR, responses ) { var contents = s.contents, dataTypes = s.dataTypes, @@ -6762,7 +6942,7 @@ function ajaxHandleResponses( s, jXHR, responses ) { // Fill responseXXX fields for( type in responseFields ) { if ( type in responses ) { - jXHR[ responseFields[type] ] = responses[ type ]; + jqXHR[ responseFields[type] ] = responses[ type ]; } } @@ -6770,7 +6950,7 @@ function ajaxHandleResponses( s, jXHR, responses ) { while( dataTypes[ 0 ] === "*" ) { dataTypes.shift(); if ( ct === undefined ) { - ct = jXHR.getResponseHeader( "content-type" ); + ct = s.mimeType || jqXHR.getResponseHeader( "content-type" ); } } @@ -6822,8 +7002,9 @@ function ajaxConvert( s, response ) { } var dataTypes = s.dataTypes, - converters = s.converters, + converters = {}, i, + key, length = dataTypes.length, tmp, // Current and previous dataTypes @@ -6840,6 +7021,16 @@ function ajaxConvert( s, response ) { // For each dataType in the chain for( i = 1; i < length; i++ ) { + // Create converters map + // with lowercased keys + if ( i === 1 ) { + for( key in s.converters ) { + if( typeof key === "string" ) { + converters[ key.toLowerCase() ] = s.converters[ key ]; + } + } + } + // Get the dataTypes prev = current; current = dataTypes[ i ]; @@ -6891,7 +7082,7 @@ function ajaxConvert( s, response ) { var jsc = jQuery.now(), - jsre = /(\=)\?(&|$)|()\?\?()/i; + jsre = /(\=)\?(&|$)|\?\?/i; // Default jsonp settings jQuery.ajaxSetup({ @@ -6902,9 +7093,9 @@ jQuery.ajaxSetup({ }); // Detect, normalize options and install callbacks for jsonp requests -jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, dataIsString /* internal */ ) { +jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { - dataIsString = ( typeof s.data === "string" ); + var dataIsString = ( typeof s.data === "string" ); if ( s.dataTypes[ 0 ] === "jsonp" || originalSettings.jsonpCallback || @@ -6918,7 +7109,15 @@ jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, dataIsString previous = window[ jsonpCallback ], url = s.url, data = s.data, - replace = "$1" + jsonpCallback + "$2"; + replace = "$1" + jsonpCallback + "$2", + cleanUp = function() { + // Set callback back to previous value + window[ jsonpCallback ] = previous; + // Call if it was a function and we have a response + if ( responseContainer && jQuery.isFunction( previous ) ) { + window[ jsonpCallback ]( responseContainer[ 0 ] ); + } + }; if ( s.jsonp !== false ) { url = url.replace( jsre, replace ); @@ -6936,32 +7135,17 @@ jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, dataIsString s.url = url; s.data = data; + // Install callback window[ jsonpCallback ] = function( response ) { responseContainer = [ response ]; }; - s.complete = [ function() { - - // Set callback back to previous value - window[ jsonpCallback ] = previous; - - // Call if it was a function and we have a response - if ( previous) { - if ( responseContainer && jQuery.isFunction( previous ) ) { - window[ jsonpCallback ] ( responseContainer[ 0 ] ); - } - } else { - // else, more memory leak avoidance - try{ - delete window[ jsonpCallback ]; - } catch( e ) {} - } - - }, s.complete ]; + // Install cleanUp function + jqXHR.then( cleanUp, cleanUp ); // Use data converter to retrieve json after script execution s.converters["script json"] = function() { - if ( ! responseContainer ) { + if ( !responseContainer ) { jQuery.error( jsonpCallback + " was not called" ); } return responseContainer[ 0 ]; @@ -6981,10 +7165,10 @@ jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, dataIsString // Install script dataType jQuery.ajaxSetup({ accepts: { - script: "text/javascript, application/javascript" + script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" }, contents: { - script: /javascript/ + script: /javascript|ecmascript/ }, converters: { "text script": function( text ) { @@ -7012,7 +7196,7 @@ jQuery.ajaxTransport( "script", function(s) { if ( s.crossDomain ) { var script, - head = document.getElementsByTagName( "head" )[ 0 ] || document.documentElement; + head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement; return { @@ -7067,18 +7251,36 @@ jQuery.ajaxTransport( "script", function(s) { -var // Next active xhr id +var // #5280: next active xhr id and list of active xhrs' callbacks xhrId = jQuery.now(), - - // active xhrs - xhrs = {}, - - // #5280: see below - xhrUnloadAbortInstalled, + xhrCallbacks, // XHR used to determine supports properties testXHR; +// #5280: Internet Explorer will keep connections alive if we don't abort on unload +function xhrOnUnloadAbort() { + jQuery( window ).unload(function() { + // Abort all pending requests + for ( var key in xhrCallbacks ) { + xhrCallbacks[ key ]( 0, 1 ); + } + }); +} + +// Functions to create xhrs +function createStandardXHR() { + try { + return new window.XMLHttpRequest(); + } catch( e ) {} +} + +function createActiveXHR() { + try { + return new window.ActiveXObject( "Microsoft.XMLHTTP" ); + } catch( e ) {} +} + // Create the request object // (This is still attached to ajaxSettings for backward compatibility) jQuery.ajaxSettings.xhr = window.ActiveXObject ? @@ -7089,27 +7291,13 @@ jQuery.ajaxSettings.xhr = window.ActiveXObject ? * we need a fallback. */ function() { - if ( window.location.protocol !== "file:" ) { - try { - return new window.XMLHttpRequest(); - } catch( xhrError ) {} - } - - try { - return new window.ActiveXObject("Microsoft.XMLHTTP"); - } catch( activeError ) {} + return !this.isLocal && createStandardXHR() || createActiveXHR(); } : // For all other browsers, use the standard XMLHttpRequest object - function() { - return new window.XMLHttpRequest(); - }; + createStandardXHR; // Test if we can create an xhr object -try { - testXHR = jQuery.ajaxSettings.xhr(); -} catch( xhrCreationException ) {} - -//Does this browser support XHR requests? +testXHR = jQuery.ajaxSettings.xhr(); jQuery.support.ajax = !!testXHR; // Does this browser support crossDomain XHR requests @@ -7130,26 +7318,10 @@ if ( jQuery.support.ajax ) { return { send: function( headers, complete ) { - // #5280: we need to abort on unload or IE will keep connections alive - if ( !xhrUnloadAbortInstalled ) { - - xhrUnloadAbortInstalled = 1; - - jQuery(window).bind( "unload", function() { - - // Abort all pending requests - jQuery.each( xhrs, function( _, xhr ) { - if ( xhr.onreadystatechange ) { - xhr.onreadystatechange( 1 ); - } - } ); - - } ); - } - // Get a new xhr var xhr = s.xhr(), - handle; + handle, + i; // Open the socket // Passing null username, generates a login popup on Opera (#2865) @@ -7159,19 +7331,32 @@ if ( jQuery.support.ajax ) { xhr.open( s.type, s.url, s.async ); } - // Requested-With header - // Not set for crossDomain requests with no content - // (see why at http://trac.dojotoolkit.org/ticket/9486) - // Won't change header if already provided - if ( !( s.crossDomain && !s.hasContent ) && !headers["x-requested-with"] ) { - headers[ "x-requested-with" ] = "XMLHttpRequest"; + // Apply custom fields if provided + if ( s.xhrFields ) { + for ( i in s.xhrFields ) { + xhr[ i ] = s.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( s.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( s.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !s.crossDomain && !headers["X-Requested-With"] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; } // Need an extra try/catch for cross domain requests in Firefox 3 try { - jQuery.each( headers, function( key, value ) { - xhr.setRequestHeader( key, value ); - } ); + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } } catch( _ ) {} // Do send the request @@ -7182,74 +7367,78 @@ if ( jQuery.support.ajax ) { // Listener callback = function( _, isAbort ) { - // Was never called and is aborted or complete - if ( callback && ( isAbort || xhr.readyState === 4 ) ) { + var status, + statusText, + responseHeaders, + responses, + xml; - // Only called once - callback = 0; + // Firefox throws exceptions when accessing properties + // of an xhr when a network error occured + // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE) + try { - // Do not keep as active anymore - if ( handle ) { - xhr.onreadystatechange = jQuery.noop; - delete xhrs[ handle ]; - } + // Was never called and is aborted or complete + if ( callback && ( isAbort || xhr.readyState === 4 ) ) { - // If it's an abort - if ( isAbort ) { - // Abort it manually if needed - if ( xhr.readyState !== 4 ) { - xhr.abort(); + // Only called once + callback = undefined; + + // Do not keep as active anymore + if ( handle ) { + xhr.onreadystatechange = jQuery.noop; + delete xhrCallbacks[ handle ]; } - } else { - // Get info - var status = xhr.status, - statusText, - responseHeaders = xhr.getAllResponseHeaders(), - responses = {}, + + // If it's an abort + if ( isAbort ) { + // Abort it manually if needed + if ( xhr.readyState !== 4 ) { + xhr.abort(); + } + } else { + status = xhr.status; + responseHeaders = xhr.getAllResponseHeaders(); + responses = {}; xml = xhr.responseXML; - // Construct response list - if ( xml && xml.documentElement /* #4958 */ ) { - responses.xml = xml; + // Construct response list + if ( xml && xml.documentElement /* #4958 */ ) { + responses.xml = xml; + } + responses.text = xhr.responseText; + + // Firefox throws an exception when accessing + // statusText for faulty cross-domain requests + try { + statusText = xhr.statusText; + } catch( e ) { + // We normalize with Webkit giving an empty statusText + statusText = ""; + } + + // Filter status for non standard behaviors + + // If the request is local and we have data: assume a success + // (success with no data won't get notified, that's the best we + // can do given current implementations) + if ( !status && s.isLocal && !s.crossDomain ) { + status = responses.text ? 200 : 404; + // IE - #1450: sometimes returns 1223 when it should be 204 + } else if ( status === 1223 ) { + status = 204; + } } - responses.text = xhr.responseText; - - // Firefox throws an exception when accessing - // statusText for faulty cross-domain requests - try { - statusText = xhr.statusText; - } catch( e ) { - // We normalize with Webkit giving an empty statusText - statusText = ""; - } - - // Filter status for non standard behaviours - status = - // Opera returns 0 when it should be 304 - // Webkit returns 0 for failing cross-domain no matter the real status - status === 0 ? - ( - // Webkit, Firefox: filter out faulty cross-domain requests - !s.crossDomain || statusText ? - ( - // Opera: filter out real aborts #6060 - responseHeaders ? - 304 : - 0 - ) : - // We assume 302 but could be anything cross-domain related - 302 - ) : - ( - // IE sometimes returns 1223 when it should be 204 (see #1450) - status == 1223 ? - 204 : - status - ); - - // Call complete - complete( status, statusText, responses, responseHeaders ); } + } catch( firefoxAccessException ) { + if ( !isAbort ) { + complete( -1, firefoxAccessException ); + } + } + + // Call complete if needed + if ( responses ) { + complete( status, statusText, responses, responseHeaders ); } }; @@ -7259,10 +7448,15 @@ if ( jQuery.support.ajax ) { if ( !s.async || xhr.readyState === 4 ) { callback(); } else { - // Add to list of active xhrs + // Create the active xhrs callbacks list if needed + // and attach the unload handler + if ( !xhrCallbacks ) { + xhrCallbacks = {}; + xhrOnUnloadAbort(); + } + // Add to list of active xhrs callbacks handle = xhrId++; - xhrs[ handle ] = xhr; - xhr.onreadystatechange = callback; + xhr.onreadystatechange = xhrCallbacks[ handle ] = callback; } }, @@ -7464,11 +7658,11 @@ jQuery.fn.extend({ } else { var parts = rfxnum.exec(val), - start = e.cur() || 0; + start = e.cur(); if ( parts ) { var end = parseFloat( parts[2] ), - unit = parts[3] || "px"; + unit = parts[3] || ( jQuery.cssNumber[ name ] ? "" : "px" ); // We need to compute starting value if ( unit !== "px" ) { @@ -7615,8 +7809,12 @@ jQuery.fx.prototype = { return this.elem[ this.prop ]; } - var r = parseFloat( jQuery.css( this.elem, this.prop ) ); - return r || 0; + var parsed, + r = jQuery.css( this.elem, this.prop ); + // Empty strings, null, undefined and "auto" are converted to 0, + // complex values such as "rotate(1rad)" are returned as is, + // simple values such as "10px" are parsed to Float. + return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed; }, // Start an animation from one number to another @@ -7627,7 +7825,7 @@ jQuery.fx.prototype = { this.startTime = jQuery.now(); this.start = from; this.end = to; - this.unit = unit || this.unit || "px"; + this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" ); this.now = this.start; this.pos = this.state = 0; @@ -7840,8 +8038,8 @@ if ( "getBoundingClientRect" in document.documentElement ) { win = getWindow(doc), clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0, - scrollTop = (win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop ), - scrollLeft = (win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft), + scrollTop = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop, + scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft, top = box.top + scrollTop - clientTop, left = box.left + scrollLeft - clientLeft; @@ -7954,7 +8152,6 @@ jQuery.offset = { this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop); body.removeChild( container ); - body = container = innerDiv = checkDiv = table = td = null; jQuery.offset.initialize = jQuery.noop; }, @@ -7984,10 +8181,10 @@ jQuery.offset = { curOffset = curElem.offset(), curCSSTop = jQuery.css( elem, "top" ), curCSSLeft = jQuery.css( elem, "left" ), - calculatePosition = (position === "absolute" && jQuery.inArray('auto', [curCSSTop, curCSSLeft]) > -1), + calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray('auto', [curCSSTop, curCSSLeft]) > -1, props = {}, curPosition = {}, curTop, curLeft; - // need to be able to calculate position if either top or left is auto and position is absolute + // need to be able to calculate position if either top or left is auto and position is either absolute or fixed if ( calculatePosition ) { curPosition = curElem.position(); } @@ -8078,7 +8275,7 @@ jQuery.each( ["Left", "Top"], function( i, name ) { if ( win ) { win.scrollTo( !i ? val : jQuery(win).scrollLeft(), - i ? val : jQuery(win).scrollTop() + i ? val : jQuery(win).scrollTop() ); } else { @@ -8173,4 +8370,5 @@ jQuery.each([ "Height", "Width" ], function( i, name ) { }); +window.jQuery = window.$ = jQuery; })(window); diff --git a/thirdparty/jquery-entwine/vendor/jquery-1.6.js b/thirdparty/jquery-entwine/vendor/jquery-1.6.js new file mode 100644 index 000000000..9a13ab960 --- /dev/null +++ b/thirdparty/jquery-entwine/vendor/jquery-1.6.js @@ -0,0 +1,8865 @@ +/*! + * jQuery JavaScript Library v1.6 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Mon May 2 13:50:00 2011 -0400 + */ +(function( window, undefined ) { + +// Use the correct document accordingly with window argument (sandbox) +var document = window.document, + navigator = window.navigator, + location = window.location; +var jQuery = (function() { + +// Define a local copy of jQuery +var jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // A central reference to the root jQuery(document) + rootjQuery, + + // A simple way to check for HTML strings or ID strings + // (both of which we optimize for) + quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, + + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, + + // Used for trimming whitespace + trimLeft = /^\s+/, + trimRight = /\s+$/, + + // Check for digits + rdigit = /\d/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, + rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + + // Useragent RegExp + rwebkit = /(webkit)[ \/]([\w.]+)/, + ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, + rmsie = /(msie) ([\w.]+)/, + rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, + + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, + + // The deferred used on DOM ready + readyList, + + // The ready event handler + DOMContentLoaded, + + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + trim = String.prototype.trim, + indexOf = Array.prototype.indexOf, + + // [[Class]] -> type pairs + class2type = {}; + +jQuery.fn = jQuery.prototype = { + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), or $(undefined) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // The body element only exists once, optimize finding it + if ( selector === "body" && !context && document.body ) { + this.context = document; + this[0] = document.body; + this.selector = selector; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = quickExpr.exec( selector ); + } + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + doc = (context ? context.ownerDocument || context : document); + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + ret = rsingleTag.exec( selector ); + + if ( ret ) { + if ( jQuery.isPlainObject( context ) ) { + selector = [ document.createElement( ret[1] ) ]; + jQuery.fn.attr.call( selector, context, true ); + + } else { + selector = [ doc.createElement( ret[1] ) ]; + } + + } else { + ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); + selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes; + } + + return jQuery.merge( this, selector ); + + // HANDLE: $("#id") + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return (context || rootjQuery).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if (selector.selector !== undefined) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.6", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return slice.call( this, 0 ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = this.constructor(); + + if ( jQuery.isArray( elems ) ) { + push.apply( ret, elems ); + + } else { + jQuery.merge( ret, elems ); + } + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + (this.selector ? " " : "") + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Attach the listeners + jQuery.bindReady(); + + // Add the callback + readyList.done( fn ); + + return this; + }, + + eq: function( i ) { + return i === -1 ? + this.slice( i ) : + this.slice( i, +i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ), + "slice", slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + // Either a released hold or an DOMready/load event and not yet ready + if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 1 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger( "ready" ).unbind( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyList ) { + return; + } + + readyList = jQuery._Deferred(); + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + return setTimeout( jQuery.ready, 1 ); + } + + // Mozilla, Opera and webkit nightlies currently support this event + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", DOMContentLoaded ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; + + try { + toplevel = window.frameElement == null; + } catch(e) {} + + if ( document.documentElement.doScroll && toplevel ) { + doScrollCheck(); + } + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + // A crude way of determining if an object is a window + isWindow: function( obj ) { + return obj && typeof obj === "object" && "setInterval" in obj; + }, + + isNaN: function( obj ) { + return obj == null || !rdigit.test( obj ) || isNaN( obj ); + }, + + type: function( obj ) { + return obj == null ? + String( obj ) : + class2type[ toString.call(obj) ] || "object"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw msg; + }, + + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Attempt to parse using the native JSON parser first + if ( window.JSON && window.JSON.parse ) { + return window.JSON.parse( data ); + } + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test( data.replace( rvalidescape, "@" ) + .replace( rvalidtokens, "]" ) + .replace( rvalidbraces, "")) ) { + + return (new Function( "return " + data ))(); + + } + jQuery.error( "Invalid JSON: " + data ); + }, + + // Cross-browser xml parsing + // (xml & tmp used internally) + parseXML: function( data , xml , tmp ) { + + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + + tmp = xml.documentElement; + + if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) { + jQuery.error( "Invalid XML: " + data ); + } + + return xml; + }, + + noop: function() {}, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && rnotwhite.test( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction( object ); + + if ( args ) { + if ( isObj ) { + for ( name in object ) { + if ( callback.apply( object[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( object[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in object ) { + if ( callback.call( object[ name ], name, object[ name ] ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { + break; + } + } + } + } + + return object; + }, + + // Use native String.trim function wherever possible + trim: trim ? + function( text ) { + return text == null ? + "" : + trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); + }, + + // results is for internal usage only + makeArray: function( array, results ) { + var ret = results || []; + + if ( array != null ) { + // The window, strings (and functions) also have 'length' + // The extra typeof function check is to prevent crashes + // in Safari 2 (See: #3039) + // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 + var type = jQuery.type( array ); + + if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { + push.call( ret, array ); + } else { + jQuery.merge( ret, array ); + } + } + + return ret; + }, + + inArray: function( elem, array ) { + + if ( indexOf ) { + return indexOf.call( array, elem ); + } + + for ( var i = 0, length = array.length; i < length; i++ ) { + if ( array[ i ] === elem ) { + return i; + } + } + + return -1; + }, + + merge: function( first, second ) { + var i = first.length, + j = 0; + + if ( typeof second.length === "number" ) { + for ( var l = second.length; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var ret = [], retVal; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, key, ret = [], + i = 0, + length = elems.length, + // jquery objects are treated as arrays + isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; + + // Go through the array, translating each of the items to their + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Go through every key on the object, + } else { + for ( key in elems ) { + value = callback( elems[ key ], key, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + } + + // Flatten any nested arrays + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + if ( typeof context === "string" ) { + var tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + var args = slice.call( arguments, 2 ), + proxy = function() { + return fn.apply( context, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + + return proxy; + }, + + // Mutifunctional method to get and set values to a collection + // The value/s can be optionally by executed if its a function + access: function( elems, key, value, exec, fn, pass ) { + var length = elems.length; + + // Setting many attributes + if ( typeof key === "object" ) { + for ( var k in key ) { + jQuery.access( elems, k, key[k], exec, fn, value ); + } + return elems; + } + + // Setting one attribute + if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = !pass && exec && jQuery.isFunction(value); + + for ( var i = 0; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + + return elems; + } + + // Getting an attribute + return length ? fn( elems[0], key ) : undefined; + }, + + now: function() { + return (new Date()).getTime(); + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = rwebkit.exec( ua ) || + ropera.exec( ua ) || + rmsie.exec( ua ) || + ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }, + + sub: function() { + function jQuerySub( selector, context ) { + return new jQuerySub.fn.init( selector, context ); + } + jQuery.extend( true, jQuerySub, this ); + jQuerySub.superclass = this; + jQuerySub.fn = jQuerySub.prototype = this(); + jQuerySub.fn.constructor = jQuerySub; + jQuerySub.sub = this.sub; + jQuerySub.fn.init = function init( selector, context ) { + if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { + context = jQuerySub( context ); + } + + return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); + }; + jQuerySub.fn.init.prototype = jQuerySub.fn; + var rootjQuerySub = jQuerySub(document); + return jQuerySub; + }, + + browser: {} +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +browserMatch = jQuery.uaMatch( userAgent ); +if ( browserMatch.browser ) { + jQuery.browser[ browserMatch.browser ] = true; + jQuery.browser.version = browserMatch.version; +} + +// Deprecated, use jQuery.browser.webkit instead +if ( jQuery.browser.webkit ) { + jQuery.browser.safari = true; +} + +// IE doesn't match non-breaking spaces with \s +if ( rnotwhite.test( "\xA0" ) ) { + trimLeft = /^[\s\xA0]+/; + trimRight = /[\s\xA0]+$/; +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); + +// Cleanup functions for the document ready method +if ( document.addEventListener ) { + DOMContentLoaded = function() { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + }; + +} else if ( document.attachEvent ) { + DOMContentLoaded = function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }; +} + +// The DOM ready check for Internet Explorer +function doScrollCheck() { + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch(e) { + setTimeout( doScrollCheck, 1 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); +} + +// Expose jQuery to the global object +return jQuery; + +})(); + + +var // Promise methods + promiseMethods = "done fail isResolved isRejected promise then always pipe".split( " " ), + // Static reference to slice + sliceDeferred = [].slice; + +jQuery.extend({ + // Create a simple deferred (one callbacks list) + _Deferred: function() { + var // callbacks list + callbacks = [], + // stored [ context , args ] + fired, + // to avoid firing when already doing so + firing, + // flag to know if the deferred has been cancelled + cancelled, + // the deferred itself + deferred = { + + // done( f1, f2, ...) + done: function() { + if ( !cancelled ) { + var args = arguments, + i, + length, + elem, + type, + _fired; + if ( fired ) { + _fired = fired; + fired = 0; + } + for ( i = 0, length = args.length; i < length; i++ ) { + elem = args[ i ]; + type = jQuery.type( elem ); + if ( type === "array" ) { + deferred.done.apply( deferred, elem ); + } else if ( type === "function" ) { + callbacks.push( elem ); + } + } + if ( _fired ) { + deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] ); + } + } + return this; + }, + + // resolve with given context and args + resolveWith: function( context, args ) { + if ( !cancelled && !fired && !firing ) { + // make sure args are available (#8421) + args = args || []; + firing = 1; + try { + while( callbacks[ 0 ] ) { + callbacks.shift().apply( context, args ); + } + } + finally { + fired = [ context, args ]; + firing = 0; + } + } + return this; + }, + + // resolve with this as context and given arguments + resolve: function() { + deferred.resolveWith( this, arguments ); + return this; + }, + + // Has this deferred been resolved? + isResolved: function() { + return !!( firing || fired ); + }, + + // Cancel + cancel: function() { + cancelled = 1; + callbacks = []; + return this; + } + }; + + return deferred; + }, + + // Full fledged deferred (two callbacks list) + Deferred: function( func ) { + var deferred = jQuery._Deferred(), + failDeferred = jQuery._Deferred(), + promise; + // Add errorDeferred methods, then and promise + jQuery.extend( deferred, { + then: function( doneCallbacks, failCallbacks ) { + deferred.done( doneCallbacks ).fail( failCallbacks ); + return this; + }, + always: function() { + return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments ); + }, + fail: failDeferred.done, + rejectWith: failDeferred.resolveWith, + reject: failDeferred.resolve, + isRejected: failDeferred.isResolved, + pipe: function( fnDone, fnFail ) { + return jQuery.Deferred(function( newDefer ) { + jQuery.each( { + done: [ fnDone, "resolve" ], + fail: [ fnFail, "reject" ] + }, function( handler, data ) { + var fn = data[ 0 ], + action = data[ 1 ], + returned; + if ( jQuery.isFunction( fn ) ) { + deferred[ handler ](function() { + returned = fn.apply( this, arguments ); + if ( jQuery.isFunction( returned.promise ) ) { + returned.promise().then( newDefer.resolve, newDefer.reject ); + } else { + newDefer[ action ]( returned ); + } + }); + } else { + deferred[ handler ]( newDefer[ action ] ); + } + }); + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + if ( obj == null ) { + if ( promise ) { + return promise; + } + promise = obj = {}; + } + var i = promiseMethods.length; + while( i-- ) { + obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ]; + } + return obj; + } + }); + // Make sure only one callback list will be used + deferred.done( failDeferred.cancel ).fail( deferred.cancel ); + // Unexpose cancel + delete deferred.cancel; + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + return deferred; + }, + + // Deferred helper + when: function( firstParam ) { + var args = arguments, + i = 0, + length = args.length, + count = length, + deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? + firstParam : + jQuery.Deferred(); + function resolveFunc( i ) { + return function( value ) { + args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + if ( !( --count ) ) { + // Strange bug in FF4: + // Values changed onto the arguments object sometimes end up as undefined values + // outside the $.when method. Cloning the object into a fresh array solves the issue + deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) ); + } + }; + } + if ( length > 1 ) { + for( ; i < length; i++ ) { + if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) { + args[ i ].promise().then( resolveFunc(i), deferred.reject ); + } else { + --count; + } + } + if ( !count ) { + deferred.resolveWith( deferred, args ); + } + } else if ( deferred !== firstParam ) { + deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); + } + return deferred.promise(); + } +}); + + + +jQuery.support = (function() { + + var div = document.createElement( "div" ), + all, + a, + select, + opt, + input, + marginDiv, + support, + fragment, + body, + bodyStyle, + tds, + events, + eventName, + i, + isSupported; + + // Preliminary tests + div.setAttribute("className", "t"); + div.innerHTML = "
    a"; + + all = div.getElementsByTagName( "*" ); + a = div.getElementsByTagName( "a" )[ 0 ]; + + // Can't get basic test support + if ( !all || !all.length || !a ) { + return {}; + } + + // First batch of supports tests + select = document.createElement( "select" ); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName( "input" )[ 0 ]; + + support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: ( div.firstChild.nodeType === 3 ), + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName( "tbody" ).length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName( "link" ).length, + + // Get the style information from getAttribute + // (IE uses .cssText instead) + style: /top/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: ( a.getAttribute( "href" ) === "/a" ), + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.55$/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: ( input.value === "on" ), + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + getSetAttribute: div.className !== "t", + + // Will be defined later + submitBubbles: true, + changeBubbles: true, + focusinBubbles: false, + deleteExpando: true, + noCloneEvent: true, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableMarginRight: true + }; + + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as disabled) + select.disabled = true; + support.optDisabled = !opt.disabled; + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { + div.attachEvent( "onclick", function click() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + support.noCloneEvent = false; + div.detachEvent( "onclick", click ); + }); + div.cloneNode( true ).fireEvent( "onclick" ); + } + + // Check if a radio maintains it's value + // after being appended to the DOM + input = document.createElement("input"); + input.value = "t"; + input.setAttribute("type", "radio"); + support.radioValue = input.value === "t"; + + input.setAttribute("checked", "checked"); + div.appendChild( input ); + fragment = document.createDocumentFragment(); + fragment.appendChild( div.firstChild ); + + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + div.innerHTML = ""; + + // Figure out if the W3C box model works as expected + div.style.width = div.style.paddingLeft = "1px"; + + // We use our own, invisible, body + body = document.createElement( "body" ); + bodyStyle = { + visibility: "hidden", + width: 0, + height: 0, + border: 0, + margin: 0, + // Set background to avoid IE crashes when removing (#9028) + background: "none" + }; + for ( i in bodyStyle ) { + body.style[ i ] = bodyStyle[ i ]; + } + body.appendChild( div ); + document.documentElement.appendChild( body ); + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; + + support.boxModel = div.offsetWidth === 2; + + if ( "zoom" in div.style ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.style.display = "inline"; + div.style.zoom = 1; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = ""; + div.innerHTML = "
    "; + support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); + } + + div.innerHTML = "
    t
    "; + tds = div.getElementsByTagName( "td" ); + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + isSupported = ( tds[ 0 ].offsetHeight === 0 ); + + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE < 8 fail this test) + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + div.innerHTML = ""; + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. For more + // info see bug #3333 + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + if ( document.defaultView && document.defaultView.getComputedStyle ) { + marginDiv = document.createElement( "div" ); + marginDiv.style.width = "0"; + marginDiv.style.marginRight = "0"; + div.appendChild( marginDiv ); + support.reliableMarginRight = + ( parseInt( document.defaultView.getComputedStyle( marginDiv, null ).marginRight, 10 ) || 0 ) === 0; + } + + // Remove the body element we added + body.innerHTML = ""; + document.documentElement.removeChild( body ); + + // Technique from Juriy Zaytsev + // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if ( div.attachEvent ) { + for( i in { + submit: 1, + change: 1, + focusin: 1 + } ) { + eventName = "on" + i; + isSupported = ( eventName in div ); + if ( !isSupported ) { + div.setAttribute( eventName, "return;" ); + isSupported = ( typeof div[ eventName ] === "function" ); + } + support[ i + "Bubbles" ] = isSupported; + } + } + + return support; +})(); + +// Keep track of boxModel +jQuery.boxModel = jQuery.support.boxModel; + + + + +var rbrace = /^(?:\{.*\}|\[.*\])$/, + rmultiDash = /([a-z])([A-Z])/g; + +jQuery.extend({ + cache: {}, + + // Please use with caution + uuid: 0, + + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var internalKey = jQuery.expando, getByName = typeof name === "string", thisCache, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || (pvt && id && !cache[ id ][ internalKey ])) && getByName && data === undefined ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ jQuery.expando ] = id = ++jQuery.uuid; + } else { + id = jQuery.expando; + } + } + + if ( !cache[ id ] ) { + cache[ id ] = {}; + + // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery + // metadata on plain JS objects when the object is serialized using + // JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name); + } else { + cache[ id ] = jQuery.extend(cache[ id ], name); + } + } + + thisCache = cache[ id ]; + + // Internal jQuery data is stored in a separate object inside the object's data + // cache in order to avoid key collisions between internal data and user-defined + // data + if ( pvt ) { + if ( !thisCache[ internalKey ] ) { + thisCache[ internalKey ] = {}; + } + + thisCache = thisCache[ internalKey ]; + } + + if ( data !== undefined ) { + thisCache[ name ] = data; + } + + // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should + // not attempt to inspect the internal events object using jQuery.data, as this + // internal data object is undocumented and subject to change. + if ( name === "events" && !thisCache[name] ) { + return thisCache[ internalKey ] && thisCache[ internalKey ].events; + } + + return getByName ? thisCache[ name ] : thisCache; + }, + + removeData: function( elem, name, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var internalKey = jQuery.expando, isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + + // See jQuery.data for more information + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + var thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ]; + + if ( thisCache ) { + delete thisCache[ name ]; + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !isEmptyDataObject(thisCache) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( pvt ) { + delete cache[ id ][ internalKey ]; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject(cache[ id ]) ) { + return; + } + } + + var internalCache = cache[ id ][ internalKey ]; + + // Browsers that fail expando deletion also refuse to delete expandos on + // the window, but it will allow it on all other JS objects; other browsers + // don't care + if ( jQuery.support.deleteExpando || cache != window ) { + delete cache[ id ]; + } else { + cache[ id ] = null; + } + + // We destroyed the entire user cache at once because it's faster than + // iterating through each key, but we need to continue to persist internal + // data if it existed + if ( internalCache ) { + cache[ id ] = {}; + // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery + // metadata on plain JS objects when the object is serialized using + // JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + + cache[ id ][ internalKey ] = internalCache; + + // Otherwise, we need to eliminate the expando on the node to avoid + // false lookups in the cache for entries that no longer exist + } else if ( isNode ) { + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( jQuery.support.deleteExpando ) { + delete elem[ jQuery.expando ]; + } else if ( elem.removeAttribute ) { + elem.removeAttribute( jQuery.expando ); + } else { + elem[ jQuery.expando ] = null; + } + } + }, + + // For internal use only. + _data: function( elem, name, data ) { + return jQuery.data( elem, name, data, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + if ( elem.nodeName ) { + var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; + + if ( match ) { + return !(match === true || elem.getAttribute("classid") !== match); + } + } + + return true; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var data = null; + + if ( typeof key === "undefined" ) { + if ( this.length ) { + data = jQuery.data( this[0] ); + + if ( this[0].nodeType === 1 ) { + var attr = this[0].attributes, name; + for ( var i = 0, l = attr.length; i < l; i++ ) { + name = attr[i].name; + + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.substring(5) ); + + dataAttr( this[0], name, data[ name ] ); + } + } + } + } + + return data; + + } else if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + var parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + // Try to fetch any internally stored data first + if ( data === undefined && this.length ) { + data = jQuery.data( this[0], key ); + data = dataAttr( this[0], key, data ); + } + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + + } else { + return this.each(function() { + var $this = jQuery( this ), + args = [ parts[0], value ]; + + $this.triggerHandler( "setData" + parts[1] + "!", args ); + jQuery.data( this, key, value ); + $this.triggerHandler( "changeData" + parts[1] + "!", args ); + }); + } + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "$1-$2" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + !jQuery.isNaN( data ) ? parseFloat( data ) : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON +// property to be considered empty objects; this property always exists in +// order to make sure JSON.stringify does not expose internal metadata +function isEmptyDataObject( obj ) { + for ( var name in obj ) { + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + + + + +function handleQueueMarkDefer( elem, type, src ) { + var deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + defer = jQuery.data( elem, deferDataKey, undefined, true ); + if ( defer && + ( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) && + ( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) { + // Give room for hard-coded callbacks to fire first + // and eventually mark/queue something else on the element + setTimeout( function() { + if ( !jQuery.data( elem, queueDataKey, undefined, true ) && + !jQuery.data( elem, markDataKey, undefined, true ) ) { + jQuery.removeData( elem, deferDataKey, true ); + defer.resolve(); + } + }, 0 ); + } +} + +jQuery.extend({ + + _mark: function( elem, type ) { + if ( elem ) { + type = (type || "fx") + "mark"; + jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true ); + } + }, + + _unmark: function( force, elem, type ) { + if ( force !== true ) { + type = elem; + elem = force; + force = false; + } + if ( elem ) { + type = type || "fx"; + var key = type + "mark", + count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 ); + if ( count ) { + jQuery.data( elem, key, count, true ); + } else { + jQuery.removeData( elem, key, true ); + handleQueueMarkDefer( elem, type, "mark" ); + } + } + }, + + queue: function( elem, type, data ) { + if ( elem ) { + type = (type || "fx") + "queue"; + var q = jQuery.data( elem, type, undefined, true ); + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !q || jQuery.isArray(data) ) { + q = jQuery.data( elem, type, jQuery.makeArray(data), true ); + } else { + q.push( data ); + } + } + return q || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + fn = queue.shift(), + defer; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + } + + if ( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift("inprogress"); + } + + fn.call(elem, function() { + jQuery.dequeue(elem, type); + }); + } + + if ( !queue.length ) { + jQuery.removeData( elem, type + "queue", true ); + handleQueueMarkDefer( elem, type, "queue" ); + } + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + } + + if ( data === undefined ) { + return jQuery.queue( this[0], type ); + } + return this.each(function() { + var queue = jQuery.queue( this, type, data ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; + type = type || "fx"; + + return this.queue( type, function() { + var elem = this; + setTimeout(function() { + jQuery.dequeue( elem, type ); + }, time ); + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, object ) { + if ( typeof type !== "string" ) { + object = type; + type = undefined; + } + type = type || "fx"; + var defer = jQuery.Deferred(), + elements = this, + i = elements.length, + count = 1, + deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark"; + function resolve() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + } + while( i-- ) { + if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || + ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || + jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && + jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) { + count++; + tmp.done( resolve ); + } + } + resolve(); + return defer.promise(); + } +}); + + + + +var rclass = /[\n\t\r]/g, + rspace = /\s+/, + rreturn = /\r/g, + rtype = /^(?:button|input)$/i, + rfocusable = /^(?:button|input|object|select|textarea)$/i, + rclickable = /^a(?:rea)?$/i, + rspecial = /^(?:data-|aria-)/, + rinvalidChar = /\:/, + formHook; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.attr ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.prop ); + }, + + removeProp: function( name ) { + return this.each(function() { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[ name ] = undefined; + delete this[ name ]; + } catch( e ) {} + }); + }, + + addClass: function( value ) { + if ( jQuery.isFunction( value ) ) { + return this.each(function(i) { + var self = jQuery(this); + self.addClass( value.call(this, i, self.attr("class") || "") ); + }); + } + + if ( value && typeof value === "string" ) { + var classNames = (value || "").split( rspace ); + + for ( var i = 0, l = this.length; i < l; i++ ) { + var elem = this[i]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className ) { + elem.className = value; + + } else { + var className = " " + elem.className + " ", + setClass = elem.className; + + for ( var c = 0, cl = classNames.length; c < cl; c++ ) { + if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) { + setClass += " " + classNames[c]; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + self.removeClass( value.call(this, i, self.attr("class")) ); + }); + } + + if ( (value && typeof value === "string") || value === undefined ) { + var classNames = (value || "").split( rspace ); + + for ( var i = 0, l = this.length; i < l; i++ ) { + var elem = this[i]; + + if ( elem.nodeType === 1 && elem.className ) { + if ( value ) { + var className = (" " + elem.className + " ").replace(rclass, " "); + for ( var c = 0, cl = classNames.length; c < cl; c++ ) { + className = className.replace(" " + classNames[c] + " ", " "); + } + elem.className = jQuery.trim( className ); + + } else { + elem.className = ""; + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function(i) { + var self = jQuery(this); + self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + state = stateVal, + classNames = value.split( rspace ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space seperated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " "; + for ( var i = 0, l = this.length; i < l; i++ ) { + if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + var hooks, ret, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; + } + + return (elem.value || "").replace(rreturn, ""); + } + + return undefined; + } + + var isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var self = jQuery(this), val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, self.val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map(val, function ( value ) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || ("set" in hooks && hooks.set( this, val, "value" ) === undefined) ) { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + valHooks: { + option: { + get: function( elem ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + }, + select: { + get: function( elem ) { + var index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + // Don't return options that are disabled or in a disabled optgroup + if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && + (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + // Fixes Bug #2551 -- select.val() broken in IE after form.reset() + if ( one && !values.length && options.length ) { + return jQuery( options[ index ] ).val(); + } + + return values; + }, + + set: function( elem, value ) { + var values = jQuery.makeArray( value ); + + jQuery(elem).find("option").each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, + + attrFix: { + // Always normalize to ensure hook usage + tabindex: "tabIndex", + readonly: "readOnly" + }, + + attr: function( elem, name, value, pass ) { + var nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return undefined; + } + + if ( pass && name in jQuery.attrFn ) { + return jQuery( elem )[ name ]( value ); + } + + var ret, hooks, + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + // Normalize the name if needed + name = notxml && jQuery.attrFix[ name ] || name; + + // Get the appropriate hook, or the formHook + // if getSetAttribute is not supported and we have form objects in IE6/7 + hooks = jQuery.attrHooks[ name ] || + ( formHook && (jQuery.nodeName( elem, "form" ) || rinvalidChar.test( name )) ? + formHook : + undefined ); + + if ( value !== undefined ) { + + if ( value === null || (value === false && !rspecial.test( name )) ) { + jQuery.removeAttr( elem, name ); + return undefined; + + } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + + // Set boolean attributes to the same name + if ( value === true && !rspecial.test( name ) ) { + value = name; + } + + elem.setAttribute( name, "" + value ); + return value; + } + + } else { + + if ( hooks && "get" in hooks && notxml ) { + return hooks.get( elem, name ); + + } else { + + ret = elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return ret === null ? + undefined : + ret; + } + } + }, + + removeAttr: function( elem, name ) { + if ( elem.nodeType === 1 ) { + name = jQuery.attrFix[ name ] || name; + + if ( jQuery.support.getSetAttribute ) { + // Use removeAttribute in browsers that support it + elem.removeAttribute( name ); + } else { + jQuery.attr( elem, name, "" ); + elem.removeAttributeNode( elem.getAttributeNode( name ) ); + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to it's default in case type is set after value + // This is for element creation + var val = elem.getAttribute("value"); + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + }, + tabIndex: { + get: function( elem ) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + var attributeNode = elem.getAttributeNode("tabIndex"); + + return attributeNode && attributeNode.specified ? + parseInt( attributeNode.value, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + } + }, + + propFix: {}, + + prop: function( elem, name, value ) { + var nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return undefined; + } + + var ret, hooks, + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + // Try to normalize/fix the name + name = notxml && jQuery.propFix[ name ] || name; + + hooks = jQuery.propHooks[ name ]; + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + return (elem[ name ] = value); + } + + } else { + if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== undefined ) { + return ret; + + } else { + return elem[ name ]; + } + } + }, + + propHooks: {} +}); + +// IE6/7 do not support getting/setting some attributes with get/setAttribute +if ( !jQuery.support.getSetAttribute ) { + jQuery.attrFix = jQuery.extend( jQuery.attrFix, { + "for": "htmlFor", + "class": "className", + maxlength: "maxLength", + cellspacing: "cellSpacing", + cellpadding: "cellPadding", + rowspan: "rowSpan", + colspan: "colSpan", + usemap: "useMap", + frameborder: "frameBorder" + }); + + // Use this for any attribute on a form in IE6/7 + formHook = jQuery.attrHooks.name = jQuery.attrHooks.value = jQuery.valHooks.button = { + get: function( elem, name ) { + var ret; + if ( name === "value" && !jQuery.nodeName( elem, "button" ) ) { + return elem.getAttribute( name ); + } + ret = elem.getAttributeNode( name ); + // Return undefined if not specified instead of empty string + return ret && ret.specified ? + ret.nodeValue : + undefined; + }, + set: function( elem, value, name ) { + // Check form objects in IE (multiple bugs related) + // Only use nodeValue if the attribute node exists on the form + var ret = elem.getAttributeNode( name ); + if ( ret ) { + ret.nodeValue = value; + return value; + } + } + }; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }); + }); +} + + +// Some attributes require a special call on IE +if ( !jQuery.support.hrefNormalized ) { + jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + get: function( elem ) { + var ret = elem.getAttribute( name, 2 ); + return ret === null ? undefined : ret; + } + }); + }); +} + +if ( !jQuery.support.style ) { + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Normalize to lowercase since IE uppercases css property names + return elem.style.cssText.toLowerCase() || undefined; + }, + set: function( elem, value ) { + return (elem.style.cssText = "" + value); + } + }; +} + +// Safari mis-reports the default selected property of an option +// Accessing the parent's selectedIndex property fixes it +if ( !jQuery.support.optSelected ) { + jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { + get: function( elem ) { + var parent = elem.parentNode; + + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }); +} + +// Radios and checkboxes getter/setter +if ( !jQuery.support.checkOn ) { + jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + get: function( elem ) { + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + } + }; + }); +} +jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0); + } + } + }); +}); + + + + +var hasOwn = Object.prototype.hasOwnProperty, + rnamespaces = /\.(.*)$/, + rformElems = /^(?:textarea|input|select)$/i, + rperiod = /\./g, + rspaces = / /g, + rescape = /[^\w\s.|`]/g, + fcleanup = function( nm ) { + return nm.replace(rescape, "\\$&"); + }; + +/* + * A number of helper functions used for managing events. + * Many of the ideas behind this code originated from + * Dean Edwards' addEvent library. + */ +jQuery.event = { + + // Bind an event to an element + // Original by Dean Edwards + add: function( elem, types, handler, data ) { + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + if ( handler === false ) { + handler = returnFalse; + } else if ( !handler ) { + // Fixes bug #7229. Fix recommended by jdalton + return; + } + + var handleObjIn, handleObj; + + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + } + + // Make sure that the function being executed has a unique ID + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure + var elemData = jQuery._data( elem ); + + // If no elemData is found then we must be trying to bind to one of the + // banned noData elements + if ( !elemData ) { + return; + } + + var events = elemData.events, + eventHandle = elemData.handle; + + if ( !events ) { + elemData.events = events = {}; + } + + if ( !eventHandle ) { + elemData.handle = eventHandle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.handle.apply( eventHandle.elem, arguments ) : + undefined; + }; + } + + // Add elem as a property of the handle function + // This is to prevent a memory leak with non-native events in IE. + eventHandle.elem = elem; + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = types.split(" "); + + var type, i = 0, namespaces; + + while ( (type = types[ i++ ]) ) { + handleObj = handleObjIn ? + jQuery.extend({}, handleObjIn) : + { handler: handler, data: data }; + + // Namespaced event handlers + if ( type.indexOf(".") > -1 ) { + namespaces = type.split("."); + type = namespaces.shift(); + handleObj.namespace = namespaces.slice(0).sort().join("."); + + } else { + namespaces = []; + handleObj.namespace = ""; + } + + handleObj.type = type; + if ( !handleObj.guid ) { + handleObj.guid = handler.guid; + } + + // Get the current list of functions bound to this event + var handlers = events[ type ], + special = jQuery.event.special[ type ] || {}; + + // Init the event handler queue + if ( !handlers ) { + handlers = events[ type ] = []; + + // Check for a special event handler + // Only use addEventListener/attachEvent if the special + // events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add the function to the element's handler list + handlers.push( handleObj ); + + // Keep track of which events have been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, pos ) { + // don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + if ( handler === false ) { + handler = returnFalse; + } + + var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ), + events = elemData && elemData.events; + + if ( !elemData || !events ) { + return; + } + + // types is actually an event object here + if ( types && types.type ) { + handler = types.handler; + types = types.type; + } + + // Unbind all events for the element + if ( !types || typeof types === "string" && types.charAt(0) === "." ) { + types = types || ""; + + for ( type in events ) { + jQuery.event.remove( elem, type + types ); + } + + return; + } + + // Handle multiple events separated by a space + // jQuery(...).unbind("mouseover mouseout", fn); + types = types.split(" "); + + while ( (type = types[ i++ ]) ) { + origType = type; + handleObj = null; + all = type.indexOf(".") < 0; + namespaces = []; + + if ( !all ) { + // Namespaced event handlers + namespaces = type.split("."); + type = namespaces.shift(); + + namespace = new RegExp("(^|\\.)" + + jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + eventType = events[ type ]; + + if ( !eventType ) { + continue; + } + + if ( !handler ) { + for ( j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( all || namespace.test( handleObj.namespace ) ) { + jQuery.event.remove( elem, origType, handleObj.handler, j ); + eventType.splice( j--, 1 ); + } + } + + continue; + } + + special = jQuery.event.special[ type ] || {}; + + for ( j = pos || 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( handler.guid === handleObj.guid ) { + // remove the given handler for the given type + if ( all || namespace.test( handleObj.namespace ) ) { + if ( pos == null ) { + eventType.splice( j--, 1 ); + } + + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + + if ( pos != null ) { + break; + } + } + } + + // remove generic event handler if no more handlers exist + if ( eventType.length === 0 || pos != null && eventType.length === 1 ) { + if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + ret = null; + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + var handle = elemData.handle; + if ( handle ) { + handle.elem = null; + } + + delete elemData.events; + delete elemData.handle; + + if ( jQuery.isEmptyObject( elemData ) ) { + jQuery.removeData( elem, undefined, true ); + } + } + }, + + // Events that are safe to short-circuit if no handlers are attached. + // Native DOM events should not be added, they may have inline handlers. + customEvent: { + "getData": true, + "setData": true, + "changeData": true + }, + + trigger: function( event, data, elem, onlyHandlers ) { + // Event object or event type + var type = event.type || event, + namespaces = [], + exclusive; + + if ( type.indexOf("!") >= 0 ) { + // Exclusive events trigger only for the exact event (no namespaces) + type = type.slice(0, -1); + exclusive = true; + } + + if ( type.indexOf(".") >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + + if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { + // No jQuery handlers for this event type, and it can't have inline handlers + return; + } + + // Caller can pass in an Event, Object, or just an event type string + event = typeof event === "object" ? + // jQuery.Event object + event[ jQuery.expando ] ? event : + // Object literal + new jQuery.Event( type, event ) : + // Just the event type (string) + new jQuery.Event( type ); + + event.type = type; + event.exclusive = exclusive; + event.namespace = namespaces.join("."); + event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)"); + + // triggerHandler() and global events don't bubble or run the default action + if ( onlyHandlers || !elem ) { + event.preventDefault(); + event.stopPropagation(); + } + + // Handle a global trigger + if ( !elem ) { + // TODO: Stop taunting the data cache; remove global events and always attach to document + jQuery.each( jQuery.cache, function() { + // internalKey variable is just used to make it easier to find + // and potentially change this stuff later; currently it just + // points to jQuery.expando + var internalKey = jQuery.expando, + internalCache = this[ internalKey ]; + if ( internalCache && internalCache.events && internalCache.events[ type ] ) { + jQuery.event.trigger( event, data, internalCache.handle.elem ); + } + }); + return; + } + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // Clean up the event in case it is being reused + event.result = undefined; + event.target = elem; + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data ? jQuery.makeArray( data ) : []; + data.unshift( event ); + + var cur = elem, + // IE doesn't like method names with a colon (#3533, #8272) + ontype = type.indexOf(":") < 0 ? "on" + type : ""; + + // Fire event on the current element, then bubble up the DOM tree + do { + var handle = jQuery._data( cur, "handle" ); + + event.currentTarget = cur; + if ( handle ) { + handle.apply( cur, data ); + } + + // Trigger an inline bound script + if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) { + event.result = false; + event.preventDefault(); + } + + // Bubble up to document, then to window + cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window; + } while ( cur && !event.isPropagationStopped() ); + + // If nobody prevented the default action, do it now + if ( !event.isDefaultPrevented() ) { + var old, + special = jQuery.event.special[ type ] || {}; + + if ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) && + !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction)() check here because IE6/7 fails that test. + // IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch. + try { + if ( ontype && elem[ type ] ) { + // Don't re-trigger an onFOO event when we call its FOO() method + old = elem[ ontype ]; + + if ( old ) { + elem[ ontype ] = null; + } + + jQuery.event.triggered = type; + elem[ type ](); + } + } catch ( ieError ) {} + + if ( old ) { + elem[ ontype ] = old; + } + + jQuery.event.triggered = undefined; + } + } + + return event.result; + }, + + handle: function( event ) { + event = jQuery.event.fix( event || window.event ); + // Snapshot the handlers list since a called handler may add/remove events. + var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0), + run_all = !event.exclusive && !event.namespace, + args = Array.prototype.slice.call( arguments, 0 ); + + // Use the fix-ed Event rather than the (read-only) native event + args[0] = event; + event.currentTarget = this; + + for ( var j = 0, l = handlers.length; j < l; j++ ) { + var handleObj = handlers[ j ]; + + // Triggered event must 1) be non-exclusive and have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event. + if ( run_all || event.namespace_re.test( handleObj.namespace ) ) { + // Pass in a reference to the handler function itself + // So that we can later remove it + event.handler = handleObj.handler; + event.data = handleObj.data; + event.handleObj = handleObj; + + var ret = handleObj.handler.apply( this, args ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + + if ( event.isImmediatePropagationStopped() ) { + break; + } + } + } + return event.result; + }, + + props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // store a copy of the original event object + // and "clone" to set read-only properties + var originalEvent = event; + event = jQuery.Event( originalEvent ); + + for ( var i = this.props.length, prop; i; ) { + prop = this.props[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary + if ( !event.target ) { + // Fixes #1925 where srcElement might not be defined either + event.target = event.srcElement || document; + } + + // check if target is a textnode (safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && event.fromElement ) { + event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; + } + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && event.clientX != null ) { + var eventDocument = event.target.ownerDocument || document, + doc = eventDocument.documentElement, + body = eventDocument.body; + + event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); + event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); + } + + // Add which for key events + if ( event.which == null && (event.charCode != null || event.keyCode != null) ) { + event.which = event.charCode != null ? event.charCode : event.keyCode; + } + + // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) + if ( !event.metaKey && event.ctrlKey ) { + event.metaKey = event.ctrlKey; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && event.button !== undefined ) { + event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); + } + + return event; + }, + + // Deprecated, use jQuery.guid instead + guid: 1E8, + + // Deprecated, use jQuery.proxy instead + proxy: jQuery.proxy, + + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady, + teardown: jQuery.noop + }, + + live: { + add: function( handleObj ) { + jQuery.event.add( this, + liveConvert( handleObj.origType, handleObj.selector ), + jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) ); + }, + + remove: function( handleObj ) { + jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj ); + } + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( jQuery.isWindow( this ) ) { + this.onbeforeunload = eventHandle; + } + }, + + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + if ( elem.detachEvent ) { + elem.detachEvent( "on" + type, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !this.preventDefault ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // timeStamp is buggy for some events on Firefox(#3843) + // So we won't rely on the native value + this.timeStamp = jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // otherwise set the returnValue property of the original event to false (IE) + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Checks if an event happened on an element within another element +// Used in jQuery.event.special.mouseenter and mouseleave handlers +var withinElement = function( event ) { + // Check if mouse(over|out) are still within the same parent element + var parent = event.relatedTarget; + + // Firefox sometimes assigns relatedTarget a XUL element + // which we cannot access the parentNode property of + try { + + // Chrome does something similar, the parentNode property + // can be accessed but is null. + if ( parent && parent !== document && !parent.parentNode ) { + return; + } + // Traverse up the tree + while ( parent && parent !== this ) { + parent = parent.parentNode; + } + + if ( parent !== this ) { + // set the correct event type + event.type = event.data; + + // handle event if we actually just moused on to a non sub-element + jQuery.event.handle.apply( this, arguments ); + } + + // assuming we've left the element since we most likely mousedover a xul element + } catch(e) { } +}, + +// In case of event delegation, we only need to rename the event.type, +// liveHandler will take care of the rest. +delegate = function( event ) { + event.type = event.data; + jQuery.event.handle.apply( this, arguments ); +}; + +// Create mouseenter and mouseleave events +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + setup: function( data ) { + jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig ); + }, + teardown: function( data ) { + jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement ); + } + }; +}); + +// submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function( data, namespaces ) { + if ( !jQuery.nodeName( this, "form" ) ) { + jQuery.event.add(this, "click.specialSubmit", function( e ) { + var elem = e.target, + type = elem.type; + + if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { + trigger( "submit", this, arguments ); + } + }); + + jQuery.event.add(this, "keypress.specialSubmit", function( e ) { + var elem = e.target, + type = elem.type; + + if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { + trigger( "submit", this, arguments ); + } + }); + + } else { + return false; + } + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialSubmit" ); + } + }; + +} + +// change delegation, happens here so we have bind. +if ( !jQuery.support.changeBubbles ) { + + var changeFilters, + + getVal = function( elem ) { + var type = elem.type, val = elem.value; + + if ( type === "radio" || type === "checkbox" ) { + val = elem.checked; + + } else if ( type === "select-multiple" ) { + val = elem.selectedIndex > -1 ? + jQuery.map( elem.options, function( elem ) { + return elem.selected; + }).join("-") : + ""; + + } else if ( jQuery.nodeName( elem, "select" ) ) { + val = elem.selectedIndex; + } + + return val; + }, + + testChange = function testChange( e ) { + var elem = e.target, data, val; + + if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) { + return; + } + + data = jQuery._data( elem, "_change_data" ); + val = getVal(elem); + + // the current data will be also retrieved by beforeactivate + if ( e.type !== "focusout" || elem.type !== "radio" ) { + jQuery._data( elem, "_change_data", val ); + } + + if ( data === undefined || val === data ) { + return; + } + + if ( data != null || val ) { + e.type = "change"; + e.liveFired = undefined; + jQuery.event.trigger( e, arguments[1], elem ); + } + }; + + jQuery.event.special.change = { + filters: { + focusout: testChange, + + beforedeactivate: testChange, + + click: function( e ) { + var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : ""; + + if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) { + testChange.call( this, e ); + } + }, + + // Change has to be called before submit + // Keydown will be called before keypress, which is used in submit-event delegation + keydown: function( e ) { + var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : ""; + + if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) || + (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || + type === "select-multiple" ) { + testChange.call( this, e ); + } + }, + + // Beforeactivate happens also before the previous element is blurred + // with this event you can't trigger a change event, but you can store + // information + beforeactivate: function( e ) { + var elem = e.target; + jQuery._data( elem, "_change_data", getVal(elem) ); + } + }, + + setup: function( data, namespaces ) { + if ( this.type === "file" ) { + return false; + } + + for ( var type in changeFilters ) { + jQuery.event.add( this, type + ".specialChange", changeFilters[type] ); + } + + return rformElems.test( this.nodeName ); + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialChange" ); + + return rformElems.test( this.nodeName ); + } + }; + + changeFilters = jQuery.event.special.change.filters; + + // Handle when the input is .focus()'d + changeFilters.focus = changeFilters.beforeactivate; +} + +function trigger( type, elem, args ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + // Don't pass args or remember liveFired; they apply to the donor event. + var event = jQuery.extend( {}, args[ 0 ] ); + event.type = type; + event.originalEvent = {}; + event.liveFired = undefined; + jQuery.event.handle.call( elem, event ); + if ( event.isDefaultPrevented() ) { + args[ 0 ].preventDefault(); + } +} + +// Create "bubbling" focus and blur events +if ( !jQuery.support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + + function handler( donor ) { + // Donor event is always a native one; fix it and switch its type. + // Let focusin/out handler cancel the donor focus/blur event. + var e = jQuery.event.fix( donor ); + e.type = fix; + e.originalEvent = {}; + jQuery.event.trigger( e, null, e.target ); + if ( e.isDefaultPrevented() ) { + donor.preventDefault(); + } + } + }); +} + +jQuery.each(["bind", "one"], function( i, name ) { + jQuery.fn[ name ] = function( type, data, fn ) { + var handler; + + // Handle object literals + if ( typeof type === "object" ) { + for ( var key in type ) { + this[ name ](key, data, type[key], fn); + } + return this; + } + + if ( arguments.length === 2 || data === false ) { + fn = data; + data = undefined; + } + + if ( name === "one" ) { + handler = function( event ) { + jQuery( this ).unbind( event, handler ); + return fn.apply( this, arguments ); + }; + handler.guid = fn.guid || jQuery.guid++; + } else { + handler = fn; + } + + if ( type === "unload" && name !== "one" ) { + this.one( type, data, fn ); + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.add( this[i], type, handler, data ); + } + } + + return this; + }; +}); + +jQuery.fn.extend({ + unbind: function( type, fn ) { + // Handle object literals + if ( typeof type === "object" && !type.preventDefault ) { + for ( var key in type ) { + this.unbind(key, type[key]); + } + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.remove( this[i], type, fn ); + } + } + + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.live( types, data, fn, selector ); + }, + + undelegate: function( selector, types, fn ) { + if ( arguments.length === 0 ) { + return this.unbind( "live" ); + + } else { + return this.die( types, null, fn, selector ); + } + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + + triggerHandler: function( type, data ) { + if ( this[0] ) { + return jQuery.event.trigger( type, data, this[0], true ); + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, + guid = fn.guid || jQuery.guid++, + i = 0, + toggler = function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + }; + + // link all the functions, so any of them can unbind this click handler + toggler.guid = guid; + while ( i < args.length ) { + args[ i++ ].guid = guid; + } + + return this.click( toggler ); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +var liveMap = { + focus: "focusin", + blur: "focusout", + mouseenter: "mouseover", + mouseleave: "mouseout" +}; + +jQuery.each(["live", "die"], function( i, name ) { + jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) { + var type, i = 0, match, namespaces, preType, + selector = origSelector || this.selector, + context = origSelector ? this : jQuery( this.context ); + + if ( typeof types === "object" && !types.preventDefault ) { + for ( var key in types ) { + context[ name ]( key, data, types[key], selector ); + } + + return this; + } + + if ( name === "die" && !types && + origSelector && origSelector.charAt(0) === "." ) { + + context.unbind( origSelector ); + + return this; + } + + if ( data === false || jQuery.isFunction( data ) ) { + fn = data || returnFalse; + data = undefined; + } + + types = (types || "").split(" "); + + while ( (type = types[ i++ ]) != null ) { + match = rnamespaces.exec( type ); + namespaces = ""; + + if ( match ) { + namespaces = match[0]; + type = type.replace( rnamespaces, "" ); + } + + if ( type === "hover" ) { + types.push( "mouseenter" + namespaces, "mouseleave" + namespaces ); + continue; + } + + preType = type; + + if ( liveMap[ type ] ) { + types.push( liveMap[ type ] + namespaces ); + type = type + namespaces; + + } else { + type = (liveMap[ type ] || type) + namespaces; + } + + if ( name === "live" ) { + // bind live handler + for ( var j = 0, l = context.length; j < l; j++ ) { + jQuery.event.add( context[j], "live." + liveConvert( type, selector ), + { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } ); + } + + } else { + // unbind live handler + context.unbind( "live." + liveConvert( type, selector ), fn ); + } + } + + return this; + }; +}); + +function liveHandler( event ) { + var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret, + elems = [], + selectors = [], + events = jQuery._data( this, "events" ); + + // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911) + if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) { + return; + } + + if ( event.namespace ) { + namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + event.liveFired = this; + + var live = events.live.slice(0); + + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) { + selectors.push( handleObj.selector ); + + } else { + live.splice( j--, 1 ); + } + } + + match = jQuery( event.target ).closest( selectors, event.currentTarget ); + + for ( i = 0, l = match.length; i < l; i++ ) { + close = match[i]; + + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) { + elem = close.elem; + related = null; + + // Those two events require additional checking + if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { + event.type = handleObj.preType; + related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; + + // Make sure not to accidentally match a child element with the same selector + if ( related && jQuery.contains( elem, related ) ) { + related = elem; + } + } + + if ( !related || related !== elem ) { + elems.push({ elem: elem, handleObj: handleObj, level: close.level }); + } + } + } + } + + for ( i = 0, l = elems.length; i < l; i++ ) { + match = elems[i]; + + if ( maxLevel && match.level > maxLevel ) { + break; + } + + event.currentTarget = match.elem; + event.data = match.handleObj.data; + event.handleObj = match.handleObj; + + ret = match.handleObj.origHandler.apply( match.elem, arguments ); + + if ( ret === false || event.isPropagationStopped() ) { + maxLevel = match.level; + + if ( ret === false ) { + stop = false; + } + if ( event.isImmediatePropagationStopped() ) { + break; + } + } + } + + return stop; +} + +function liveConvert( type, selector ) { + return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&"); +} + +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + if ( fn == null ) { + fn = data; + data = null; + } + + return arguments.length > 0 ? + this.bind( name, data, fn ) : + this.trigger( name ); + }; + + if ( jQuery.attrFn ) { + jQuery.attrFn[ name ] = true; + } +}); + + + +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true, + rBackslash = /\\/g, + rNonWord = /\W/; + +// Here we check if the JavaScript engine is using some sort of +// optimization where it does not always call our comparision +// function. If that is the case, discard the hasDuplicate value. +// Thus far that includes Google Chrome. +[0, 0].sort(function() { + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function( selector, context, results, seed ) { + results = results || []; + context = context || document; + + var origContext = context; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var m, set, checkSet, extra, ret, cur, pop, i, + prune = true, + contextXML = Sizzle.isXML( context ), + parts = [], + soFar = selector; + + // Reset the position of the chunker regexp (start from head) + do { + chunker.exec( "" ); + m = chunker.exec( soFar ); + + if ( m ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + } while ( m ); + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context ); + + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set ); + } + } + + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + + ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? + Sizzle.filter( ret.expr, ret.set )[0] : + ret.set[0]; + } + + if ( context ) { + ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + + set = ret.expr ? + Sizzle.filter( ret.expr, ret.set ) : + ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray( set ); + + } else { + prune = false; + } + + while ( parts.length ) { + cur = parts.pop(); + pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + + } else if ( context && context.nodeType === 1 ) { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + + } else { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function( results ) { + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[ i - 1 ] ) { + results.splice( i--, 1 ); + } + } + } + } + + return results; +}; + +Sizzle.matches = function( expr, set ) { + return Sizzle( expr, null, null, set ); +}; + +Sizzle.matchesSelector = function( node, expr ) { + return Sizzle( expr, null, null, [node] ).length > 0; +}; + +Sizzle.find = function( expr, context, isXML ) { + var set; + + if ( !expr ) { + return []; + } + + for ( var i = 0, l = Expr.order.length; i < l; i++ ) { + var match, + type = Expr.order[i]; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + var left = match[1]; + match.splice( 1, 1 ); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace( rBackslash, "" ); + set = Expr.find[ type ]( match, context, isXML ); + + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( "*" ) : + []; + } + + return { set: set, expr: expr }; +}; + +Sizzle.filter = function( expr, set, inplace, not ) { + var match, anyFound, + old = expr, + result = [], + curLoop = set, + isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); + + while ( expr && set.length ) { + for ( var type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + var found, item, + filter = Expr.filter[ type ], + left = match[1]; + + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( var i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + var pass = not ^ !!found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + + } else { + curLoop[i] = false; + } + + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +Sizzle.error = function( msg ) { + throw "Syntax error, unrecognized expression: " + msg; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + + match: { + ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + + leftMatch: {}, + + attrMap: { + "class": "className", + "for": "htmlFor" + }, + + attrHandle: { + href: function( elem ) { + return elem.getAttribute( "href" ); + }, + type: function( elem ) { + return elem.getAttribute( "type" ); + } + }, + + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !rNonWord.test( part ), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + + ">": function( checkSet, part ) { + var elem, + isPartStr = typeof part === "string", + i = 0, + l = checkSet.length; + + if ( isPartStr && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + + } else { + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + + "": function(checkSet, part, isXML){ + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); + }, + + "~": function( checkSet, part, isXML ) { + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); + } + }, + + find: { + ID: function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }, + + NAME: function( match, context ) { + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], + results = context.getElementsByName( match[1] ); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + + TAG: function( match, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( match[1] ); + } + } + }, + preFilter: { + CLASS: function( match, curLoop, inplace, result, not, isXML ) { + match = " " + match[1].replace( rBackslash, "" ) + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + + ID: function( match ) { + return match[1].replace( rBackslash, "" ); + }, + + TAG: function( match, curLoop ) { + return match[1].replace( rBackslash, "" ).toLowerCase(); + }, + + CHILD: function( match ) { + if ( match[1] === "nth" ) { + if ( !match[2] ) { + Sizzle.error( match[0] ); + } + + match[2] = match[2].replace(/^\+|\s*/g, ''); + + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + else if ( match[2] ) { + Sizzle.error( match[0] ); + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + + ATTR: function( match, curLoop, inplace, result, not, isXML ) { + var name = match[1] = match[1].replace( rBackslash, "" ); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + // Handle if an un-quoted value was used + match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + + PSEUDO: function( match, curLoop, inplace, result, not ) { + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + + if ( !inplace ) { + result.push.apply( result, ret ); + } + + return false; + } + + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + + POS: function( match ) { + match.unshift( true ); + + return match; + } + }, + + filters: { + enabled: function( elem ) { + return elem.disabled === false && elem.type !== "hidden"; + }, + + disabled: function( elem ) { + return elem.disabled === true; + }, + + checked: function( elem ) { + return elem.checked === true; + }, + + selected: function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + parent: function( elem ) { + return !!elem.firstChild; + }, + + empty: function( elem ) { + return !elem.firstChild; + }, + + has: function( elem, i, match ) { + return !!Sizzle( match[3], elem ).length; + }, + + header: function( elem ) { + return (/h\d/i).test( elem.nodeName ); + }, + + text: function( elem ) { + var attr = elem.getAttribute( "type" ), type = elem.type; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); + }, + + radio: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; + }, + + checkbox: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; + }, + + file: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; + }, + + password: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; + }, + + submit: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "submit" === elem.type; + }, + + image: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; + }, + + reset: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "reset" === elem.type; + }, + + button: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && "button" === elem.type || name === "button"; + }, + + input: function( elem ) { + return (/input|select|textarea|button/i).test( elem.nodeName ); + }, + + focus: function( elem ) { + return elem === elem.ownerDocument.activeElement; + } + }, + setFilters: { + first: function( elem, i ) { + return i === 0; + }, + + last: function( elem, i, match, array ) { + return i === array.length - 1; + }, + + even: function( elem, i ) { + return i % 2 === 0; + }, + + odd: function( elem, i ) { + return i % 2 === 1; + }, + + lt: function( elem, i, match ) { + return i < match[3] - 0; + }, + + gt: function( elem, i, match ) { + return i > match[3] - 0; + }, + + nth: function( elem, i, match ) { + return match[3] - 0 === i; + }, + + eq: function( elem, i, match ) { + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function( elem, match, i, array ) { + var name = match[1], + filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0; + + } else if ( name === "not" ) { + var not = match[3]; + + for ( var j = 0, l = not.length; j < l; j++ ) { + if ( not[j] === elem ) { + return false; + } + } + + return true; + + } else { + Sizzle.error( name ); + } + }, + + CHILD: function( elem, match ) { + var type = match[1], + node = elem; + + switch ( type ) { + case "only": + case "first": + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + if ( type === "first" ) { + return true; + } + + node = elem; + + case "last": + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + return true; + + case "nth": + var first = match[2], + last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + var doneName = match[0], + parent = elem.parentNode; + + if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { + var count = 0; + + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + + parent.sizcache = doneName; + } + + var diff = elem.nodeIndex - last; + + if ( first === 0 ) { + return diff === 0; + + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + + ID: function( elem, match ) { + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + + TAG: function( elem, match ) { + return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; + }, + + CLASS: function( elem, match ) { + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + + ATTR: function( elem, match ) { + var name = match[1], + result = Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + + POS: function( elem, match, i, array ) { + var name = match[2], + filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS, + fescape = function(all, num){ + return "\\" + (num - 0 + 1); + }; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); +} + +var makeArray = function( array, results ) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +// Perform a simple check to determine if the browser is capable of +// converting a NodeList to an array using builtin methods. +// Also verifies that the returned array holds DOM nodes +// (which is not the case in the Blackberry browser) +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + +// Provide a fallback method if it does not work +} catch( e ) { + makeArray = function( array, results ) { + var i = 0, + ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + + } else { + if ( typeof array.length === "number" ) { + for ( var l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + + } else { + for ( ; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder, siblingCheck; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + return a.compareDocumentPosition ? -1 : 1; + } + + return a.compareDocumentPosition(b) & 4 ? -1 : 1; + }; + +} else { + sortOrder = function( a, b ) { + var al, bl, + ap = [], + bp = [], + aup = a.parentNode, + bup = b.parentNode, + cur = aup; + + // The nodes are identical, we can exit early + if ( a === b ) { + hasDuplicate = true; + return 0; + + // If the nodes are siblings (or identical) we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + + // If no parents were found then the nodes are disconnected + } else if ( !aup ) { + return -1; + + } else if ( !bup ) { + return 1; + } + + // Otherwise they're somewhere else in the tree so we need + // to build up a full list of the parentNodes for comparison + while ( cur ) { + ap.unshift( cur ); + cur = cur.parentNode; + } + + cur = bup; + + while ( cur ) { + bp.unshift( cur ); + cur = cur.parentNode; + } + + al = ap.length; + bl = bp.length; + + // Start walking down the tree looking for a discrepancy + for ( var i = 0; i < al && i < bl; i++ ) { + if ( ap[i] !== bp[i] ) { + return siblingCheck( ap[i], bp[i] ); + } + } + + // We ended someplace up the tree so do a sibling check + return i === al ? + siblingCheck( a, bp[i], -1 ) : + siblingCheck( ap[i], b, 1 ); + }; + + siblingCheck = function( a, b, ret ) { + if ( a === b ) { + return ret; + } + + var cur = a.nextSibling; + + while ( cur ) { + if ( cur === b ) { + return -1; + } + + cur = cur.nextSibling; + } + + return 1; + }; +} + +// Utility function for retreiving the text value of an array of DOM nodes +Sizzle.getText = function( elems ) { + var ret = "", elem; + + for ( var i = 0; elems[i]; i++ ) { + elem = elems[i]; + + // Get the text from text nodes and CDATA nodes + if ( elem.nodeType === 3 || elem.nodeType === 4 ) { + ret += elem.nodeValue; + + // Traverse everything else, except comment nodes + } else if ( elem.nodeType !== 8 ) { + ret += Sizzle.getText( elem.childNodes ); + } + } + + return ret; +}; + +// Check to see if the browser returns elements by name when +// querying by getElementById (and provide a workaround) +(function(){ + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date()).getTime(), + root = document.documentElement; + + form.innerHTML = ""; + + // Inject it into the root element, check its status, and remove it quickly + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + + return m ? + m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? + [m] : + undefined : + []; + } + }; + + Expr.filter.ID = function( elem, match ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + + // release memory in IE + root = form = null; +})(); + +(function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") + + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function( match, context ) { + var results = context.getElementsByTagName( match[1] ); + + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = ""; + + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + + Expr.attrHandle.href = function( elem ) { + return elem.getAttribute( "href", 2 ); + }; + } + + // release memory in IE + div = null; +})(); + +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, + div = document.createElement("div"), + id = "__sizzle__"; + + div.innerHTML = "

    "; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function( query, context, extra, seed ) { + context = context || document; + + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && !Sizzle.isXML(context) ) { + // See if we find a selector to speed up + var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); + + if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { + // Speed-up: Sizzle("TAG") + if ( match[1] ) { + return makeArray( context.getElementsByTagName( query ), extra ); + + // Speed-up: Sizzle(".CLASS") + } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { + return makeArray( context.getElementsByClassName( match[2] ), extra ); + } + } + + if ( context.nodeType === 9 ) { + // Speed-up: Sizzle("body") + // The body element only exists once, optimize finding it + if ( query === "body" && context.body ) { + return makeArray( [ context.body ], extra ); + + // Speed-up: Sizzle("#ID") + } else if ( match && match[3] ) { + var elem = context.getElementById( match[3] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id === match[3] ) { + return makeArray( [ elem ], extra ); + } + + } else { + return makeArray( [], extra ); + } + } + + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(qsaError) {} + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + var oldContext = context, + old = context.getAttribute( "id" ), + nid = old || id, + hasParent = context.parentNode, + relativeHierarchySelector = /^\s*[+~]/.test( query ); + + if ( !old ) { + context.setAttribute( "id", nid ); + } else { + nid = nid.replace( /'/g, "\\$&" ); + } + if ( relativeHierarchySelector && hasParent ) { + context = context.parentNode; + } + + try { + if ( !relativeHierarchySelector || hasParent ) { + return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); + } + + } catch(pseudoError) { + } finally { + if ( !old ) { + oldContext.removeAttribute( "id" ); + } + } + } + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + // release memory in IE + div = null; + })(); +} + +(function(){ + var html = document.documentElement, + matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; + + if ( matches ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9 fails this) + var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), + pseudoWorks = false; + + try { + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( document.documentElement, "[test!='']:sizzle" ); + + } catch( pseudoError ) { + pseudoWorks = true; + } + + Sizzle.matchesSelector = function( node, expr ) { + // Make sure that attribute selectors are quoted + expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); + + if ( !Sizzle.isXML( node ) ) { + try { + if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { + var ret = matches.call( node, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || !disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9, so check for that + node.document && node.document.nodeType !== 11 ) { + return ret; + } + } + } catch(e) {} + } + + return Sizzle(expr, null, null, [node]).length > 0; + }; + } +})(); + +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "
    "; + + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } + + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function( match, context, isXML ) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + // release memory in IE + div = null; +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +if ( document.documentElement.contains ) { + Sizzle.contains = function( a, b ) { + return a !== b && (a.contains ? a.contains(b) : true); + }; + +} else if ( document.documentElement.compareDocumentPosition ) { + Sizzle.contains = function( a, b ) { + return !!(a.compareDocumentPosition(b) & 16); + }; + +} else { + Sizzle.contains = function() { + return false; + }; +} + +Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +var posProcess = function( selector, context ) { + var match, + tmpSet = [], + later = "", + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet ); + } + + return Sizzle.filter( later, tmpSet ); +}; + +// EXPOSE +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.filters; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})(); + + +var runtil = /Until$/, + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + isSimple = /^.[^:#\[\.,]*$/, + slice = Array.prototype.slice, + POS = jQuery.expr.match.POS, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var self = this, + i, l; + + if ( typeof selector !== "string" ) { + return jQuery( selector ).filter(function() { + for ( i = 0, l = self.length; i < l; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }); + } + + var ret = this.pushStack( "", "find", selector ), + length, n, r; + + for ( i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( n = length; n < ret.length; n++ ) { + for ( r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var targets = jQuery( target ); + return this.filter(function() { + for ( var i = 0, l = targets.length; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && ( typeof selector === "string" ? + jQuery.filter( selector, this ).length > 0 : + this.filter( selector ).length > 0 ); + }, + + closest: function( selectors, context ) { + var ret = [], i, l, cur = this[0]; + + // Array + if ( jQuery.isArray( selectors ) ) { + var match, selector, + matches = {}, + level = 1; + + if ( cur && selectors.length ) { + for ( i = 0, l = selectors.length; i < l; i++ ) { + selector = selectors[i]; + + if ( !matches[ selector ] ) { + matches[ selector ] = POS.test( selector ) ? + jQuery( selector, context || this.context ) : + selector; + } + } + + while ( cur && cur.ownerDocument && cur !== context ) { + for ( selector in matches ) { + match = matches[ selector ]; + + if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) { + ret.push({ selector: selector, elem: cur, level: level }); + } + } + + cur = cur.parentNode; + level++; + } + } + + return ret; + } + + // String + var pos = POS.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( i = 0, l = this.length; i < l; i++ ) { + cur = this[i]; + + while ( cur ) { + if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { + ret.push( cur ); + break; + + } else { + cur = cur.parentNode; + if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { + break; + } + } + } + } + + ret = ret.length > 1 ? jQuery.unique( ret ) : ret; + + return this.pushStack( ret, "closest", selectors ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + if ( !elem || typeof elem === "string" ) { + return jQuery.inArray( this[0], + // If it receives a string, the selector is used + // If it receives nothing, the siblings are used + elem ? jQuery( elem ) : this.parent().children() ); + } + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + andSelf: function() { + return this.add( this.prevObject ); + } +}); + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return jQuery.nth( elem, 2, "nextSibling" ); + }, + prev: function( elem ) { + return jQuery.nth( elem, 2, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( elem.parentNode.firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.makeArray( elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ), + // The variable 'args' was introduced in + // https://github.com/jquery/jquery/commit/52a0238 + // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed. + // http://code.google.com/p/v8/issues/detail?id=1050 + args = slice.call(arguments); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; + + if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, args.join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : + jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + nth: function( cur, result, dir, elem ) { + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) { + if ( cur.nodeType === 1 && ++num === result ) { + break; + } + } + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, keep ) { + + // Can't pass null or undefined to indexOf in Firefox 4 + // Set to 0 to skip string check + qualifier = qualifier || 0; + + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return (elem === qualifier) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return (jQuery.inArray( elem, qualifier ) >= 0) === keep; + }); +} + + + + +var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, + rtagName = /<([\w:]+)/, + rtbody = /", "" ], + legend: [ 1, "
    ", "
    " ], + thead: [ 1, "", "
    " ], + tr: [ 2, "", "
    " ], + td: [ 3, "", "
    " ], + col: [ 2, "", "
    " ], + area: [ 1, "", "" ], + _default: [ 0, "", "" ] + }; + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE can't serialize and