├── .editorconfig ├── README.md ├── _config.php ├── code-of-conduct.md ├── code ├── MobileBrowserDetector.php ├── MobileSiteConfigExtension.php ├── MobileSiteControllerExtension.php └── MobileSiteTreeExtension.php ├── composer.json ├── license.md └── themes ├── blackcandymobile ├── css │ ├── form.css │ ├── layout.css │ └── typography.css ├── images │ ├── activeTabLeft.png │ ├── activeTabRight.png │ ├── bg.gif │ ├── header.gif │ └── headerRounded.gif ├── js │ ├── iphone.js │ ├── jquery-1.4.2.min.js │ └── jquery.iphone.min.js └── templates │ ├── Includes │ ├── BreadCrumbs.ss │ ├── Footer.ss │ ├── Navigation.ss │ └── SideBar.ss │ ├── Layout │ └── Page.ss │ └── Page.ss └── jquerymobile └── templates ├── Includes ├── Footer.ss ├── Navigation.ss └── Navigation_manypages.ss ├── Layout └── Page.ss └── Page.ss /.editorconfig: -------------------------------------------------------------------------------- 1 | # For more information about the properties used in this file, 2 | # please see the EditorConfig documentation: 3 | # http://editorconfig.org 4 | 5 | [*] 6 | charset = utf-8 7 | end_of_line = lf 8 | indent_size = 4 9 | indent_style = space 10 | insert_final_newline = true 11 | trim_trailing_whitespace = true 12 | 13 | [{*.yml,package.json}] 14 | indent_size = 2 15 | 16 | # The indent size used in the package.json file cannot be changed: 17 | # https://github.com/npm/npm/pull/3180#issuecomment-16336516 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Mobile Module # 2 | 3 | [![Build Status](https://secure.travis-ci.org/silverstripe/silverstripe-mobile.png?branch=master)](http://travis-ci.org/silverstripe/silverstripe-mobile) 4 | 5 | **Please note: this module is no longer actively maintained.** 6 | 7 | ## Overview ## 8 | 9 | The mobile module provides detection for mobile devices, 10 | and can serve a different SilverStripe theme to them. 11 | The module can either use redirection to a separate mobile 12 | domain, or serve mobile optimised content under the same URLs. 13 | It includes a default "blackcandymobile" theme to demonstrate the effects. 14 | 15 | The codebase relies on server-side device detection based on user agent strings, 16 | which is an [unreliable](http://www.brettjankord.com/2013/01/10/active-development-on-categorizr-has-come-to-an-end/) way to determine if a device is considered to be "mobile". 17 | 18 | The W3C recommends a ["One web" approach](http://www.w3.org/TR/mobile-bp/#d0e347) 19 | that uses ["Responsive Design"](http://www.alistapart.com/articles/responsive-web-design/) 20 | to adapt content, rather than create isolated mobile experiences under their own domain. 21 | Most of the work on mobile optimization will be in client-side techniques 22 | like JavaScript and CSS (e.g. through media queries). 23 | 24 | Responsive design is not covered by this module, and can be achieved with standard 25 | SilverStripe functionality. 26 | 27 | The module also exposes this state in SilverStripe controllers 28 | so custom logic and CSS/JavaScript includes can be adapted to mobile usage. 29 | 30 | ## Maintainer Contact 31 | 32 | * Sean Harvey (Nickname: halkyon, sharvey) 33 | 34 | 35 | * Will Rossiter (Nickname: wrossiter, willr) 36 | 37 | 38 | ## Requirements 39 | 40 | * SilverStripe 3.1 or newer 41 | 42 | ## Installation 43 | 44 | Unpack and copy the mobile folder into your SilverStripe project. 45 | 46 | Run "dev/build" in your browser, for example: "http://localhost/silverstripe/dev/build?flush=all" 47 | 48 | A new theme called "blackcandymobile" will be created in your themes folder after 49 | invoking the database (dev) build. This theme is a good starting point which you can modify 50 | to create your own mobile theme. 51 | 52 | If the themes folder can't be written to by the web server during dev/build, please 53 | manually copy "blackcandymobile" into your themes folder from the mobile folder. 54 | 55 | Alternatively, the module contains a "jquerymobile" sample theme 56 | which creates a basic navigation interface through [jQuery Mobile](http://jquerymobile.com). 57 | To use this theme, copy it to `/themes` in the same way, 58 | and set it in your `SiteConfig` as described below. 59 | 60 | ## Configuration 61 | 62 | * SS2.4: In the CMS, browse to the "Pages" tab and click the root node of the site tree to 63 | access the SiteConfig settings. 64 | * SS3: In the CMS, browse to the "Settings" tab on the left navigation bar to access the 65 | SiteConfig settings. 66 | 67 | Once opened, there's a "Mobile" tab which exposes the configuration options of the mobile module. 68 | 69 | These options are quite simple. One set of radio buttons controls the behaviour 70 | of the mobile site, and there's text input fields to enter which domain you want 71 | to act as the mobile, and which is the full site, so that redirection can occur 72 | when a user accesses your site on a mobile device. 73 | 74 | There's also a dropdown of all themes on the site. The theme chosen here will be 75 | the one that mobile users of your site will see. 76 | 77 | Please keep in mind that the mobile domain must point to your site before it will work. 78 | 79 | ### Search Engine Optimization ### 80 | 81 | The module follows [Google's recommendations](http://googlewebmastercentral.blogspot.com/2011/02/making-websites-mobile-friendly.html) 82 | by using a 301 HTTP redirection when using the module in "domain redirection" mode. 83 | When using the same URLs, but different themes for mobile and non-mobile content, 84 | Google will detect this change by using a different user agent, and index accordingly. 85 | 86 | ## Limitations 87 | 88 | * No fine grained mobile browser detection. There is only a way to detect the device 89 | in general, e.g. Android or iPhone, but not the browser and features of the device 90 | * Only tested on Android and iPhone devices. Other devices NOT tested 91 | 92 | ## Future enhancements 93 | 94 | * Search form in the default theme 95 | * Integrate with subsites module to serve different content for a mobile site 96 | * Device feature detection e.g. "Does this device support SSL?" or "Does this device support XHTML?" for progressive enhancement 97 | * Dynamic image insertion and resizing via HTML5 data attributes 98 | -------------------------------------------------------------------------------- /_config.php: -------------------------------------------------------------------------------- 1 | 'Text', 39 | // Comma-separated list of non-mobile domains, without protocol 40 | 'FullSiteDomain' => 'Text', 41 | 'MobileTheme' => 'Varchar(255)', 42 | 'MobileSiteType' => 'Enum("Disabled,RedirectToDomain,MobileThemeOnly","Disabled")' 43 | ); 44 | 45 | private static $defaults = array( 46 | 'MobileTheme' => 'blackcandymobile', 47 | 'MobileSiteType' => 'Disabled' 48 | ); 49 | 50 | public function populateDefaults() { 51 | parent::populateDefaults(); 52 | 53 | $this->owner->MobileDomain = 'm.' . $_SERVER['HTTP_HOST']; 54 | $this->owner->FullSiteDomain = $_SERVER['HTTP_HOST']; 55 | } 56 | 57 | /** 58 | * @return String The first available domain, with the current protocol prefixed, 59 | * suitable for redirections etc. 60 | */ 61 | public function getMobileDomainNormalized() { 62 | $domains = explode(',', $this->owner->MobileDomain); 63 | $domain = array_shift($domains); 64 | if(!$domain) return false; 65 | if(!parse_url($domain, PHP_URL_SCHEME)) $domain = Director::protocol() . $domain; 66 | return $domain; 67 | } 68 | 69 | /** 70 | * @return String The first available domain, with the current protocol prefixed, 71 | * suitable for redirections etc. 72 | */ 73 | public function getFullSiteDomainNormalized() { 74 | $domains = explode(',', $this->owner->FullSiteDomain); 75 | $domain = array_shift($domains); 76 | if(!$domain) return false; 77 | if(!parse_url($domain, PHP_URL_SCHEME)) $domain = Director::protocol() . $domain; 78 | return $domain; 79 | } 80 | 81 | /** 82 | * Provide a default if MobileSiteType is not set. 83 | * @return string 84 | */ 85 | public function getMobileSiteType() { 86 | $defaults = $this->owner->stat('defaults'); 87 | $value = $this->owner->getField('MobileSiteType'); 88 | if(!$value) $value = $defaults['MobileSiteType']; 89 | return $value; 90 | } 91 | 92 | /** 93 | * Return possible values for the MobileSiteType field mapped 94 | * to a human readable title. 95 | * @return array 96 | */ 97 | public function getMobileSiteTypes() { 98 | $types = array(); 99 | $types['Disabled'] = _t('MobileSiteConfig.DISABLED', 'Disabled'); 100 | $types['RedirectToDomain'] = _t('MobileSiteConfig.REDIRECTDOMAIN', 'Mobile users are redirected to mobile domain'); 101 | $types['MobileThemeOnly'] = _t('MobileSiteConfig.USEANOTHERTHEME', 'Mobile users see mobile theme, but no redirection occurs'); 102 | return $types; 103 | } 104 | 105 | /** 106 | * The default theme is "blackcandymobile". If this is still set 107 | * as a field on SiteConfig, then make sure that it's copied 108 | * into the themes directory from the mobile module. 109 | */ 110 | public function augmentDatabase() { 111 | $defaultThemes = array('blackcandymobile', 'jquerymobile'); 112 | $currentTheme = $this->owner->getField('MobileTheme'); 113 | if(!$currentTheme || in_array($currentTheme, $defaultThemes)) { 114 | $this->copyDefaultTheme($currentTheme); 115 | } 116 | } 117 | 118 | /** 119 | * @param String 120 | */ 121 | public static function copyDefaultTheme($theme = null) { 122 | if(!self::$theme_copy_enabled) return; 123 | if(!$theme) $theme = 'blackcandymobile'; 124 | $src = BASE_PATH . '/' . MOBILE_DIR . '/themes/' . $theme; 125 | if(!file_exists($src)) { 126 | throw new InvalidArgumentException(sprintf('Theme "%s" not found in path %s', $theme, $src)); 127 | } 128 | 129 | $dst = self::get_theme_copy_path(); 130 | 131 | if(!file_exists($dst)) { 132 | @mkdir($dst); 133 | if(is_writable($dst)) { 134 | rcopy($src, $dst); 135 | DB::alteration_message( 136 | sprintf('Default mobile theme "%s" has been copied into the themes directory', $theme), 137 | 'created' 138 | ); 139 | } else { 140 | DB::alteration_message( 141 | sprintf( 142 | 'Could not copy default mobile theme "%s" into themes directory (permission denied). 143 | Please manually copy the "%s" directory from the mobile module into the themes directory.', 144 | $theme, 145 | $theme 146 | ), 147 | 'error' 148 | ); 149 | } 150 | } 151 | } 152 | 153 | /** 154 | * Append extra fields to the new Mobile tab in the cms. 155 | */ 156 | public function updateCMSFields(FieldList $fields) { 157 | $fields->addFieldsToTab( 158 | 'Root.Mobile', 159 | array( 160 | OptionsetField::create('MobileSiteType', _t('MobileSiteConfig.MOBILESITEBEHAVIOUR', 'Mobile site behaviour'), $this->getMobileSiteTypes()), 161 | TextField::create('MobileDomain', _t('MobileSiteConfig.MOBILEDOMAIN', 'Mobile domain (e.g. m.mysite.com, needs to be different from "Full site domain")')), 162 | TextField::create('FullSiteDomain', _t('MobileSiteConfig.FULLSITEDOMAIN', 'Full site domain (e.g. mysite.com, usually doesn\'t need to be changed)')), 163 | DropdownField::create('MobileTheme', _t('MobileSiteConfig.MOBILETHEME', 'Mobile theme'), $this->owner->getAvailableThemes()) 164 | ->setEmptyString(_t('SiteConfig.DEFAULTTHEME', '(Use default theme)')) 165 | ) 166 | ); 167 | } 168 | 169 | } 170 | 171 | /** 172 | * Copies a directory from source to destination 173 | * completely by recursively copying each 174 | * individual file. 175 | * 176 | * Note: This will ignore ".svn" directories. 177 | * 178 | * @param string $src Source path 179 | * @param string $dst Destination path 180 | */ 181 | function rcopy($src, $dst) { 182 | $dir = opendir($src); 183 | @mkdir($dst); 184 | while(false !== ($file = readdir($dir))) { 185 | if(($file != '.') && ($file != '..') && ($file != '.svn')) { 186 | if(is_dir($src . '/' . $file)) { 187 | rcopy($src . '/' . $file, $dst . '/' . $file); 188 | } else { 189 | copy($src . '/' . $file, $dst . '/' . $file); 190 | } 191 | } 192 | } 193 | closedir($dir); 194 | } 195 | -------------------------------------------------------------------------------- /code/MobileSiteControllerExtension.php: -------------------------------------------------------------------------------- 1 | owner->getRequest(); 30 | 31 | // If we've accessed the homepage as /home/, then we redirect to / and don't want to double redirect here 32 | if ($this->owner->redirectedTo()) { 33 | return; 34 | } 35 | 36 | // Enforce the site (cookie expires in 1 day) 37 | $fullSite = $request->getVar('fullSite'); 38 | 39 | if(is_numeric($fullSite)) { 40 | $fullSiteCookie = (int)$fullSite; 41 | Cookie::set('fullSite', $fullSiteCookie); 42 | 43 | // use the host of the desktop version of the site to set cross-(sub)domain cookie 44 | $domain = $config->FullSiteDomainNormalized; 45 | 46 | if (!empty($domain)) { 47 | Cookie::set('fullSite', $fullSite, self::$cookie_expire_time, null, '.' . parse_url($domain, PHP_URL_HOST)); 48 | } else { // otherwise just use a normal cookie with the default domain 49 | Cookie::set('fullSite', $fullSite, self::$cookie_expire_time); 50 | } 51 | } 52 | else { 53 | $fullSiteCookie = Cookie::get('fullSite'); 54 | } 55 | 56 | if(is_numeric($fullSiteCookie)) { 57 | // Full site requested 58 | if($fullSiteCookie) { 59 | if($this->onMobileDomain() && $config->MobileSiteType == 'RedirectToDomain') { 60 | return $this->owner->redirect($config->FullSiteDomainNormalized, 301); 61 | } 62 | 63 | return; 64 | } 65 | // Mobile site requested 66 | else { 67 | if(!$this->onMobileDomain() && $config->MobileSiteType == 'RedirectToDomain') { 68 | return $this->owner->redirect($config->MobileDomainNormalized, 301); 69 | } 70 | 71 | Config::inst()->update('SSViewer', 'theme', $config->MobileTheme); 72 | self::$is_mobile = true; 73 | return; 74 | } 75 | } 76 | 77 | // If the user requested the mobile domain, set the right theme 78 | if($this->onMobileDomain()) { 79 | Config::inst()->update('SSViewer', 'theme', $config->MobileTheme); 80 | self::$is_mobile = true; 81 | } 82 | 83 | // User just wants to see a theme, but no redirect occurs 84 | if(MobileBrowserDetector::is_mobile() && $config->MobileSiteType == 'MobileThemeOnly') { 85 | Config::inst()->update('SSViewer', 'theme', $config->MobileTheme); 86 | self::$is_mobile = true; 87 | } 88 | 89 | // If on a mobile device, but not on the mobile domain and has been setup for redirection 90 | if(!$this->onMobileDomain() && MobileBrowserDetector::is_mobile() && $config->MobileSiteType == 'RedirectToDomain') { 91 | return $this->owner->redirect($config->MobileDomainNormalized, 301); 92 | } 93 | } 94 | 95 | /** 96 | * Provide state information. We can't always rely on current theme, 97 | * as the user may elect to use the same theme for both sites. 98 | * 99 | * Useful for example for template conditionals. 100 | */ 101 | static public function is_mobile() { 102 | return self::$is_mobile; 103 | } 104 | 105 | /** 106 | * Return whether the user is requesting the mobile site - either by query string 107 | * or by saved cookie. Falls back to browser detection for first time visitors 108 | * 109 | * @return boolean 110 | */ 111 | public function requestedMobileSite() { 112 | $config = SiteConfig::current_site_config(); 113 | if ($config->MobileSiteType == 'Disabled') return false; 114 | 115 | $request = $this->owner->getRequest(); 116 | $fullSite = $request->getVar('fullSite'); 117 | if (is_numeric($fullSite)) { 118 | return ($fullSite == 0); 119 | } 120 | 121 | $fullSiteCookie = Cookie::get('fullSite'); 122 | if (is_numeric($fullSiteCookie)) { 123 | return ($fullSiteCookie == 0); 124 | } 125 | 126 | return MobileBrowserDetector::is_mobile(); 127 | } 128 | 129 | /** 130 | * Return whether the user is on the mobile version of the website. 131 | * Caution: This only has an effect when "MobileSiteType" is configured as "RedirectToDomain". 132 | * 133 | * @return boolean 134 | */ 135 | public function onMobileDomain() { 136 | $config = SiteConfig::current_site_config(); 137 | $domains = explode(',', $config->MobileDomain); 138 | foreach($domains as $domain) { 139 | if(!parse_url($domain, PHP_URL_SCHEME)) $domain = Director::protocol() . $domain; // Normalize URL 140 | $parts = parse_url($domain); 141 | $compare = @$parts['host']; 142 | if(@$parts['port']) $compare .= ':' . $parts['port']; 143 | if($compare && $compare == $_SERVER['HTTP_HOST']) return true; 144 | } 145 | 146 | return false; 147 | } 148 | 149 | /** 150 | * @return boolean 151 | */ 152 | public function isMobile() { 153 | return MobileSiteControllerExtension::$is_mobile; 154 | } 155 | 156 | /** 157 | * Return a link to the full site. 158 | * 159 | * @return string 160 | */ 161 | public function FullSiteLink() { 162 | return Controller::join_links($this->owner->Link(), '?fullSite=1'); 163 | } 164 | 165 | /** 166 | * @return string 167 | */ 168 | public function MobileSiteLink() { 169 | return Controller::join_links($this->owner->Link(), '?fullSite=0'); 170 | } 171 | 172 | /** 173 | * Is the current HTTP_USER_AGENT a known iPhone or iPod Touch 174 | * mobile agent string? 175 | * 176 | * @return boolean 177 | */ 178 | public function IsiPhone() { 179 | return MobileBrowserDetector::is_iphone(); 180 | } 181 | 182 | /** 183 | * Is the current HTTP_USER_AGENT a known Android mobile 184 | * agent string? 185 | * 186 | * @return boolean 187 | */ 188 | public function IsAndroid() { 189 | return MobileBrowserDetector::is_android(); 190 | } 191 | 192 | /** 193 | * Is the current HTTP_USER_AGENT a known Opera Mini 194 | * agent string? 195 | * 196 | * @return boolean 197 | */ 198 | public function IsOperaMini() { 199 | return MobileBrowserDetector::is_opera_mini(); 200 | } 201 | 202 | /** 203 | * Is the current HTTP_USER_AGENT a known Blackberry 204 | * mobile agent string? 205 | * 206 | * @return boolean 207 | */ 208 | public function IsBlackBerry() { 209 | return MobileBrowserDetector::is_blackberry(); 210 | } 211 | 212 | } 213 | -------------------------------------------------------------------------------- /code/MobileSiteTreeExtension.php: -------------------------------------------------------------------------------- 1 | hasMethod("onMobileDomain") && Controller::curr()->onMobileDomain() && $config->MobileSiteType == 'RedirectToDomain') { 12 | $oldBaseURL = Director::baseURL(); 13 | 14 | Config::inst()->update('Director', 'alternate_base_url', $config->FullSiteDomain); 15 | $tags .= sprintf('', $this->owner->AbsoluteLink()) . "\n"; 16 | Config::inst()->update('Director', 'alternate_base_url', $oldBaseURL); 17 | } 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "silverstripe/mobile", 3 | "description": "The mobile module provides detection for mobile devices, and can serve a different SilverStripe theme to them.The module can either use redirection to a separate mobile domain, or serve mobile optimized content under the same URLs.", 4 | "type": "silverstripe-module", 5 | "keywords": ["silverstripe", "mobile"], 6 | "authors": [ 7 | { 8 | "name": "Sean Harvey", 9 | "email": "sean@silverstripe.com" 10 | }, 11 | { 12 | "name": "Will Rossiter", 13 | "email": "will@fullscreen.io" 14 | } 15 | ], 16 | "require": { 17 | "silverstripe/framework": "~3.1" 18 | }, 19 | "license": "BSD-3-Clause" 20 | } 21 | -------------------------------------------------------------------------------- /license.md: -------------------------------------------------------------------------------- 1 | Copyright (c) 2016, SilverStripe Limited 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 5 | 6 | 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 7 | 8 | 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 9 | 10 | 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 11 | 12 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 13 | -------------------------------------------------------------------------------- /themes/blackcandymobile/css/form.css: -------------------------------------------------------------------------------- 1 | /** 2 | * SilverStripe Black Candy Theme 3 | * http://www.silverstripe.com 4 | * 5 | * Form Styling 6 | */ 7 | 8 | 9 | /* FORM 10 | ---------------------------------------- */ 11 | form { 12 | border-bottom:1px solid #CCCCCC; 13 | margin:0 0 18px 0; 14 | padding-bottom:18px; 15 | } 16 | 17 | /* FIELDSETS 18 | ---------------------------------------- */ 19 | fieldset { 20 | border: 0; 21 | } 22 | 23 | /* ACTION BUTTONS 24 | ---------------------------------------- */ 25 | input.action { 26 | padding: 2px; 27 | font-size: 14px ; 28 | font-family: Verdana, Tahoma, Sans-serif; 29 | margin:10px 0 10px 0; 30 | } 31 | input.action:hover, 32 | input.action:focus { 33 | cursor: pointer; 34 | } 35 | 36 | /* FIELD FORMATING 37 | ---------------------------------------- */ 38 | form ul { 39 | list-style: none; 40 | } 41 | .middleColumn { 42 | display: block; 43 | /*margin: 15px 10px 10px 0;*/ 44 | /*background: #E9E9E9;*/ 45 | /*padding: 4px;*/ 46 | /*width: 306px;*/ 47 | clear: left; 48 | } 49 | #Sidebar .middleColumn { 50 | margin: 0 0 0 8px; 51 | display: inline; 52 | } 53 | 54 | div.tab .field .middleColumn { 55 | clear: none !important; 56 | margin: 0 !important; 57 | width: auto; 58 | } 59 | 60 | .middleColumn .middleColumn { 61 | margin-left: 0; 62 | margin-right: 0; 63 | padding: 0; 64 | } 65 | 66 | .middleColumn .message { 67 | margin: 0; 68 | } 69 | 70 | /* INPUT BOXS 71 | ---------------------------------------- */ 72 | 73 | input.text, textarea, select { 74 | padding: 6px 2px 5px 2px; 75 | border: 1px solid #A7A7A7; 76 | color: #000; 77 | font-size: 14px; 78 | font-weight: bold; 79 | width:99.25%; 80 | margin:0 0 18px 0; 81 | } 82 | 83 | textarea { 84 | font-family: Verdana, Tahoma, sans-serif; 85 | font-size: 12px; 86 | } 87 | input:focus span, textarea:focus span { 88 | border: 3px solid #000; 89 | } 90 | 91 | /* SELECT DROPDOWN 92 | ---------------------------------------- */ 93 | 94 | select { 95 | width: auto; 96 | } 97 | 98 | /* LABELS 99 | ---------------------------------------- */ 100 | .typography label { 101 | display: block; 102 | font-weight:bold; 103 | margin: 0 0 18px 0; 104 | color: #777; 105 | font-size: 14px; 106 | } 107 | 108 | label.right { 109 | display:inline; 110 | } 111 | 112 | /* CHECKBOXES 113 | ---------------------------------------- */ 114 | ul.optionset { 115 | margin: 0; 116 | overflow: hidden; 117 | } 118 | ul.optionset li { 119 | margin: 6px 0; 120 | clear: both; 121 | } 122 | ul.optionset li input { 123 | float: left; 124 | margin: 0 6px; 125 | } 126 | ul.optionset li label { 127 | margin: 0; 128 | } -------------------------------------------------------------------------------- /themes/blackcandymobile/css/layout.css: -------------------------------------------------------------------------------- 1 | /** 2 | * SilverStripe Mobile Theme http://www.silverstripe.com 3 | */ 4 | /* Misc Styles and defaults 5 | -------------------------------------------- */ 6 | * { margin:0; padding:0; } 7 | body { color:#333; font-family:Helvetica, Arial, sans-serif; font-size:62.5%; line-height:18px; } 8 | html { background:#626467 url(../images/bg.gif) repeat; } 9 | table { border-collapse:collapse; border-spacing:0; } 10 | caption, th, td { text-align:left; font-weight:normal; } 11 | img { max-width:320px; } 12 | .clear { clear:both; } 13 | /* CONTAINER */ 14 | #Container { background:#ffffff; padding:0 0 5px 0; width:100%; } 15 | #Layout { padding:10px 15px; } 16 | /* HEADER */ 17 | #Header { background: #58ade1 url(../images/header.gif) repeat-x left center; margin:0 10px; overflow:hidden; } 18 | #Header h1 { color:#fff; padding:10px 0 10px 10px; } 19 | #Header p { color:#fff; clear:left; font-size:12px; font-weight:bold; margin:0 0 0 10px; } 20 | /* NAVIGATION */ 21 | #Navigation { background:#4ea3d7; margin:0 10px; overflow:hidden; padding:10px 0px 0px 0px; 22 | -moz-border-radius-bottomleft:10px; -webkit-border-bottom-left-radius:10px; border-bottom-left-radius:10px; 23 | -moz-border-radius-bottomright:10px; -webkit-border-bottom-right-radius:10px; border-bottom-right-radius:10px; } 24 | #Navigation ul li { display:block; list-style:none; margin:0; } 25 | #Navigation ul li a { color:#fff; display:block; font-size:14px; font-weight:bold; line-height:36px; padding:0 0 0 9px; text-decoration:none; } 26 | #Navigation ul li.current, 27 | #Navigation ul li.section { border-left:1px solid #CCC; border-right:1px solid #CCC; } 28 | #Navigation ul li.current a, 29 | #Navigation ul.sub li.current a { background:#fff; color:#444; } 30 | #Navigation ul li.section a { background:#fff; color:#999; } 31 | #Navigation ul.sub { background:#ffffff; padding:0; } 32 | #Navigation ul.sub li { border:none; } 33 | #Navigation ul.sub li a { border-top:1px solid #CCC; color:#999; padding-left:18px; } 34 | /* FOOTER */ 35 | #Footer { background:#4EA3D7; clear:both; margin:10px; padding:10px 15px; text-align:center; -moz-border-radius:10px; -webkit-border-radius:10px; border-radius:10px; } 36 | #Footer p { color:#fff; font-size:11px; text-align:center; } 37 | #Footer a { color: #fff; text-decoration:none; } 38 | #Footer a:hover { color:#fff; text-decoration:underline; } 39 | /* PAGE COMMENTS */ 40 | #PageComments_holder { border-top:1px solid #CCCCCC; padding-top:18px; } 41 | #CommentHolder ul { margin:0; padding:0; list-style:none; } 42 | #CommentHolder li { margin:0; padding:0; list-style:none; } 43 | #PageComments li { border-bottom:1px solid #CCCCCC; margin:0 0 18px 0; padding:0 0 18px 0; } 44 | #PageComments .info { font-size:12px; font-style:italic; } 45 | #PageComments .actionLinks { overflow:hidden; } 46 | #PageComments .actionLinks li { border:none; display:block; float:left; margin:0 9px 0 0; padding:0; } 47 | #DeleteComments, #CommentsRSSFeed { margin-bottom:0; padding:0; font-size:12px; } 48 | .typography .spamlink, .typography .deletelink { background:#3E91C4; color:#FFFFFF; font-size:12px; padding:3px 6px; text-align:center; } -------------------------------------------------------------------------------- /themes/blackcandymobile/css/typography.css: -------------------------------------------------------------------------------- 1 | /** 2 | * SilverStripe Mobile Theme 3 | * http://www.silverstripe.com 4 | * 5 | * This typography file is included in the WYSIWYG editor and the front end. It provides 6 | * a place to add link styles and font styles you would like in the CMS and the Front End. 7 | */ 8 | /* GENERIC STYLES */ 9 | .typography * { font-family:Helvetica, Arial, sans-serif; } 10 | /* PARAGRAPHS */ 11 | .typography p { color: #666; font-weight:bold; font-size: 14px; line-height:18px; margin:0 0 18px 0; } 12 | /* QUOTES */ 13 | .typography blockquote { color:#777; font-size:1.4em; font-style:italic; margin:10px; } 14 | .typography q { border:1px #ccc solid; display:block; font-size:0.8em; margin: 1em 1em; padding:0.5em; } 15 | /* LINKS */ 16 | .typography a { color:#3E91C4; text-decoration:none; } 17 | .typography a:hover { text-decoration:underline; } 18 | /* LINK ICONS - shows type of file */ 19 | .typography a[href$=".pdf"], .typography a[href$=".PDF"], .typography a.pdf { background:url(../images/icons/page_white_acrobat.png) no-repeat left center; padding:2px; padding-left:20px; } 20 | .typography a[href$=".doc"], .typography a[href$=".DOC"], .typography a.doc { background:url(../images/icons/page_word.png) no-repeat left center; padding:2px; padding-left:20px; } 21 | .typography a[href$=".xls"], .typography a[href$=".XLS"], .typography a.xls { background:url(../images/icons/page_excel.png) no-repeat left center; padding:2px; padding-left:20px; } 22 | .typography a[href$=".gz"], .typography a[href$=".GZ"], .typography a[href$=".gzip"], .typography a[href$=".GZIP"], .typography a[href$=".zip"], .typography a[href$=".ZIP"], .typography a.archive { background:url(../images/icons/page_white_zip.png) no-repeat left center; padding:2px; padding-left:20px; } 23 | .typography a[href$=".exe"], .typography a[href$=".EXE"], .typography a.application { background:url(../images/icons/application.png) no-repeat left center; padding:2px; padding-left:20px; } 24 | /* LIST STYLES */ 25 | .typography ul, 26 | .typography ol { margin:0 0 18px 18px; color:#666; } 27 | .typography li { font-size:13px; font-weight:bold; margin:0px 9px; } 28 | .typography li li { } 29 | /* HEADER STYLES */ 30 | .typography h1 { color:#4EA3D7; font-size:27px; font-weight:bold; line-height:1; margin:18px 0 18px 0; } 31 | .typography h2 { color:#222; font-size:24px; font-weight:bold; line-height:1.125; margin:18px 0 18px 0; } 32 | .typography h3 { clear:both; color:#222; font-weight:bold; font-size:18px; line-height:1; margin:9px 0 18px 0; } 33 | .typography h4 { clear:both; color:#222; font-size:16px; font-weight:bold; line-height:1.2857; margin:0 0 9px 0; } 34 | .typography h5 { color:#222; font-size:14px; font-weight:bold; line-height:1.2857; margin:0; } 35 | .typography h6 { color:#555; font-size:14px; font-weight:bold; line-height:1.3846; margin:0; } 36 | /* PRE STYLES */ 37 | .typography pre { display:block; font-family:"Courier New",Courier; font-size:1.2em; margin:2em 5em; padding:0.5em; border:1px #ccc solid; background:#eee; } 38 | /* TABLE STYLING */ 39 | .typography table { border-collapse:collapse; border:1px dotted #CCCCCC; color:#666; font-size:12px; margin:0 0 18px 0; } 40 | .typography tr {} 41 | .typography th { background:#4EA3D7; border:1px dotted #CCCCCC; color:#FFFFFF; font-weight:bold; padding:6px 5px 3px 5px; } 42 | .typography td { border:1px dotted #CCCCCC; font-weight:bold; padding:6px 5px 3px 5px; } 43 | /* WYSIWYG EDITOR ALIGNMENT CLASSES */ 44 | .typography .left { text-align:left; } 45 | .typography .center { text-align:center; } 46 | .typography .right { text-align:right; } 47 | /* IMAGES */ 48 | .typography img { border:none; } 49 | .typography img.right { float:right; margin:0 0 18px 18px; } 50 | .typography img.left { float:left; margin:0 18px 18px 0; } 51 | .typography img.leftAlone { float:left; margin-right:100%; } 52 | .typography img.center { float:none; margin-left:auto; margin-right:auto; display:block; } 53 | -------------------------------------------------------------------------------- /themes/blackcandymobile/images/activeTabLeft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/silverstripe-archive/silverstripe-mobile/6332f6a4e0ddbbd23299137ceebc6b6f4b319a2f/themes/blackcandymobile/images/activeTabLeft.png -------------------------------------------------------------------------------- /themes/blackcandymobile/images/activeTabRight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/silverstripe-archive/silverstripe-mobile/6332f6a4e0ddbbd23299137ceebc6b6f4b319a2f/themes/blackcandymobile/images/activeTabRight.png -------------------------------------------------------------------------------- /themes/blackcandymobile/images/bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/silverstripe-archive/silverstripe-mobile/6332f6a4e0ddbbd23299137ceebc6b6f4b319a2f/themes/blackcandymobile/images/bg.gif -------------------------------------------------------------------------------- /themes/blackcandymobile/images/header.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/silverstripe-archive/silverstripe-mobile/6332f6a4e0ddbbd23299137ceebc6b6f4b319a2f/themes/blackcandymobile/images/header.gif -------------------------------------------------------------------------------- /themes/blackcandymobile/images/headerRounded.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/silverstripe-archive/silverstripe-mobile/6332f6a4e0ddbbd23299137ceebc6b6f4b319a2f/themes/blackcandymobile/images/headerRounded.gif -------------------------------------------------------------------------------- /themes/blackcandymobile/js/iphone.js: -------------------------------------------------------------------------------- 1 | var $j = jQuery.noConflict(); 2 | 3 | $j(document).ready(function(){ 4 | 5 | 6 | $j("body").addClass("iphone portrait"); 7 | $j.iPhone.disableTextSizeAdjust(); 8 | 9 | $j(document).iPhone.orientchange( 10 | function(){ 11 | $j("body").removeClass("landscape"); 12 | $j("body").addClass("portrait"); 13 | }, 14 | function(){ 15 | $j("body").removeClass("portrait"); 16 | $j("body").addClass("landscape"); 17 | } 18 | ); 19 | 20 | }); 21 | -------------------------------------------------------------------------------- /themes/blackcandymobile/js/jquery-1.4.2.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery JavaScript Library v1.4.2 3 | * http://jquery.com/ 4 | * 5 | * Copyright 2010, John Resig 6 | * Dual licensed under the MIT or GPL Version 2 licenses. 7 | * http://jquery.org/license 8 | * 9 | * Includes Sizzle.js 10 | * http://sizzlejs.com/ 11 | * Copyright 2010, The Dojo Foundation 12 | * Released under the MIT, BSD, and GPL Licenses. 13 | * 14 | * Date: Sat Feb 13 22:33:48 2010 -0500 15 | */ 16 | (function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/, 21 | Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&& 22 | (d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this, 23 | a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b=== 24 | "find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this, 25 | function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b
a"; 34 | var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected, 35 | parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent= 36 | false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n= 37 | s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true, 38 | applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando]; 39 | else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this, 40 | a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b=== 41 | w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i, 42 | cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected= 47 | c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); 48 | a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g, 49 | function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split("."); 50 | k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a), 51 | C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B=0){a.type= 53 | e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&& 54 | f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive; 55 | if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data", 63 | e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a, 64 | "_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a, 65 | d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, 71 | e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift(); 72 | t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D|| 73 | g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()}, 80 | CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m, 81 | g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)}, 82 | text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}}, 83 | setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return hl[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h= 84 | h[3];l=0;for(m=h.length;l=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m=== 86 | "="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g, 87 | h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&& 90 | q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML=""; 91 | if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="

";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}(); 92 | (function(){var g=s.createElement("div");g.innerHTML="
";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}: 93 | function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f0)for(var j=d;j0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j= 96 | {},i;if(f&&a.length){e=0;for(var o=a.length;e-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a=== 97 | "string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode", 98 | d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")? 99 | a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType=== 100 | 1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/"},F={option:[1,""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div
","
"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= 102 | c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, 103 | wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, 104 | prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, 105 | this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); 106 | return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja, 107 | ""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]); 111 | return this}else{e=0;for(var j=d.length;e0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["", 112 | ""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]===""&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e= 113 | c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]? 114 | c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja= 115 | function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter= 116 | Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a, 117 | "border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f= 118 | a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b= 119 | a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=//gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== 120 | "string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("
").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this}, 121 | serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), 122 | function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href, 123 | global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&& 124 | e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)? 125 | "&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache=== 126 | false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B= 127 | false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since", 128 | c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E|| 129 | d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x); 130 | g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status=== 131 | 1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b=== 132 | "json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional; 133 | if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration=== 139 | "number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]|| 140 | c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start; 141 | this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now= 142 | this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem, 143 | e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b
"; 149 | a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b); 150 | c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a, 151 | d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top- 152 | f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset": 153 | "pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in 154 | e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window); 155 | -------------------------------------------------------------------------------- /themes/blackcandymobile/js/jquery.iphone.min.js: -------------------------------------------------------------------------------- 1 | jQuery.fn.iPhone={present:(navigator.platform=='iPhone'),version:{safari:(/AppleWebKit\/([^\s]+)/.exec(navigator.userAgent)||[,false])[1],webkit:(/Safari\/(.+)/.exec(navigator.userAgent)||[,false])[1]},orientchange:function(p,l,r){p=p||function(){};l=l||p;r=r||l;window.onorientationchange=function(){switch(window.orientation){case 0:p();break;case 90:l();break;case-90:r();break;};};},hideURLbar:function(f){if(window.innerHeight<(window.outerHeight+20)){$('html').css({'min-height':(window.outerHeight+20)+'px'});} 2 | setTimeout(function(){if(window.pageYOffset<1||f){window.scrollTo(0,1);jQuery.iPhone.hideURLbar();}},0);},disableTextSizeAdjust:function(){jQuery('html').css({'-webkit-text-size-adjust':'none'});},enableTextSizeAdjust:function(){jQuery('html').css({'-webkit-text-size-adjust':'auto'});}};jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i 2 | 5 | <% end_if %> -------------------------------------------------------------------------------- /themes/blackcandymobile/templates/Includes/Footer.ss: -------------------------------------------------------------------------------- 1 |

© $Now.year | Powered by SilverStripe | Full site

2 | -------------------------------------------------------------------------------- /themes/blackcandymobile/templates/Includes/Navigation.ss: -------------------------------------------------------------------------------- 1 |
    2 | <% loop Menu(1) %> 3 | <% if Children %> 4 |
  • $MenuTitle.XML 5 | <% else %> 6 |
  • $MenuTitle.XML 7 | <% end_if %> 8 | <% if LinkOrSection = section %> 9 | <% if Children %> 10 |
      11 | <% loop Children %> 12 |
    • $MenuTitle.XML
    • 13 | <% end_loop %> 14 |
    15 | <% end_if %> 16 | <% end_if %> 17 |
  • 18 | <% end_loop %> 19 |
-------------------------------------------------------------------------------- /themes/blackcandymobile/templates/Includes/SideBar.ss: -------------------------------------------------------------------------------- 1 | 28 | -------------------------------------------------------------------------------- /themes/blackcandymobile/templates/Layout/Page.ss: -------------------------------------------------------------------------------- 1 |
2 |

$Title

3 | $Content 4 | $Form 5 | $PageComments 6 |
-------------------------------------------------------------------------------- /themes/blackcandymobile/templates/Page.ss: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | <% base_tag %> 5 | <% if MetaTitle %>$MetaTitle<% else %>$Title<% end_if %> » $SiteConfig.Title 6 | $MetaTags(false) 7 | 8 | 9 | <% require themedCSS(layout) %> 10 | <% require themedCSS(typography) %> 11 | <% require themedCSS(form) %> 12 | 13 | 14 | 15 | 16 | 17 |
18 | 22 | 23 | 26 | 27 |
28 | $Layout 29 |
30 | 31 | 34 |
35 | 36 | -------------------------------------------------------------------------------- /themes/jquerymobile/templates/Includes/Footer.ss: -------------------------------------------------------------------------------- 1 |

2 | 3 | Made with 4 | SilverStripe 5 | 6 |

-------------------------------------------------------------------------------- /themes/jquerymobile/templates/Includes/Navigation.ss: -------------------------------------------------------------------------------- 1 |
2 | 13 |
-------------------------------------------------------------------------------- /themes/jquerymobile/templates/Includes/Navigation_manypages.ss: -------------------------------------------------------------------------------- 1 | <%-- Alternate template rendering nav with more pages as a list rather than a navigation bar --%> 2 |
3 | 14 |
-------------------------------------------------------------------------------- /themes/jquerymobile/templates/Layout/Page.ss: -------------------------------------------------------------------------------- 1 | <% if Level(2) %> 2 | 3 | <% end_if %> 4 | 5 |
6 | $Content 7 |
8 | 9 | <% if Menu(2) %> 10 | 19 | <% end_if %> -------------------------------------------------------------------------------- /themes/jquerymobile/templates/Page.ss: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | <% base_tag %> 5 | $Title 6 | $MetaTags(false) 7 | 8 | <%-- Caution: Any Requirements calls in init() methods of custom page types won't work due to jQuery Mobile loading pages via Ajax, place them all in Page_Controller --%> 9 | 10 | 11 | 12 | 13 | 14 |
15 |
16 | 18 | Home 19 | 20 |

$SiteConfig.Title

21 | <%-- See Navigation_manypages.ss for handling more than half a dozen toplevel pages --%> 22 | <% include Navigation %> 23 |
24 |
25 | $Layout 26 |
27 |
28 | <% include Footer %> 29 |
30 |
31 | --------------------------------------------------------------------------------