From 954c86105af843c37541f53e21df00590ba7f9d5 Mon Sep 17 00:00:00 2001 From: Alan Pich Date: Wed, 15 May 2013 09:48:03 +0100 Subject: [PATCH 001/515] Add phpstorm .idea folder to gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 90c14fcb..7f7eae1e 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -config.core.php \ No newline at end of file +config.core.php +.idea \ No newline at end of file From 563fb85b1662aaced67d55c3f7d43bb60c686cb7 Mon Sep 17 00:00:00 2001 From: Alan Pich Date: Wed, 15 May 2013 09:53:21 +0100 Subject: [PATCH 002/515] Added translations to changelog --- core/components/tvimageplus/docs/changelog.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/core/components/tvimageplus/docs/changelog.txt b/core/components/tvimageplus/docs/changelog.txt index b4e5bb67..7058919a 100644 --- a/core/components/tvimageplus/docs/changelog.txt +++ b/core/components/tvimageplus/docs/changelog.txt @@ -2,6 +2,18 @@ Image+ TV type changelog ------------------------- +# v2.2 +-------- + :: Added Czech translation (@TheBoxer) + :: Added Danish translation (@Flygenring) + :: Added German translation (@KristianP) + :: Added Spanish translation (Nico Telfer) + :: Added French translation (@rtripault) + :: Added Hungarian translation (Kristof Kotai) + :: Added Italian translation (@tillilab) + :: Added Dutch translation (@Mark-H) + :: Added Russian translation (@Alroniks)g + # v2.1 -------- :: Fixed bug with non-default media sources From 15062c58580bd17936c04fb7b4c304beb4c93569 Mon Sep 17 00:00:00 2001 From: Alan Pich Date: Wed, 15 May 2013 10:01:47 +0100 Subject: [PATCH 003/515] #25 Allow system setting override for core_path and assets_url --- assets/components/tvimageplus/mgr/connector.php | 2 +- .../tvimageplus/elements/plugins/plugin.ImagePlusRouter.php | 4 ++-- .../tvimageplus/elements/tv/input/imageplus.class.php | 2 +- .../tvimageplus/elements/tv/input/options/imageplus.php | 2 +- .../tvimageplus/elements/tv/output/imageplus.class.php | 2 +- .../tvimageplus/elements/tv/output/options/imageplus.php | 2 +- core/components/tvimageplus/tvImagePlus.class.php | 4 ++-- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/assets/components/tvimageplus/mgr/connector.php b/assets/components/tvimageplus/mgr/connector.php index 7cbdbb84..11e414b2 100644 --- a/assets/components/tvimageplus/mgr/connector.php +++ b/assets/components/tvimageplus/mgr/connector.php @@ -14,6 +14,6 @@ // Handle request $modx->request->handleRequest(array( - 'processors_path' => $modx->getOption('core_path').'components/tvimageplus/processors/', + 'processors_path' => $modx->getOption('tvimageplus.core_path',null,$modx->getOption('core_path').'components/tvimageplus/').'processors/', 'location' => '', )); \ No newline at end of file diff --git a/core/components/tvimageplus/elements/plugins/plugin.ImagePlusRouter.php b/core/components/tvimageplus/elements/plugins/plugin.ImagePlusRouter.php index 357aa5ca..b2894f64 100644 --- a/core/components/tvimageplus/elements/plugins/plugin.ImagePlusRouter.php +++ b/core/components/tvimageplus/elements/plugins/plugin.ImagePlusRouter.php @@ -1,6 +1,6 @@ getOption('core_path',null,MODX_CORE_PATH).'components/tvimageplus/'; -$assetsUrl = $modx->getOption('assets_url',null,MODX_ASSETS_URL).'components/tvimageplus/js/mgr/'; +$corePath = $modx->getOption('tvimageplus.core_path',null,$modx->getOption('core_path',null,MODX_CORE_PATH).'components/tvimageplus/'); +$assetsUrl = $modx->getOption('tvimageplus.assets_url',null,$modx->getOption('assets_url',null,MODX_ASSETS_URL).'components/tvimageplus/js/mgr/'); $modx->lexicon->load('tvimageplus:default'); diff --git a/core/components/tvimageplus/elements/tv/input/imageplus.class.php b/core/components/tvimageplus/elements/tv/input/imageplus.class.php index a64619dd..58229c19 100644 --- a/core/components/tvimageplus/elements/tv/input/imageplus.class.php +++ b/core/components/tvimageplus/elements/tv/input/imageplus.class.php @@ -20,7 +20,7 @@ public function process($value,array $params = array()) { // Load helper class if(!class_exists('tvImagePlus')){ - require $this->modx->getOption('core_path').'components/tvimageplus/tvImagePlus.class.php'; }; + require $this->modx->getOption('tvimageplus.core_path',null,$this->modx->getOption('core_path').'components/tvimageplus/tvImagePlus.class.php'); }; $this->helper = new tvImagePlus($this->modx); // Load required javascripts & register global config diff --git a/core/components/tvimageplus/elements/tv/input/options/imageplus.php b/core/components/tvimageplus/elements/tv/input/options/imageplus.php index 92e368fd..83d73a54 100644 --- a/core/components/tvimageplus/elements/tv/input/options/imageplus.php +++ b/core/components/tvimageplus/elements/tv/input/options/imageplus.php @@ -1,5 +1,5 @@ getOption('core_path').'components/tvimageplus/'; +$root = $modx->getOption('tvimageplus.core_path',null,$modx->getOption('core_path').'components/tvimageplus/'); if(!class_exists('tvImagePlus')){ require $root.'tvImagePlus.class.php'; }; $helper = new tvImagePlus($modx); diff --git a/core/components/tvimageplus/elements/tv/output/imageplus.class.php b/core/components/tvimageplus/elements/tv/output/imageplus.class.php index 557c7f68..c666c110 100644 --- a/core/components/tvimageplus/elements/tv/output/imageplus.class.php +++ b/core/components/tvimageplus/elements/tv/output/imageplus.class.php @@ -2,7 +2,7 @@ class ImagePlusOutputRender extends modTemplateVarOutputRender { public function process($value,array $params = array()) { // Load the helper library if its not already here - if(!class_exists('tvImagePlus')){ require_once $this->modx->getOption('core_path').'components/tvimageplus/tvImagePlus.class.php'; }; + if(!class_exists('tvImagePlus')){ require_once $this->modx->getOption('tvimageplus.core_path',null,$this->modx->getOption('core_path').'components/tvimageplus/').'tvImagePlus.class.php'; }; $this->helper = new tvImagePlus($this->modx); diff --git a/core/components/tvimageplus/elements/tv/output/options/imageplus.php b/core/components/tvimageplus/elements/tv/output/options/imageplus.php index fce2c00b..8aa8007b 100644 --- a/core/components/tvimageplus/elements/tv/output/options/imageplus.php +++ b/core/components/tvimageplus/elements/tv/output/options/imageplus.php @@ -1,6 +1,6 @@ getOption('core_path').'components/tvimageplus/'; +$root = $modx->getOption('tvimageplus.core_path',null,$modx->getOption('core_path').'components/tvimageplus/'); if(!class_exists('tvImagePlus')){ require $root.'tvImagePlus.class.php'; }; $helper = new tvImagePlus($modx); diff --git a/core/components/tvimageplus/tvImagePlus.class.php b/core/components/tvimageplus/tvImagePlus.class.php index 9184ca0c..68426331 100644 --- a/core/components/tvimageplus/tvImagePlus.class.php +++ b/core/components/tvimageplus/tvImagePlus.class.php @@ -14,8 +14,8 @@ function __construct(modX &$modx){ private function loadConfig(){ - $core = $this->modx->getOption('core_path').'components/tvimageplus/'; - $assets = $this->modx->getOption('assets_url').'components/tvimageplus/'; + $core = $this->modx->getOption('tvimageplus.core_path',null,$this->modx->getOption('core_path').'components/tvimageplus/'); + $assets = $this->modx->getOption('tvimageplus.assets_url',null,$this->modx->getOption('assets_url').'components/tvimageplus/'); $this->config = array( 'core_path' => $core, 'assets_url' => $assets, From 0c6b9471851a6166a6c43f4b4be9f9ee2bef17fe Mon Sep 17 00:00:00 2001 From: Alan Pich Date: Wed, 15 May 2013 14:11:04 +0100 Subject: [PATCH 004/515] Added onDocFormRender hook to plugin --- .../components/tvimageplus/docs/changelog.txt | 3 +- .../plugins/plugin.ImagePlusRouter.php | 42 +++- .../tvimageplus/tvImagePlus.class.php | 215 +++++++++++------- 3 files changed, 168 insertions(+), 92 deletions(-) diff --git a/core/components/tvimageplus/docs/changelog.txt b/core/components/tvimageplus/docs/changelog.txt index 7058919a..296e7f75 100644 --- a/core/components/tvimageplus/docs/changelog.txt +++ b/core/components/tvimageplus/docs/changelog.txt @@ -4,6 +4,7 @@ # v2.2 -------- + :: Added system setting override for core_path and assets_url (#25) :: Added Czech translation (@TheBoxer) :: Added Danish translation (@Flygenring) :: Added German translation (@KristianP) @@ -12,7 +13,7 @@ :: Added Hungarian translation (Kristof Kotai) :: Added Italian translation (@tillilab) :: Added Dutch translation (@Mark-H) - :: Added Russian translation (@Alroniks)g + :: Added Russian translation (@Alroniks) # v2.1 -------- diff --git a/core/components/tvimageplus/elements/plugins/plugin.ImagePlusRouter.php b/core/components/tvimageplus/elements/plugins/plugin.ImagePlusRouter.php index b2894f64..981ba2ab 100644 --- a/core/components/tvimageplus/elements/plugins/plugin.ImagePlusRouter.php +++ b/core/components/tvimageplus/elements/plugins/plugin.ImagePlusRouter.php @@ -1,20 +1,50 @@ getOption('tvimageplus.core_path',null,$modx->getOption('core_path',null,MODX_CORE_PATH).'components/tvimageplus/'); -$assetsUrl = $modx->getOption('tvimageplus.assets_url',null,$modx->getOption('assets_url',null,MODX_ASSETS_URL).'components/tvimageplus/js/mgr/'); +/** + * Image+ runtime hooks - registers custom TV input & output types + * and includes javascripts on document edit pages so that the TV + * can be used from within MIGX + * + * @plugin ImagePlusRouter + * @package tvimageplus + * @locked + * + * @event OnTVInputRenderList + * @event OnTVOutputRenderList + * @event OnTVInputPropertiesList + * @event OnTVOutputPropertiesList + * @event OnDocFormRender + * + */ + +$corePath = $modx->getOption( + 'tvimageplus.core_path', + null, + $modx->getOption('core_path', null, MODX_CORE_PATH) . 'components/tvimageplus/' +); +$assetsUrl = $modx->getOption( + 'tvimageplus.assets_url', + null, + $modx->getOption('assets_url', null, MODX_ASSETS_URL) . 'components/tvimageplus/js/mgr/' +); $modx->lexicon->load('tvimageplus:default'); switch ($modx->event->name) { case 'OnTVInputRenderList': - $modx->event->output($corePath.'elements/tv/input/'); + $modx->event->output($corePath . 'elements/tv/input/'); break; case 'OnTVOutputRenderList': - $modx->event->output($corePath.'elements/tv/output/'); + $modx->event->output($corePath . 'elements/tv/output/'); break; case 'OnTVInputPropertiesList': - $modx->event->output($corePath.'elements/tv/input/options/'); + $modx->event->output($corePath . 'elements/tv/input/options/'); break; case 'OnTVOutputRenderPropertiesList': - $modx->event->output($corePath.'elements/tv/output/options/'); + $modx->event->output($corePath . 'elements/tv/output/options/'); + break; + case 'OnDocFormRender': + include $corePath."tvImagePlus.class.php"; + $helper = new tvImagePlus($modx); + $helper->includeScriptAssets(); break; }; \ No newline at end of file diff --git a/core/components/tvimageplus/tvImagePlus.class.php b/core/components/tvimageplus/tvImagePlus.class.php index 68426331..de5c0c08 100644 --- a/core/components/tvimageplus/tvImagePlus.class.php +++ b/core/components/tvimageplus/tvImagePlus.class.php @@ -1,68 +1,93 @@ modx =& $modx; - $this->loadConfig(); - $this->loadLexicon(); - $this->loadSourceMap(); - }// + function __construct(modX &$modx) + { + $this->modx =& $modx; + $this->loadConfig(); + $this->loadLexicon(); + $this->loadSourceMap(); + } - - private function loadConfig(){ - $core = $this->modx->getOption('tvimageplus.core_path',null,$this->modx->getOption('core_path').'components/tvimageplus/'); - $assets = $this->modx->getOption('tvimageplus.assets_url',null,$this->modx->getOption('assets_url').'components/tvimageplus/'); + // + + + private function loadConfig() + { + $core = $this->modx->getOption( + 'tvimageplus.core_path', + null, + $this->modx->getOption('core_path') . 'components/tvimageplus/' + ); + $assets = $this->modx->getOption( + 'tvimageplus.assets_url', + null, + $this->modx->getOption('assets_url') . 'components/tvimageplus/' + ); $this->config = array( 'core_path' => $core, 'assets_url' => $assets, - 'connectorUrl' => $assets.'mgr/connector.php', + 'connectorUrl' => $assets . 'mgr/connector.php', 'sources' => array() ); - }// - - + } + + // + + /** * Load the lexicon topic + * * @todo Do it properly with MODx.lang _() */ - private function loadLexicon(){ + private function loadLexicon() + { // This should be enough aaaarrrrrgh!!!!! - $this->modx->lexicon->load('tvimageplus'); - $lex = $this->modx->lexicon->getFileTopic($this->modx->cultureKey,'tvimageplus'); - $this->config['lexicon'] = $lex; - }// - + $this->modx->lexicon->load('tvimageplus'); + $lex = $this->modx->lexicon->getFileTopic($this->modx->cultureKey, 'tvimageplus'); + $this->config['lexicon'] = $lex; + } + + // + /** * Get a map of MediaSource id => baseUrl + * * @return void */ - private function loadSourceMap(){ + private function loadSourceMap() + { $sources = $this->modx->getCollection('sources.modMediaSource'); - foreach($sources as $source){ + foreach ($sources as $source) { $source->initialize(); $this->config['sources'][$source->get('id')] = new stdClass(); $this->config['sources'][$source->get('id')]->url = $source->getBaseUrl(); }; - }// - + } + /** * Gather info about the TV + * * @param ImagePlusInputRender $render + * @param $value + * @param array $params * @return object */ - public function loadTvConfig(ImagePlusInputRender $render, $value, array $params){ + public function loadTvConfig(ImagePlusInputRender $render, $value, array $params) + { $data = new stdClass; // Grab the ID of the assigned mediasource $data->mediaSource = $render->tv->getSource('web')->get('id'); // Grab TV info $data->tv = new stdClass; $data->tv->id = $render->tv->get('id'); - $data->tv->params = $render->getInputOptions(); + $data->tv->params = $render->getInputOptions(); $data->tv->value = $value; // Misc $data->allowBlank = (bool)$params['allowBlank']; @@ -70,10 +95,10 @@ public function loadTvConfig(ImagePlusInputRender $render, $value, array $params $data->targetWidth = (int)$params['targetWidth']; $data->targetHeight = (int)$params['targetHeight']; // Alt-tag options - $data->altTagOn = (isset($params['allowAltTag']) && $params['allowAltTag']=='Yes'); - - $saved = empty($value)? null : json_decode($value); - if(is_null($saved)){ + $data->altTagOn = (isset($params['allowAltTag']) && $params['allowAltTag'] == 'Yes'); + + $saved = empty($value) ? null : json_decode($value); + if (is_null($saved)) { // Crop data $data->crop = new stdClass(); $data->crop->width = 0; @@ -85,10 +110,10 @@ public function loadTvConfig(ImagePlusInputRender $render, $value, array $params $data->sourceImg->width = 0; $data->sourceImg->height = 0; $data->sourceImg->src = ''; - $data->sourceImg->source = 1; - $data->altTag = ($data->altTagOn? '' : false); + $data->sourceImg->source = 1; + $data->altTag = ($data->altTagOn ? '' : false); } else { - // Crop data + // Crop data $data->crop = new stdClass(); $data->crop->width = $saved->crop->width; $data->crop->height = $saved->crop->height; @@ -100,100 +125,120 @@ public function loadTvConfig(ImagePlusInputRender $render, $value, array $params $data->sourceImg->height = $saved->sourceImg->height; $data->sourceImg->src = $saved->sourceImg->src; $data->sourceImg->source = $saved->sourceImg->source; - // die('
'.print_r($saved,1));
-            $data->altTag = ($data->altTagOn? (isset($saved->altTag)? $saved->altTag:'') : false);
+            //      die('
'.print_r($saved,1));
+            $data->altTag = ($data->altTagOn ? (isset($saved->altTag) ? $saved->altTag : '') : false);
         }
-        
-        return $data;        
-    }//
-    
-    
+
+        return $data;
+    }
+
+
+    /**
+     * Render supporting javascrip
+     */
+    public function includeScriptAssets()
+    {
+
+    }
+
+
     /**
      * Check if phpThumbOf is installed
+     *
      * @return bool
      */
-    public function hasPhpThumbOf(){
-        $pto = $this->modx->getObject('modSnippet',array('name'=>'phpthumbof'));
+    public function hasPhpThumbOf()
+    {
+        $pto = $this->modx->getObject('modSnippet', array('name' => 'phpthumbof'));
         return $pto instanceof modSnippet;
-    }//
-    
+    }
+
+    //
+
     /**
      * Return a scaled, cached version of the source image for front-end use
+     *
      * @param string $json
-     * @param array $params
+     * @param array  $opts
+     * @internal param array $params
      * @return string
      */
-    public function getImageURL($json, $opts = array()){
+    public function getImageURL($json, $opts = array())
+    {
         // Return error message if phpthumbof not found
-        if(!$this->hasPhpThumbOf()){
+        if (!$this->hasPhpThumbOf()) {
             return "Image+ Error: PhpThumbOf Extra not found";
         }
-    
+
         // Parse json to object
         $data = json_decode($json);
 
         // Load up the mediaSource
-        $source = $this->modx->getObject('modMediaSource',$data->sourceImg->source);
-        if(!$source instanceof modMediaSource){
+        $source = $this->modx->getObject('modMediaSource', $data->sourceImg->source);
+        if (!$source instanceof modMediaSource) {
             return 'Image+ Error: Invalid Media Source';
         };
         $source->initialize();
-        
+
         // Grab absolute system path to image
-        $imgPath = $source->getBasePath().$data->sourceImg->src;
-        
+        $imgPath = $source->getBasePath() . $data->sourceImg->src;
+
         // Prepare arguments for phpthumbof snippet call
         $params = array(
-                'src' => $imgPath,
-                'w' => $data->targetWidth,
-                'h' => $data->targetHeight,
-                'far' => true,
-                'sx' => $data->crop->x,
-                'sy'=> $data->crop->y,
-                'sw'=> $data->crop->width,
-                'sh'=> $data->crop->height
+            'src' => $imgPath,
+            'w' => $data->targetWidth,
+            'h' => $data->targetHeight,
+            'far' => true,
+            'sx' => $data->crop->x,
+            'sy' => $data->crop->y,
+            'sw' => $data->crop->width,
+            'sh' => $data->crop->height
         );
 
         // Add in output render params
-        $optParams = explode('&',$opts['phpThumbParams']);
-        foreach($optParams as $oP){
-            if(empty($oP)){ continue; };
-            $bits = explode('=',$oP);
+        $optParams = explode('&', $opts['phpThumbParams']);
+        foreach ($optParams as $oP) {
+            if (empty($oP)) {
+                continue;
+            };
+            $bits = explode('=', $oP);
             $params[$bits[0]] = $bits[1];
         }
-        
+
         $options = array();
-        foreach($params as $key => $val){
-            $options[] = $key.'='.$val;
+        foreach ($params as $key => $val) {
+            $options[] = $key . '=' . $val;
         };
-        $options = implode('&',$options);
+        $options = implode('&', $options);
+
 
-        
         // Call phpthumbof for url
-        $url = $this->modx->runSnippet('phpthumbof',array(
-                    'options'=>$options,
-                    'input' => $imgPath
-                ));
-        
+        $url = $this->modx->runSnippet(
+            'phpthumbof',
+            array(
+                'options' => $options,
+                'input' => $imgPath
+            )
+        );
+
         // If an output chunk is selected, parse that
-        if(isset($opts['outputChunk']) && !empty($opts['outputChunk']) ){
+        if (isset($opts['outputChunk']) && !empty($opts['outputChunk'])) {
             $chunkParams = array(
                 'url' => $url,
                 'alt' => $data->altTag,
                 'width' => $data->targetWidth,
                 'height' => $data->targetHeight
             );
-            return $this->modx->getChunk($opts['outputChunk'],$chunkParams);
+            return $this->modx->getChunk($opts['outputChunk'], $chunkParams);
         } else {
             // Otherwise return raw url
             return $url;
         };
-    }//
-
-
-
+    }
+    //
 
 
+}
 
-};// end class tvImagePlus
-define('tvimageplus',true);
+; // end class tvImagePlus
+define('tvimageplus', true);

From 6e09ddae8161523e8b70194f1a041dd6fc3d9b82 Mon Sep 17 00:00:00 2001
From: Alan Pich 
Date: Wed, 15 May 2013 14:16:33 +0100
Subject: [PATCH 005/515] Added copyright/license docblocks

---
 .../components/tvimageplus/mgr/connector.php  | 24 +++++++++++++++++
 .../mgr/js/tvimageplus.jquery.imagecrop.js    | 24 +++++++++++++++++
 .../tvimageplus/mgr/js/tvimageplus.js         | 24 +++++++++++++++++
 .../mgr/js/tvimageplus.panel.input.js         | 24 +++++++++++++++++
 .../mgr/js/tvimageplus.window.editor.js       | 24 +++++++++++++++++
 .../elements/tv/input/imageplus.class.php     | 22 ++++++++++++++++
 .../elements/tv/input/options/imageplus.php   | 25 +++++++++++++++++-
 .../elements/tv/output/imageplus.class.php    | 25 +++++++++++++++++-
 .../elements/tv/output/options/imageplus.php  | 25 +++++++++++++++++-
 .../tvimageplus/tvImagePlus.class.php         | 26 +++++++++++++++++++
 10 files changed, 240 insertions(+), 3 deletions(-)

diff --git a/assets/components/tvimageplus/mgr/connector.php b/assets/components/tvimageplus/mgr/connector.php
index 11e414b2..042ec18f 100644
--- a/assets/components/tvimageplus/mgr/connector.php
+++ b/assets/components/tvimageplus/mgr/connector.php
@@ -1,4 +1,28 @@
 
+ *
+ * This file is part of tvImagePlus
+ *
+ * tvImagePlus is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * tvImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * Vapor; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+ * Suite 330, Boston, MA 02111-1307 USA
+ *
+ * @package tvImagePlus
+ * @author Alan Pich 
+ * @copyright Alan Pich 2013
+ */
+
+
 /**
  * MGR Connector
  * 
diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.jquery.imagecrop.js b/assets/components/tvimageplus/mgr/js/tvimageplus.jquery.imagecrop.js
index 89dc3d68..b349841f 100644
--- a/assets/components/tvimageplus/mgr/js/tvimageplus.jquery.imagecrop.js
+++ b/assets/components/tvimageplus/mgr/js/tvimageplus.jquery.imagecrop.js
@@ -1,3 +1,27 @@
+/*
+ * Copyright 2013 by Alan Pich 
+ *
+ * This file is part of tvImagePlus
+ *
+ * tvImagePlus is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * tvImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * Vapor; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+ * Suite 330, Boston, MA 02111-1307 USA
+ *
+ * @package tvImagePlus
+ * @author Alan Pich 
+ * @copyright Alan Pich 2013
+ */
+
+
 tvImagePlus.jquery.ImageCrop= function(config) {
     config = config || {};
     this.tvimageplus = config.tvimageplus;
diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.js b/assets/components/tvimageplus/mgr/js/tvimageplus.js
index 06103035..66a678b5 100644
--- a/assets/components/tvimageplus/mgr/js/tvimageplus.js
+++ b/assets/components/tvimageplus/mgr/js/tvimageplus.js
@@ -1,3 +1,27 @@
+/*
+ * Copyright 2013 by Alan Pich 
+ *
+ * This file is part of tvImagePlus
+ *
+ * tvImagePlus is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * tvImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * Vapor; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+ * Suite 330, Boston, MA 02111-1307 USA
+ *
+ * @package tvImagePlus
+ * @author Alan Pich 
+ * @copyright Alan Pich 2013
+ */
+
+
 var tvImagePlus = function(config) {
     config = config || {};
     tvImagePlus.superclass.constructor.call(this,config);
diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js b/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js
index b55cbe9e..47e916c2 100644
--- a/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js
+++ b/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js
@@ -1,3 +1,27 @@
+/*
+ * Copyright 2013 by Alan Pich 
+ *
+ * This file is part of tvImagePlus
+ *
+ * tvImagePlus is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * tvImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * Vapor; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+ * Suite 330, Boston, MA 02111-1307 USA
+ *
+ * @package tvImagePlus
+ * @author Alan Pich 
+ * @copyright Alan Pich 2013
+ */
+
+
 tvImagePlus.panel.input = function(config) {
     config = config || {};
     this.tvimageplus = config.tvimageplus;
diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.window.editor.js b/assets/components/tvimageplus/mgr/js/tvimageplus.window.editor.js
index cdcd10ae..815d90f4 100644
--- a/assets/components/tvimageplus/mgr/js/tvimageplus.window.editor.js
+++ b/assets/components/tvimageplus/mgr/js/tvimageplus.window.editor.js
@@ -1,3 +1,27 @@
+/*
+ * Copyright 2013 by Alan Pich 
+ *
+ * This file is part of tvImagePlus
+ *
+ * tvImagePlus is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * tvImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * Vapor; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+ * Suite 330, Boston, MA 02111-1307 USA
+ *
+ * @package tvImagePlus
+ * @author Alan Pich 
+ * @copyright Alan Pich 2013
+ */
+
+
 tvImagePlus.window.Editor = function(config) {
     config = config || {};
     this.tvimageplus = config.tvimageplus;
diff --git a/core/components/tvimageplus/elements/tv/input/imageplus.class.php b/core/components/tvimageplus/elements/tv/input/imageplus.class.php
index 58229c19..5340a3a5 100644
--- a/core/components/tvimageplus/elements/tv/input/imageplus.class.php
+++ b/core/components/tvimageplus/elements/tv/input/imageplus.class.php
@@ -1,4 +1,26 @@
 
+ *
+ * This file is part of tvImagePlus
+ *
+ * tvImagePlus is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * tvImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * Vapor; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+ * Suite 330, Boston, MA 02111-1307 USA
+ *
+ * @package tvImagePlus
+ * @author Alan Pich 
+ * @copyright Alan Pich 2013
+ */
 
 class ImagePlusInputRender extends modTemplateVarInputRender {
     
diff --git a/core/components/tvimageplus/elements/tv/input/options/imageplus.php b/core/components/tvimageplus/elements/tv/input/options/imageplus.php
index 83d73a54..ac998edd 100644
--- a/core/components/tvimageplus/elements/tv/input/options/imageplus.php
+++ b/core/components/tvimageplus/elements/tv/input/options/imageplus.php
@@ -1,4 +1,27 @@
-
+ *
+ * This file is part of tvImagePlus
+ *
+ * tvImagePlus is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * tvImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * Vapor; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+ * Suite 330, Boston, MA 02111-1307 USA
+ *
+ * @package tvImagePlus
+ * @author Alan Pich 
+ * @copyright Alan Pich 2013
+ */
+
 $root = $modx->getOption('tvimageplus.core_path',null,$modx->getOption('core_path').'components/tvimageplus/');
 if(!class_exists('tvImagePlus')){ require $root.'tvImagePlus.class.php'; };
 $helper = new tvImagePlus($modx);
diff --git a/core/components/tvimageplus/elements/tv/output/imageplus.class.php b/core/components/tvimageplus/elements/tv/output/imageplus.class.php
index c666c110..ef688136 100644
--- a/core/components/tvimageplus/elements/tv/output/imageplus.class.php
+++ b/core/components/tvimageplus/elements/tv/output/imageplus.class.php
@@ -1,4 +1,27 @@
-
+ *
+ * This file is part of tvImagePlus
+ *
+ * tvImagePlus is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * tvImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * Vapor; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+ * Suite 330, Boston, MA 02111-1307 USA
+ *
+ * @package tvImagePlus
+ * @author Alan Pich 
+ * @copyright Alan Pich 2013
+ */
+
 class ImagePlusOutputRender extends modTemplateVarOutputRender {
     public function process($value,array $params = array()) {
     	// Load the helper library if its not already here
diff --git a/core/components/tvimageplus/elements/tv/output/options/imageplus.php b/core/components/tvimageplus/elements/tv/output/options/imageplus.php
index 8aa8007b..35966a18 100644
--- a/core/components/tvimageplus/elements/tv/output/options/imageplus.php
+++ b/core/components/tvimageplus/elements/tv/output/options/imageplus.php
@@ -1,5 +1,28 @@
-
+ *
+ * This file is part of tvImagePlus
+ *
+ * tvImagePlus is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * tvImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * Vapor; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+ * Suite 330, Boston, MA 02111-1307 USA
+ *
+ * @package tvImagePlus
+ * @author Alan Pich 
+ * @copyright Alan Pich 2013
+ */
 
+/** @var \modX $modx */
 $root = $modx->getOption('tvimageplus.core_path',null,$modx->getOption('core_path').'components/tvimageplus/');
 if(!class_exists('tvImagePlus')){ require $root.'tvImagePlus.class.php'; };
 $helper = new tvImagePlus($modx);
diff --git a/core/components/tvimageplus/tvImagePlus.class.php b/core/components/tvimageplus/tvImagePlus.class.php
index de5c0c08..edd2f909 100644
--- a/core/components/tvimageplus/tvImagePlus.class.php
+++ b/core/components/tvimageplus/tvImagePlus.class.php
@@ -1,10 +1,36 @@
 
+ *
+ * This file is part of tvImagePlus
+ *
+ * tvImagePlus is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * tvImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * Vapor; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+ * Suite 330, Boston, MA 02111-1307 USA
+ *
+ * @package tvImagePlus
+ * @author Alan Pich 
+ * @copyright Alan Pich 2013
+ */
+
 
 class tvImagePlus
 {
 
     public $dataStr;
 
+    /** @var \modX  */
+    public $modx;
+
 
     function __construct(modX &$modx)
     {

From 71ff918c440cb71c9cf134a9fca7d51614009c4b Mon Sep 17 00:00:00 2001
From: Alan Pich 
Date: Wed, 15 May 2013 14:25:04 +0100
Subject: [PATCH 006/515] fix dead email address in readme

---
 core/components/tvimageplus/docs/readme.tpl | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/core/components/tvimageplus/docs/readme.tpl b/core/components/tvimageplus/docs/readme.tpl
index ad46adcd..af81a2de 100644
--- a/core/components/tvimageplus/docs/readme.tpl
+++ b/core/components/tvimageplus/docs/readme.tpl
@@ -2,7 +2,7 @@
  Image+ TV type 
 ---------------------
  Version:  {$version}
- Author:   Alan Pich 
+ Author:   Alan Pich 
  License:  GNU GPLv2
  Date:     {$date}
  Build:    {$commit}

From b4d7ed4d6fb42ad3ef01fc9b8258ad4b4bb163c9 Mon Sep 17 00:00:00 2001
From: Alan Pich 
Date: Wed, 15 May 2013 14:25:57 +0100
Subject: [PATCH 007/515] bump builder version in preparation for v2.2 build

---
 _build/build.transport.php                  | 4 ++--
 core/components/tvimageplus/docs/readme.tpl | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/_build/build.transport.php b/_build/build.transport.php
index 70a7a718..85c69f23 100644
--- a/_build/build.transport.php
+++ b/_build/build.transport.php
@@ -8,8 +8,8 @@
 /* define package names */
 define('PKG_NAME','Image+ TV');
 define('PKG_NAME_LOWER','tvimageplus');
-define('PKG_VERSION','2.0');
-define('PKG_RELEASE','beta1');
+define('PKG_VERSION','2.1.5');
+define('PKG_RELEASE','pl');
 define('PKG_COMMIT',getGitCommitId(dirname(dirname(__FILE__))));
  
 /* define build paths */
diff --git a/core/components/tvimageplus/docs/readme.tpl b/core/components/tvimageplus/docs/readme.tpl
index af81a2de..cf1f33a0 100644
--- a/core/components/tvimageplus/docs/readme.tpl
+++ b/core/components/tvimageplus/docs/readme.tpl
@@ -2,7 +2,7 @@
  Image+ TV type 
 ---------------------
  Version:  {$version}
- Author:   Alan Pich 
+ Author:   Alan Pich 
  License:  GNU GPLv2
  Date:     {$date}
  Build:    {$commit}

From e7135b099ae7d37788748fc40a29f768029ad6e7 Mon Sep 17 00:00:00 2001
From: Alan Pich 
Date: Wed, 15 May 2013 15:27:41 +0100
Subject: [PATCH 008/515] Refactor build script

---
 .gitignore                                    |   3 +-
 _build/build.config.php                       |  39 +++-
 _build/build.tools.php                        |  51 -----
 _build/build.transport.php                    | 194 ++++++++----------
 ...p => transport.plugin.ImagePlusRouter.php} |   5 +-
 _build/tools/build.tools.php                  | 104 ++++++++++
 config.core.sample.php                        |  12 ++
 7 files changed, 228 insertions(+), 180 deletions(-)
 delete mode 100644 _build/build.tools.php
 rename _build/data/{transport.plugins.php => transport.plugin.ImagePlusRouter.php} (81%)
 create mode 100644 _build/tools/build.tools.php
 create mode 100644 config.core.sample.php

diff --git a/.gitignore b/.gitignore
index 7f7eae1e..4bfb5695 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
 config.core.php
-.idea
\ No newline at end of file
+.idea
+*.zip
\ No newline at end of file
diff --git a/_build/build.config.php b/_build/build.config.php
index cc6e507b..ddd24949 100644
--- a/_build/build.config.php
+++ b/_build/build.config.php
@@ -1,12 +1,29 @@
  PKG_ROOT,
+    'build' => PKG_BUILD,
+    'data' => PKG_BUILD . 'data/',
+    'resolvers' => PKG_BUILD . 'resolvers/',
+    'elements' => PKG_CORE . 'elements/',
+    'plugins' => PKG_CORE . 'elements/plugins/',
+    'lexicon' => PKG_CORE . 'lexicon/',
+    'docs' => PKG_CORE . 'docs/',
+    'source_assets' => PKG_ASSETS,
+    'source_core' => PKG_CORE
+);
+
+
diff --git a/_build/build.tools.php b/_build/build.tools.php
deleted file mode 100644
index 967ae716..00000000
--- a/_build/build.tools.php
+++ /dev/null
@@ -1,51 +0,0 @@
-'),'',$o));
-    return $o;
-}
-
-
-/**
- * Parse the smarty readme tpl for packaging
- * @param string $path Path to tpl
- * @return string
- */
-function getReadmeFile( $path ){
-    global $modx;
-    $modx->getService('smarty','smarty.modSmarty');
-    
-    $modx->smarty->assign('date',date("jS M Y g:ia"));
-    $modx->smarty->assign('version',PKG_VERSION.' '.PKG_RELEASE);
-    $modx->smarty->assign('commit',PKG_COMMIT);
-    $readme = $modx->smarty->fetch($path);
-    return $readme;
-}//
-
-
-/**
- * Get currect git commit id
- * @param string repoRoot Path to repository root
- * @return string commit hash
- */
-function getGitCommitId( $repoRoot ){
-   // Check git exists
-    $whichGit = `which git`;
-    if(empty($whichGit)){ return ''; };
-    
-   // Check we're in a git repo
-    $gitFolder = str_replace('//','/',$repoRoot.'/.git');
-    if( ! is_dir($gitFolder) ){ return ''; };
-    
-    // 
-    $test = shell_exec("cd $repoRoot; git rev-parse HEAD;");
-    return trim($test);
-    
-   
-}//
\ No newline at end of file
diff --git a/_build/build.transport.php b/_build/build.transport.php
index 85c69f23..c2597964 100644
--- a/_build/build.transport.php
+++ b/_build/build.transport.php
@@ -1,120 +1,86 @@
  $root,
-    'build' => $root . '_build/',
-    'data' => $root . '_build/data/',
-    'resolvers' => $root . '_build/resolvers/',
-    'plugins' => $root.'core/components/'.PKG_NAME_LOWER.'/elements/plugins/',
-    'lexicon' => $root . 'core/components/'.PKG_NAME_LOWER.'/lexicon/',
-    'docs' => $root.'core/components/'.PKG_NAME_LOWER.'/docs/',
-    'elements' => $root.'core/components/'.PKG_NAME_LOWER.'/elements/',
-    'source_assets' => $root.'assets/components/'.PKG_NAME_LOWER,
-    'source_core' => $root.'core/components/'.PKG_NAME_LOWER,
-);
-unset($root);
- 
-/* override with your own defines here (see build.config.sample.php) */
-require_once $sources['build'] . 'build.config.php';
-require_once MODX_CORE_PATH . 'model/modx/modx.class.php';
- 
-$modx= new modX();
-$modx->initialize('mgr');
-echo '
'; /* used for nice formatting of log messages */
-$modx->setLogLevel(modX::LOG_LEVEL_INFO);
-
-if(!defined('LOG_TARGET_ALREADY_SET')){
-    $modx->setLogTarget('ECHO');
-};
- 
-$modx->loadClass('transport.modPackageBuilder','',false, true);
+/*
+ * Copyright 2013 by Alan Pich 
+ *
+ * This file is part of tvImagePlus
+ *
+ * tvImagePlus is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * tvImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * Vapor; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+ * Suite 330, Boston, MA 02111-1307 USA
+ *
+ * @package tvImagePlus
+ * @author Alan Pich 
+ * @copyright Alan Pich 2013
+ */
+
+require dirname(__FILE__) . '/tools/build.tools.php';
+require dirname(__FILE__) . '/build.config.php';
+require MODX_BASE_PATH . 'config.core.php';
+Tools::StartTimer();
+
+
+// Create modx & package instance -----------------------------------------------------------------
+$modx = Tools::loadModxInstance();
 $builder = new modPackageBuilder($modx);
-$builder->createPackage(PKG_NAME_LOWER,PKG_VERSION,PKG_RELEASE);
-$builder->registerNamespace(PKG_NAME_LOWER,false,true,'{core_path}components/'.PKG_NAME_LOWER.'/');
-
-$category= $modx->newObject('modCategory');
-$category->set('id',1);
-$category->set('category','ImagePlus');
-
- 
-// Create category vehicle -----------------------------------------------------------------
-$attr = array(
-		xPDOTransport::UNIQUE_KEY => 'category',
-		xPDOTransport::PRESERVE_KEYS => false,
-		xPDOTransport::UPDATE_OBJECT => true,
-		xPDOTransport::RELATED_OBJECTS => true,
-		xPDOTransport::RELATED_OBJECT_ATTRIBUTES => array (
-		    'Plugins' => array(
-		        xPDOTransport::PRESERVE_KEYS => false,
-		        xPDOTransport::UPDATE_OBJECT => true,
-		        xPDOTransport::UNIQUE_KEY => 'name',
-                xPDOTransport::RELATED_OBJECT_ATTRIBUTES => array (
-                    'PluginEvents' => array(
-                        xPDOTransport::PRESERVE_KEYS => false,
-                        xPDOTransport::UPDATE_OBJECT => true,
-                        xPDOTransport::UNIQUE_KEY => 'id',
-                     ),
-                )			
-            )
-       )
-	);
-$vehicle = $builder->createVehicle($category,$attr);
-
-
-// Add file resolvers ------------------------------------------------------------------------
-$modx->log(modX::LOG_LEVEL_INFO,'Adding file resolvers to category...');
+$builder->createPackage(PKG_NAMESPACE, PKG_VERSION, PKG_RELEASE);
+
+
+// Register Namespace -----------------------------------------------------------------------------
+$builder->registerNamespace(PKG_NAMESPACE, false, true, '{core_path}components/' . PKG_NAMESPACE . '/');
+
+
+// Create the plugin object -----------------------------------------------------------------------
+include $sources['data'] . 'transport.plugin.ImagePlusRouter.php';
+
+
+// Package core and assets directories ------------------------------------------------------------
+$modx->log(modX::LOG_LEVEL_INFO, 'Packaging core & assets directories...');
+$vehicle = $builder->createVehicle($plugin, $attributes);
 $vehicle->resolve('file',array(
-    'source' => $sources['source_assets'],
-    'target' => "return MODX_ASSETS_PATH . 'components/';",
-));
+        'source' => PKG_ASSETS,
+        'target' => "return MODX_ASSETS_PATH . 'components/';",
+    ));
 $vehicle->resolve('file',array(
-    'source' => $sources['source_core'],
-    'target' => "return MODX_CORE_PATH . 'components/';",
-));
+        'source' => PKG_CORE,
+        'target' => "return MODX_CORE_PATH . 'components/';",
+    ));
 $builder->putVehicle($vehicle);
- 
-// Add Router plugin -------------------------------------------------------------------------
-include $sources['data'].'transport.plugins.php';
-    
-    
- 
- 
-
- // Add documentation ===========================================================
-$modx->log(modX::LOG_LEVEL_INFO,'Adding documentation...');
-$builder->setPackageAttributes(array(
-    'license' => file_get_contents($sources['docs'] . 'license.txt'),
-    'readme' => getReadmeFile($sources['docs'] . 'readme.tpl'),
-    'changelog' => file_get_contents($sources['docs'] . 'changelog.txt')
-));   
-    
-    
- 
- 
-
-
-
-
-/* zip up package */
-$modx->log(modX::LOG_LEVEL_INFO,'Packing up transport package zip...');
+
+
+// Add documentation ------------------------------------------------------------------------------
+$modx->log(modX::LOG_LEVEL_INFO, 'Adding documentation...');
+$builder->setPackageAttributes(
+    array(
+        'license' => file_get_contents($sources['docs'] . 'license.txt'),
+        'readme' => Tools::parseReadmeTpl($sources['docs'] . 'readme.tpl'),
+        'changelog' => file_get_contents($sources['docs'] . 'changelog.txt'),
+    )
+);
+
+
+// Create transport package -----------------------------------------------------------------------
+$modx->log(modX::LOG_LEVEL_INFO, 'Packing component for transport...');
 $builder->pack();
- 
-$tend= explode(" ", microtime());
-$tend= $tend[1] + $tend[0];
-$totalTime= sprintf("%2.4f s",($tend - $tstart));
-$modx->log(modX::LOG_LEVEL_INFO,"\n
Package Built.
\nExecution time: {$totalTime}\n"); -exit (); + + +// Copy transport package back to PKG_ROOT -------------------------------------------------------- +$zipFile = PKG_NAMESPACE.'-'.PKG_VERSION.'-'.PKG_RELEASE.'.transport.zip'; +$zipPath = MODX_CORE_PATH.'packages/'. $zipFile; +copy($zipPath,PKG_ROOT.$zipFile); + + +// Build process finished ------------------------------------------------------------------------- +$totalTime= sprintf("%2.4f s", Tools::stopTimer()); +$modx->log(modX::LOG_LEVEL_INFO,"Package ".PKG_NAME.' '.PKG_VERSION.'-'.PKG_RELEASE." built in {$totalTime}"); + + +exit; \ No newline at end of file diff --git a/_build/data/transport.plugins.php b/_build/data/transport.plugin.ImagePlusRouter.php similarity index 81% rename from _build/data/transport.plugins.php rename to _build/data/transport.plugin.ImagePlusRouter.php index bf574fc9..0f1d1288 100644 --- a/_build/data/transport.plugins.php +++ b/_build/data/transport.plugin.ImagePlusRouter.php @@ -9,8 +9,7 @@ function getPluginContent($filename) { $plugin= $modx->newObject('modPlugin'); $plugin->set('id',1); $plugin->set('name', 'ImagePlusRouter'); -$plugin->set('description', 'Required by ModX <2.3 to route class calls properly'); -$plugin->set('plugincode', getPluginContent($sources['elements'] . 'plugins/plugin.ImagePlusRouter.php')); +$plugin->set('description', PKG_NAME.' '.PKG_VERSION.'-'.PKG_RELEASE.' :: Image+ runtime hooks - registers custom TV input & output types and includes javascripts on document edit pages so that the TV can be used from within MIGX');$plugin->set('plugincode', getPluginContent($sources['elements'] . 'plugins/plugin.ImagePlusRouter.php')); $plugin->set('category', 0); /* add plugin events */ @@ -59,5 +58,5 @@ function getPluginContent($filename) { ), ); $vehicle = $builder->createVehicle($plugin, $attributes); -$modx->log(modX::LOG_LEVEL_INFO,'Packaging in plugins...'); +$modx->log(modX::LOG_LEVEL_INFO,'Added plugin ImagePlusRouter'); $builder->putVehicle($vehicle); \ No newline at end of file diff --git a/_build/tools/build.tools.php b/_build/tools/build.tools.php new file mode 100644 index 00000000..eb2bbedc --- /dev/null +++ b/_build/tools/build.tools.php @@ -0,0 +1,104 @@ + + * + * This file is part of tvImagePlus + * + * tvImagePlus is free software; you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * tvImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * Vapor; if not, write to the Free Software Foundation, Inc., 59 Temple Place, + * Suite 330, Boston, MA 02111-1307 USA + * + * @package tvImagePlus + * @author Alan Pich + * @copyright Alan Pich 2013 + */ + + +/** + * Class Tools + * + * Helpful tools to clean up the transport build file + * + */ +class Tools { + + protected static $_startTime; + + /** + * Start a timer + */ + public static function startTimer(){ + self::$_startTime = microtime(true); + } + + /** + * Stop the timer and return time + * @return float + */ + public static function stopTimer(){ + $now = microtime(true); + return $now - self::$_startTime; + } + + + public static function loadModxInstance(){ + require_once MODX_CORE_PATH . 'model/modx/modx.class.php'; + $modx= new modX(); + $modx->initialize('mgr'); + echo XPDO_CLI_MODE ? '' : '
';
+        $modx->setLogLevel(modX::LOG_LEVEL_INFO);
+        $modx->setLogTarget('ECHO');
+        $modx->loadClass('transport.modPackageBuilder','',false, true);
+        return $modx;
+    }
+
+
+    /**
+     * Parse the smarty readme tpl for packaging
+     * @param string $path Path to tpl
+     * @return string
+     */
+    public static function parseReadmeTpl( $path ){
+        global $modx;
+        $modx->getService('smarty','smarty.modSmarty');
+
+        $modx->smarty->assign('date',date("jS M Y g:ia"));
+        $modx->smarty->assign('version',PKG_VERSION.' '.PKG_RELEASE);
+        $modx->smarty->assign('commit',PKG_COMMIT);
+        $readme = $modx->smarty->fetch($path);
+        return $readme;
+    }//
+
+
+    /**
+     * Get currect git commit id
+     * @param string repoRoot Path to repository root
+     * @return string commit hash
+     */
+    function getGitCommitId( $repoRoot ){
+        // Check git exists
+        $whichGit = `which git`;
+        if(empty($whichGit)){ return ''; };
+
+        // Check we're in a git repo
+        $gitFolder = str_replace('//','/',$repoRoot.'/.git');
+        if( ! is_dir($gitFolder) ){ return ''; };
+
+        //
+        $test = shell_exec("cd $repoRoot; git rev-parse HEAD;");
+        return trim($test);
+    }//
+
+
+
+
+}
\ No newline at end of file
diff --git a/config.core.sample.php b/config.core.sample.php
new file mode 100644
index 00000000..a2f84ab7
--- /dev/null
+++ b/config.core.sample.php
@@ -0,0 +1,12 @@
+
Date: Wed, 15 May 2013 19:26:33 +0100
Subject: [PATCH 009/515] [#16] Added tvimageplus.crop_icon system setting for
 optional crop button icon

---
 .../tvimageplus/mgr/icons/icon.crop.png           | Bin 0 -> 274 bytes
 .../tvimageplus/mgr/js/tvimageplus.panel.input.js |   4 ++++
 core/components/tvimageplus/tvImagePlus.class.php |   6 ++++--
 3 files changed, 8 insertions(+), 2 deletions(-)
 create mode 100644 assets/components/tvimageplus/mgr/icons/icon.crop.png

diff --git a/assets/components/tvimageplus/mgr/icons/icon.crop.png b/assets/components/tvimageplus/mgr/icons/icon.crop.png
new file mode 100644
index 0000000000000000000000000000000000000000..068056ad88f401cd465d0eb9651dfcfed0e043c2
GIT binary patch
literal 274
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk?
zp1FzXsX?iUDV2pMQ*D5Xws^WYhE&{2N^ofS>+nauLso)=nOR{U|Ds3<4|cYI(<}`Z
z^8`;ddN#1=Gkj!cVr#gf%kapBZN+BKqn{I(HST%9k^0@)SHEQ!)7@)zD*v2v{0@tD
zD4czNF@_=hu#3V0nF&lhPo6Ws;QAmrp<$V&;A|x|n^}pBt-;1R0v8=^t}rysD%{zS
zadt<{0R~?W{>B}QzA=m^r}FJsG*RVD$FmYvCcVD)Rgny(iYF87S8{eLFmMzopr00vcIX8-^I

literal 0
HcmV?d00001

diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js b/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js
index 47e916c2..ceab90e4 100644
--- a/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js
+++ b/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js
@@ -60,10 +60,14 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
      * Create the 'edit image' button
      */
     create_editButton: function(){
+
+        console.log(this.tvimageplus);
+
         this.editButton = new Ext.Button({
             text: _('tvimageplus.edit_image')
             ,handler: this.editImage
             ,scope:this
+            ,icon: tvImagePlus.config.crop_icon
         })
     }//
     
diff --git a/core/components/tvimageplus/tvImagePlus.class.php b/core/components/tvimageplus/tvImagePlus.class.php
index edd2f909..cd8b05c5 100644
--- a/core/components/tvimageplus/tvImagePlus.class.php
+++ b/core/components/tvimageplus/tvImagePlus.class.php
@@ -59,8 +59,10 @@ private function loadConfig()
             'core_path' => $core,
             'assets_url' => $assets,
             'connectorUrl' => $assets . 'mgr/connector.php',
-            'sources' => array()
+            'sources' => array(),
+            'crop_icon' => $this->modx->getOption('tvimageplus.crop_icon',null,$assets."mgr/icons/icon.crop.png")
         );
+
     }
 
     //
@@ -79,7 +81,7 @@ private function loadLexicon()
         $this->config['lexicon'] = $lex;
     }
 
-    //
+
 
     /**
      * Get a map of MediaSource id => baseUrl

From cf22c24975a04bcb107b261d176f16eaad062e9c Mon Sep 17 00:00:00 2001
From: Alan Pich 
Date: Wed, 15 May 2013 19:28:41 +0100
Subject: [PATCH 010/515] update changelog

---
 core/components/tvimageplus/docs/changelog.txt | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/core/components/tvimageplus/docs/changelog.txt b/core/components/tvimageplus/docs/changelog.txt
index 296e7f75..24c82af6 100644
--- a/core/components/tvimageplus/docs/changelog.txt
+++ b/core/components/tvimageplus/docs/changelog.txt
@@ -4,6 +4,9 @@
 
 # v2.2
 --------
+ :: Added option to put an icon on TV input 'crop' button.
+    - Create a system setting called tvimageplus.crop_icon and
+      populate it with the url to the desired icon png
  :: Added system setting override for core_path and assets_url (#25)
  :: Added Czech translation (@TheBoxer)
  :: Added Danish translation (@Flygenring)
@@ -23,4 +26,4 @@
 
 # v2.0
 -------
-Complete rewrite
\ No newline at end of file
+Complete rewrite

From 10486bb86b78bee75888f95ce20f4d5fe5306b92 Mon Sep 17 00:00:00 2001
From: Alan Pich 
Date: Wed, 15 May 2013 20:13:00 +0100
Subject: [PATCH 011/515] Fix URL parser to handle empty TV values. Also
 satisfy #22

---
 core/components/tvimageplus/tvImagePlus.class.php | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/core/components/tvimageplus/tvImagePlus.class.php b/core/components/tvimageplus/tvImagePlus.class.php
index cd8b05c5..aafc9687 100644
--- a/core/components/tvimageplus/tvImagePlus.class.php
+++ b/core/components/tvimageplus/tvImagePlus.class.php
@@ -201,6 +201,13 @@ public function getImageURL($json, $opts = array())
         // Parse json to object
         $data = json_decode($json);
 
+        // If data is null, json was invalid or empty.
+        // This is almost certainly because the TV is empty
+        if(is_null($data)){
+            $this->modx->log(xPDO::LOG_LEVEL_INFO,"Image+ TV renderer failed to parse JSON");
+            return '';
+        }
+
         // Load up the mediaSource
         $source = $this->modx->getObject('modMediaSource', $data->sourceImg->source);
         if (!$source instanceof modMediaSource) {

From 6c43d184410e2a9049146c48fb01b96b1a748d2d Mon Sep 17 00:00:00 2001
From: Alan Pich 
Date: Wed, 15 May 2013 20:24:40 +0100
Subject: [PATCH 012/515] fix require path in input class

---
 core/components/tvimageplus/docs/changelog.txt                | 4 ++--
 .../tvimageplus/elements/tv/input/imageplus.class.php         | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/core/components/tvimageplus/docs/changelog.txt b/core/components/tvimageplus/docs/changelog.txt
index 24c82af6..c3853ba2 100644
--- a/core/components/tvimageplus/docs/changelog.txt
+++ b/core/components/tvimageplus/docs/changelog.txt
@@ -4,10 +4,10 @@
 
 # v2.2
 --------
- :: Added option to put an icon on TV input 'crop' button.
+ :: Added option to put an icon on TV input 'crop' button. [#16]g
     - Create a system setting called tvimageplus.crop_icon and
       populate it with the url to the desired icon png
- :: Added system setting override for core_path and assets_url (#25)
+ :: Added system setting override for core_path and assets_url [#25]
  :: Added Czech translation (@TheBoxer)
  :: Added Danish translation (@Flygenring)
  :: Added German translation (@KristianP)
diff --git a/core/components/tvimageplus/elements/tv/input/imageplus.class.php b/core/components/tvimageplus/elements/tv/input/imageplus.class.php
index 5340a3a5..850d1f0e 100644
--- a/core/components/tvimageplus/elements/tv/input/imageplus.class.php
+++ b/core/components/tvimageplus/elements/tv/input/imageplus.class.php
@@ -42,7 +42,7 @@ public function process($value,array $params = array()) {
         
         // Load helper class
         if(!class_exists('tvImagePlus')){ 
-            require $this->modx->getOption('tvimageplus.core_path',null,$this->modx->getOption('core_path').'components/tvimageplus/tvImagePlus.class.php'); };
+            require $this->modx->getOption('tvimageplus.core_path',null,$this->modx->getOption('core_path').'components/tvimageplus/').'tvImagePlus.class.php'; };
         $this->helper = new tvImagePlus($this->modx);
 
         // Load required javascripts & register global config

From c24ad7dd077f3a1a118ceabeede3a51c024f4fb5 Mon Sep 17 00:00:00 2001
From: Alan Pich 
Date: Wed, 15 May 2013 20:27:48 +0100
Subject: [PATCH 013/515] [#8] Confirmed crop works properly for images larger
 than 800x600

---
 core/components/tvimageplus/docs/changelog.txt | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/core/components/tvimageplus/docs/changelog.txt b/core/components/tvimageplus/docs/changelog.txt
index c3853ba2..52c678fb 100644
--- a/core/components/tvimageplus/docs/changelog.txt
+++ b/core/components/tvimageplus/docs/changelog.txt
@@ -4,7 +4,10 @@
 
 # v2.2
 --------
- :: Added option to put an icon on TV input 'crop' button. [#16]g
+ :: Added image preloader to accurately get image size on upload.
+    - This is because Modx File Manager will not report accurate
+      image size for images above 800x600 [#8]
+ :: Added option to put an icon on TV input 'crop' button. [#16]
     - Create a system setting called tvimageplus.crop_icon and
       populate it with the url to the desired icon png
  :: Added system setting override for core_path and assets_url [#25]

From e70259a2d1c3383da26e977342ae23ce5b24b20c Mon Sep 17 00:00:00 2001
From: Alan Pich 
Date: Wed, 15 May 2013 21:01:08 +0100
Subject: [PATCH 014/515] [#14] Added checks to ensure source image is larger
 than target crop size, and display error message if not

---
 .../mgr/js/tvimageplus.panel.input.js         | 43 ++++++++++++++++---
 1 file changed, 38 insertions(+), 5 deletions(-)

diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js b/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js
index ceab90e4..8d5a44c3 100644
--- a/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js
+++ b/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js
@@ -61,8 +61,6 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
      */
     create_editButton: function(){
 
-        console.log(this.tvimageplus);
-
         this.editButton = new Ext.Button({
             text: _('tvimageplus.edit_image')
             ,handler: this.editImage
@@ -150,7 +148,12 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
      * Fired when user has selected an image from the browser
      */
     ,on_imageSelected: function(img){
-        
+
+        this.oldSourceImg = {};
+        for(i in this.tvimageplus){
+            this.oldSourceImg[i] = this.tvimageplus.sourceImg[i];
+        }
+
         this.tvimageplus.sourceImg = {
             src: img.relativeUrl
             ,width: img.image_width
@@ -190,11 +193,21 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
             }})(this);
         img.src = baseUrl+this.tvimageplus.sourceImg.src;
     }//
-    
+
+
     /**
      * Update the component display on state change
      */
     ,updateDisplay: function(){
+
+        // Make sure image is large enough to use
+        if(!this.checkImageIsLargeEnough()){
+            this.tvimageplus.sourceImg = this.oldSourceImg;
+            console.log(this.imageBrowser.reset());
+            MODx.msg.alert("Image too small","The selected image is too small to be used here. Please select a different image");
+            return;
+        }
+
         // Hide 'edit' button if field is empty
         if(this.imageBrowser.getValue()==''){
             this.editButton.disable();
@@ -205,7 +218,8 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
         
         this.updateExternalField();
     }//
-    
+
+
     /**
      * Update updateTo field input field value
      */
@@ -236,6 +250,25 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
         // Mark resource as dirty
         MODx.fireResourceFormChange()
     }
+
+
+    /**
+     * Checks whether the image is larger than specified crop dimensions
+     * @returns bool
+     */
+    ,checkImageIsLargeEnough: function(){
+        if(this.tvimageplus.targetWidth > 0){
+            if(this.tvimageplus.targetWidth > this.tvimageplus.sourceImg.width){
+                return false;
+            }
+        }
+        if(this.tvimageplus.targetHeight > 0){
+            if(this.tvimageplus.targetHeight > this.tvimageplus.sourceImg.height){
+                return false;
+            }
+        }
+        return true;
+    }
     
     
     /**

From cf0ebc532f67fe05fb94118cc32b89931fa7cdc9 Mon Sep 17 00:00:00 2001
From: Alan Pich 
Date: Wed, 15 May 2013 21:41:47 +0100
Subject: [PATCH 015/515] [#22] Added listener for TV reset to update display
 on fire

---
 .../mgr/js/tvimageplus.panel.input.js         | 41 +++++++++++++++++--
 1 file changed, 37 insertions(+), 4 deletions(-)

diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js b/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js
index 8d5a44c3..6f12bf36 100644
--- a/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js
+++ b/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js
@@ -53,9 +53,27 @@ tvImagePlus.panel.input = function(config) {
         },this.altTextField,this.imagePreview]
     });
     tvImagePlus.panel.input.superclass.constructor.call(this,config);
+
+
+    this.listenForResetEvent();
 };
 Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
-    
+
+
+    /**
+     * Bind change event on tv input DOM element so
+     * that we can be notified when the user hits the
+     * native 'Reset' button
+     */
+    listenForResetEvent: function(){
+        var resourcePanel = Ext.getCmp('modx-panel-resource');
+        resourcePanel.on('tv-reset',function(changed){
+            if(changed.id = this.tvimageplus.tv.id){
+                this.on_Reset();
+            }
+        },this)
+    },
+
     /**
      * Create the 'edit image' button
      */
@@ -129,7 +147,18 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
         };
         return url;
     }
-    
+
+    /**
+     * Fires when the TV field is reset
+     */
+    ,on_Reset: function(){
+        console.log('RESET!!!');
+        this.imageBrowser.setValue('');
+        this.tvimageplus.sourceImg = false;
+        this.editButton.disable();
+        this.updatePreviewImage.defer(10,this);
+    }
+
     /**
      * Render form elements to page
      */
@@ -244,7 +273,7 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
         
         if(document.getElementById(this.updateTo)){
             document.getElementById(this.updateTo).value = json;
-            document.getElementById(this.updateTo).innerHTML = json;
+//            document.getElementById(this.updateTo).innerHTML = json;
         }
         
         // Mark resource as dirty
@@ -322,7 +351,10 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
     }
     
     ,updatePreviewImage: function(){
-        if(!this.tvimageplus.sourceImg || this.tvimageplus.crop.width==0){return;}
+        if(!this.tvimageplus.sourceImg || this.tvimageplus.crop.width==0){
+            this.imagePreview.hide();
+            return;
+        }
         url = this.generateThumbUrl({
                 src: this.tvimageplus.sourceImg.src
                 ,sw: this.tvimageplus.crop.width
@@ -332,6 +364,7 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
             })
         if(this.imagePreview.el){
             this.imagePreview.el.dom.src = url;
+            this.imagePreview.show()
         };
     }
     

From d01fc6e62f9af092d0c05dade87b1928783a00e3 Mon Sep 17 00:00:00 2001
From: Alan Pich 
Date: Wed, 15 May 2013 21:50:19 +0100
Subject: [PATCH 016/515] [#13] Allow default tv value if TV is empty

---
 core/components/tvimageplus/docs/changelog.txt       |  2 ++
 .../elements/tv/output/imageplus.class.php           |  7 ++++---
 core/components/tvimageplus/tvImagePlus.class.php    | 12 +++++++++---
 3 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/core/components/tvimageplus/docs/changelog.txt b/core/components/tvimageplus/docs/changelog.txt
index 52c678fb..d8a4aa80 100644
--- a/core/components/tvimageplus/docs/changelog.txt
+++ b/core/components/tvimageplus/docs/changelog.txt
@@ -4,6 +4,8 @@
 
 # v2.2
 --------
+ :: TV Default Value is now output if TV is empty
+ :: TV Reset button now works [#22]
  :: Added image preloader to accurately get image size on upload.
     - This is because Modx File Manager will not report accurate
       image size for images above 800x600 [#8]
diff --git a/core/components/tvimageplus/elements/tv/output/imageplus.class.php b/core/components/tvimageplus/elements/tv/output/imageplus.class.php
index ef688136..2bcc1c40 100644
--- a/core/components/tvimageplus/elements/tv/output/imageplus.class.php
+++ b/core/components/tvimageplus/elements/tv/output/imageplus.class.php
@@ -23,13 +23,14 @@
  */
 
 class ImagePlusOutputRender extends modTemplateVarOutputRender {
+
     public function process($value,array $params = array()) {
     	// Load the helper library if its not already here
     	if(!class_exists('tvImagePlus')){ require_once $this->modx->getOption('tvimageplus.core_path',null,$this->modx->getOption('core_path').'components/tvimageplus/').'tvImagePlus.class.php'; };
     	$this->helper = new tvImagePlus($this->modx);
-        
-        
-    	return $this->helper->getImageURL($value,$params);
+
+    	return $this->helper->getImageURL($value,$params,$this->tv);
     }//
+
 };
 return 'ImagePlusOutputRender';
diff --git a/core/components/tvimageplus/tvImagePlus.class.php b/core/components/tvimageplus/tvImagePlus.class.php
index aafc9687..79545b10 100644
--- a/core/components/tvimageplus/tvImagePlus.class.php
+++ b/core/components/tvimageplus/tvImagePlus.class.php
@@ -186,12 +186,13 @@ public function hasPhpThumbOf()
     /**
      * Return a scaled, cached version of the source image for front-end use
      *
-     * @param string $json
-     * @param array  $opts
+     * @param string         $json
+     * @param array          $opts
+     * @param modTemplateVar $tv
      * @internal param array $params
      * @return string
      */
-    public function getImageURL($json, $opts = array())
+    public function getImageURL($json, $opts = array(), modTemplateVar $tv)
     {
         // Return error message if phpthumbof not found
         if (!$this->hasPhpThumbOf()) {
@@ -205,6 +206,11 @@ public function getImageURL($json, $opts = array())
         // This is almost certainly because the TV is empty
         if(is_null($data)){
             $this->modx->log(xPDO::LOG_LEVEL_INFO,"Image+ TV renderer failed to parse JSON");
+
+            return $tv->default_text;
+
+            return "EMPTY TV FIELD";
+
             return '';
         }
 

From 71fa03316449691493a70e34115b54eee6525cb2 Mon Sep 17 00:00:00 2001
From: Alan Pich 
Date: Wed, 15 May 2013 22:13:32 +0100
Subject: [PATCH 017/515] [#15] BOOM! Now works in MIGX

---
 .../elements/tv/input/imageplus.class.php     | 13 +------------
 .../tvimageplus/tvImagePlus.class.php         | 19 +++++++++++++------
 2 files changed, 14 insertions(+), 18 deletions(-)

diff --git a/core/components/tvimageplus/elements/tv/input/imageplus.class.php b/core/components/tvimageplus/elements/tv/input/imageplus.class.php
index 850d1f0e..83b0edec 100644
--- a/core/components/tvimageplus/elements/tv/input/imageplus.class.php
+++ b/core/components/tvimageplus/elements/tv/input/imageplus.class.php
@@ -46,18 +46,7 @@ public function process($value,array $params = array()) {
         $this->helper = new tvImagePlus($this->modx);
 
         // Load required javascripts & register global config
-        $this->modx->regClientCSS($this->helper->config['assets_url'].'mgr/css/jquery/jquery.jcrop.min.css');
-        $this->modx->regClientStartupScript($this->helper->config['assets_url'].'mgr/js/tvimageplus.js');
-        $this->modx->regClientStartupScript($this->helper->config['assets_url'].'mgr/js/tvimageplus.panel.input.js');
-        $this->modx->regClientStartupScript($this->helper->config['assets_url'].'mgr/js/tvimageplus.window.editor.js');
-        $this->modx->regClientStartupScript($this->helper->config['assets_url'].'mgr/js/tools/JSON2.js');
-        $this->modx->regClientStartupScript($this->helper->config['assets_url'].'mgr/js/jquery/jquery.min.js');
-        $this->modx->regClientStartupScript($this->helper->config['assets_url'].'mgr/js/jquery/jquery.jcrop.min.js');
-        $this->modx->regClientStartupScript($this->helper->config['assets_url'].'mgr/js/tvimageplus.jquery.imagecrop.js');
-        $this->modx->regClientStartupHTMLBlock('');
+        $this->helper->includeScriptAssets();
         
         // Prepare tv config for jsonification
         $tvConfig = $this->helper->loadTvConfig($this,$value,$params);
diff --git a/core/components/tvimageplus/tvImagePlus.class.php b/core/components/tvimageplus/tvImagePlus.class.php
index 79545b10..60e1b988 100644
--- a/core/components/tvimageplus/tvImagePlus.class.php
+++ b/core/components/tvimageplus/tvImagePlus.class.php
@@ -162,11 +162,22 @@ public function loadTvConfig(ImagePlusInputRender $render, $value, array $params
 
 
     /**
-     * Render supporting javascrip
+     * Render supporting javascript to try and help it work with MIGX etc
      */
     public function includeScriptAssets()
     {
-
+        $this->modx->regClientCSS($this->config['assets_url'].'mgr/css/jquery/jquery.jcrop.min.css');
+        $this->modx->regClientStartupScript($this->config['assets_url'].'mgr/js/tvimageplus.js');
+        $this->modx->regClientStartupScript($this->config['assets_url'].'mgr/js/tvimageplus.panel.input.js');
+        $this->modx->regClientStartupScript($this->config['assets_url'].'mgr/js/tvimageplus.window.editor.js');
+        $this->modx->regClientStartupScript($this->config['assets_url'].'mgr/js/tools/JSON2.js');
+        $this->modx->regClientStartupScript($this->config['assets_url'].'mgr/js/jquery/jquery.min.js');
+        $this->modx->regClientStartupScript($this->config['assets_url'].'mgr/js/jquery/jquery.jcrop.min.js');
+        $this->modx->regClientStartupScript($this->config['assets_url'].'mgr/js/tvimageplus.jquery.imagecrop.js');
+        $this->modx->regClientStartupHTMLBlock('');
     }
 
 
@@ -208,10 +219,6 @@ public function getImageURL($json, $opts = array(), modTemplateVar $tv)
             $this->modx->log(xPDO::LOG_LEVEL_INFO,"Image+ TV renderer failed to parse JSON");
 
             return $tv->default_text;
-
-            return "EMPTY TV FIELD";
-
-            return '';
         }
 
         // Load up the mediaSource

From 5e92e93df7b05e793724201e84540f77e68211c9 Mon Sep 17 00:00:00 2001
From: Alan Pich 
Date: Thu, 16 May 2013 08:29:37 +0100
Subject: [PATCH 018/515] [#31] Dont display "Image Too Small" dialog when tv
 is empty

---
 .../tvimageplus/mgr/js/tvimageplus.panel.input.js   | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js b/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js
index 6f12bf36..7e7d0213 100644
--- a/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js
+++ b/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js
@@ -152,7 +152,6 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
      * Fires when the TV field is reset
      */
     ,on_Reset: function(){
-        console.log('RESET!!!');
         this.imageBrowser.setValue('');
         this.tvimageplus.sourceImg = false;
         this.editButton.disable();
@@ -232,7 +231,7 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
         // Make sure image is large enough to use
         if(!this.checkImageIsLargeEnough()){
             this.tvimageplus.sourceImg = this.oldSourceImg;
-            console.log(this.imageBrowser.reset());
+            this.imageBrowser.reset();
             MODx.msg.alert("Image too small","The selected image is too small to be used here. Please select a different image");
             return;
         }
@@ -286,13 +285,19 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
      * @returns bool
      */
     ,checkImageIsLargeEnough: function(){
-        if(this.tvimageplus.targetWidth > 0){
+        if(!this.tvimageplus.sourceImg || this.tvimageplus == undefined) return true;
+
+
+        console.log(this.tvimageplus);
+        if(this.tvimageplus.targetWidth > 0 && this.tvimageplus.sourceImg.width>0){
             if(this.tvimageplus.targetWidth > this.tvimageplus.sourceImg.width){
+                console.log('Width to small');
                 return false;
             }
         }
-        if(this.tvimageplus.targetHeight > 0){
+        if(this.tvimageplus.targetHeight > 0 && this.tvimageplus.sourceImg.height>0){
             if(this.tvimageplus.targetHeight > this.tvimageplus.sourceImg.height){
+                console.log('height too small');
                 return false;
             }
         }

From 7ac73b72319f9424248f6474a33860fdbabd53d3 Mon Sep 17 00:00:00 2001
From: Alan Pich 
Date: Sat, 25 May 2013 12:51:32 +0100
Subject: [PATCH 019/515] Added vagrant box for dev work

---
 _build/vagrant/.gitignore                     |  1 +
 _build/vagrant/Vagrantfile                    | 38 +++++++++++++++
 _build/vagrant/bootstrap.sh                   |  7 +++
 _build/vagrant/bootstrap/bootstrap.php        | 48 +++++++++++++++++++
 .../mgr/js/tvimageplus.migx_renderer.js       |  0
 5 files changed, 94 insertions(+)
 create mode 100644 _build/vagrant/.gitignore
 create mode 100644 _build/vagrant/Vagrantfile
 create mode 100644 _build/vagrant/bootstrap.sh
 create mode 100644 _build/vagrant/bootstrap/bootstrap.php
 create mode 100644 assets/components/tvimageplus/mgr/js/tvimageplus.migx_renderer.js

diff --git a/_build/vagrant/.gitignore b/_build/vagrant/.gitignore
new file mode 100644
index 00000000..8000dd9d
--- /dev/null
+++ b/_build/vagrant/.gitignore
@@ -0,0 +1 @@
+.vagrant
diff --git a/_build/vagrant/Vagrantfile b/_build/vagrant/Vagrantfile
new file mode 100644
index 00000000..2ffea7c8
--- /dev/null
+++ b/_build/vagrant/Vagrantfile
@@ -0,0 +1,38 @@
+### Vagrant Development Environment for tvImagePlus
+#===============================================================================
+#
+#   Brings up a testing server ready to use that will run at http://localhost:8881
+#
+#   phpMyAdmin can be accessed at http://localhost:8881/phpmyadmin
+#       username: root
+#       password: password
+#
+#   SSH into the box by running the command `vagrant ssh` from the project root
+#
+#   MODx manager login is at http://localhost:8881/manager
+#       username: admin
+#       password: password
+#
+
+#### Configure Vagrant ==========================================================
+###=============================================================================
+Vagrant.configure("2") do |config|
+
+    config.vm.define :vagrant do |vbox_config|
+
+        ## Box Definition ######################################################
+        vbox_config.vm.box = "modx-2.2.7-precise32"
+        vbox_config.vm.box_url = "http://vagrant.alanpich.com/modx-2.2.7-precise32.box"
+        config.vm.provision :shell, :path => "bootstrap.sh"
+
+        ## Network Binding #####################################################
+        config.vm.network :forwarded_port, host: 8881, guest: 80
+
+        ## Shared Folders ######################################################
+        vbox_config.vm.synced_folder "../../core/components/tvimageplus", "/var/www/core/components/tvimageplus"
+        vbox_config.vm.synced_folder "../../assets/components/tvimageplus", "/var/www/assets/components/tvimageplus"
+        vbox_config.vm.synced_folder "bootstrap", "/home/vagrant/vagrant-bootstrap"
+
+    end
+
+end
diff --git a/_build/vagrant/bootstrap.sh b/_build/vagrant/bootstrap.sh
new file mode 100644
index 00000000..2c6b463c
--- /dev/null
+++ b/_build/vagrant/bootstrap.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+
+sudo apt-get update;
+sudo apt-get install curl php5-curl -y
+sudo service apache2 restart
+
+php /home/vagrant/vagrant-bootstrap/bootstrap.php > /dev/null
diff --git a/_build/vagrant/bootstrap/bootstrap.php b/_build/vagrant/bootstrap/bootstrap.php
new file mode 100644
index 00000000..e90c3e97
--- /dev/null
+++ b/_build/vagrant/bootstrap/bootstrap.php
@@ -0,0 +1,48 @@
+newObject('modNamespace');
+$namespace->set('name', 'tvimageplus');
+$namespace->set('path', '{core_path}components/tvimageplus/');
+$namespace->set('assets_path', '{assets_path}components/tvimageplus/');
+$namespace->save();
+
+
+// Create the plugin
+$plugin = $modx->newObject('modPlugin');
+$plugin->set('name', 'ImagePlusRouter');
+$plugin->set('static', true);
+$plugin->set('static_file', 'core/components/tvimageplus/elements/plugins/plugin.ImagePlusRouter.php');
+$plugin->set('source',1);
+$plugin->set('locked',true);
+
+$eventNames = array(
+    'OnTVInputRenderList',
+    'OnTVOutputRenderList',
+    'OnTVInputPropertiesList',
+    'OnTVOutputPropertiesList',
+    'OnDocFormRender',
+    'OnTVOutputRenderPropertiesList'
+);
+$events = array();
+foreach($eventNames as $evt){
+    $event = $modx->newObject('modPluginEvent');
+    $event->set('event', $evt);
+    $events[] = $event;
+}
+$plugin->addMany($events);
+$plugin->save();
+
+
+// Clear the cache
+$modx->cacheManager->refresh();
+
diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.migx_renderer.js b/assets/components/tvimageplus/mgr/js/tvimageplus.migx_renderer.js
new file mode 100644
index 00000000..e69de29b

From bd2062a86e40fc7eb4c598040f81bfc7b58d248e Mon Sep 17 00:00:00 2001
From: Alan Pich 
Date: Sat, 25 May 2013 12:53:17 +0100
Subject: [PATCH 020/515] Confirmed working in MIGX [#15] and Articles [#21]

---
 .../components/tvimageplus/mgr/connector.php  |  4 +--
 .../mgr/js/tvimageplus.jquery.imagecrop.js    |  2 +-
 .../tvimageplus/mgr/js/tvimageplus.js         | 28 +++++++++++++--
 .../mgr/js/tvimageplus.migx_renderer.js       | 36 +++++++++++++++++++
 .../mgr/js/tvimageplus.panel.input.js         |  6 +---
 .../mgr/js/tvimageplus.window.editor.js       |  2 +-
 .../components/tvimageplus/docs/changelog.txt |  1 +
 .../plugins/plugin.ImagePlusRouter.php        |  3 +-
 .../elements/tv/input/imageplus.class.php     |  4 +--
 .../elements/tv/input/options/imageplus.php   |  2 +-
 .../elements/tv/output/imageplus.class.php    |  2 +-
 .../elements/tv/output/options/imageplus.php  |  2 +-
 .../tvimageplus/tvImagePlus.class.php         | 27 +++++++-------
 13 files changed, 89 insertions(+), 30 deletions(-)

diff --git a/assets/components/tvimageplus/mgr/connector.php b/assets/components/tvimageplus/mgr/connector.php
index 042ec18f..72b23a17 100644
--- a/assets/components/tvimageplus/mgr/connector.php
+++ b/assets/components/tvimageplus/mgr/connector.php
@@ -14,7 +14,7 @@
  * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License along with
- * Vapor; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+ * tvImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
  * Suite 330, Boston, MA 02111-1307 USA
  *
  * @package tvImagePlus
@@ -40,4 +40,4 @@
 $modx->request->handleRequest(array(
     'processors_path' => $modx->getOption('tvimageplus.core_path',null,$modx->getOption('core_path').'components/tvimageplus/').'processors/',
     'location' => '',
-));
\ No newline at end of file
+));
diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.jquery.imagecrop.js b/assets/components/tvimageplus/mgr/js/tvimageplus.jquery.imagecrop.js
index b349841f..22458ef5 100644
--- a/assets/components/tvimageplus/mgr/js/tvimageplus.jquery.imagecrop.js
+++ b/assets/components/tvimageplus/mgr/js/tvimageplus.jquery.imagecrop.js
@@ -13,7 +13,7 @@
  * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License along with
- * Vapor; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+ * tvImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
  * Suite 330, Boston, MA 02111-1307 USA
  *
  * @package tvImagePlus
diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.js b/assets/components/tvimageplus/mgr/js/tvimageplus.js
index 66a678b5..86ed106c 100644
--- a/assets/components/tvimageplus/mgr/js/tvimageplus.js
+++ b/assets/components/tvimageplus/mgr/js/tvimageplus.js
@@ -13,7 +13,7 @@
  * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License along with
- * Vapor; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+ * tvImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
  * Suite 330, Boston, MA 02111-1307 USA
  *
  * @package tvImagePlus
@@ -27,7 +27,29 @@ var tvImagePlus = function(config) {
     tvImagePlus.superclass.constructor.call(this,config);
 };
 Ext.extend(tvImagePlus,Ext.Component,{
-    page:{},window:{},grid:{},tree:{},panel:{},combo:{},config: {},jquery:{}
+    page:{},window:{},grid:{},tree:{},panel:{},combo:{},config: {},jquery:{},
+
+    generateThumbUrl: function(params){
+        return this.generatePhpThumbOfUrl(params);
+    },
+
+    generatePhpThumbOfUrl: function(params){
+        var url = MODx.config.connectors_url+'system/phpthumb.php?imageplus=1'
+        var defaults = {
+            wctx: 'mgr'
+            ,f: 'png'
+            ,q: 90
+            ,w: 150
+            ,source: 1
+        }
+        for(i in params){ defaults[i] = params[i]};
+        for(i in defaults){
+            url+= '&'+i+'='+defaults[i];
+        };
+        return url;
+
+    }
 });
-Ext.reg('doodles',tvImagePlus);
+Ext.reg('imageplus',tvImagePlus);
 tvImagePlus = new tvImagePlus();
+
diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.migx_renderer.js b/assets/components/tvimageplus/mgr/js/tvimageplus.migx_renderer.js
index e69de29b..76df03dd 100644
--- a/assets/components/tvimageplus/mgr/js/tvimageplus.migx_renderer.js
+++ b/assets/components/tvimageplus/mgr/js/tvimageplus.migx_renderer.js
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2013 by Alan Pich 
+ *
+ * This file is part of tvImagePlus
+ *
+ * tvImagePlus is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * tvImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * tvImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+ * Suite 330, Boston, MA 02111-1307 USA
+ *
+ * @package tvImagePlus
+ * @author Alan Pich 
+ * @copyright Alan Pich 2013
+ */
+
+tvImagePlus.MIGX_Renderer = function(json){
+    if(!json.length) return '';
+    var data = JSON.parse(json);
+    var url = tvImagePlus.generateThumbUrl({
+        src: data.sourceImg.src
+        ,source: data.sourceImg.source
+        ,sw: data.crop.width
+        ,sh: data.crop.height
+        ,sx: data.crop.x
+        ,sy: data.crop.y
+    })
+    return '';
+}
diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js b/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js
index 7e7d0213..21ee506b 100644
--- a/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js
+++ b/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js
@@ -13,7 +13,7 @@
  * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License along with
- * Vapor; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+ * tvImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
  * Suite 330, Boston, MA 02111-1307 USA
  *
  * @package tvImagePlus
@@ -287,17 +287,13 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
     ,checkImageIsLargeEnough: function(){
         if(!this.tvimageplus.sourceImg || this.tvimageplus == undefined) return true;
 
-
-        console.log(this.tvimageplus);
         if(this.tvimageplus.targetWidth > 0 && this.tvimageplus.sourceImg.width>0){
             if(this.tvimageplus.targetWidth > this.tvimageplus.sourceImg.width){
-                console.log('Width to small');
                 return false;
             }
         }
         if(this.tvimageplus.targetHeight > 0 && this.tvimageplus.sourceImg.height>0){
             if(this.tvimageplus.targetHeight > this.tvimageplus.sourceImg.height){
-                console.log('height too small');
                 return false;
             }
         }
diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.window.editor.js b/assets/components/tvimageplus/mgr/js/tvimageplus.window.editor.js
index 815d90f4..f937811d 100644
--- a/assets/components/tvimageplus/mgr/js/tvimageplus.window.editor.js
+++ b/assets/components/tvimageplus/mgr/js/tvimageplus.window.editor.js
@@ -13,7 +13,7 @@
  * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License along with
- * Vapor; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+ * tvImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
  * Suite 330, Boston, MA 02111-1307 USA
  *
  * @package tvImagePlus
diff --git a/core/components/tvimageplus/docs/changelog.txt b/core/components/tvimageplus/docs/changelog.txt
index d8a4aa80..a3541ef4 100644
--- a/core/components/tvimageplus/docs/changelog.txt
+++ b/core/components/tvimageplus/docs/changelog.txt
@@ -4,6 +4,7 @@
 
 # v2.2
 --------
+ :: Now works with MIGX [#15]
  :: TV Default Value is now output if TV is empty
  :: TV Reset button now works [#22]
  :: Added image preloader to accurately get image size on upload.
diff --git a/core/components/tvimageplus/elements/plugins/plugin.ImagePlusRouter.php b/core/components/tvimageplus/elements/plugins/plugin.ImagePlusRouter.php
index 981ba2ab..e5593485 100644
--- a/core/components/tvimageplus/elements/plugins/plugin.ImagePlusRouter.php
+++ b/core/components/tvimageplus/elements/plugins/plugin.ImagePlusRouter.php
@@ -12,6 +12,7 @@
  * @event   OnTVOutputRenderList
  * @event   OnTVInputPropertiesList
  * @event   OnTVOutputPropertiesList
+ * @event   OnTVOutputRenderPropertiesList
  * @event   OnDocFormRender
  *
  */
@@ -47,4 +48,4 @@
         $helper = new tvImagePlus($modx);
         $helper->includeScriptAssets();
         break;
-};
\ No newline at end of file
+};
diff --git a/core/components/tvimageplus/elements/tv/input/imageplus.class.php b/core/components/tvimageplus/elements/tv/input/imageplus.class.php
index 83b0edec..45204ed5 100644
--- a/core/components/tvimageplus/elements/tv/input/imageplus.class.php
+++ b/core/components/tvimageplus/elements/tv/input/imageplus.class.php
@@ -14,7 +14,7 @@
  * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License along with
- * Vapor; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+ * tvImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
  * Suite 330, Boston, MA 02111-1307 USA
  *
  * @package tvImagePlus
@@ -47,7 +47,7 @@ public function process($value,array $params = array()) {
 
         // Load required javascripts & register global config
         $this->helper->includeScriptAssets();
-        
+
         // Prepare tv config for jsonification
         $tvConfig = $this->helper->loadTvConfig($this,$value,$params);
         $this->setPlaceholder('tvimageplusconfig',json_encode($tvConfig));
diff --git a/core/components/tvimageplus/elements/tv/input/options/imageplus.php b/core/components/tvimageplus/elements/tv/input/options/imageplus.php
index ac998edd..010d8dbc 100644
--- a/core/components/tvimageplus/elements/tv/input/options/imageplus.php
+++ b/core/components/tvimageplus/elements/tv/input/options/imageplus.php
@@ -14,7 +14,7 @@
  * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License along with
- * Vapor; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+ * tvImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
  * Suite 330, Boston, MA 02111-1307 USA
  *
  * @package tvImagePlus
diff --git a/core/components/tvimageplus/elements/tv/output/imageplus.class.php b/core/components/tvimageplus/elements/tv/output/imageplus.class.php
index 2bcc1c40..1805eb0e 100644
--- a/core/components/tvimageplus/elements/tv/output/imageplus.class.php
+++ b/core/components/tvimageplus/elements/tv/output/imageplus.class.php
@@ -14,7 +14,7 @@
  * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License along with
- * Vapor; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+ * tvImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
  * Suite 330, Boston, MA 02111-1307 USA
  *
  * @package tvImagePlus
diff --git a/core/components/tvimageplus/elements/tv/output/options/imageplus.php b/core/components/tvimageplus/elements/tv/output/options/imageplus.php
index 35966a18..e6478725 100644
--- a/core/components/tvimageplus/elements/tv/output/options/imageplus.php
+++ b/core/components/tvimageplus/elements/tv/output/options/imageplus.php
@@ -14,7 +14,7 @@
  * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License along with
- * Vapor; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+ * tvImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
  * Suite 330, Boston, MA 02111-1307 USA
  *
  * @package tvImagePlus
diff --git a/core/components/tvimageplus/tvImagePlus.class.php b/core/components/tvimageplus/tvImagePlus.class.php
index 60e1b988..7a98dabf 100644
--- a/core/components/tvimageplus/tvImagePlus.class.php
+++ b/core/components/tvimageplus/tvImagePlus.class.php
@@ -14,7 +14,7 @@
  * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License along with
- * Vapor; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+ * tvImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
  * Suite 330, Boston, MA 02111-1307 USA
  *
  * @package tvImagePlus
@@ -170,6 +170,7 @@ public function includeScriptAssets()
         $this->modx->regClientStartupScript($this->config['assets_url'].'mgr/js/tvimageplus.js');
         $this->modx->regClientStartupScript($this->config['assets_url'].'mgr/js/tvimageplus.panel.input.js');
         $this->modx->regClientStartupScript($this->config['assets_url'].'mgr/js/tvimageplus.window.editor.js');
+        $this->modx->regClientStartupScript($this->config['assets_url'].'mgr/js/tvimageplus.migx_renderer.js');
         $this->modx->regClientStartupScript($this->config['assets_url'].'mgr/js/tools/JSON2.js');
         $this->modx->regClientStartupScript($this->config['assets_url'].'mgr/js/jquery/jquery.min.js');
         $this->modx->regClientStartupScript($this->config['assets_url'].'mgr/js/jquery/jquery.jcrop.min.js');
@@ -244,18 +245,20 @@ public function getImageURL($json, $opts = array(), modTemplateVar $tv)
         );
 
         // Add in output render params
-        $optParams = explode('&', $opts['phpThumbParams']);
-        foreach ($optParams as $oP) {
-            if (empty($oP)) {
-                continue;
-            };
-            $bits = explode('=', $oP);
-            $params[$bits[0]] = $bits[1];
-        }
-
         $options = array();
-        foreach ($params as $key => $val) {
-            $options[] = $key . '=' . $val;
+        if(isset($opts['phpThumbParams'])){
+            $optParams = explode('&', $opts['phpThumbParams']);
+            foreach ($optParams as $oP) {
+                if (empty($oP)) {
+                    continue;
+                };
+                $bits = explode('=', $oP);
+                $params[$bits[0]] = $bits[1];
+            }
+
+            foreach ($params as $key => $val) {
+                $options[] = $key . '=' . $val;
+            };
         };
         $options = implode('&', $options);
 

From 118568225ec8fc96b1f1f5e54d1bfe3fda83d1e7 Mon Sep 17 00:00:00 2001
From: Alan Pich 
Date: Sat, 25 May 2013 12:53:47 +0100
Subject: [PATCH 021/515] Cant remember what, but changes to gitignore

---
 .gitignore | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.gitignore b/.gitignore
index 4bfb5695..f56a23d9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,3 @@
 config.core.php
 .idea
-*.zip
\ No newline at end of file
+*.zip

From a4e4db0d3b9be39104539c0f4491b99e9ffddb7c Mon Sep 17 00:00:00 2001
From: Alan Pich 
Date: Sat, 25 May 2013 13:27:00 +0100
Subject: [PATCH 022/515] Updated copyright notes

---
 assets/components/tvimageplus/mgr/connector.php   |  2 +-
 .../mgr/js/tvimageplus.jquery.imagecrop.js        |  2 +-
 .../components/tvimageplus/mgr/js/tvimageplus.js  |  2 +-
 .../mgr/js/tvimageplus.migx_renderer.js           |  2 +-
 .../tvimageplus/mgr/js/tvimageplus.panel.input.js |  2 +-
 .../mgr/js/tvimageplus.window.editor.js           |  2 +-
 .../lib/CropEngines/AbstractCropEngine.php        | 15 +++++++++++++++
 .../tvimageplus/lib/CropEngines/PhpThumbOf.php    | 15 +++++++++++++++
 8 files changed, 36 insertions(+), 6 deletions(-)
 create mode 100644 core/components/tvimageplus/lib/CropEngines/AbstractCropEngine.php
 create mode 100644 core/components/tvimageplus/lib/CropEngines/PhpThumbOf.php

diff --git a/assets/components/tvimageplus/mgr/connector.php b/assets/components/tvimageplus/mgr/connector.php
index 72b23a17..cb36cafa 100644
--- a/assets/components/tvimageplus/mgr/connector.php
+++ b/assets/components/tvimageplus/mgr/connector.php
@@ -1,5 +1,5 @@
 
  *
  * This file is part of tvImagePlus
diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.jquery.imagecrop.js b/assets/components/tvimageplus/mgr/js/tvimageplus.jquery.imagecrop.js
index 22458ef5..1c458066 100644
--- a/assets/components/tvimageplus/mgr/js/tvimageplus.jquery.imagecrop.js
+++ b/assets/components/tvimageplus/mgr/js/tvimageplus.jquery.imagecrop.js
@@ -1,4 +1,4 @@
-/*
+/**
  * Copyright 2013 by Alan Pich 
  *
  * This file is part of tvImagePlus
diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.js b/assets/components/tvimageplus/mgr/js/tvimageplus.js
index 86ed106c..1539f63b 100644
--- a/assets/components/tvimageplus/mgr/js/tvimageplus.js
+++ b/assets/components/tvimageplus/mgr/js/tvimageplus.js
@@ -1,4 +1,4 @@
-/*
+/**
  * Copyright 2013 by Alan Pich 
  *
  * This file is part of tvImagePlus
diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.migx_renderer.js b/assets/components/tvimageplus/mgr/js/tvimageplus.migx_renderer.js
index 76df03dd..a1070c83 100644
--- a/assets/components/tvimageplus/mgr/js/tvimageplus.migx_renderer.js
+++ b/assets/components/tvimageplus/mgr/js/tvimageplus.migx_renderer.js
@@ -1,4 +1,4 @@
-/*
+/**
  * Copyright 2013 by Alan Pich 
  *
  * This file is part of tvImagePlus
diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js b/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js
index 21ee506b..9f53728c 100644
--- a/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js
+++ b/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js
@@ -1,4 +1,4 @@
-/*
+/**
  * Copyright 2013 by Alan Pich 
  *
  * This file is part of tvImagePlus
diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.window.editor.js b/assets/components/tvimageplus/mgr/js/tvimageplus.window.editor.js
index f937811d..1aaaab95 100644
--- a/assets/components/tvimageplus/mgr/js/tvimageplus.window.editor.js
+++ b/assets/components/tvimageplus/mgr/js/tvimageplus.window.editor.js
@@ -1,4 +1,4 @@
-/*
+/**
  * Copyright 2013 by Alan Pich 
  *
  * This file is part of tvImagePlus
diff --git a/core/components/tvimageplus/lib/CropEngines/AbstractCropEngine.php b/core/components/tvimageplus/lib/CropEngines/AbstractCropEngine.php
new file mode 100644
index 00000000..49f487da
--- /dev/null
+++ b/core/components/tvimageplus/lib/CropEngines/AbstractCropEngine.php
@@ -0,0 +1,15 @@
+
Date: Sat, 25 May 2013 13:28:02 +0100
Subject: [PATCH 023/515] Extract phpThumbOf functionality into separate class
 ready for adding others

---
 .../lib/CropEngines/AbstractCropEngine.php    |  61 +++++++-
 .../lib/CropEngines/PhpThumbOf.php            | 136 +++++++++++++++++-
 .../tvimageplus/tvImagePlus.class.php         | 118 ++++-----------
 3 files changed, 211 insertions(+), 104 deletions(-)

diff --git a/core/components/tvimageplus/lib/CropEngines/AbstractCropEngine.php b/core/components/tvimageplus/lib/CropEngines/AbstractCropEngine.php
index 49f487da..21c95087 100644
--- a/core/components/tvimageplus/lib/CropEngines/AbstractCropEngine.php
+++ b/core/components/tvimageplus/lib/CropEngines/AbstractCropEngine.php
@@ -1,15 +1,64 @@
 
+ *
+ * This file is part of tvImagePlus
+ *
+ * tvImagePlus is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * tvImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * tvImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+ * Suite 330, Boston, MA 02111-1307 USA
+ *
+ * @package tvImagePlus
+ * @author Alan Pich 
+ * @copyright Alan Pich 2013
  */
 
 namespace tvImagePlus\CropEngines;
 
 
-class AbstractCropEngine {
+abstract class AbstractCropEngine
+{
+
+    /**
+     * @var \modX
+     */
+    protected $modx;
+
+    public function __construct(\modX $modx)
+    {
+        $this->modx = $modx;
+
+        echo '
Loaded CropEngine
'; + } + + + /** + * Checks that all requirements are met for using + * this engine + * + * @return bool True if engine is usable + */ + abstract public function engineRequirementsMet(); + + + /** + * Parse image+ data and return a url for the cropped + * version of the image + * + * @param $json + * @param array $opts + * @param \modTemplateVar $tv + * @return string + */ + abstract public function getImageUrl($json, $opts = array(), \modTemplateVar $tv); } diff --git a/core/components/tvimageplus/lib/CropEngines/PhpThumbOf.php b/core/components/tvimageplus/lib/CropEngines/PhpThumbOf.php index c8b1e65c..976ecefd 100644 --- a/core/components/tvimageplus/lib/CropEngines/PhpThumbOf.php +++ b/core/components/tvimageplus/lib/CropEngines/PhpThumbOf.php @@ -1,15 +1,139 @@ + * + * This file is part of tvImagePlus + * + * tvImagePlus is free software; you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * tvImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * tvImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place, + * Suite 330, Boston, MA 02111-1307 USA + * + * @package tvImagePlus + * @author Alan Pich + * @copyright Alan Pich 2013 */ namespace tvImagePlus\CropEngines; +/** + * Class PhpThumbOf + * + * Uses the phpthumbof extra to generate cropped images + * + * @package tvImagePlus + * @subpackage tvImagePlus\CropEngines + */ +class PhpThumbOf extends AbstractCropEngine { + + + /** + * Checks that all requirements are met for using + * this engine + * + * @return bool True if engine is usable + */ + public function engineRequirementsMet(){ + $pto = $this->modx->getObject('modSnippet', array('name' => 'phpthumbof')); + return $pto instanceof \modSnippet; + } + + + + /** + * Parse image+ data and return a url for the cropped + * version of the image + * + * @param $json + * @param array $opts + * @param \modTemplateVar $tv + * @return string + */ + public function getImageUrl($json, $opts = array(), \modTemplateVar $tv){ + + // Parse json to object + $data = json_decode($json); + + // If data is null, json was invalid or empty. + // This is almost certainly because the TV is empty + if(is_null($data)){ + $this->modx->log(\xPDO::LOG_LEVEL_INFO,"Image+ TV renderer failed to parse JSON"); + return $tv->default_text; + } + + // Load up the mediaSource + $source = $this->modx->getObject('modMediaSource', $data->sourceImg->source); + if (!$source instanceof \modMediaSource) { + return 'Image+ Error: Invalid Media Source'; + }; + $source->initialize(); + + // Grab absolute system path to image + $imgPath = $source->getBasePath() . $data->sourceImg->src; + + // Prepare arguments for phpthumbof snippet call + $params = array( + 'src' => $imgPath, + 'w' => $data->targetWidth, + 'h' => $data->targetHeight, + 'far' => true, + 'sx' => $data->crop->x, + 'sy' => $data->crop->y, + 'sw' => $data->crop->width, + 'sh' => $data->crop->height + ); + + // Add in output render params + $options = array(); + if(isset($opts['phpThumbParams'])){ + $optParams = explode('&', $opts['phpThumbParams']); + foreach ($optParams as $oP) { + if (empty($oP)) { + continue; + }; + $bits = explode('=', $oP); + $params[$bits[0]] = $bits[1]; + } + + foreach ($params as $key => $val) { + $options[] = $key . '=' . $val; + }; + }; + $options = implode('&', $options); + + + // Call phpthumbof for url + $url = $this->modx->runSnippet( + 'phpthumbof', + array( + 'options' => $options, + 'input' => $imgPath + ) + ); + + // If an output chunk is selected, parse that + if (isset($opts['outputChunk']) && !empty($opts['outputChunk'])) { + $chunkParams = array( + 'url' => $url, + 'alt' => $data->altTag, + 'width' => $data->targetWidth, + 'height' => $data->targetHeight + ); + return $this->modx->getChunk($opts['outputChunk'], $chunkParams); + } else { + // Otherwise return raw url + return $url; + }; + + } -class PhpThumbOf { } diff --git a/core/components/tvimageplus/tvImagePlus.class.php b/core/components/tvimageplus/tvImagePlus.class.php index 7a98dabf..8f8260f0 100644 --- a/core/components/tvimageplus/tvImagePlus.class.php +++ b/core/components/tvimageplus/tvImagePlus.class.php @@ -1,5 +1,5 @@ * * This file is part of tvImagePlus @@ -153,7 +153,6 @@ public function loadTvConfig(ImagePlusInputRender $render, $value, array $params $data->sourceImg->height = $saved->sourceImg->height; $data->sourceImg->src = $saved->sourceImg->src; $data->sourceImg->source = $saved->sourceImg->source; - // die('
'.print_r($saved,1));
             $data->altTag = ($data->altTagOn ? (isset($saved->altTag) ? $saved->altTag : '') : false);
         }
 
@@ -182,19 +181,6 @@ public function includeScriptAssets()
     }
 
 
-    /**
-     * Check if phpThumbOf is installed
-     *
-     * @return bool
-     */
-    public function hasPhpThumbOf()
-    {
-        $pto = $this->modx->getObject('modSnippet', array('name' => 'phpthumbof'));
-        return $pto instanceof modSnippet;
-    }
-
-    //
-
     /**
      * Return a scaled, cached version of the source image for front-end use
      *
@@ -206,85 +192,33 @@ public function hasPhpThumbOf()
      */
     public function getImageURL($json, $opts = array(), modTemplateVar $tv)
     {
-        // Return error message if phpthumbof not found
-        if (!$this->hasPhpThumbOf()) {
-            return "Image+ Error: PhpThumbOf Extra not found";
-        }
-
-        // Parse json to object
-        $data = json_decode($json);
-
-        // If data is null, json was invalid or empty.
-        // This is almost certainly because the TV is empty
-        if(is_null($data)){
-            $this->modx->log(xPDO::LOG_LEVEL_INFO,"Image+ TV renderer failed to parse JSON");
-
-            return $tv->default_text;
+        // Register a micro autoloader for in-house engines
+        spl_autoload_register(function($className){
+            if(strpos($className,'tvImagePlus\\CropEngines\\') === false)
+                return;
+
+            $class = str_replace('tvImagePlus\\CropEngines\\','',$className);
+            $path = dirname(__FILE__).'/lib/CropEngines/'.$class.'.php';
+            if(is_readable($path))
+                include $path;
+
+        });
+
+        // Check system settings for crop engine override
+        $engineClass = $this->modx->getOption('tvimageplus.crop_engine_class',null,'\\tvImagePlus\\CropEngines\\PhpThumbOf');
+
+        /**
+         * @var tvImagePlus\CropEngines\AbstractCropEngine $cropEngine
+         */
+        $cropEngine = new $engineClass($this->modx);
+
+        // Check crop engine is usable
+        if(!$cropEngine->engineRequirementsMet()){
+            $this->modx->log(xPDO::LOG_LEVEL_ERROR,"Image+ :: Requirements not met for Crop Engine [{$engineClass}]");
+            return 'IMAGE+ ERROR';
         }
 
-        // Load up the mediaSource
-        $source = $this->modx->getObject('modMediaSource', $data->sourceImg->source);
-        if (!$source instanceof modMediaSource) {
-            return 'Image+ Error: Invalid Media Source';
-        };
-        $source->initialize();
-
-        // Grab absolute system path to image
-        $imgPath = $source->getBasePath() . $data->sourceImg->src;
-
-        // Prepare arguments for phpthumbof snippet call
-        $params = array(
-            'src' => $imgPath,
-            'w' => $data->targetWidth,
-            'h' => $data->targetHeight,
-            'far' => true,
-            'sx' => $data->crop->x,
-            'sy' => $data->crop->y,
-            'sw' => $data->crop->width,
-            'sh' => $data->crop->height
-        );
-
-        // Add in output render params
-        $options = array();
-        if(isset($opts['phpThumbParams'])){
-            $optParams = explode('&', $opts['phpThumbParams']);
-            foreach ($optParams as $oP) {
-                if (empty($oP)) {
-                    continue;
-                };
-                $bits = explode('=', $oP);
-                $params[$bits[0]] = $bits[1];
-            }
-
-            foreach ($params as $key => $val) {
-                $options[] = $key . '=' . $val;
-            };
-        };
-        $options = implode('&', $options);
-
-
-        // Call phpthumbof for url
-        $url = $this->modx->runSnippet(
-            'phpthumbof',
-            array(
-                'options' => $options,
-                'input' => $imgPath
-            )
-        );
-
-        // If an output chunk is selected, parse that
-        if (isset($opts['outputChunk']) && !empty($opts['outputChunk'])) {
-            $chunkParams = array(
-                'url' => $url,
-                'alt' => $data->altTag,
-                'width' => $data->targetWidth,
-                'height' => $data->targetHeight
-            );
-            return $this->modx->getChunk($opts['outputChunk'], $chunkParams);
-        } else {
-            // Otherwise return raw url
-            return $url;
-        };
+        return $cropEngine->getImageUrl($json,$opts,$tv);
     }
     //
 

From bd07681e3e64ebc53485182bf6d8676849b7348c Mon Sep 17 00:00:00 2001
From: Alan Pich 
Date: Sat, 25 May 2013 13:28:18 +0100
Subject: [PATCH 024/515] update copyright notes

---
 core/components/tvimageplus/docs/changelog.txt                  | 2 ++
 .../tvimageplus/elements/tv/input/imageplus.class.php           | 2 +-
 .../tvimageplus/elements/tv/input/options/imageplus.php         | 2 +-
 .../tvimageplus/elements/tv/output/imageplus.class.php          | 2 +-
 .../tvimageplus/elements/tv/output/options/imageplus.php        | 2 +-
 5 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/core/components/tvimageplus/docs/changelog.txt b/core/components/tvimageplus/docs/changelog.txt
index a3541ef4..8e5cec64 100644
--- a/core/components/tvimageplus/docs/changelog.txt
+++ b/core/components/tvimageplus/docs/changelog.txt
@@ -4,6 +4,8 @@
 
 # v2.2
 --------
+ :: Added grid renderer for MIGX backend
+ :: Confirmed to work with Articles [#21]
  :: Now works with MIGX [#15]
  :: TV Default Value is now output if TV is empty
  :: TV Reset button now works [#22]
diff --git a/core/components/tvimageplus/elements/tv/input/imageplus.class.php b/core/components/tvimageplus/elements/tv/input/imageplus.class.php
index 45204ed5..befd70d6 100644
--- a/core/components/tvimageplus/elements/tv/input/imageplus.class.php
+++ b/core/components/tvimageplus/elements/tv/input/imageplus.class.php
@@ -1,5 +1,5 @@
 
  *
  * This file is part of tvImagePlus
diff --git a/core/components/tvimageplus/elements/tv/input/options/imageplus.php b/core/components/tvimageplus/elements/tv/input/options/imageplus.php
index 010d8dbc..e3cefdb9 100644
--- a/core/components/tvimageplus/elements/tv/input/options/imageplus.php
+++ b/core/components/tvimageplus/elements/tv/input/options/imageplus.php
@@ -1,5 +1,5 @@
 
  *
  * This file is part of tvImagePlus
diff --git a/core/components/tvimageplus/elements/tv/output/imageplus.class.php b/core/components/tvimageplus/elements/tv/output/imageplus.class.php
index 1805eb0e..9e200b0a 100644
--- a/core/components/tvimageplus/elements/tv/output/imageplus.class.php
+++ b/core/components/tvimageplus/elements/tv/output/imageplus.class.php
@@ -1,5 +1,5 @@
 
  *
  * This file is part of tvImagePlus
diff --git a/core/components/tvimageplus/elements/tv/output/options/imageplus.php b/core/components/tvimageplus/elements/tv/output/options/imageplus.php
index e6478725..55441af7 100644
--- a/core/components/tvimageplus/elements/tv/output/options/imageplus.php
+++ b/core/components/tvimageplus/elements/tv/output/options/imageplus.php
@@ -1,5 +1,5 @@
 
  *
  * This file is part of tvImagePlus

From 1fbdc297774158b9240e9898a037ce0357394faa Mon Sep 17 00:00:00 2001
From: Alan Pich 
Date: Sat, 25 May 2013 13:56:23 +0100
Subject: [PATCH 025/515] Added phpThumbsUp crop engine

---
 .../components/tvimageplus/docs/changelog.txt |   2 +
 .../plugins/plugin.ImagePlusRouter.php        |   2 +-
 .../lib/CropEngines/AbstractCropEngine.php    |   2 -
 .../lib/CropEngines/PhpThumbsUp.php           | 140 ++++++++++++++++++
 .../tvimageplus/tvImagePlus.class.php         |  28 +++-
 5 files changed, 168 insertions(+), 6 deletions(-)
 create mode 100644 core/components/tvimageplus/lib/CropEngines/PhpThumbsUp.php

diff --git a/core/components/tvimageplus/docs/changelog.txt b/core/components/tvimageplus/docs/changelog.txt
index 8e5cec64..ddf7a117 100644
--- a/core/components/tvimageplus/docs/changelog.txt
+++ b/core/components/tvimageplus/docs/changelog.txt
@@ -4,6 +4,8 @@
 
 # v2.2
 --------
+ :: Added PhpThumbsUp crop engine
+ :: Refactored to allow changing of crop engines
  :: Added grid renderer for MIGX backend
  :: Confirmed to work with Articles [#21]
  :: Now works with MIGX [#15]
diff --git a/core/components/tvimageplus/elements/plugins/plugin.ImagePlusRouter.php b/core/components/tvimageplus/elements/plugins/plugin.ImagePlusRouter.php
index e5593485..c5ffd646 100644
--- a/core/components/tvimageplus/elements/plugins/plugin.ImagePlusRouter.php
+++ b/core/components/tvimageplus/elements/plugins/plugin.ImagePlusRouter.php
@@ -48,4 +48,4 @@
         $helper = new tvImagePlus($modx);
         $helper->includeScriptAssets();
         break;
-};
+};
\ No newline at end of file
diff --git a/core/components/tvimageplus/lib/CropEngines/AbstractCropEngine.php b/core/components/tvimageplus/lib/CropEngines/AbstractCropEngine.php
index 21c95087..4de45e42 100644
--- a/core/components/tvimageplus/lib/CropEngines/AbstractCropEngine.php
+++ b/core/components/tvimageplus/lib/CropEngines/AbstractCropEngine.php
@@ -36,8 +36,6 @@ abstract class AbstractCropEngine
     public function __construct(\modX $modx)
     {
         $this->modx = $modx;
-
-        echo '
Loaded CropEngine
'; } diff --git a/core/components/tvimageplus/lib/CropEngines/PhpThumbsUp.php b/core/components/tvimageplus/lib/CropEngines/PhpThumbsUp.php new file mode 100644 index 00000000..8ecdb8f4 --- /dev/null +++ b/core/components/tvimageplus/lib/CropEngines/PhpThumbsUp.php @@ -0,0 +1,140 @@ + + * + * This file is part of tvImagePlus + * + * tvImagePlus is free software; you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * tvImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * tvImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place, + * Suite 330, Boston, MA 02111-1307 USA + * + * @package tvImagePlus + * @author Alan Pich + * @copyright Alan Pich 2013 + */ + +namespace tvImagePlus\CropEngines; + +/** + * Class PhpThumbsUp + * + * Uses the phpthumbsup extra to generate cropped images + * + * @package tvImagePlus + * @subpackage tvImagePlus\CropEngines + */ +class PhpThumbsUp extends AbstractCropEngine { + + + /** + * Checks that all requirements are met for using + * this engine + * + * @return bool True if engine is usable + */ + public function engineRequirementsMet(){ + $pto = $this->modx->getObject('modSnippet', array('name' => 'phpthumbsup')); + return $pto instanceof \modSnippet; + } + + + + /** + * Parse image+ data and return a url for the cropped + * version of the image + * + * @param $json + * @param array $opts + * @param \modTemplateVar $tv + * @return string + */ + public function getImageUrl($json, $opts = array(), \modTemplateVar $tv){ + + // Parse json to object + $data = json_decode($json); + + // If data is null, json was invalid or empty. + // This is almost certainly because the TV is empty + if(is_null($data)){ + $this->modx->log(\xPDO::LOG_LEVEL_INFO,"Image+ TV renderer failed to parse JSON"); + return $tv->default_text; + } + + // Load up the mediaSource + $source = $this->modx->getObject('modMediaSource', $data->sourceImg->source); + if (!$source instanceof \modMediaSource) { + return 'Image+ Error: Invalid Media Source'; + }; + $source->initialize(); + + // Grab absolute system path to image + $imgPath = $data->sourceImg->src; + + // Prepare arguments for phpthumbof snippet call + $params = array( + 'w' => $data->targetWidth, + 'h' => $data->targetHeight, + 'far' => true, + 'sx' => $data->crop->x, + 'sy' => $data->crop->y, + 'sw' => $data->crop->width, + 'sh' => $data->crop->height + ); + + // Add in output render params + $options = array(); + if(isset($opts['phpThumbParams'])){ + $optParams = explode('&', $opts['phpThumbParams']); + foreach ($optParams as $oP) { + if (empty($oP)) { + continue; + }; + $bits = explode('=', $oP); + $params[$bits[0]] = $bits[1]; + } + + foreach ($params as $key => $val) { + $options[] = $key . '=' . $val; + }; + }; + $options = implode('&', $options); + + + // Call phpthumbof for url + $url = $this->modx->runSnippet( + 'phpthumbsup', + array( + 'options' => $options, + 'input' => $imgPath + ) + ); + + $url = str_replace('%2F','/',$url); + + // If an output chunk is selected, parse that + if (isset($opts['outputChunk']) && !empty($opts['outputChunk'])) { + $chunkParams = array( + 'url' => $url, + 'alt' => $data->altTag, + 'width' => $data->targetWidth, + 'height' => $data->targetHeight + ); + return $this->modx->getChunk($opts['outputChunk'], $chunkParams); + } else { + // Otherwise return raw url + return $url; + }; + + } + + +} diff --git a/core/components/tvimageplus/tvImagePlus.class.php b/core/components/tvimageplus/tvImagePlus.class.php index 8f8260f0..b24ef045 100644 --- a/core/components/tvimageplus/tvImagePlus.class.php +++ b/core/components/tvimageplus/tvImagePlus.class.php @@ -205,7 +205,16 @@ public function getImageURL($json, $opts = array(), modTemplateVar $tv) }); // Check system settings for crop engine override - $engineClass = $this->modx->getOption('tvimageplus.crop_engine_class',null,'\\tvImagePlus\\CropEngines\\PhpThumbOf'); + $engineClass = $this->modx->getOption('tvimageplus.crop_engine_class',null,false); + + // Do some basic intelligent sniffing + if(!$engineClass){ + if($this->snippetExists('phpthumbsup')){ + $engineClass = '\\tvImagePlus\\CropEngines\\PhpThumbsUp'; + } else { + $engineClass = '\\tvImagePlus\\CropEngines\\PhpThumbOf'; + } + } /** * @var tvImagePlus\CropEngines\AbstractCropEngine $cropEngine @@ -215,12 +224,25 @@ public function getImageURL($json, $opts = array(), modTemplateVar $tv) // Check crop engine is usable if(!$cropEngine->engineRequirementsMet()){ $this->modx->log(xPDO::LOG_LEVEL_ERROR,"Image+ :: Requirements not met for Crop Engine [{$engineClass}]"); - return 'IMAGE+ ERROR'; + return 'IMAGE+ ERROR - requirements not met for crop engine'; } return $cropEngine->getImageUrl($json,$opts,$tv); } - // + + + /** + * Check if a snippet exists by name + * + * @param string $snippet Name of snippet to check for + * @return bool + */ + protected function snippetExists($snippet){ + $obj = $this->modx->getObject('modSnippet',array( + 'name' => $snippet + )); + return $obj instanceof modSnippet; + } } From b992d8b5927dcfefee763ae5a3c4ca9c8c489133 Mon Sep 17 00:00:00 2001 From: Alan Pich Date: Sat, 25 May 2013 14:08:21 +0100 Subject: [PATCH 026/515] tweak build script --- _build/build.transport.php | 6 +++--- _build/tools/build.tools.php | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/_build/build.transport.php b/_build/build.transport.php index c2597964..d97334fa 100644 --- a/_build/build.transport.php +++ b/_build/build.transport.php @@ -1,5 +1,5 @@ * * This file is part of tvImagePlus @@ -14,7 +14,7 @@ * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with - * Vapor; if not, write to the Free Software Foundation, Inc., 59 Temple Place, + * tvImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place, * Suite 330, Boston, MA 02111-1307 USA * * @package tvImagePlus @@ -83,4 +83,4 @@ $modx->log(modX::LOG_LEVEL_INFO,"Package ".PKG_NAME.' '.PKG_VERSION.'-'.PKG_RELEASE." built in {$totalTime}"); -exit; \ No newline at end of file +exit; diff --git a/_build/tools/build.tools.php b/_build/tools/build.tools.php index eb2bbedc..dcf7b758 100644 --- a/_build/tools/build.tools.php +++ b/_build/tools/build.tools.php @@ -1,5 +1,5 @@ * * This file is part of tvImagePlus @@ -14,7 +14,7 @@ * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with - * Vapor; if not, write to the Free Software Foundation, Inc., 59 Temple Place, + * tvImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place, * Suite 330, Boston, MA 02111-1307 USA * * @package tvImagePlus @@ -101,4 +101,4 @@ function getGitCommitId( $repoRoot ){ -} \ No newline at end of file +} From 3bb7afed12570add244f5e30818be062cef9db95 Mon Sep 17 00:00:00 2001 From: Alan Pich Date: Sat, 25 May 2013 14:09:21 +0100 Subject: [PATCH 027/515] Updated plugin packager to include onDocFormRender event --- _build/data/transport.plugin.ImagePlusRouter.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/_build/data/transport.plugin.ImagePlusRouter.php b/_build/data/transport.plugin.ImagePlusRouter.php index 0f1d1288..6ee56d50 100644 --- a/_build/data/transport.plugin.ImagePlusRouter.php +++ b/_build/data/transport.plugin.ImagePlusRouter.php @@ -39,6 +39,12 @@ function getPluginContent($filename) { $event->set('propertyset',0); $events[] = $event; +$event = $modx->newObject('modPluginEvent'); +$event->set('event','OnDocFormRender'); +$event->set('priority',0); +$event->set('propertyset',0); +$events[] = $event; + $plugin->addMany($events); $modx->log(xPDO::LOG_LEVEL_INFO,'Packaged in '.count($events).' Plugin Events.'); flush(); unset($events); @@ -59,4 +65,4 @@ function getPluginContent($filename) { ); $vehicle = $builder->createVehicle($plugin, $attributes); $modx->log(modX::LOG_LEVEL_INFO,'Added plugin ImagePlusRouter'); -$builder->putVehicle($vehicle); \ No newline at end of file +$builder->putVehicle($vehicle); From 25f9c08a2ee6c497b0927c7320824f4755a4a477 Mon Sep 17 00:00:00 2001 From: Alan Pich Date: Wed, 29 May 2013 10:53:02 +0100 Subject: [PATCH 028/515] Update version for v2.2.0-beta and add build instructions to readme --- README.md | 5 +++-- _build/build.config.php | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1a3d8a8e..d7fbd30d 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,10 @@ # Image+ v2.0 # ## Advanced Image Template Variable -**v2.1 now available for [download](https://github.com/downloads/alanpich/tvImagePlus/tvimageplus-2.1-pl.transport.zip) `v2.1-pl`** +** v2.2 is currently in beta phase - [Build Instructions](https://github.com/alanpich/tvImagePlus/wiki/Installation) - +please log any feedback as an issue [here](https://github.com/alanpich/tvImagePlus/issues) ** -**Dependant on PhpThumbOf component** +**Dependant on PhpThumbOf or PhpThumbsUp component** Advanced image TV input type for MODx Revolution. The required dimensions for the image can (optionally) diff --git a/_build/build.config.php b/_build/build.config.php index ddd24949..7ea9ec9f 100644 --- a/_build/build.config.php +++ b/_build/build.config.php @@ -2,7 +2,7 @@ define('PKG_NAME', 'Image+ TV'); define('PKG_NAMESPACE', 'tvimageplus'); -define('PKG_VERSION','2.1.5'); +define('PKG_VERSION','2.2.0'); define('PKG_RELEASE','beta'); From 9d1b9391fa5029d656586aeb6bf48219e1f94cdb Mon Sep 17 00:00:00 2001 From: Glenn Ko Date: Fri, 19 Jul 2013 18:23:17 +0800 Subject: [PATCH 029/515] front-end manager GUI fixes. Added 'Clear Image' button and other improvements. --- .../mgr/js/tvimageplus.panel.input.js | 93 +++++++++++++++++-- .../mgr/js/tvimageplus.window.editor.js | 19 +++- 2 files changed, 99 insertions(+), 13 deletions(-) diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js b/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js index 9f53728c..c906f52f 100644 --- a/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js +++ b/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js @@ -27,6 +27,7 @@ tvImagePlus.panel.input = function(config) { this.tvimageplus = config.tvimageplus; this.create_editButton(); + this.create_clearButton(); this.create_imageBrowser(); this.create_imagePreview(); this.create_altTextField(); @@ -50,7 +51,7 @@ tvImagePlus.panel.input = function(config) { ,'afterRender': {fn: this.onAfterRender,scope:this} } ,items: [this.imageBrowser,this.editButton] - },this.altTextField,this.imagePreview] + },this.altTextField,this.imagePreview,this.clearButton] }); tvImagePlus.panel.input.superclass.constructor.call(this,config); @@ -86,6 +87,14 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, { ,icon: tvImagePlus.config.crop_icon }) }// + + ,create_clearButton: function(){ + this.clearButton = new Ext.Button({ + text: _('tvimageplus.clear_image') || "Clear Image" + ,handler: this.clearImage + ,scope:this + }) + }// /** * Create the image browser combo @@ -176,11 +185,15 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, { * Fired when user has selected an image from the browser */ ,on_imageSelected: function(img){ + + var diffImg = (this.tvimageplus.sourceImg && this.tvimageplus.sourceImg.src != img.relativeUrl); - this.oldSourceImg = {}; - for(i in this.tvimageplus){ + + this.oldSourceImg = {}; + for(i in this.tvimageplus.sourceImg){ this.oldSourceImg[i] = this.tvimageplus.sourceImg[i]; } + this.tvimageplus.sourceImg = { src: img.relativeUrl @@ -188,14 +201,25 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, { ,height: img.image_height ,source: this.tvimageplus.mediaSource } - - // If server returns 800x600, image may be larger + + + // Reset crop rectangle everytime an image is selected to be different from browser + if (diffImg) { + this.tvimageplus.crop.x =0; + this.tvimageplus.crop.y =0; + this.tvimageplus.crop.width = this.tvimageplus.targetWidth; + this.tvimageplus.crop.height = this.tvimageplus.targetHeight; + } + + + // If server returns 800x600 or higher, image may be larger // so need to get size manually - if(img.image_width == 800 && img.image_height == 600){ + if(img.image_width >= 800 || img.image_height >= 600){ this.manual_getImageSize(); } else { // Update display this.updateDisplay(); + if (this.tvimageplus.crop.width ==0 || this.tvimageplus.crop.height ==0 ) this.editImage(); }; }// @@ -217,7 +241,9 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, { img.onload = (function(ths){ return function(){ ths.tvimageplus.sourceImg.width = this.width; ths.tvimageplus.sourceImg.height = this.height; + ths.updateDisplay(); + if (ths.tvimageplus.crop.width ==0 || ths.tvimageplus.crop.height ==0 ) ths.editImage(); }})(this); img.src = baseUrl+this.tvimageplus.sourceImg.src; }// @@ -230,17 +256,31 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, { // Make sure image is large enough to use if(!this.checkImageIsLargeEnough()){ + this.tvimageplus.sourceImg = this.oldSourceImg; - this.imageBrowser.reset(); + + if (!this.oldSourceImg) this.imageBrowser.reset(); + else { + if (this.oldSourceImg.crop) { + this.tvimageplus.crop.x = this.oldSourceImg.crop.x; + this.tvimageplus.crop.y = this.oldSourceImg.crop.y; + this.tvimageplus.crop.width = this.oldSourceImg.crop.width; + this.tvimageplus.crop.height = this.oldSourceImg.crop.height; + } + this.imageBrowser.setValue(this.lastFileLabel || ""); + } MODx.msg.alert("Image too small","The selected image is too small to be used here. Please select a different image"); return; } + this.lastFileLabel = this.tvimageplus.sourceImg.src; // Hide 'edit' button if field is empty if(this.imageBrowser.getValue()==''){ this.editButton.disable(); + this.clearButton.hide(); } else { this.editButton.enable(); + this.clearButton.show(); } this.updatePreviewImage.defer(10,this); @@ -253,6 +293,9 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, { */ ,updateExternalField: function(){ // console.log(this.updateTo); + + + var TV = { sourceImg: this.tvimageplus.sourceImg ,crop: this.tvimageplus.crop @@ -340,13 +383,43 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, { // Show the window this.editorWindow.show(); }// - - + ,clearImage: function() { + this.tvimageplus.sourceImg = null; + this.oldSourceImg = null; + this.lastFileLabel = ""; + this.editButton.disable(); + this.clearButton.hide(); + if(this.imagePreview.el) { + jQuery(this.imagePreview.el.dom).attr( 'src','data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=='); + } + document.getElementById(this.updateTo).innerHTML = ""; + document.getElementById(this.updateTo).value = ""; + this.imageBrowser.setValue(""); + MODx.fireResourceFormChange(); + } + /** * Receive new cropping dimensions from editor */ ,updateFromEditor: function(crop){ - this.tvimageplus.crop = crop; + this.tvimageplus.crop.x = crop.x; + this.tvimageplus.crop.y = crop.y; + this.tvimageplus.crop.width = crop.width; + this.tvimageplus.crop.height = crop.height; + + if (!this.oldSourceImg) { + this.oldSourceImg = {}; + for(i in this.tvimageplus.sourceImg){ + this.oldSourceImg[i] = this.tvimageplus.sourceImg[i]; + } + } + this.oldSourceImg.crop = {}; + this.oldSourceImg.crop.x = crop.x; + this.oldSourceImg.crop.y = crop.y; + this.oldSourceImg.crop.width = crop.width; + this.oldSourceImg.crop.height = crop.height; + + this.editorWindow = null; this.updateDisplay(); } diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.window.editor.js b/assets/components/tvimageplus/mgr/js/tvimageplus.window.editor.js index 1aaaab95..f36a341f 100644 --- a/assets/components/tvimageplus/mgr/js/tvimageplus.window.editor.js +++ b/assets/components/tvimageplus/mgr/js/tvimageplus.window.editor.js @@ -27,10 +27,17 @@ tvImagePlus.window.Editor = function(config) { this.tvimageplus = config.tvimageplus; this.inputPanel = config.inputPanel; this.displayRatio = config.displayRatio; + + var cropSettings = { + x: this.tvimageplus.crop.x, + y: this.tvimageplus.crop.y, + width: this.tvimageplus.crop.width, + height: this.tvimageplus.crop.height + } Ext.apply(config,{ border: false - ,crop: this.tvimageplus.crop + ,crop: cropSettings ,resizable: false ,closeAction: 'close' ,listeners: { @@ -53,7 +60,7 @@ tvImagePlus.window.Editor = function(config) { ,buttonAlign: 'right' ,buttons: [{ text: _('cancel') - ,handler: this.updateFromEditor + ,handler: this.closeFromEditor ,scope: this },{ text: _('update') @@ -168,6 +175,12 @@ Ext.extend(tvImagePlus.window.Editor, Ext.Window, { this.inputPanel.updateFromEditor(this.crop); this.close(); } - + ,closeFromEditor: function() { + this.crop.width = this.tvimageplus.crop.width; + this.crop.height = this.tvimageplus.crop.height; + this.crop.x = this.tvimageplus.crop.x; + this.crop.y = this.tvimageplus.crop.y; + this.close(); + } }); Ext.reg('tvimageplus-window-editor',tvImagePlus.window.Editor); From 49949115162834f4a4586c7377e5018b4cba3e81 Mon Sep 17 00:00:00 2001 From: Alan Pich Date: Fri, 13 Sep 2013 19:18:52 +0100 Subject: [PATCH 030/515] Add warning for unmet dependencies --- .../tvimageplus/mgr/js/tvimageplus.js | 21 ++++ .../mgr/js/tvimageplus.panel.input.js | 6 +- .../elements/tv/input/imageplus.class.php | 4 +- .../tv/input/tpl/imageplus.inputrender.tpl | 1 + .../lib/CropEngines/AbstractCropEngine.php | 7 +- .../lib/CropEngines/PhpThumbOf.php | 27 ++-- .../lib/CropEngines/PhpThumbsUp.php | 27 ++-- .../tvimageplus/tvImagePlus.class.php | 119 +++++++++--------- 8 files changed, 125 insertions(+), 87 deletions(-) diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.js b/assets/components/tvimageplus/mgr/js/tvimageplus.js index 1539f63b..81e7c3a9 100644 --- a/assets/components/tvimageplus/mgr/js/tvimageplus.js +++ b/assets/components/tvimageplus/mgr/js/tvimageplus.js @@ -48,6 +48,27 @@ Ext.extend(tvImagePlus,Ext.Component,{ }; return url; + }, + + warnAboutUnmetDependencies: function(){ + var warningWindow = MODx.load({ + xtype: 'modx-window' + ,title: "   Image+ Warning - Unmet Dependencies   " + ,modal: true + ,padding: 25 + ,allowDrop: false + ,resizable: true + ,collapsible: true + ,maximizable: true + ,buttons: [{ + text: _('ok') + ,handler: function(L) { L.ownerCt.ownerCt.close(); } + }] + ,html: "

You don't have any crop engines!

"+ + "

Before you can use Image+, you need at least one Crop Engine installed to handle image manipulation.

"+ + "

A quick fix is to install either phpThumbOf or phpThumbsUp from the MODX Package Repository

" + }) + warningWindow.show() } }); Ext.reg('imageplus',tvImagePlus); diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js b/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js index 9f53728c..8da353db 100644 --- a/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js +++ b/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js @@ -30,6 +30,11 @@ tvImagePlus.panel.input = function(config) { this.create_imageBrowser(); this.create_imagePreview(); this.create_altTextField(); + + // Warn if has no dependencies + if(tvImagePlus.config.has_unmet_dependencies){ + tvImagePlus.warnAboutUnmetDependencies() + } Ext.apply(config,{ @@ -162,7 +167,6 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, { * Render form elements to page */ ,on_Render: function(){ - }// /** diff --git a/core/components/tvimageplus/elements/tv/input/imageplus.class.php b/core/components/tvimageplus/elements/tv/input/imageplus.class.php index befd70d6..1e3b3a4f 100644 --- a/core/components/tvimageplus/elements/tv/input/imageplus.class.php +++ b/core/components/tvimageplus/elements/tv/input/imageplus.class.php @@ -57,7 +57,9 @@ public function process($value,array $params = array()) { $this->setPlaceholder('mediasource',$this->tv->getSource('web')->get('id')); $this->setPlaceholder('tvparams',json_encode($this->getInputOptions())); - $this->setPlaceholder('imgData',$this->getImageDataJSON($value,$params)); + $this->setPlaceholder('imgData',$this->getImageDataJSON($value,$params)); + + $this->setPlaceholder('config',json_encode($this->helper->config)); } diff --git a/core/components/tvimageplus/elements/tv/input/tpl/imageplus.inputrender.tpl b/core/components/tvimageplus/elements/tv/input/tpl/imageplus.inputrender.tpl index 54420b0c..170c59ee 100644 --- a/core/components/tvimageplus/elements/tv/input/tpl/imageplus.inputrender.tpl +++ b/core/components/tvimageplus/elements/tv/input/tpl/imageplus.inputrender.tpl @@ -11,4 +11,5 @@ Ext.onReady(function(){ }); }); {/literal} +$.merge(true,tvImagePlus.config,{$config}); diff --git a/core/components/tvimageplus/lib/CropEngines/AbstractCropEngine.php b/core/components/tvimageplus/lib/CropEngines/AbstractCropEngine.php index 4de45e42..9ef44baa 100644 --- a/core/components/tvimageplus/lib/CropEngines/AbstractCropEngine.php +++ b/core/components/tvimageplus/lib/CropEngines/AbstractCropEngine.php @@ -33,6 +33,7 @@ abstract class AbstractCropEngine */ protected $modx; + public function __construct(\modX $modx) { $this->modx = $modx; @@ -43,9 +44,13 @@ public function __construct(\modX $modx) * Checks that all requirements are met for using * this engine * + * @param \modX $modx * @return bool True if engine is usable */ - abstract public function engineRequirementsMet(); + public static function engineRequirementsMet(\modX $modx) + { + return true; + } /** diff --git a/core/components/tvimageplus/lib/CropEngines/PhpThumbOf.php b/core/components/tvimageplus/lib/CropEngines/PhpThumbOf.php index 976ecefd..130fc6b6 100644 --- a/core/components/tvimageplus/lib/CropEngines/PhpThumbOf.php +++ b/core/components/tvimageplus/lib/CropEngines/PhpThumbOf.php @@ -1,5 +1,5 @@ * * This file is part of tvImagePlus @@ -32,22 +32,21 @@ * @package tvImagePlus * @subpackage tvImagePlus\CropEngines */ -class PhpThumbOf extends AbstractCropEngine { - - +class PhpThumbOf extends AbstractCropEngine +{ /** * Checks that all requirements are met for using * this engine * + * @param \modX $modx * @return bool True if engine is usable */ - public function engineRequirementsMet(){ - $pto = $this->modx->getObject('modSnippet', array('name' => 'phpthumbof')); + public static function engineRequirementsMet(\modX $modx) + { + $pto = $modx->getObject('modSnippet', array('name' => 'phpthumbof')); return $pto instanceof \modSnippet; } - - /** * Parse image+ data and return a url for the cropped * version of the image @@ -57,15 +56,16 @@ public function engineRequirementsMet(){ * @param \modTemplateVar $tv * @return string */ - public function getImageUrl($json, $opts = array(), \modTemplateVar $tv){ + public function getImageUrl($json, $opts = array(), \modTemplateVar $tv) + { // Parse json to object $data = json_decode($json); // If data is null, json was invalid or empty. // This is almost certainly because the TV is empty - if(is_null($data)){ - $this->modx->log(\xPDO::LOG_LEVEL_INFO,"Image+ TV renderer failed to parse JSON"); + if (is_null($data)) { + $this->modx->log(\xPDO::LOG_LEVEL_INFO, "Image+ TV renderer failed to parse JSON"); return $tv->default_text; } @@ -93,7 +93,7 @@ public function getImageUrl($json, $opts = array(), \modTemplateVar $tv){ // Add in output render params $options = array(); - if(isset($opts['phpThumbParams'])){ + if (isset($opts['phpThumbParams'])) { $optParams = explode('&', $opts['phpThumbParams']); foreach ($optParams as $oP) { if (empty($oP)) { @@ -131,9 +131,8 @@ public function getImageUrl($json, $opts = array(), \modTemplateVar $tv){ } else { // Otherwise return raw url return $url; - }; + } } - } diff --git a/core/components/tvimageplus/lib/CropEngines/PhpThumbsUp.php b/core/components/tvimageplus/lib/CropEngines/PhpThumbsUp.php index 8ecdb8f4..adf6a1b3 100644 --- a/core/components/tvimageplus/lib/CropEngines/PhpThumbsUp.php +++ b/core/components/tvimageplus/lib/CropEngines/PhpThumbsUp.php @@ -32,22 +32,21 @@ * @package tvImagePlus * @subpackage tvImagePlus\CropEngines */ -class PhpThumbsUp extends AbstractCropEngine { - - +class PhpThumbsUp extends AbstractCropEngine +{ /** * Checks that all requirements are met for using * this engine * + * @param \modX $modx * @return bool True if engine is usable */ - public function engineRequirementsMet(){ - $pto = $this->modx->getObject('modSnippet', array('name' => 'phpthumbsup')); + public static function engineRequirementsMet(\modX $modx) + { + $pto = $modx->getObject('modSnippet', array('name' => 'phpthumbsup')); return $pto instanceof \modSnippet; } - - /** * Parse image+ data and return a url for the cropped * version of the image @@ -57,15 +56,16 @@ public function engineRequirementsMet(){ * @param \modTemplateVar $tv * @return string */ - public function getImageUrl($json, $opts = array(), \modTemplateVar $tv){ + public function getImageUrl($json, $opts = array(), \modTemplateVar $tv) + { // Parse json to object $data = json_decode($json); // If data is null, json was invalid or empty. // This is almost certainly because the TV is empty - if(is_null($data)){ - $this->modx->log(\xPDO::LOG_LEVEL_INFO,"Image+ TV renderer failed to parse JSON"); + if (is_null($data)) { + $this->modx->log(\xPDO::LOG_LEVEL_INFO, "Image+ TV renderer failed to parse JSON"); return $tv->default_text; } @@ -81,7 +81,7 @@ public function getImageUrl($json, $opts = array(), \modTemplateVar $tv){ // Prepare arguments for phpthumbof snippet call $params = array( - 'w' => $data->targetWidth, + 'w' => $data->targetWidth, 'h' => $data->targetHeight, 'far' => true, 'sx' => $data->crop->x, @@ -92,7 +92,7 @@ public function getImageUrl($json, $opts = array(), \modTemplateVar $tv){ // Add in output render params $options = array(); - if(isset($opts['phpThumbParams'])){ + if (isset($opts['phpThumbParams'])) { $optParams = explode('&', $opts['phpThumbParams']); foreach ($optParams as $oP) { if (empty($oP)) { @@ -118,7 +118,7 @@ public function getImageUrl($json, $opts = array(), \modTemplateVar $tv){ ) ); - $url = str_replace('%2F','/',$url); + $url = str_replace('%2F', '/', $url); // If an output chunk is selected, parse that if (isset($opts['outputChunk']) && !empty($opts['outputChunk'])) { @@ -136,5 +136,4 @@ public function getImageUrl($json, $opts = array(), \modTemplateVar $tv){ } - } diff --git a/core/components/tvimageplus/tvImagePlus.class.php b/core/components/tvimageplus/tvImagePlus.class.php index a3dc3b68..3d7037ec 100644 --- a/core/components/tvimageplus/tvImagePlus.class.php +++ b/core/components/tvimageplus/tvImagePlus.class.php @@ -22,16 +22,16 @@ * @copyright Alan Pich 2013 */ +use tvImagePlus\CropEngines; class tvImagePlus { public $dataStr; - /** @var \modX */ + /** @var \modX */ public $modx; - public $config; @@ -41,11 +41,12 @@ function __construct(modX &$modx) $this->loadConfig(); $this->loadLexicon(); $this->loadSourceMap(); + $this->checkDependencies(); } - // - - + /** + * Load default configuration + */ private function loadConfig() { $core = $this->modx->getOption( @@ -63,36 +64,58 @@ private function loadConfig() 'assets_url' => $assets, 'connectorUrl' => $assets . 'mgr/connector.php', 'sources' => array(), - 'crop_icon' => $this->modx->getOption('tvimageplus.crop_icon',null,$assets."mgr/icons/icon.crop.png") + 'crop_icon' => $this->modx->getOption('tvimageplus.crop_icon', null, $assets . "mgr/icons/icon.crop.png"), + 'has_unmet_dependencies' => false, ); - } - // + /** + * Check dependencies and raise warnings if not met + */ + private function checkDependencies() + { + // Register a micro autoloader for in-house engines + spl_autoload_register(function ($className) { + if (strpos($className, 'tvImagePlus\\CropEngines\\') === false) + return; + $class = str_replace('tvImagePlus\\CropEngines\\', '', $className); + $path = dirname(__FILE__) . '/lib/CropEngines/' . $class . '.php'; + if (is_readable($path)) + include $path; + + }); + + // Do some basic intelligent sniffing + if( ! CropEngines\PhpThumbsUp::engineRequirementsMet($this->modx) + && ! CropEngines\PhpThumbOf::engineRequirementsMet($this->modx) ){ + // Handle unmet dependencies + $this->config['has_unmet_dependencies'] = TRUE; + } + } /** * Load the lexicon topic * * @todo Do it properly with MODx.lang _() */ - private function loadLexicon(){ + private function loadLexicon() + { $lexicon = $this->modx->lexicon; $modx = $this->modx; $mgr_lang = $modx->getOption('manager_language'); $lexicon->load('tvimageplus'); - if(in_array($mgr_lang, $lexicon->getLanguageList('tvimageplus'))){ + if (in_array($mgr_lang, $lexicon->getLanguageList('tvimageplus'))) { $lang = $mgr_lang; - } - else{ + } else { $lang = 'en'; } $this->config['lexicon'] = $lexicon->getFileTopic($lang, 'tvimageplus'); - }// - + } + /** * Get a map of MediaSource id => baseUrl * @@ -109,13 +132,12 @@ private function loadSourceMap() }; } - /** * Gather info about the TV * * @param ImagePlusInputRender $render * @param $value - * @param array $params + * @param array $params * @return object */ public function loadTvConfig(ImagePlusInputRender $render, $value, array $params) @@ -170,59 +192,47 @@ public function loadTvConfig(ImagePlusInputRender $render, $value, array $params return $data; } - /** * Render supporting javascript to try and help it work with MIGX etc */ public function includeScriptAssets() { - $this->modx->regClientCSS($this->config['assets_url'].'mgr/css/jquery/jquery.jcrop.min.css'); - $this->modx->regClientStartupScript($this->config['assets_url'].'mgr/js/tvimageplus.js'); - $this->modx->regClientStartupScript($this->config['assets_url'].'mgr/js/tvimageplus.panel.input.js'); - $this->modx->regClientStartupScript($this->config['assets_url'].'mgr/js/tvimageplus.window.editor.js'); - $this->modx->regClientStartupScript($this->config['assets_url'].'mgr/js/tvimageplus.migx_renderer.js'); - $this->modx->regClientStartupScript($this->config['assets_url'].'mgr/js/tools/JSON2.js'); - $this->modx->regClientStartupScript($this->config['assets_url'].'mgr/js/jquery/jquery.min.js'); - $this->modx->regClientStartupScript($this->config['assets_url'].'mgr/js/jquery/jquery.jcrop.min.js'); - $this->modx->regClientStartupScript($this->config['assets_url'].'mgr/js/tvimageplus.jquery.imagecrop.js'); + $this->modx->regClientCSS($this->config['assets_url'] . 'mgr/css/jquery/jquery.jcrop.min.css'); + $this->modx->regClientStartupScript($this->config['assets_url'] . 'mgr/js/tvimageplus.js'); + $this->modx->regClientStartupScript($this->config['assets_url'] . 'mgr/js/tvimageplus.panel.input.js'); + $this->modx->regClientStartupScript($this->config['assets_url'] . 'mgr/js/tvimageplus.window.editor.js'); + $this->modx->regClientStartupScript($this->config['assets_url'] . 'mgr/js/tvimageplus.migx_renderer.js'); + $this->modx->regClientStartupScript($this->config['assets_url'] . 'mgr/js/tools/JSON2.js'); + $this->modx->regClientStartupScript($this->config['assets_url'] . 'mgr/js/jquery/jquery.min.js'); + $this->modx->regClientStartupScript($this->config['assets_url'] . 'mgr/js/jquery/jquery.jcrop.min.js'); + $this->modx->regClientStartupScript($this->config['assets_url'] . 'mgr/js/tvimageplus.jquery.imagecrop.js'); $this->modx->regClientStartupHTMLBlock(''); + . ' tvImagePlus.config = ' . json_encode($this->config) . ';' + . ' for(i in tvImagePlus.config.lexicon){ MODx.lang[i] = tvImagePlus.config.lexicon[i] }' + . ''); } - /** * Return a scaled, cached version of the source image for front-end use * - * @param string $json - * @param array $opts + * @param string $json + * @param array $opts * @param modTemplateVar $tv * @internal param array $params * @return string */ public function getImageURL($json, $opts = array(), modTemplateVar $tv) { - // Register a micro autoloader for in-house engines - spl_autoload_register(function($className){ - if(strpos($className,'tvImagePlus\\CropEngines\\') === false) - return; - - $class = str_replace('tvImagePlus\\CropEngines\\','',$className); - $path = dirname(__FILE__).'/lib/CropEngines/'.$class.'.php'; - if(is_readable($path)) - include $path; - - }); // Check system settings for crop engine override - $engineClass = $this->modx->getOption('tvimageplus.crop_engine_class',null,false); + $engineClass = $this->modx->getOption('tvimageplus.crop_engine_class', null, false); // Do some basic intelligent sniffing - if(!$engineClass){ - if($this->snippetExists('phpthumbsup')){ + if (!$engineClass) { + if( CropEngines\PhpThumbsUp::engineRequirementsMet($this->modx)) { $engineClass = '\\tvImagePlus\\CropEngines\\PhpThumbsUp'; - } else { + } + else if( CropEngines\PhpThumbOf::engineRequirementsMet($this->modx)) { $engineClass = '\\tvImagePlus\\CropEngines\\PhpThumbOf'; } } @@ -233,30 +243,27 @@ public function getImageURL($json, $opts = array(), modTemplateVar $tv) $cropEngine = new $engineClass($this->modx); // Check crop engine is usable - if(!$cropEngine->engineRequirementsMet()){ - $this->modx->log(xPDO::LOG_LEVEL_ERROR,"Image+ :: Requirements not met for Crop Engine [{$engineClass}]"); + if (!$cropEngine->engineRequirementsMet()) { + $this->modx->log(xPDO::LOG_LEVEL_ERROR, "Image+ :: Requirements not met for Crop Engine [{$engineClass}]"); return 'IMAGE+ ERROR - requirements not met for crop engine'; } - return $cropEngine->getImageUrl($json,$opts,$tv); + return $cropEngine->getImageUrl($json, $opts, $tv); } - /** * Check if a snippet exists by name * * @param string $snippet Name of snippet to check for * @return bool */ - protected function snippetExists($snippet){ - $obj = $this->modx->getObject('modSnippet',array( + protected function snippetExists($snippet) + { + $obj = $this->modx->getObject('modSnippet', array( 'name' => $snippet )); return $obj instanceof modSnippet; } - } - -; // end class tvImagePlus define('tvimageplus', true); From 14b87a9e413f1765cb65892ce588594778b18068 Mon Sep 17 00:00:00 2001 From: Alan Pich Date: Fri, 13 Sep 2013 19:37:14 +0100 Subject: [PATCH 031/515] update changelog, fix error --- core/components/tvimageplus/docs/changelog.txt | 2 ++ core/components/tvimageplus/tvImagePlus.class.php | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/core/components/tvimageplus/docs/changelog.txt b/core/components/tvimageplus/docs/changelog.txt index ddf7a117..fbf6ac68 100644 --- a/core/components/tvimageplus/docs/changelog.txt +++ b/core/components/tvimageplus/docs/changelog.txt @@ -2,8 +2,10 @@ Image+ TV type changelog ------------------------- + # v2.2 -------- + :: Added gui warning of missing dependencies :: Added PhpThumbsUp crop engine :: Refactored to allow changing of crop engines :: Added grid renderer for MIGX backend diff --git a/core/components/tvimageplus/tvImagePlus.class.php b/core/components/tvimageplus/tvImagePlus.class.php index 3d7037ec..d1b6a759 100644 --- a/core/components/tvimageplus/tvImagePlus.class.php +++ b/core/components/tvimageplus/tvImagePlus.class.php @@ -243,7 +243,7 @@ public function getImageURL($json, $opts = array(), modTemplateVar $tv) $cropEngine = new $engineClass($this->modx); // Check crop engine is usable - if (!$cropEngine->engineRequirementsMet()) { + if (!$cropEngine->engineRequirementsMet($this->modx)) { $this->modx->log(xPDO::LOG_LEVEL_ERROR, "Image+ :: Requirements not met for Crop Engine [{$engineClass}]"); return 'IMAGE+ ERROR - requirements not met for crop engine'; } From 681315310e285a006eeedea0228b9a2774bceb03 Mon Sep 17 00:00:00 2001 From: Alan Pich Date: Fri, 13 Sep 2013 19:49:02 +0100 Subject: [PATCH 032/515] tidy --- .../lib/CropEngines/PhpThumbOf.php | 2 +- .../tvimageplus/tvImagePlus.class.php | 26 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/core/components/tvimageplus/lib/CropEngines/PhpThumbOf.php b/core/components/tvimageplus/lib/CropEngines/PhpThumbOf.php index 130fc6b6..24d9d341 100644 --- a/core/components/tvimageplus/lib/CropEngines/PhpThumbOf.php +++ b/core/components/tvimageplus/lib/CropEngines/PhpThumbOf.php @@ -135,4 +135,4 @@ public function getImageUrl($json, $opts = array(), \modTemplateVar $tv) } -} +} sdgvsdgsg diff --git a/core/components/tvimageplus/tvImagePlus.class.php b/core/components/tvimageplus/tvImagePlus.class.php index d1b6a759..d88258f5 100644 --- a/core/components/tvimageplus/tvImagePlus.class.php +++ b/core/components/tvimageplus/tvImagePlus.class.php @@ -251,19 +251,19 @@ public function getImageURL($json, $opts = array(), modTemplateVar $tv) return $cropEngine->getImageUrl($json, $opts, $tv); } - /** - * Check if a snippet exists by name - * - * @param string $snippet Name of snippet to check for - * @return bool - */ - protected function snippetExists($snippet) - { - $obj = $this->modx->getObject('modSnippet', array( - 'name' => $snippet - )); - return $obj instanceof modSnippet; - } +// /** +// * Check if a snippet exists by name +// * +// * @param string $snippet Name of snippet to check for +// * @return bool +// */ +// protected function snippetExists($snippet) +// { +// $obj = $this->modx->getObject('modSnippet', array( +// 'name' => $snippet +// )); +// return $obj instanceof modSnippet; +// } } define('tvimageplus', true); From 3684ae762aa25dccee1c1e2611622c1c925a38c0 Mon Sep 17 00:00:00 2001 From: Alan Pich Date: Fri, 13 Sep 2013 19:55:20 +0100 Subject: [PATCH 033/515] tidy --- core/components/tvimageplus/lib/CropEngines/PhpThumbOf.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/components/tvimageplus/lib/CropEngines/PhpThumbOf.php b/core/components/tvimageplus/lib/CropEngines/PhpThumbOf.php index 24d9d341..130fc6b6 100644 --- a/core/components/tvimageplus/lib/CropEngines/PhpThumbOf.php +++ b/core/components/tvimageplus/lib/CropEngines/PhpThumbOf.php @@ -135,4 +135,4 @@ public function getImageUrl($json, $opts = array(), \modTemplateVar $tv) } -} sdgvsdgsg +} From 670a152347aa6d6209ced147ad9e688ecc969df0 Mon Sep 17 00:00:00 2001 From: Alan Pich Date: Fri, 13 Sep 2013 19:59:34 +0100 Subject: [PATCH 034/515] tidy --- .../mgr/js/tvimageplus.panel.input.js | 449 ++++++++---------- 1 file changed, 199 insertions(+), 250 deletions(-) diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js b/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js index e3df9508..e501c6fd 100644 --- a/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js +++ b/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js @@ -22,43 +22,37 @@ */ -tvImagePlus.panel.input = function(config) { +tvImagePlus.panel.input = function (config) { config = config || {}; this.tvimageplus = config.tvimageplus; - + this.create_editButton(); - this.create_clearButton(); + this.create_clearButton(); this.create_imageBrowser(); this.create_imagePreview(); this.create_altTextField(); // Warn if has no dependencies - if(tvImagePlus.config.has_unmet_dependencies){ + if (tvImagePlus.config.has_unmet_dependencies) { tvImagePlus.warnAboutUnmetDependencies() } - - - Ext.apply(config,{ - border: false - ,baseCls: 'modx-formpanel' - ,cls: 'container' - ,updateTo: config.updateTo - ,width: '100%' - ,items: [{ - xtype: 'compositefield' - ,anchor: '98%' - ,hideLabel: true - ,style: { + + + Ext.apply(config, { + border: false, baseCls: 'modx-formpanel', cls: 'container', updateTo: config.updateTo, width: '100%', items: [ + { + xtype: 'compositefield', anchor: '98%', hideLabel: true, style: { marginBottom: '5px' - } - ,listeners: { - 'render': {fn: this.on_Render,scope:this} - ,'afterRender': {fn: this.onAfterRender,scope:this} - } - ,items: [this.imageBrowser,this.editButton] - },this.altTextField,this.imagePreview,this.clearButton] + }, listeners: { + 'render': {fn: this.on_Render, scope: this}, 'afterRender': {fn: this.onAfterRender, scope: this} + }, items: [this.imageBrowser, this.editButton] + }, + this.altTextField, + this.imagePreview, + this.clearButton + ] }); - tvImagePlus.panel.input.superclass.constructor.call(this,config); + tvImagePlus.panel.input.superclass.constructor.call(this, config); this.listenForResetEvent(); @@ -71,257 +65,226 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, { * that we can be notified when the user hits the * native 'Reset' button */ - listenForResetEvent: function(){ + listenForResetEvent: function () { var resourcePanel = Ext.getCmp('modx-panel-resource'); - resourcePanel.on('tv-reset',function(changed){ - if(changed.id = this.tvimageplus.tv.id){ + resourcePanel.on('tv-reset', function (changed) { + if (changed.id = this.tvimageplus.tv.id) { this.on_Reset(); } - },this) + }, this) }, /** * Create the 'edit image' button */ - create_editButton: function(){ + create_editButton: function () { this.editButton = new Ext.Button({ - text: _('tvimageplus.edit_image') - ,handler: this.editImage - ,scope:this - ,icon: tvImagePlus.config.crop_icon + text: _('tvimageplus.edit_image'), handler: this.editImage, scope: this, icon: tvImagePlus.config.crop_icon }) }// - - ,create_clearButton: function(){ + + , create_clearButton: function () { this.clearButton = new Ext.Button({ - text: _('tvimageplus.clear_image') || "Clear Image" - ,handler: this.clearImage - ,scope:this + text: _('tvimageplus.clear_image') || "Clear Image", handler: this.clearImage, scope: this }) }// - + /** * Create the image browser combo - */ - ,create_imageBrowser: function(){ + */, create_imageBrowser: function () { // Generate opento path var openToPath = this.tvimageplus.sourceImg.src.split('/'); - openToPath.pop(); - openToPath = openToPath.join('/'); - + openToPath.pop(); + openToPath = openToPath.join('/'); + // Create browser component this.imageBrowser = new MODx.combo.Browser({ - value: this.tvimageplus.sourceImg.src - ,source: this.tvimageplus.mediaSource - ,hideSourceCombo: true - ,openTo: openToPath - ,listeners: { - 'select': {fn: this.on_imageSelected,scope:this} + value: this.tvimageplus.sourceImg.src, source: this.tvimageplus.mediaSource, hideSourceCombo: true, openTo: openToPath, listeners: { + 'select': {fn: this.on_imageSelected, scope: this} } }) } - + /** * Create image preview img - */ - ,create_imagePreview: function(){ + */, create_imagePreview: function () { this.imagePreview = new Ext.BoxComponent({autoEl: {tag: 'img', src: ''}}); } - + /** * Create field for alt-text input - */ - ,create_altTextField: function(){ + */, create_altTextField: function () { this.altTextField = MODx.load({ - xtype: this.tvimageplus.altTagOn? 'textfield' : 'hidden' - ,value: this.tvimageplus.altTag || '' - ,listeners: { - 'change': {fn: this.on_altTagChange,scope:this} - } - ,width: 300 - ,style: {marginBottom:'5px'} + xtype: this.tvimageplus.altTagOn ? 'textfield' : 'hidden', value: this.tvimageplus.altTag || '', listeners: { + 'change': {fn: this.on_altTagChange, scope: this} + }, width: 300, style: {marginBottom: '5px'} }) - } - - - - ,generateThumbUrl: function(params){ - var url = MODx.config.connectors_url+'system/phpthumb.php?imageplus=1' + }, generateThumbUrl: function (params) { + var url = MODx.config.connectors_url + 'system/phpthumb.php?imageplus=1'; var defaults = { - wctx: 'mgr' - ,f: 'png' - ,q: 90 - ,w: 150 - ,source: this.tvimageplus.sourceImg.source + wctx: 'mgr', f: 'png', q: 90, w: 150, source: this.tvimageplus.sourceImg.source + } + for (i in params) { + defaults[i] = params[i] + } + for (i in defaults) { + url += '&' + i + '=' + defaults[i]; } - for(i in params){ defaults[i] = params[i]}; - for(i in defaults){ - url+= '&'+i+'='+defaults[i]; - }; return url; } /** * Fires when the TV field is reset - */ - ,on_Reset: function(){ + */, on_Reset: function () { this.imageBrowser.setValue(''); this.tvimageplus.sourceImg = false; this.editButton.disable(); - this.updatePreviewImage.defer(10,this); + this.updatePreviewImage.defer(10, this); } /** * Render form elements to page - */ - ,on_Render: function(){ + */, on_Render: function () { }// - + /** * Runs after initial render of panel - */ - ,onAfterRender: function(){ + */, onAfterRender: function () { this.updateDisplay(); }// - + /** * Fired when user has selected an image from the browser - */ - ,on_imageSelected: function(img){ - - var diffImg = (this.tvimageplus.sourceImg && this.tvimageplus.sourceImg.src != img.relativeUrl); + */, on_imageSelected: function (img) { + + var diffImg = (this.tvimageplus.sourceImg && this.tvimageplus.sourceImg.src != img.relativeUrl); + - - this.oldSourceImg = {}; - for(i in this.tvimageplus.sourceImg){ + this.oldSourceImg = {}; + for (i in this.tvimageplus.sourceImg) { this.oldSourceImg[i] = this.tvimageplus.sourceImg[i]; } - + this.tvimageplus.sourceImg = { - src: img.relativeUrl - ,width: img.image_width - ,height: img.image_height - ,source: this.tvimageplus.mediaSource + src: img.relativeUrl, width: img.image_width, height: img.image_height, source: this.tvimageplus.mediaSource } - - - // Reset crop rectangle everytime an image is selected to be different from browser - if (diffImg) { - this.tvimageplus.crop.x =0; - this.tvimageplus.crop.y =0; - this.tvimageplus.crop.width = this.tvimageplus.targetWidth; - this.tvimageplus.crop.height = this.tvimageplus.targetHeight; - } - - + + + // Reset crop rectangle everytime an image is selected to be different from browser + if (diffImg) { + this.tvimageplus.crop.x = 0; + this.tvimageplus.crop.y = 0; + this.tvimageplus.crop.width = this.tvimageplus.targetWidth; + this.tvimageplus.crop.height = this.tvimageplus.targetHeight; + } + + // If server returns 800x600 or higher, image may be larger // so need to get size manually - if(img.image_width >= 800 || img.image_height >= 600){ + if (img.image_width >= 800 || img.image_height >= 600) { this.manual_getImageSize(); - } else { + } else { // Update display this.updateDisplay(); - if (this.tvimageplus.crop.width ==0 || this.tvimageplus.crop.height ==0 ) this.editImage(); - }; + if (this.tvimageplus.crop.width == 0 || this.tvimageplus.crop.height == 0) this.editImage(); + } + ; }// - + /** * Fired when alt-tag field is changed - */ - ,on_altTagChange: function(field, value){ + */, on_altTagChange: function (field, value) { this.tvimageplus.altTag = value; this.updateExternalField(); } - + /** * Manually get image size * @return void - */ - ,manual_getImageSize: function(){ + */, manual_getImageSize: function () { var baseUrl = tvImagePlus.config['sources'][this.tvimageplus.sourceImg.source].url; var img = new Image(); - img.onload = (function(ths){ return function(){ + img.onload = (function (ths) { + return function () { ths.tvimageplus.sourceImg.width = this.width; ths.tvimageplus.sourceImg.height = this.height; - + ths.updateDisplay(); - if (ths.tvimageplus.crop.width ==0 || ths.tvimageplus.crop.height ==0 ) ths.editImage(); - }})(this); - img.src = baseUrl+this.tvimageplus.sourceImg.src; + if (ths.tvimageplus.crop.width == 0 || ths.tvimageplus.crop.height == 0) ths.editImage(); + } + })(this); + img.src = baseUrl + this.tvimageplus.sourceImg.src; }// /** * Update the component display on state change - */ - ,updateDisplay: function(){ + */, updateDisplay: function () { // Make sure image is large enough to use - if(!this.checkImageIsLargeEnough()){ - + if (!this.checkImageIsLargeEnough()) { + this.tvimageplus.sourceImg = this.oldSourceImg; - - if (!this.oldSourceImg) this.imageBrowser.reset(); - else { - if (this.oldSourceImg.crop) { - this.tvimageplus.crop.x = this.oldSourceImg.crop.x; - this.tvimageplus.crop.y = this.oldSourceImg.crop.y; - this.tvimageplus.crop.width = this.oldSourceImg.crop.width; - this.tvimageplus.crop.height = this.oldSourceImg.crop.height; - } - this.imageBrowser.setValue(this.lastFileLabel || ""); - } - MODx.msg.alert("Image too small","The selected image is too small to be used here. Please select a different image"); + + if (!this.oldSourceImg) this.imageBrowser.reset(); + else { + if (this.oldSourceImg.crop) { + this.tvimageplus.crop.x = this.oldSourceImg.crop.x; + this.tvimageplus.crop.y = this.oldSourceImg.crop.y; + this.tvimageplus.crop.width = this.oldSourceImg.crop.width; + this.tvimageplus.crop.height = this.oldSourceImg.crop.height; + } + this.imageBrowser.setValue(this.lastFileLabel || ""); + } + MODx.msg.alert("Image too small", "The selected image is too small to be used here. Please select a different image"); return; } - this.lastFileLabel = this.tvimageplus.sourceImg.src; + this.lastFileLabel = this.tvimageplus.sourceImg.src; // Hide 'edit' button if field is empty - if(this.imageBrowser.getValue()==''){ + if (this.imageBrowser.getValue() == '') { this.editButton.disable(); - this.clearButton.hide(); + this.clearButton.hide(); } else { this.editButton.enable(); - this.clearButton.show(); + this.clearButton.show(); } - this.updatePreviewImage.defer(10,this); - + this.updatePreviewImage.defer(10, this); + this.updateExternalField(); }// /** * Update updateTo field input field value - */ - ,updateExternalField: function(){ - // console.log(this.updateTo); - - - + */, updateExternalField: function () { + // console.log(this.updateTo); + + var TV = { - sourceImg: this.tvimageplus.sourceImg - ,crop: this.tvimageplus.crop - ,targetWidth: this.tvimageplus.targetWidth - ,targetHeight: this.tvimageplus.targetHeight - ,altTag: this.tvimageplus.altTag + sourceImg: this.tvimageplus.sourceImg, crop: this.tvimageplus.crop, targetWidth: this.tvimageplus.targetWidth, targetHeight: this.tvimageplus.targetHeight, altTag: this.tvimageplus.altTag } - var json = JSON.stringify(TV,null,' '); - - + var json = JSON.stringify(TV, null, ' '); + + var external = document.getElementById(this.updateTo); var current = external.value || ''; - if(current==''){ current=external.innerHTML} - + if (current == '') { + current = external.innerHTML + } + // Has value changed? - if(current==json){ return } - - if(document.getElementById(this.updateTo)){ + if (current == json) { + return + } + + if (document.getElementById(this.updateTo)) { document.getElementById(this.updateTo).value = json; // document.getElementById(this.updateTo).innerHTML = json; } - + // Mark resource as dirty MODx.fireResourceFormChange() } @@ -330,121 +293,107 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, { /** * Checks whether the image is larger than specified crop dimensions * @returns bool - */ - ,checkImageIsLargeEnough: function(){ - if(!this.tvimageplus.sourceImg || this.tvimageplus == undefined) return true; + */, checkImageIsLargeEnough: function () { + if (!this.tvimageplus.sourceImg || this.tvimageplus == undefined) return true; - if(this.tvimageplus.targetWidth > 0 && this.tvimageplus.sourceImg.width>0){ - if(this.tvimageplus.targetWidth > this.tvimageplus.sourceImg.width){ + if (this.tvimageplus.targetWidth > 0 && this.tvimageplus.sourceImg.width > 0) { + if (this.tvimageplus.targetWidth > this.tvimageplus.sourceImg.width) { return false; } } - if(this.tvimageplus.targetHeight > 0 && this.tvimageplus.sourceImg.height>0){ - if(this.tvimageplus.targetHeight > this.tvimageplus.sourceImg.height){ + if (this.tvimageplus.targetHeight > 0 && this.tvimageplus.sourceImg.height > 0) { + if (this.tvimageplus.targetHeight > this.tvimageplus.sourceImg.height) { return false; } } return true; } - - + + /** * Launch the editor window - */ - ,editImage: function(){ + */, editImage: function () { // Create the editor window (if it doesnt exist) - if(!this.editorWindow){ - + if (!this.editorWindow) { + // Calculate safe image ratio var imgW = this.tvimageplus.sourceImg.width; var imgH = this.tvimageplus.sourceImg.height; var maxH = window.innerHeight * 0.7; var maxW = window.innerWidth * 0.7; - // Is image taller than screen? - if(imgH > maxH){ - var ratio = maxH/imgH - } else - if(imgW > maxW){ - var ratio = maxW/imgW - } else { - var ratio = 1; - } - - - + // Is image taller than screen? + if (imgH > maxH) { + var ratio = maxH / imgH + } else if (imgW > maxW) { + var ratio = maxW / imgW + } else { + var ratio = 1; + } + + this.editorWindow = MODx.load({ - xtype: 'tvimageplus-window-editor' - ,title: _('tvimageplus.editor_title') - ,tvimageplus: this.tvimageplus - ,inputPanel: this - ,displayRatio: ratio - // ,autoWidth: true - ,width: imgW*ratio - ,crop: this.tvimageplus.crop + xtype: 'tvimageplus-window-editor', title: _('tvimageplus.editor_title'), tvimageplus: this.tvimageplus, inputPanel: this, displayRatio: ratio + // ,autoWidth: true + , width: imgW * ratio, crop: this.tvimageplus.crop }); - - }; + + } + ; // Show the window this.editorWindow.show(); }// - ,clearImage: function() { - this.tvimageplus.sourceImg = null; - this.oldSourceImg = null; - this.lastFileLabel = ""; - this.editButton.disable(); - this.clearButton.hide(); - if(this.imagePreview.el) { - jQuery(this.imagePreview.el.dom).attr( 'src','data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=='); - } - document.getElementById(this.updateTo).innerHTML = ""; - document.getElementById(this.updateTo).value = ""; - this.imageBrowser.setValue(""); - MODx.fireResourceFormChange(); - } + , clearImage: function () { + this.tvimageplus.sourceImg = null; + this.oldSourceImg = null; + this.lastFileLabel = ""; + this.editButton.disable(); + this.clearButton.hide(); + if (this.imagePreview.el) { + jQuery(this.imagePreview.el.dom).attr('src', 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=='); + } + document.getElementById(this.updateTo).innerHTML = ""; + document.getElementById(this.updateTo).value = ""; + this.imageBrowser.setValue(""); + MODx.fireResourceFormChange(); + } /** * Receive new cropping dimensions from editor - */ - ,updateFromEditor: function(crop){ + */, updateFromEditor: function (crop) { this.tvimageplus.crop.x = crop.x; - this.tvimageplus.crop.y = crop.y; - this.tvimageplus.crop.width = crop.width; - this.tvimageplus.crop.height = crop.height; - - if (!this.oldSourceImg) { - this.oldSourceImg = {}; - for(i in this.tvimageplus.sourceImg){ - this.oldSourceImg[i] = this.tvimageplus.sourceImg[i]; - } - } - this.oldSourceImg.crop = {}; - this.oldSourceImg.crop.x = crop.x; - this.oldSourceImg.crop.y = crop.y; - this.oldSourceImg.crop.width = crop.width; - this.oldSourceImg.crop.height = crop.height; - - + this.tvimageplus.crop.y = crop.y; + this.tvimageplus.crop.width = crop.width; + this.tvimageplus.crop.height = crop.height; + + if (!this.oldSourceImg) { + this.oldSourceImg = {}; + for (i in this.tvimageplus.sourceImg) { + this.oldSourceImg[i] = this.tvimageplus.sourceImg[i]; + } + } + this.oldSourceImg.crop = {}; + this.oldSourceImg.crop.x = crop.x; + this.oldSourceImg.crop.y = crop.y; + this.oldSourceImg.crop.width = crop.width; + this.oldSourceImg.crop.height = crop.height; + + this.editorWindow = null; this.updateDisplay(); - } - - ,updatePreviewImage: function(){ - if(!this.tvimageplus.sourceImg || this.tvimageplus.crop.width==0){ + }, updatePreviewImage: function () { + if (!this.tvimageplus.sourceImg || this.tvimageplus.crop.width == 0) { this.imagePreview.hide(); return; } url = this.generateThumbUrl({ - src: this.tvimageplus.sourceImg.src - ,sw: this.tvimageplus.crop.width - ,sh: this.tvimageplus.crop.height - ,sx: this.tvimageplus.crop.x - ,sy: this.tvimageplus.crop.y - }) - if(this.imagePreview.el){ + src: this.tvimageplus.sourceImg.src, sw: this.tvimageplus.crop.width, sh: this.tvimageplus.crop.height, sx: this.tvimageplus.crop.x, sy: this.tvimageplus.crop.y + }) + if (this.imagePreview.el) { this.imagePreview.el.dom.src = url; this.imagePreview.show() - }; + } + ; } - + }); -Ext.reg('tvimageplus-panel-input',tvImagePlus.panel.input); +Ext.reg('tvimageplus-panel-input', tvImagePlus.panel.input); From ca046ef7c3e763ab71be436c41e4284d5c00a64c Mon Sep 17 00:00:00 2001 From: Thomas Jakobi Date: Wed, 25 Mar 2015 21:58:39 +0100 Subject: [PATCH 035/515] Update to 2.2.1 from develop 2.2.0 - MODX Revolution 2.3 Compatibility - Build by GitPackageManagement --- _build/build.config.php | 30 +--- _build/build.transport.php | 86 ----------- _build/config.json | 37 +++++ .../data/transport.plugin.ImagePlusRouter.php | 68 --------- _build/tools/build.tools.php | 104 -------------- _build/vagrant/.gitignore | 1 - _build/vagrant/Vagrantfile | 38 ----- _build/vagrant/bootstrap.sh | 7 - _build/vagrant/bootstrap/bootstrap.php | 48 ------- .../mgr/connector.php | 4 +- .../mgr/css/jquery/Jcrop.gif | Bin .../mgr/css/jquery/jquery.jcrop.min.css | 0 .../mgr/icons/icon.crop.png | Bin .../mgr/js/imageplus.jquery.imagecrop.js} | 6 +- .../mgr/js/imageplus.js} | 0 .../mgr/js/imageplus.migx_renderer.js} | 0 .../mgr/js/imageplus.panel.input.js} | 133 ++++++++++-------- .../mgr/js/imageplus.window.editor.js} | 63 +++++---- .../mgr/js/jquery/jquery.jcrop.min.js | 0 .../mgr/js/jquery/jquery.min.js | 0 .../mgr/js/tools/JSON2.js | 0 config.core.sample.php | 12 -- .../docs/changelog.txt | 2 +- .../docs/license.txt | 0 .../docs/readme.tpl | 0 .../elements/chunks/imageplus.demo.html | 69 +++++++++ .../elements/plugins/imageplus.plugin.php} | 12 +- .../elements/tv/input/imageplus.class.php | 8 +- .../elements/tv/input/options/imageplus.php | 8 +- .../tv/input/tpl/imageplus.inputrender.tpl | 8 +- .../tv/input/tpl/imageplus.options.tpl | 14 +- .../elements/tv/output/imageplus.class.php | 2 +- .../elements/tv/output/options/imageplus.php | 10 +- .../tv/output/tpl/imageplus.options.tpl | 14 +- .../imageplus/lexicon/cs/default.inc.php | 21 +++ .../imageplus/lexicon/da/default.inc.php | 21 +++ .../imageplus/lexicon/de/default.inc.php | 21 +++ .../imageplus/lexicon/en/default.inc.php | 21 +++ .../imageplus/lexicon/es/default.inc.php | 21 +++ .../imageplus/lexicon/fr/default.inc.php | 21 +++ .../imageplus/lexicon/hu/default.inc.php | 21 +++ .../imageplus/lexicon/it/default.inc.php | 21 +++ .../imageplus/lexicon/nl/default.inc.php | 21 +++ .../imageplus/lexicon/ru/default.inc.php | 21 +++ .../lib/CropEngines/AbstractCropEngine.php | 0 .../lib/CropEngines/PhpThumbOf.php | 9 +- .../lib/CropEngines/PhpThumbsUp.php | 0 .../tvImagePlus.class.php | 30 ++-- .../tvimageplus/lexicon/cs/default.inc.php | 21 --- .../tvimageplus/lexicon/da/default.inc.php | 21 --- .../tvimageplus/lexicon/de/default.inc.php | 21 --- .../tvimageplus/lexicon/en/default.inc.php | 21 --- .../tvimageplus/lexicon/es/default.inc.php | 21 --- .../tvimageplus/lexicon/fr/default.inc.php | 21 --- .../tvimageplus/lexicon/hu/default.inc.php | 21 --- .../tvimageplus/lexicon/it/default.inc.php | 21 --- .../tvimageplus/lexicon/nl/default.inc.php | 21 --- .../tvimageplus/lexicon/ru/default.inc.php | 21 --- 58 files changed, 487 insertions(+), 756 deletions(-) delete mode 100644 _build/build.transport.php create mode 100644 _build/config.json delete mode 100644 _build/data/transport.plugin.ImagePlusRouter.php delete mode 100644 _build/tools/build.tools.php delete mode 100644 _build/vagrant/.gitignore delete mode 100644 _build/vagrant/Vagrantfile delete mode 100644 _build/vagrant/bootstrap.sh delete mode 100644 _build/vagrant/bootstrap/bootstrap.php rename assets/components/{tvimageplus => imageplus}/mgr/connector.php (87%) rename assets/components/{tvimageplus => imageplus}/mgr/css/jquery/Jcrop.gif (100%) rename assets/components/{tvimageplus => imageplus}/mgr/css/jquery/jquery.jcrop.min.css (100%) rename assets/components/{tvimageplus => imageplus}/mgr/icons/icon.crop.png (100%) rename assets/components/{tvimageplus/mgr/js/tvimageplus.jquery.imagecrop.js => imageplus/mgr/js/imageplus.jquery.imagecrop.js} (94%) rename assets/components/{tvimageplus/mgr/js/tvimageplus.js => imageplus/mgr/js/imageplus.js} (100%) rename assets/components/{tvimageplus/mgr/js/tvimageplus.migx_renderer.js => imageplus/mgr/js/imageplus.migx_renderer.js} (100%) rename assets/components/{tvimageplus/mgr/js/tvimageplus.panel.input.js => imageplus/mgr/js/imageplus.panel.input.js} (67%) rename assets/components/{tvimageplus/mgr/js/tvimageplus.window.editor.js => imageplus/mgr/js/imageplus.window.editor.js} (71%) rename assets/components/{tvimageplus => imageplus}/mgr/js/jquery/jquery.jcrop.min.js (100%) rename assets/components/{tvimageplus => imageplus}/mgr/js/jquery/jquery.min.js (100%) rename assets/components/{tvimageplus => imageplus}/mgr/js/tools/JSON2.js (100%) delete mode 100644 config.core.sample.php rename core/components/{tvimageplus => imageplus}/docs/changelog.txt (95%) rename core/components/{tvimageplus => imageplus}/docs/license.txt (100%) rename core/components/{tvimageplus => imageplus}/docs/readme.tpl (100%) create mode 100644 core/components/imageplus/elements/chunks/imageplus.demo.html rename core/components/{tvimageplus/elements/plugins/plugin.ImagePlusRouter.php => imageplus/elements/plugins/imageplus.plugin.php} (88%) rename core/components/{tvimageplus => imageplus}/elements/tv/input/imageplus.class.php (92%) rename core/components/{tvimageplus => imageplus}/elements/tv/input/options/imageplus.php (79%) rename core/components/{tvimageplus => imageplus}/elements/tv/input/tpl/imageplus.inputrender.tpl (55%) rename core/components/{tvimageplus => imageplus}/elements/tv/input/tpl/imageplus.options.tpl (84%) rename core/components/{tvimageplus => imageplus}/elements/tv/output/imageplus.class.php (90%) rename core/components/{tvimageplus => imageplus}/elements/tv/output/options/imageplus.php (76%) rename core/components/{tvimageplus => imageplus}/elements/tv/output/tpl/imageplus.options.tpl (82%) create mode 100644 core/components/imageplus/lexicon/cs/default.inc.php create mode 100644 core/components/imageplus/lexicon/da/default.inc.php create mode 100644 core/components/imageplus/lexicon/de/default.inc.php create mode 100644 core/components/imageplus/lexicon/en/default.inc.php create mode 100644 core/components/imageplus/lexicon/es/default.inc.php create mode 100644 core/components/imageplus/lexicon/fr/default.inc.php create mode 100644 core/components/imageplus/lexicon/hu/default.inc.php create mode 100644 core/components/imageplus/lexicon/it/default.inc.php create mode 100644 core/components/imageplus/lexicon/nl/default.inc.php create mode 100644 core/components/imageplus/lexicon/ru/default.inc.php rename core/components/{tvimageplus => imageplus}/lib/CropEngines/AbstractCropEngine.php (100%) rename core/components/{tvimageplus => imageplus}/lib/CropEngines/PhpThumbOf.php (90%) rename core/components/{tvimageplus => imageplus}/lib/CropEngines/PhpThumbsUp.php (100%) rename core/components/{tvimageplus => imageplus}/tvImagePlus.class.php (91%) delete mode 100755 core/components/tvimageplus/lexicon/cs/default.inc.php delete mode 100644 core/components/tvimageplus/lexicon/da/default.inc.php delete mode 100644 core/components/tvimageplus/lexicon/de/default.inc.php delete mode 100644 core/components/tvimageplus/lexicon/en/default.inc.php delete mode 100644 core/components/tvimageplus/lexicon/es/default.inc.php delete mode 100755 core/components/tvimageplus/lexicon/fr/default.inc.php delete mode 100644 core/components/tvimageplus/lexicon/hu/default.inc.php delete mode 100644 core/components/tvimageplus/lexicon/it/default.inc.php delete mode 100755 core/components/tvimageplus/lexicon/nl/default.inc.php delete mode 100644 core/components/tvimageplus/lexicon/ru/default.inc.php diff --git a/_build/build.config.php b/_build/build.config.php index 7ea9ec9f..a8143662 100644 --- a/_build/build.config.php +++ b/_build/build.config.php @@ -1,29 +1 @@ - PKG_ROOT, - 'build' => PKG_BUILD, - 'data' => PKG_BUILD . 'data/', - 'resolvers' => PKG_BUILD . 'resolvers/', - 'elements' => PKG_CORE . 'elements/', - 'plugins' => PKG_CORE . 'elements/plugins/', - 'lexicon' => PKG_CORE . 'lexicon/', - 'docs' => PKG_CORE . 'docs/', - 'source_assets' => PKG_ASSETS, - 'source_core' => PKG_CORE -); - - + - * - * This file is part of tvImagePlus - * - * tvImagePlus is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. - * - * tvImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * tvImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place, - * Suite 330, Boston, MA 02111-1307 USA - * - * @package tvImagePlus - * @author Alan Pich - * @copyright Alan Pich 2013 - */ - -require dirname(__FILE__) . '/tools/build.tools.php'; -require dirname(__FILE__) . '/build.config.php'; -require MODX_BASE_PATH . 'config.core.php'; -Tools::StartTimer(); - - -// Create modx & package instance ----------------------------------------------------------------- -$modx = Tools::loadModxInstance(); -$builder = new modPackageBuilder($modx); -$builder->createPackage(PKG_NAMESPACE, PKG_VERSION, PKG_RELEASE); - - -// Register Namespace ----------------------------------------------------------------------------- -$builder->registerNamespace(PKG_NAMESPACE, false, true, '{core_path}components/' . PKG_NAMESPACE . '/'); - - -// Create the plugin object ----------------------------------------------------------------------- -include $sources['data'] . 'transport.plugin.ImagePlusRouter.php'; - - -// Package core and assets directories ------------------------------------------------------------ -$modx->log(modX::LOG_LEVEL_INFO, 'Packaging core & assets directories...'); -$vehicle = $builder->createVehicle($plugin, $attributes); -$vehicle->resolve('file',array( - 'source' => PKG_ASSETS, - 'target' => "return MODX_ASSETS_PATH . 'components/';", - )); -$vehicle->resolve('file',array( - 'source' => PKG_CORE, - 'target' => "return MODX_CORE_PATH . 'components/';", - )); -$builder->putVehicle($vehicle); - - -// Add documentation ------------------------------------------------------------------------------ -$modx->log(modX::LOG_LEVEL_INFO, 'Adding documentation...'); -$builder->setPackageAttributes( - array( - 'license' => file_get_contents($sources['docs'] . 'license.txt'), - 'readme' => Tools::parseReadmeTpl($sources['docs'] . 'readme.tpl'), - 'changelog' => file_get_contents($sources['docs'] . 'changelog.txt'), - ) -); - - -// Create transport package ----------------------------------------------------------------------- -$modx->log(modX::LOG_LEVEL_INFO, 'Packing component for transport...'); -$builder->pack(); - - -// Copy transport package back to PKG_ROOT -------------------------------------------------------- -$zipFile = PKG_NAMESPACE.'-'.PKG_VERSION.'-'.PKG_RELEASE.'.transport.zip'; -$zipPath = MODX_CORE_PATH.'packages/'. $zipFile; -copy($zipPath,PKG_ROOT.$zipFile); - - -// Build process finished ------------------------------------------------------------------------- -$totalTime= sprintf("%2.4f s", Tools::stopTimer()); -$modx->log(modX::LOG_LEVEL_INFO,"Package ".PKG_NAME.' '.PKG_VERSION.'-'.PKG_RELEASE." built in {$totalTime}"); - - -exit; diff --git a/_build/config.json b/_build/config.json new file mode 100644 index 00000000..fa045923 --- /dev/null +++ b/_build/config.json @@ -0,0 +1,37 @@ +{ + "name": "ImagePlus", + "lowCaseName": "imageplus", + "description": "Advanced Image template variable input type", + "author": "Alan Pich", + "version": "2.2.1", + "package": { + "elements": { + "chunks": [ + { + "name": "ImagePlus.demo", + "file": "imageplus.demo.html", + "description": "Demo output chunk for Image+." + } + ], + "plugins": [ + { + "name": "ImagePlus", + "file": "imageplus.plugin.php", + "description": "Image+ runtime hooks - registers custom TV input & output types and includes javascripts on document edit pages.", + "events": [ + "OnTVInputPropertiesList", + "OnTVInputRenderList", + "OnTVOutputRenderList", + "OnTVOutputRenderPropertiesList", + "OnDocFormRender" + ] + } + ] + } + }, + "build": { + "readme": "docs/readme.txt", + "license": "docs/license.txt", + "changelog": "docs/changelog.txt" + } +} \ No newline at end of file diff --git a/_build/data/transport.plugin.ImagePlusRouter.php b/_build/data/transport.plugin.ImagePlusRouter.php deleted file mode 100644 index 6ee56d50..00000000 --- a/_build/data/transport.plugin.ImagePlusRouter.php +++ /dev/null @@ -1,68 +0,0 @@ -'),'',$o)); - return $o; -} - -/* create the plugin object */ -$plugin= $modx->newObject('modPlugin'); -$plugin->set('id',1); -$plugin->set('name', 'ImagePlusRouter'); -$plugin->set('description', PKG_NAME.' '.PKG_VERSION.'-'.PKG_RELEASE.' :: Image+ runtime hooks - registers custom TV input & output types and includes javascripts on document edit pages so that the TV can be used from within MIGX');$plugin->set('plugincode', getPluginContent($sources['elements'] . 'plugins/plugin.ImagePlusRouter.php')); -$plugin->set('category', 0); - -/* add plugin events */ -$events = array(); - -$event = $modx->newObject('modPluginEvent'); -$event->set('event','OnTVInputPropertiesList'); -$event->set('priority',0); -$event->set('propertyset',0); -$events[] = $event; - -$event = $modx->newObject('modPluginEvent'); -$event->set('event','OnTVInputRenderList'); -$event->set('priority',0); -$event->set('propertyset',0); -$events[] = $event; - -$event = $modx->newObject('modPluginEvent'); -$event->set('event','OnTVOutputRenderList'); -$event->set('priority',0); -$event->set('propertyset',0); -$events[] = $event; - -$event = $modx->newObject('modPluginEvent'); -$event->set('event','OnTVOutputRenderPropertiesList'); -$event->set('priority',0); -$event->set('propertyset',0); -$events[] = $event; - -$event = $modx->newObject('modPluginEvent'); -$event->set('event','OnDocFormRender'); -$event->set('priority',0); -$event->set('propertyset',0); -$events[] = $event; - -$plugin->addMany($events); -$modx->log(xPDO::LOG_LEVEL_INFO,'Packaged in '.count($events).' Plugin Events.'); flush(); -unset($events); - -/* create vehicle for plugin */ -$attributes= array( - xPDOTransport::UNIQUE_KEY => 'name', - xPDOTransport::PRESERVE_KEYS => false, - xPDOTransport::UPDATE_OBJECT => true, - xPDOTransport::RELATED_OBJECTS => true, - xPDOTransport::RELATED_OBJECT_ATTRIBUTES => array ( - 'PluginEvents' => array( - xPDOTransport::PRESERVE_KEYS => true, - xPDOTransport::UPDATE_OBJECT => false, - xPDOTransport::UNIQUE_KEY => array('pluginid','event'), - ), - ), -); -$vehicle = $builder->createVehicle($plugin, $attributes); -$modx->log(modX::LOG_LEVEL_INFO,'Added plugin ImagePlusRouter'); -$builder->putVehicle($vehicle); diff --git a/_build/tools/build.tools.php b/_build/tools/build.tools.php deleted file mode 100644 index dcf7b758..00000000 --- a/_build/tools/build.tools.php +++ /dev/null @@ -1,104 +0,0 @@ - - * - * This file is part of tvImagePlus - * - * tvImagePlus is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. - * - * tvImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * tvImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place, - * Suite 330, Boston, MA 02111-1307 USA - * - * @package tvImagePlus - * @author Alan Pich - * @copyright Alan Pich 2013 - */ - - -/** - * Class Tools - * - * Helpful tools to clean up the transport build file - * - */ -class Tools { - - protected static $_startTime; - - /** - * Start a timer - */ - public static function startTimer(){ - self::$_startTime = microtime(true); - } - - /** - * Stop the timer and return time - * @return float - */ - public static function stopTimer(){ - $now = microtime(true); - return $now - self::$_startTime; - } - - - public static function loadModxInstance(){ - require_once MODX_CORE_PATH . 'model/modx/modx.class.php'; - $modx= new modX(); - $modx->initialize('mgr'); - echo XPDO_CLI_MODE ? '' : '
';
-        $modx->setLogLevel(modX::LOG_LEVEL_INFO);
-        $modx->setLogTarget('ECHO');
-        $modx->loadClass('transport.modPackageBuilder','',false, true);
-        return $modx;
-    }
-
-
-    /**
-     * Parse the smarty readme tpl for packaging
-     * @param string $path Path to tpl
-     * @return string
-     */
-    public static function parseReadmeTpl( $path ){
-        global $modx;
-        $modx->getService('smarty','smarty.modSmarty');
-
-        $modx->smarty->assign('date',date("jS M Y g:ia"));
-        $modx->smarty->assign('version',PKG_VERSION.' '.PKG_RELEASE);
-        $modx->smarty->assign('commit',PKG_COMMIT);
-        $readme = $modx->smarty->fetch($path);
-        return $readme;
-    }//
-
-
-    /**
-     * Get currect git commit id
-     * @param string repoRoot Path to repository root
-     * @return string commit hash
-     */
-    function getGitCommitId( $repoRoot ){
-        // Check git exists
-        $whichGit = `which git`;
-        if(empty($whichGit)){ return ''; };
-
-        // Check we're in a git repo
-        $gitFolder = str_replace('//','/',$repoRoot.'/.git');
-        if( ! is_dir($gitFolder) ){ return ''; };
-
-        //
-        $test = shell_exec("cd $repoRoot; git rev-parse HEAD;");
-        return trim($test);
-    }//
-
-
-
-
-}
diff --git a/_build/vagrant/.gitignore b/_build/vagrant/.gitignore
deleted file mode 100644
index 8000dd9d..00000000
--- a/_build/vagrant/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-.vagrant
diff --git a/_build/vagrant/Vagrantfile b/_build/vagrant/Vagrantfile
deleted file mode 100644
index 2ffea7c8..00000000
--- a/_build/vagrant/Vagrantfile
+++ /dev/null
@@ -1,38 +0,0 @@
-### Vagrant Development Environment for tvImagePlus
-#===============================================================================
-#
-#   Brings up a testing server ready to use that will run at http://localhost:8881
-#
-#   phpMyAdmin can be accessed at http://localhost:8881/phpmyadmin
-#       username: root
-#       password: password
-#
-#   SSH into the box by running the command `vagrant ssh` from the project root
-#
-#   MODx manager login is at http://localhost:8881/manager
-#       username: admin
-#       password: password
-#
-
-#### Configure Vagrant ==========================================================
-###=============================================================================
-Vagrant.configure("2") do |config|
-
-    config.vm.define :vagrant do |vbox_config|
-
-        ## Box Definition ######################################################
-        vbox_config.vm.box = "modx-2.2.7-precise32"
-        vbox_config.vm.box_url = "http://vagrant.alanpich.com/modx-2.2.7-precise32.box"
-        config.vm.provision :shell, :path => "bootstrap.sh"
-
-        ## Network Binding #####################################################
-        config.vm.network :forwarded_port, host: 8881, guest: 80
-
-        ## Shared Folders ######################################################
-        vbox_config.vm.synced_folder "../../core/components/tvimageplus", "/var/www/core/components/tvimageplus"
-        vbox_config.vm.synced_folder "../../assets/components/tvimageplus", "/var/www/assets/components/tvimageplus"
-        vbox_config.vm.synced_folder "bootstrap", "/home/vagrant/vagrant-bootstrap"
-
-    end
-
-end
diff --git a/_build/vagrant/bootstrap.sh b/_build/vagrant/bootstrap.sh
deleted file mode 100644
index 2c6b463c..00000000
--- a/_build/vagrant/bootstrap.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/usr/bin/env bash
-
-sudo apt-get update;
-sudo apt-get install curl php5-curl -y
-sudo service apache2 restart
-
-php /home/vagrant/vagrant-bootstrap/bootstrap.php > /dev/null
diff --git a/_build/vagrant/bootstrap/bootstrap.php b/_build/vagrant/bootstrap/bootstrap.php
deleted file mode 100644
index e90c3e97..00000000
--- a/_build/vagrant/bootstrap/bootstrap.php
+++ /dev/null
@@ -1,48 +0,0 @@
-newObject('modNamespace');
-$namespace->set('name', 'tvimageplus');
-$namespace->set('path', '{core_path}components/tvimageplus/');
-$namespace->set('assets_path', '{assets_path}components/tvimageplus/');
-$namespace->save();
-
-
-// Create the plugin
-$plugin = $modx->newObject('modPlugin');
-$plugin->set('name', 'ImagePlusRouter');
-$plugin->set('static', true);
-$plugin->set('static_file', 'core/components/tvimageplus/elements/plugins/plugin.ImagePlusRouter.php');
-$plugin->set('source',1);
-$plugin->set('locked',true);
-
-$eventNames = array(
-    'OnTVInputRenderList',
-    'OnTVOutputRenderList',
-    'OnTVInputPropertiesList',
-    'OnTVOutputPropertiesList',
-    'OnDocFormRender',
-    'OnTVOutputRenderPropertiesList'
-);
-$events = array();
-foreach($eventNames as $evt){
-    $event = $modx->newObject('modPluginEvent');
-    $event->set('event', $evt);
-    $events[] = $event;
-}
-$plugin->addMany($events);
-$plugin->save();
-
-
-// Clear the cache
-$modx->cacheManager->refresh();
-
diff --git a/assets/components/tvimageplus/mgr/connector.php b/assets/components/imageplus/mgr/connector.php
similarity index 87%
rename from assets/components/tvimageplus/mgr/connector.php
rename to assets/components/imageplus/mgr/connector.php
index cb36cafa..31b8b8ce 100644
--- a/assets/components/tvimageplus/mgr/connector.php
+++ b/assets/components/imageplus/mgr/connector.php
@@ -34,10 +34,10 @@
 require_once MODX_CONNECTORS_PATH.'index.php';
 
 // Load up some lexiconzzzz
-$modx->lexicon->load('tvimageplus:default');
+$modx->lexicon->load('imageplus:default');
  
 // Handle request 
 $modx->request->handleRequest(array(
-    'processors_path' => $modx->getOption('tvimageplus.core_path',null,$modx->getOption('core_path').'components/tvimageplus/').'processors/',
+    'processors_path' => $modx->getOption('imageplus.core_path',null,$modx->getOption('core_path').'components/imageplus/').'processors/',
     'location' => '',
 ));
diff --git a/assets/components/tvimageplus/mgr/css/jquery/Jcrop.gif b/assets/components/imageplus/mgr/css/jquery/Jcrop.gif
similarity index 100%
rename from assets/components/tvimageplus/mgr/css/jquery/Jcrop.gif
rename to assets/components/imageplus/mgr/css/jquery/Jcrop.gif
diff --git a/assets/components/tvimageplus/mgr/css/jquery/jquery.jcrop.min.css b/assets/components/imageplus/mgr/css/jquery/jquery.jcrop.min.css
similarity index 100%
rename from assets/components/tvimageplus/mgr/css/jquery/jquery.jcrop.min.css
rename to assets/components/imageplus/mgr/css/jquery/jquery.jcrop.min.css
diff --git a/assets/components/tvimageplus/mgr/icons/icon.crop.png b/assets/components/imageplus/mgr/icons/icon.crop.png
similarity index 100%
rename from assets/components/tvimageplus/mgr/icons/icon.crop.png
rename to assets/components/imageplus/mgr/icons/icon.crop.png
diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.jquery.imagecrop.js b/assets/components/imageplus/mgr/js/imageplus.jquery.imagecrop.js
similarity index 94%
rename from assets/components/tvimageplus/mgr/js/tvimageplus.jquery.imagecrop.js
rename to assets/components/imageplus/mgr/js/imageplus.jquery.imagecrop.js
index 1c458066..6a85c7c1 100644
--- a/assets/components/tvimageplus/mgr/js/tvimageplus.jquery.imagecrop.js
+++ b/assets/components/imageplus/mgr/js/imageplus.jquery.imagecrop.js
@@ -24,12 +24,12 @@
 
 tvImagePlus.jquery.ImageCrop= function(config) {
     config = config || {};
-    this.tvimageplus = config.tvimageplus;
+    this.imageplus = config.imageplus;
     this.window = config.window;
     this.imageDOMid = Ext.id();
     
     Ext.apply(config,{
-        cropData: this.tvimageplus.crop
+        cropData: this.imageplus.crop
         ,collapsable: false
         ,items: [{
             html: ''
@@ -85,4 +85,4 @@ Ext.extend(tvImagePlus.jquery.ImageCrop, Ext.Panel, {
     
     
   });
-Ext.reg('tvimageplus-jquery-imagecrop',tvImagePlus.jquery.ImageCrop);
+Ext.reg('imageplus-jquery-imagecrop',tvImagePlus.jquery.ImageCrop);
diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.js b/assets/components/imageplus/mgr/js/imageplus.js
similarity index 100%
rename from assets/components/tvimageplus/mgr/js/tvimageplus.js
rename to assets/components/imageplus/mgr/js/imageplus.js
diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.migx_renderer.js b/assets/components/imageplus/mgr/js/imageplus.migx_renderer.js
similarity index 100%
rename from assets/components/tvimageplus/mgr/js/tvimageplus.migx_renderer.js
rename to assets/components/imageplus/mgr/js/imageplus.migx_renderer.js
diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js b/assets/components/imageplus/mgr/js/imageplus.panel.input.js
similarity index 67%
rename from assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js
rename to assets/components/imageplus/mgr/js/imageplus.panel.input.js
index e501c6fd..123f76ac 100644
--- a/assets/components/tvimageplus/mgr/js/tvimageplus.panel.input.js
+++ b/assets/components/imageplus/mgr/js/imageplus.panel.input.js
@@ -24,7 +24,7 @@
 
 tvImagePlus.panel.input = function (config) {
     config = config || {};
-    this.tvimageplus = config.tvimageplus;
+    this.imageplus = config.imageplus;
 
     this.create_editButton();
     this.create_clearButton();
@@ -39,18 +39,27 @@ tvImagePlus.panel.input = function (config) {
 
 
     Ext.apply(config, {
-        border: false, baseCls: 'modx-formpanel', cls: 'container', updateTo: config.updateTo, width: '100%', items: [
-            {
-                xtype: 'compositefield', anchor: '98%', hideLabel: true, style: {
-                marginBottom: '5px'
-            }, listeners: {
-                'render': {fn: this.on_Render, scope: this}, 'afterRender': {fn: this.onAfterRender, scope: this}
-            }, items: [this.imageBrowser, this.editButton]
+        border: false, baseCls: 'modx-formpanel', cls: 'container', updateTo: config.updateTo, width: '100%',
+        items: [{
+            xtype: 'compositefield', anchor: '98%', hideLabel: true,
+            listeners: {
+                'render': {fn: this.on_Render, scope: this},
+                'afterRender': {fn: this.onAfterRender, scope: this}
             },
-            this.altTextField,
-            this.imagePreview,
-            this.clearButton
-        ]
+            items: [this.imageBrowser]
+        }, {
+            cls: 'modx-tv-image-preview',
+            items: [
+                this.editButton,
+                this.clearButton
+            ]
+        },{
+            cls: 'modx-tv-image-preview',
+            items: [
+                this.imagePreview,
+                this.altTextField
+            ]
+        }]
     });
     tvImagePlus.panel.input.superclass.constructor.call(this, config);
 
@@ -68,7 +77,7 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
     listenForResetEvent: function () {
         var resourcePanel = Ext.getCmp('modx-panel-resource');
         resourcePanel.on('tv-reset', function (changed) {
-            if (changed.id = this.tvimageplus.tv.id) {
+            if (changed.id = this.imageplus.tv.id) {
                 this.on_Reset();
             }
         }, this)
@@ -80,13 +89,13 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
     create_editButton: function () {
 
         this.editButton = new Ext.Button({
-            text: _('tvimageplus.edit_image'), handler: this.editImage, scope: this, icon: tvImagePlus.config.crop_icon
+            text: _('imageplus.edit_image'), handler: this.editImage, scope: this, icon: tvImagePlus.config.crop_icon, style: { marginRight: '5px' }
         })
     }//
 
     , create_clearButton: function () {
         this.clearButton = new Ext.Button({
-            text: _('tvimageplus.clear_image') || "Clear Image", handler: this.clearImage, scope: this
+            text: _('imageplus.clear_image') || "Clear Image", handler: this.clearImage, scope: this
         })
     }//
 
@@ -94,13 +103,13 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
      * Create the image browser combo
      */, create_imageBrowser: function () {
         // Generate opento path
-        var openToPath = this.tvimageplus.sourceImg.src.split('/');
+        var openToPath = this.imageplus.sourceImg.src.split('/');
         openToPath.pop();
         openToPath = openToPath.join('/');
 
         // Create browser component
         this.imageBrowser = new MODx.combo.Browser({
-            value: this.tvimageplus.sourceImg.src, source: this.tvimageplus.mediaSource, hideSourceCombo: true, openTo: openToPath, listeners: {
+            value: this.imageplus.sourceImg.src, source: this.imageplus.mediaSource, hideSourceCombo: true, openTo: openToPath, listeners: {
                 'select': {fn: this.on_imageSelected, scope: this}
             }
         })
@@ -116,14 +125,14 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
      * Create field for alt-text input
      */, create_altTextField: function () {
         this.altTextField = MODx.load({
-            xtype: this.tvimageplus.altTagOn ? 'textfield' : 'hidden', value: this.tvimageplus.altTag || '', listeners: {
+            xtype: this.imageplus.altTagOn ? 'textfield' : 'hidden', value: this.imageplus.altTag || '', listeners: {
                 'change': {fn: this.on_altTagChange, scope: this}
             }, width: 300, style: {marginBottom: '5px'}
         })
     }, generateThumbUrl: function (params) {
         var url = MODx.config.connectors_url + 'system/phpthumb.php?imageplus=1';
         var defaults = {
-            wctx: 'mgr', f: 'png', q: 90, w: 150, source: this.tvimageplus.sourceImg.source
+            wctx: 'mgr', f: 'png', q: 90, w: 150, source: this.imageplus.sourceImg.source
         }
         for (i in params) {
             defaults[i] = params[i]
@@ -138,7 +147,7 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
      * Fires when the TV field is reset
      */, on_Reset: function () {
         this.imageBrowser.setValue('');
-        this.tvimageplus.sourceImg = false;
+        this.imageplus.sourceImg = false;
         this.editButton.disable();
         this.updatePreviewImage.defer(10, this);
     }
@@ -158,26 +167,26 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
      * Fired when user has selected an image from the browser
      */, on_imageSelected: function (img) {
 
-        var diffImg = (this.tvimageplus.sourceImg && this.tvimageplus.sourceImg.src != img.relativeUrl);
+        var diffImg = (this.imageplus.sourceImg && this.imageplus.sourceImg.src != img.relativeUrl);
 
 
         this.oldSourceImg = {};
-        for (i in this.tvimageplus.sourceImg) {
-            this.oldSourceImg[i] = this.tvimageplus.sourceImg[i];
+        for (i in this.imageplus.sourceImg) {
+            this.oldSourceImg[i] = this.imageplus.sourceImg[i];
         }
 
 
-        this.tvimageplus.sourceImg = {
-            src: img.relativeUrl, width: img.image_width, height: img.image_height, source: this.tvimageplus.mediaSource
+        this.imageplus.sourceImg = {
+            src: img.relativeUrl, width: img.image_width, height: img.image_height, source: this.imageplus.mediaSource
         }
 
 
         // Reset crop rectangle everytime an image is selected to be different from browser
         if (diffImg) {
-            this.tvimageplus.crop.x = 0;
-            this.tvimageplus.crop.y = 0;
-            this.tvimageplus.crop.width = this.tvimageplus.targetWidth;
-            this.tvimageplus.crop.height = this.tvimageplus.targetHeight;
+            this.imageplus.crop.x = 0;
+            this.imageplus.crop.y = 0;
+            this.imageplus.crop.width = this.imageplus.targetWidth;
+            this.imageplus.crop.height = this.imageplus.targetHeight;
         }
 
 
@@ -188,7 +197,7 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
         } else {
             // Update display
             this.updateDisplay();
-            if (this.tvimageplus.crop.width == 0 || this.tvimageplus.crop.height == 0) this.editImage();
+            if (this.imageplus.crop.width == 0 || this.imageplus.crop.height == 0) this.editImage();
         }
         ;
     }//
@@ -196,7 +205,7 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
     /**
      * Fired when alt-tag field is changed
      */, on_altTagChange: function (field, value) {
-        this.tvimageplus.altTag = value;
+        this.imageplus.altTag = value;
         this.updateExternalField();
     }
 
@@ -204,18 +213,18 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
      * Manually get image size
      * @return void
      */, manual_getImageSize: function () {
-        var baseUrl = tvImagePlus.config['sources'][this.tvimageplus.sourceImg.source].url;
+        var baseUrl = tvImagePlus.config['sources'][this.imageplus.sourceImg.source].url;
         var img = new Image();
         img.onload = (function (ths) {
             return function () {
-                ths.tvimageplus.sourceImg.width = this.width;
-                ths.tvimageplus.sourceImg.height = this.height;
+                ths.imageplus.sourceImg.width = this.width;
+                ths.imageplus.sourceImg.height = this.height;
 
                 ths.updateDisplay();
-                if (ths.tvimageplus.crop.width == 0 || ths.tvimageplus.crop.height == 0)  ths.editImage();
+                if (ths.imageplus.crop.width == 0 || ths.imageplus.crop.height == 0)  ths.editImage();
             }
         })(this);
-        img.src = baseUrl + this.tvimageplus.sourceImg.src;
+        img.src = baseUrl + this.imageplus.sourceImg.src;
     }//
 
 
@@ -226,22 +235,22 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
         // Make sure image is large enough to use
         if (!this.checkImageIsLargeEnough()) {
 
-            this.tvimageplus.sourceImg = this.oldSourceImg;
+            this.imageplus.sourceImg = this.oldSourceImg;
 
             if (!this.oldSourceImg) this.imageBrowser.reset();
             else {
                 if (this.oldSourceImg.crop) {
-                    this.tvimageplus.crop.x = this.oldSourceImg.crop.x;
-                    this.tvimageplus.crop.y = this.oldSourceImg.crop.y;
-                    this.tvimageplus.crop.width = this.oldSourceImg.crop.width;
-                    this.tvimageplus.crop.height = this.oldSourceImg.crop.height;
+                    this.imageplus.crop.x = this.oldSourceImg.crop.x;
+                    this.imageplus.crop.y = this.oldSourceImg.crop.y;
+                    this.imageplus.crop.width = this.oldSourceImg.crop.width;
+                    this.imageplus.crop.height = this.oldSourceImg.crop.height;
                 }
                 this.imageBrowser.setValue(this.lastFileLabel || "");
             }
             MODx.msg.alert("Image too small", "The selected image is too small to be used here. Please select a different image");
             return;
         }
-        this.lastFileLabel = this.tvimageplus.sourceImg.src;
+        this.lastFileLabel = this.imageplus.sourceImg.src;
 
         // Hide 'edit' button if field is empty
         if (this.imageBrowser.getValue() == '') {
@@ -264,7 +273,7 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
 
 
         var TV = {
-            sourceImg: this.tvimageplus.sourceImg, crop: this.tvimageplus.crop, targetWidth: this.tvimageplus.targetWidth, targetHeight: this.tvimageplus.targetHeight, altTag: this.tvimageplus.altTag
+            sourceImg: this.imageplus.sourceImg, crop: this.imageplus.crop, targetWidth: this.imageplus.targetWidth, targetHeight: this.imageplus.targetHeight, altTag: this.imageplus.altTag
         }
         var json = JSON.stringify(TV, null, '  ');
 
@@ -294,15 +303,15 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
      * Checks whether the image is larger than specified crop dimensions
      * @returns bool
      */, checkImageIsLargeEnough: function () {
-        if (!this.tvimageplus.sourceImg || this.tvimageplus == undefined) return true;
+        if (!this.imageplus.sourceImg || this.imageplus == undefined) return true;
 
-        if (this.tvimageplus.targetWidth > 0 && this.tvimageplus.sourceImg.width > 0) {
-            if (this.tvimageplus.targetWidth > this.tvimageplus.sourceImg.width) {
+        if (this.imageplus.targetWidth > 0 && this.imageplus.sourceImg.width > 0) {
+            if (this.imageplus.targetWidth > this.imageplus.sourceImg.width) {
                 return false;
             }
         }
-        if (this.tvimageplus.targetHeight > 0 && this.tvimageplus.sourceImg.height > 0) {
-            if (this.tvimageplus.targetHeight > this.tvimageplus.sourceImg.height) {
+        if (this.imageplus.targetHeight > 0 && this.imageplus.sourceImg.height > 0) {
+            if (this.imageplus.targetHeight > this.imageplus.sourceImg.height) {
                 return false;
             }
         }
@@ -317,8 +326,8 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
         if (!this.editorWindow) {
 
             // Calculate safe image ratio
-            var imgW = this.tvimageplus.sourceImg.width;
-            var imgH = this.tvimageplus.sourceImg.height;
+            var imgW = this.imageplus.sourceImg.width;
+            var imgH = this.imageplus.sourceImg.height;
             var maxH = window.innerHeight * 0.7;
             var maxW = window.innerWidth * 0.7;
             // Is image taller than screen?
@@ -332,9 +341,9 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
 
 
             this.editorWindow = MODx.load({
-                xtype: 'tvimageplus-window-editor', title: _('tvimageplus.editor_title'), tvimageplus: this.tvimageplus, inputPanel: this, displayRatio: ratio
+                xtype: 'imageplus-window-editor', title: _('imageplus.editor_title'), imageplus: this.imageplus, inputPanel: this, displayRatio: ratio
                 //    ,autoWidth: true
-                , width: imgW * ratio, crop: this.tvimageplus.crop
+                , width: imgW * ratio, crop: this.imageplus.crop
             });
 
         }
@@ -343,7 +352,7 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
         this.editorWindow.show();
     }//
     , clearImage: function () {
-        this.tvimageplus.sourceImg = null;
+        this.imageplus.sourceImg = null;
         this.oldSourceImg = null;
         this.lastFileLabel = "";
         this.editButton.disable();
@@ -360,15 +369,15 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
     /**
      * Receive new cropping dimensions from editor
      */, updateFromEditor: function (crop) {
-        this.tvimageplus.crop.x = crop.x;
-        this.tvimageplus.crop.y = crop.y;
-        this.tvimageplus.crop.width = crop.width;
-        this.tvimageplus.crop.height = crop.height;
+        this.imageplus.crop.x = crop.x;
+        this.imageplus.crop.y = crop.y;
+        this.imageplus.crop.width = crop.width;
+        this.imageplus.crop.height = crop.height;
 
         if (!this.oldSourceImg) {
             this.oldSourceImg = {};
-            for (i in this.tvimageplus.sourceImg) {
-                this.oldSourceImg[i] = this.tvimageplus.sourceImg[i];
+            for (i in this.imageplus.sourceImg) {
+                this.oldSourceImg[i] = this.imageplus.sourceImg[i];
             }
         }
         this.oldSourceImg.crop = {};
@@ -381,12 +390,12 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
         this.editorWindow = null;
         this.updateDisplay();
     }, updatePreviewImage: function () {
-        if (!this.tvimageplus.sourceImg || this.tvimageplus.crop.width == 0) {
+        if (!this.imageplus.sourceImg || this.imageplus.crop.width == 0) {
             this.imagePreview.hide();
             return;
         }
         url = this.generateThumbUrl({
-            src: this.tvimageplus.sourceImg.src, sw: this.tvimageplus.crop.width, sh: this.tvimageplus.crop.height, sx: this.tvimageplus.crop.x, sy: this.tvimageplus.crop.y
+            src: this.imageplus.sourceImg.src, sw: this.imageplus.crop.width, sh: this.imageplus.crop.height, sx: this.imageplus.crop.x, sy: this.imageplus.crop.y
         })
         if (this.imagePreview.el) {
             this.imagePreview.el.dom.src = url;
@@ -396,4 +405,4 @@ Ext.extend(tvImagePlus.panel.input, MODx.Panel, {
     }
 
 });
-Ext.reg('tvimageplus-panel-input', tvImagePlus.panel.input);
+Ext.reg('imageplus-panel-input', tvImagePlus.panel.input);
diff --git a/assets/components/tvimageplus/mgr/js/tvimageplus.window.editor.js b/assets/components/imageplus/mgr/js/imageplus.window.editor.js
similarity index 71%
rename from assets/components/tvimageplus/mgr/js/tvimageplus.window.editor.js
rename to assets/components/imageplus/mgr/js/imageplus.window.editor.js
index f36a341f..7e18b645 100644
--- a/assets/components/tvimageplus/mgr/js/tvimageplus.window.editor.js
+++ b/assets/components/imageplus/mgr/js/imageplus.window.editor.js
@@ -24,18 +24,19 @@
 
 tvImagePlus.window.Editor = function(config) {
     config = config || {};
-    this.tvimageplus = config.tvimageplus;
+    this.imageplus = config.imageplus;
     this.inputPanel = config.inputPanel;
     this.displayRatio = config.displayRatio;
 	
 	var cropSettings = {
-		x: this.tvimageplus.crop.x,
-		y: this.tvimageplus.crop.y,
-		width: this.tvimageplus.crop.width,
-		height: this.tvimageplus.crop.height
+		x: this.imageplus.crop.x,
+		y: this.imageplus.crop.y,
+		width: this.imageplus.crop.width,
+		height: this.imageplus.crop.height
 	}
     
     Ext.apply(config,{
+        bodyStyle: { 'padding': '0'},
         border: false
         ,crop: cropSettings
         ,resizable: false
@@ -46,8 +47,8 @@ tvImagePlus.window.Editor = function(config) {
             ,'show': {fn:this.on_show,scope:this}
         }
         ,items: [{
-            xtype: 'tvimageplus-jquery-imagecrop'
-            ,tvimageplus: this.tvimageplus
+            xtype: 'imageplus-jquery-imagecrop'
+            ,imageplus: this.imageplus
             ,initialWidth: this.getDisplayWidth()
             ,initialHeight: this.getDisplayHeight()
             ,imageUrl: this.getImageUrl()
@@ -55,7 +56,7 @@ tvImagePlus.window.Editor = function(config) {
             ,listeners: {
                 'change': {fn: this.on_cropChange,scope:this}
             }
-            ,cropData: this.tvimageplus.crop
+            ,cropData: this.imageplus.crop
         }]
         ,buttonAlign: 'right'
         ,buttons: [{
@@ -74,10 +75,10 @@ Ext.extend(tvImagePlus.window.Editor, Ext.Window, {
     
     // Get the required width of the cropper
     getDisplayWidth: function(){
-        return Math.round(this.tvimageplus.sourceImg.width * this.displayRatio);
+        return Math.round(this.imageplus.sourceImg.width * this.displayRatio);
     }//
     ,getDisplayHeight: function(){
-        return Math.round(this.tvimageplus.sourceImg.height * this.displayRatio);
+        return Math.round(this.imageplus.sourceImg.height * this.displayRatio);
     }
     
     /**
@@ -85,7 +86,7 @@ Ext.extend(tvImagePlus.window.Editor, Ext.Window, {
      */
     ,getImageUrl: function(){ 
         var url = this.inputPanel.generateThumbUrl({
-                src: this.tvimageplus.sourceImg.src
+                src: this.imageplus.sourceImg.src
                 ,w: this.getDisplayWidth()
                 ,h: this.getDisplayHeight()
             })
@@ -94,7 +95,7 @@ Ext.extend(tvImagePlus.window.Editor, Ext.Window, {
     
     ,getOuterImageUrl: function(){
         var url = this.inputPanel.generateThumbUrl({
-                src: this.tvimageplus.sourceImg.src
+                src: this.imageplus.sourceImg.src
                 ,w: this.getDisplayWidth()
                 ,h: this.getDisplayHeight()
                 ,'fltr[]': 'blur|25'
@@ -104,40 +105,40 @@ Ext.extend(tvImagePlus.window.Editor, Ext.Window, {
     
     ,getMinCropSize: function(){
         return [ 
-            this.tvimageplus.targetWidth * this.displayRatio
-            ,this.tvimageplus.targetHeight * this.displayRatio
+            this.imageplus.targetWidth * this.displayRatio
+            ,this.imageplus.targetHeight * this.displayRatio
         ]
     }
     
     ,getMinCropWidth: function(){
-        return this.tvimageplus.targetWidth * this.displayRatio;
+        return this.imageplus.targetWidth * this.displayRatio;
     }
     ,getMinCropHeight: function(){
-        return this.tvimageplus.targetHeight * this.displayRatio;
+        return this.imageplus.targetHeight * this.displayRatio;
     }
     ,getInitialCropX: function(){
-        return this.tvimageplus.crop.x * this.displayRatio;
+        return this.imageplus.crop.x * this.displayRatio;
     }
     ,getInitialCropY: function(){
-        return this.tvimageplus.crop.y * this.displayRatio;
+        return this.imageplus.crop.y * this.displayRatio;
     }
     ,getInitialCropWidth: function(){
-        if(this.tvimageplus.crop.width==0){
-            return this.tvimageplus.targetWidth * this.displayRatio;
+        if(this.imageplus.crop.width==0){
+            return this.imageplus.targetWidth * this.displayRatio;
         } else {
-            return this.tvimageplus.crop.width * this.displayRatio;
+            return this.imageplus.crop.width * this.displayRatio;
         };
     }
     ,getInitialCropHeight: function(){
-        if(this.tvimageplus.crop.height==0){
-            return this.tvimageplus.targetHeight * this.displayRatio
+        if(this.imageplus.crop.height==0){
+            return this.imageplus.targetHeight * this.displayRatio
         } else {
-            return this.tvimageplus.crop.height * this.displayRatio;
+            return this.imageplus.crop.height * this.displayRatio;
         };
     }
     ,getAspectRatio: function(){
-        if( this.tvimageplus.targetWidth>0 && this.tvimageplus.targetHeight>0){
-            return this.tvimageplus.targetWidth / this.tvimageplus.targetHeight;
+        if( this.imageplus.targetWidth>0 && this.imageplus.targetHeight>0){
+            return this.imageplus.targetWidth / this.imageplus.targetHeight;
         } else { return false}
     }
     
@@ -176,11 +177,11 @@ Ext.extend(tvImagePlus.window.Editor, Ext.Window, {
         this.close();
     }
     ,closeFromEditor: function() {
-		this.crop.width = this.tvimageplus.crop.width;
-		this.crop.height = this.tvimageplus.crop.height;
-		this.crop.x = this.tvimageplus.crop.x;
-		this.crop.y = this.tvimageplus.crop.y;
+		this.crop.width = this.imageplus.crop.width;
+		this.crop.height = this.imageplus.crop.height;
+		this.crop.x = this.imageplus.crop.x;
+		this.crop.y = this.imageplus.crop.y;
 		this.close();
 	}
 });
-Ext.reg('tvimageplus-window-editor',tvImagePlus.window.Editor);
+Ext.reg('imageplus-window-editor',tvImagePlus.window.Editor);
diff --git a/assets/components/tvimageplus/mgr/js/jquery/jquery.jcrop.min.js b/assets/components/imageplus/mgr/js/jquery/jquery.jcrop.min.js
similarity index 100%
rename from assets/components/tvimageplus/mgr/js/jquery/jquery.jcrop.min.js
rename to assets/components/imageplus/mgr/js/jquery/jquery.jcrop.min.js
diff --git a/assets/components/tvimageplus/mgr/js/jquery/jquery.min.js b/assets/components/imageplus/mgr/js/jquery/jquery.min.js
similarity index 100%
rename from assets/components/tvimageplus/mgr/js/jquery/jquery.min.js
rename to assets/components/imageplus/mgr/js/jquery/jquery.min.js
diff --git a/assets/components/tvimageplus/mgr/js/tools/JSON2.js b/assets/components/imageplus/mgr/js/tools/JSON2.js
similarity index 100%
rename from assets/components/tvimageplus/mgr/js/tools/JSON2.js
rename to assets/components/imageplus/mgr/js/tools/JSON2.js
diff --git a/config.core.sample.php b/config.core.sample.php
deleted file mode 100644
index a2f84ab7..00000000
--- a/config.core.sample.php
+++ /dev/null
@@ -1,12 +0,0 @@
-
+    

Image+ Demo Chunk

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TagDescriptionCurrent Value
[[+uid:url]]
[[%imageplus.placeholder.url?&namespace=`imageplus`]][[+url]]
[[+uid:alt]]
[[%imageplus.placeholder.alt?&namespace=`imageplus`]][[+alt]]
[[+uid:width]]
[[%imageplus.placeholder.width?&namespace=`imageplus`]][[+width]]
[[+uid:height]]
[[%imageplus.placeholder.height?&namespace=`imageplus`]][[+height]]
[[+uid:source.src]]
[[%imageplus.placeholder.source.src?&namespace=`imageplus`]][[+source.src]]
[[+uid:source.width]]
[[%imageplus.placeholder.source.width?&namespace=`imageplus`]][[+source.width]]
[[+uid:source.height]]
[[%imageplus.placeholder.source.height?&namespace=`imageplus`]][[+source.height]]
[[+uid:crop.width]]
[[%imageplus.placeholder.crop.width?&namespace=`imageplus`]][[+crop.width]]
[[+uid:crop.height]]
[[%imageplus.placeholder.crop.height?&namespace=`imageplus`]][[+crop.height]]
[[+uid:crop.x]]
[[%imageplus.placeholder.crop.x?&namespace=`imageplus`]][[+crop.x]]
[[+uid:crop.y]]
[[%imageplus.placeholder.crop.y?&namespace=`imageplus`]][[+crop.y]]
+ \ No newline at end of file diff --git a/core/components/tvimageplus/elements/plugins/plugin.ImagePlusRouter.php b/core/components/imageplus/elements/plugins/imageplus.plugin.php similarity index 88% rename from core/components/tvimageplus/elements/plugins/plugin.ImagePlusRouter.php rename to core/components/imageplus/elements/plugins/imageplus.plugin.php index c5ffd646..8d6ac6ed 100644 --- a/core/components/tvimageplus/elements/plugins/plugin.ImagePlusRouter.php +++ b/core/components/imageplus/elements/plugins/imageplus.plugin.php @@ -5,7 +5,7 @@ * can be used from within MIGX * * @plugin ImagePlusRouter - * @package tvimageplus + * @package imageplus * @locked * * @event OnTVInputRenderList @@ -18,17 +18,17 @@ */ $corePath = $modx->getOption( - 'tvimageplus.core_path', + 'imageplus.core_path', null, - $modx->getOption('core_path', null, MODX_CORE_PATH) . 'components/tvimageplus/' + $modx->getOption('core_path', null, MODX_CORE_PATH) . 'components/imageplus/' ); $assetsUrl = $modx->getOption( - 'tvimageplus.assets_url', + 'imageplus.assets_url', null, - $modx->getOption('assets_url', null, MODX_ASSETS_URL) . 'components/tvimageplus/js/mgr/' + $modx->getOption('assets_url', null, MODX_ASSETS_URL) . 'components/imageplus/js/mgr/' ); -$modx->lexicon->load('tvimageplus:default'); +$modx->lexicon->load('imageplus:default'); switch ($modx->event->name) { case 'OnTVInputRenderList': diff --git a/core/components/tvimageplus/elements/tv/input/imageplus.class.php b/core/components/imageplus/elements/tv/input/imageplus.class.php similarity index 92% rename from core/components/tvimageplus/elements/tv/input/imageplus.class.php rename to core/components/imageplus/elements/tv/input/imageplus.class.php index 1e3b3a4f..3c010cc5 100644 --- a/core/components/tvimageplus/elements/tv/input/imageplus.class.php +++ b/core/components/imageplus/elements/tv/input/imageplus.class.php @@ -33,16 +33,16 @@ public function getTemplate() { public function getLexiconTopics(){ - return array('tvimageplus:default'); + return array('imageplus:default'); }// public function process($value,array $params = array()) { - $this->modx->lexicon->load('tvimageplus:default'); + $this->modx->lexicon->load('imageplus:default'); // Load helper class if(!class_exists('tvImagePlus')){ - require $this->modx->getOption('tvimageplus.core_path',null,$this->modx->getOption('core_path').'components/tvimageplus/').'tvImagePlus.class.php'; }; + require $this->modx->getOption('imageplus.core_path',null,$this->modx->getOption('core_path').'components/imageplus/').'tvImagePlus.class.php'; }; $this->helper = new tvImagePlus($this->modx); // Load required javascripts & register global config @@ -50,7 +50,7 @@ public function process($value,array $params = array()) { // Prepare tv config for jsonification $tvConfig = $this->helper->loadTvConfig($this,$value,$params); - $this->setPlaceholder('tvimageplusconfig',json_encode($tvConfig)); + $this->setPlaceholder('imageplusconfig',json_encode($tvConfig)); $this->setPlaceholder('tvValue',$value); diff --git a/core/components/tvimageplus/elements/tv/input/options/imageplus.php b/core/components/imageplus/elements/tv/input/options/imageplus.php similarity index 79% rename from core/components/tvimageplus/elements/tv/input/options/imageplus.php rename to core/components/imageplus/elements/tv/input/options/imageplus.php index e3cefdb9..7d1819fd 100644 --- a/core/components/tvimageplus/elements/tv/input/options/imageplus.php +++ b/core/components/imageplus/elements/tv/input/options/imageplus.php @@ -22,16 +22,16 @@ * @copyright Alan Pich 2013 */ -$root = $modx->getOption('tvimageplus.core_path',null,$modx->getOption('core_path').'components/tvimageplus/'); +$root = $modx->getOption('imageplus.core_path',null,$modx->getOption('core_path').'components/imageplus/'); if(!class_exists('tvImagePlus')){ require $root.'tvImagePlus.class.php'; }; $helper = new tvImagePlus($modx); -$modx->lexicon->load('tvimageplus:default'); +$modx->lexicon->load('imageplus:default'); $a = print_r($this->getInputProperties(),1); $modx->controller->setPlaceholder('t_width',$a); -$modx->controller->setPlaceholder('tvimagepluslexicon',json_encode($helper->config['lexicon'])); -$modx->controller->addLexiconTopic('tvimageplus:default'); +$modx->controller->setPlaceholder('imagepluslexicon',json_encode($helper->config['lexicon'])); +$modx->controller->addLexiconTopic('imageplus:default'); return $modx->smarty->fetch($root.'elements/tv/input/tpl/imageplus.options.tpl'); diff --git a/core/components/tvimageplus/elements/tv/input/tpl/imageplus.inputrender.tpl b/core/components/imageplus/elements/tv/input/tpl/imageplus.inputrender.tpl similarity index 55% rename from core/components/tvimageplus/elements/tv/input/tpl/imageplus.inputrender.tpl rename to core/components/imageplus/elements/tv/input/tpl/imageplus.inputrender.tpl index 170c59ee..b4deca8e 100644 --- a/core/components/tvimageplus/elements/tv/input/tpl/imageplus.inputrender.tpl +++ b/core/components/imageplus/elements/tv/input/tpl/imageplus.inputrender.tpl @@ -1,12 +1,12 @@ -
+
diff --git a/core/components/imageplus/elements/tv/output/imageplus.class.php b/core/components/imageplus/elements/tv/output/imageplus.class.php index dd79225b..bad6aca3 100644 --- a/core/components/imageplus/elements/tv/output/imageplus.class.php +++ b/core/components/imageplus/elements/tv/output/imageplus.class.php @@ -2,22 +2,22 @@ /** * Copyright 2013 by Alan Pich * - * This file is part of tvImagePlus + * This file is part of ImagePlus * - * tvImagePlus is free software; you can redistribute it and/or modify it under the + * ImagePlus is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * - * tvImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY + * ImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with - * tvImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place, + * ImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place, * Suite 330, Boston, MA 02111-1307 USA * - * @package tvImagePlus + * @package imageplus * @author Alan Pich * @copyright Alan Pich 2013 */ @@ -26,8 +26,8 @@ class ImagePlusOutputRender extends modTemplateVarOutputRender { public function process($value,array $params = array()) { // Load the helper library if its not already here - if(!class_exists('tvImagePlus')){ require_once $this->modx->getOption('imageplus.core_path',null,$this->modx->getOption('core_path').'components/imageplus/').'tvImagePlus.class.php'; }; - $this->helper = new tvImagePlus($this->modx); + if(!class_exists('ImagePlus')){ require_once $this->modx->getOption('imageplus.core_path',null,$this->modx->getOption('core_path').'components/imageplus/').'imageplus.class.php'; }; + $this->helper = new ImagePlus($this->modx); return $this->helper->getImageURL($value,$params,$this->tv); }// diff --git a/core/components/imageplus/elements/tv/output/options/imageplus.php b/core/components/imageplus/elements/tv/output/options/imageplus.php index b9f9d66c..8031b229 100644 --- a/core/components/imageplus/elements/tv/output/options/imageplus.php +++ b/core/components/imageplus/elements/tv/output/options/imageplus.php @@ -2,30 +2,30 @@ /** * Copyright 2013 by Alan Pich * - * This file is part of tvImagePlus + * This file is part of ImagePlus * - * tvImagePlus is free software; you can redistribute it and/or modify it under the + * ImagePlus is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * - * tvImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY + * ImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with - * tvImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place, + * ImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place, * Suite 330, Boston, MA 02111-1307 USA * - * @package tvImagePlus + * @package imageplus * @author Alan Pich * @copyright Alan Pich 2013 */ /** @var \modX $modx */ $root = $modx->getOption('imageplus.core_path',null,$modx->getOption('core_path').'components/imageplus/'); -if(!class_exists('tvImagePlus')){ require $root.'tvImagePlus.class.php'; }; -$helper = new tvImagePlus($modx); +if(!class_exists('ImagePlus')){ require $root.'imageplus.class.php'; }; +$helper = new ImagePlus($modx); $modx->lexicon->load('imageplus:default'); $a = print_r($this->getProperties(),1); diff --git a/core/components/imageplus/tvImagePlus.class.php b/core/components/imageplus/imageplus.class.php similarity index 90% rename from core/components/imageplus/tvImagePlus.class.php rename to core/components/imageplus/imageplus.class.php index f9d5275a..66609a0b 100644 --- a/core/components/imageplus/tvImagePlus.class.php +++ b/core/components/imageplus/imageplus.class.php @@ -2,29 +2,29 @@ /** * Copyright 2013 by Alan Pich * - * This file is part of tvImagePlus + * This file is part of ImagePlus * - * tvImagePlus is free software; you can redistribute it and/or modify it under the + * ImagePlus is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * - * tvImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY + * ImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with - * tvImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place, + * ImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place, * Suite 330, Boston, MA 02111-1307 USA * - * @package tvImagePlus + * @package imageplus * @author Alan Pich * @copyright Alan Pich 2013 */ -use tvImagePlus\CropEngines; +use ImagePlus\CropEngines; -class tvImagePlus +class ImagePlus { public $dataStr; @@ -76,10 +76,10 @@ private function checkDependencies() { // Register a micro autoloader for in-house engines spl_autoload_register(function ($className) { - if (strpos($className, 'tvImagePlus\\CropEngines\\') === false) + if (strpos($className, 'ImagePlus\\CropEngines\\') === false) return; - $class = str_replace('tvImagePlus\\CropEngines\\', '', $className); + $class = str_replace('ImagePlus\\CropEngines\\', '', $className); $path = dirname(__FILE__) . '/lib/CropEngines/' . $class . '.php'; if (is_readable($path)) include $path; @@ -207,8 +207,8 @@ public function includeScriptAssets() $this->modx->regClientStartupScript($this->config['assets_url'] . 'mgr/js/jquery/jquery.jcrop.min.js'); $this->modx->regClientStartupScript($this->config['assets_url'] . 'mgr/js/imageplus.jquery.imagecrop.js'); $this->modx->regClientStartupHTMLBlock(''); } @@ -230,15 +230,15 @@ public function getImageURL($json, $opts = array(), modTemplateVar $tv) // Do some basic intelligent sniffing if (!$engineClass) { if( CropEngines\PhpThumbsUp::engineRequirementsMet($this->modx)) { - $engineClass = '\\tvImagePlus\\CropEngines\\PhpThumbsUp'; + $engineClass = '\\ImagePlus\\CropEngines\\PhpThumbsUp'; } else if( CropEngines\PhpThumbOf::engineRequirementsMet($this->modx)) { - $engineClass = '\\tvImagePlus\\CropEngines\\PhpThumbOf'; + $engineClass = '\\ImagePlus\\CropEngines\\PhpThumbOf'; } } /** - * @var tvImagePlus\CropEngines\AbstractCropEngine $cropEngine + * @var ImagePlus\CropEngines\AbstractCropEngine $cropEngine */ $cropEngine = new $engineClass($this->modx); diff --git a/core/components/imageplus/lib/CropEngines/AbstractCropEngine.php b/core/components/imageplus/lib/CropEngines/AbstractCropEngine.php index 9ef44baa..576225d6 100644 --- a/core/components/imageplus/lib/CropEngines/AbstractCropEngine.php +++ b/core/components/imageplus/lib/CropEngines/AbstractCropEngine.php @@ -2,27 +2,27 @@ /** * Copyright 2013 by Alan Pich * - * This file is part of tvImagePlus + * This file is part of ImagePlus * - * tvImagePlus is free software; you can redistribute it and/or modify it under the + * ImagePlus is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * - * tvImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY + * ImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with - * tvImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place, + * ImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place, * Suite 330, Boston, MA 02111-1307 USA * - * @package tvImagePlus + * @package imageplus * @author Alan Pich * @copyright Alan Pich 2013 */ -namespace tvImagePlus\CropEngines; +namespace ImagePlus\CropEngines; abstract class AbstractCropEngine diff --git a/core/components/imageplus/lib/CropEngines/PhpThumbOf.php b/core/components/imageplus/lib/CropEngines/PhpThumbOf.php index d12b4834..c354c2a7 100644 --- a/core/components/imageplus/lib/CropEngines/PhpThumbOf.php +++ b/core/components/imageplus/lib/CropEngines/PhpThumbOf.php @@ -2,35 +2,35 @@ /**! * Copyright 2013 by Alan Pich * - * This file is part of tvImagePlus + * This file is part of ImagePlus * - * tvImagePlus is free software; you can redistribute it and/or modify it under the + * ImagePlus is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * - * tvImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY + * ImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with - * tvImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place, + * ImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place, * Suite 330, Boston, MA 02111-1307 USA * - * @package tvImagePlus + * @package imageplus * @author Alan Pich * @copyright Alan Pich 2013 */ -namespace tvImagePlus\CropEngines; +namespace ImagePlus\CropEngines; /** * Class PhpThumbOf * * Uses the phpthumbof extra to generate cropped images * - * @package tvImagePlus - * @subpackage tvImagePlus\CropEngines + * @package imageplus + * @subpackage ImagePlus\CropEngines */ class PhpThumbOf extends AbstractCropEngine { diff --git a/core/components/imageplus/lib/CropEngines/PhpThumbsUp.php b/core/components/imageplus/lib/CropEngines/PhpThumbsUp.php index adf6a1b3..ce321111 100644 --- a/core/components/imageplus/lib/CropEngines/PhpThumbsUp.php +++ b/core/components/imageplus/lib/CropEngines/PhpThumbsUp.php @@ -2,35 +2,35 @@ /** * Copyright 2013 by Alan Pich * - * This file is part of tvImagePlus + * This file is part of ImagePlus * - * tvImagePlus is free software; you can redistribute it and/or modify it under the + * ImagePlus is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * - * tvImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY + * ImagePlus is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with - * tvImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place, + * ImagePlus; if not, write to the Free Software Foundation, Inc., 59 Temple Place, * Suite 330, Boston, MA 02111-1307 USA * - * @package tvImagePlus + * @package imageplus * @author Alan Pich * @copyright Alan Pich 2013 */ -namespace tvImagePlus\CropEngines; +namespace ImagePlus\CropEngines; /** * Class PhpThumbsUp * * Uses the phpthumbsup extra to generate cropped images * - * @package tvImagePlus - * @subpackage tvImagePlus\CropEngines + * @package imageplus + * @subpackage ImagePlus\CropEngines */ class PhpThumbsUp extends AbstractCropEngine { From 8c8e180cbdd77df7ba786b8a0586bcf4ad399465 Mon Sep 17 00:00:00 2001 From: Thomas Jakobi Date: Mon, 4 May 2015 23:37:30 +0200 Subject: [PATCH 037/515] Respect context settings for media sources --- .../elements/tv/input/imageplus.class.php | 14 +++++++------- core/components/imageplus/imageplus.class.php | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/core/components/imageplus/elements/tv/input/imageplus.class.php b/core/components/imageplus/elements/tv/input/imageplus.class.php index eb1e4442..54413ea8 100644 --- a/core/components/imageplus/elements/tv/input/imageplus.class.php +++ b/core/components/imageplus/elements/tv/input/imageplus.class.php @@ -54,7 +54,7 @@ public function process($value,array $params = array()) { $this->setPlaceholder('tvValue',$value); - $this->setPlaceholder('mediasource',$this->tv->getSource('web')->get('id')); + $this->setPlaceholder('mediasource',$this->tv->get('source')); $this->setPlaceholder('tvparams',json_encode($this->getInputOptions())); $this->setPlaceholder('imgData',$this->getImageDataJSON($value,$params)); @@ -71,13 +71,13 @@ private function getImageDataJSON($value,$params){ $data = new stdClass; // Grab MediaSource info - $MS = $this->tv->getSource('web')->toArray(); - $data->mediasource = new stdClass; - $data->mediasource->id = $MS['id']; - $data->mediasource->path = !isset($MS['properties']['basePath'])? $this->modx->getOption('base_path') : $MS['properties']['basePath']['value']; - $data->mediasource->url = !isset($MS['properties']['baseUrl'])? $this->modx->getOption('base_url') : $MS['properties']['baseUrl']['value']; - unset($MS); + $source = $this->modx->getObject('modMediaSource', $this->tv->get('source')); + $properties = $source->getProperties(); + $data->mediasource = new stdClass; + $data->mediasource->id = $source->get('id'); + $data->mediasource->path = (isset($properties['basePath'])) ? $properties['basePath']['value'] : $this->modx->getOption('base_path'); + $data->mediasource->url = (isset($properties['baseUrl'])) ? $properties['baseUrl']['value'] : $this->modx->getOption('base_url'); // Grab constraint info $data->constraint = new stdClass; $data->constraint->width = empty($params['targetWidth']) ? 0 : (int) $params['targetWidth']; diff --git a/core/components/imageplus/imageplus.class.php b/core/components/imageplus/imageplus.class.php index 66609a0b..7e693a14 100644 --- a/core/components/imageplus/imageplus.class.php +++ b/core/components/imageplus/imageplus.class.php @@ -144,7 +144,7 @@ public function loadTvConfig(ImagePlusInputRender $render, $value, array $params { $data = new stdClass; // Grab the ID of the assigned mediasource - $data->mediaSource = $render->tv->getSource('web')->get('id'); + $data->mediaSource = $render->tv->get('source'); // Grab TV info $data->tv = new stdClass; $data->tv->id = $render->tv->get('id'); From 58ce127d12b0b4a46d0501dc890fa016c3fa3543 Mon Sep 17 00:00:00 2001 From: Thomas Jakobi Date: Tue, 5 May 2015 08:13:17 +0200 Subject: [PATCH 038/515] Update to 2.2.3 - Code revision - Respect context settings for media sources --- .gitignore | 2 +- _build/config.json | 11 ++- core/components/imageplus/docs/changelog.txt | 64 +++++++------- .../elements/chunks/imageplus.demo.html | 10 +++ .../elements/chunks/imageplus.image.html | 1 + .../elements/plugins/imageplus.plugin.php | 24 ++---- .../elements/snippets/imageplus.snippet.php | 68 +++++++-------- .../elements/tv/output/imageplus.class.php | 20 +++-- .../tv/output/tpl/imageplus.options.tpl | 83 +++++++++++-------- .../imageplus/lexicon/de/default.inc.php | 4 +- .../imageplus/lexicon/en/default.inc.php | 4 +- .../imageplus/lib/CropEngines/PhpThumbOf.php | 68 ++++++++------- .../imageplus/lib/CropEngines/PhpThumbsUp.php | 82 ++++++++++-------- 13 files changed, 243 insertions(+), 198 deletions(-) create mode 100644 core/components/imageplus/elements/chunks/imageplus.image.html diff --git a/.gitignore b/.gitignore index bd743a84..f56a23d9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ config.core.php .idea - +*.zip diff --git a/_build/config.json b/_build/config.json index 8db11c1d..ae653601 100644 --- a/_build/config.json +++ b/_build/config.json @@ -3,14 +3,19 @@ "lowCaseName": "imageplus", "description": "Advanced Image template variable input type", "author": "Alan Pich", - "version": "2.2.2", + "version": "2.2.3", "package": { "elements": { "chunks": [ { "name": "ImagePlus.demo", "file": "imageplus.demo.html", - "description": "Demo output chunk for Image+." + "description": "Demo chunk for Image+ template variable output." + }, + { + "name": "ImagePlus.image", + "file": "imageplus.image.html", + "description": "Demo chunk for Image+ snippet output." } ], "plugins": [ @@ -31,7 +36,7 @@ { "name": "ImagePlus", "file": "imageplus.snippet.php", - "description": "Outputfilter as alternative to Image+ TV Output Type" + "description": "Snippet as alternative to Image+ TV Output Type" } ] } diff --git a/core/components/imageplus/docs/changelog.txt b/core/components/imageplus/docs/changelog.txt index 5a72a60c..93cbb9cc 100644 --- a/core/components/imageplus/docs/changelog.txt +++ b/core/components/imageplus/docs/changelog.txt @@ -1,41 +1,39 @@ -------------------------- - Image+ TV type changelog -------------------------- +Changelog +================================================================================ +- 2.3.x + - MODX 2.3 compatibility -# v2.2 --------- - :: Added gui warning of missing dependencies - :: Added PhpThumbsUp crop engine - :: Refactored to allow changing of crop engines - :: Added grid renderer for MIGX backend - :: Confirmed to work with Articles [#21] - :: Now works with MIGX [#15] - :: TV Default Value is now output if TV is empty - :: TV Reset button now works [#22] - :: Added image preloader to accurately get image size on upload. +- 2.2.x + - Added gui warning of missing dependencies + - Added PhpThumbsUp crop engine + - Refactored to allow changing of crop engines + - Added grid renderer for MIGX backend + - Confirmed to work with Articles [#21] + - Now works with MIGX [#15] + - TV Default Value is now output if TV is empty + - TV Reset button now works [#22] + - Added image preloader to accurately get image size on upload. - This is because Modx File Manager will not report accurate image size for images above 800x600 [#8] - :: Added option to put an icon on TV input 'crop' button. [#16] + - Added option to put an icon on TV input 'crop' button. [#16] - Create a system setting called imageplus.crop_icon and populate it with the url to the desired icon png - :: Added system setting override for core_path and assets_url [#25] - :: Added Czech translation (@TheBoxer) - :: Added Danish translation (@Flygenring) - :: Added German translation (@KristianP) - :: Added Spanish translation (Nico Telfer) - :: Added French translation (@rtripault) - :: Added Hungarian translation (Kristof Kotai) - :: Added Italian translation (@tillilab) - :: Added Dutch translation (@Mark-H) - :: Added Russian translation (@Alroniks) + - Added system setting override for core_path and assets_url [#25] + - Added Czech translation (@TheBoxer) + - Added Danish translation (@Flygenring) + - Added German translation (@KristianP) + - Added Spanish translation (Nico Telfer) + - Added French translation (@rtripault) + - Added Hungarian translation (Kristof Kotai) + - Added Italian translation (@tillilab) + - Added Dutch translation (@Mark-H) + - Added Russian translation (@Alroniks) -# v2.1 --------- - :: Fixed bug with non-default media sources - :: Added field for additional phpThumb parameters to output renderer - :: Added option to specify a chunk for output formatting (fields: url,alt,width,height) +- 2.1.x + - Fixed bug with non-default media sources + - Added field for additional phpThumb parameters to output renderer + - Added option to specify a chunk for output formatting (fields: url,alt,width,height) -# v2.0 -------- -Complete rewrite +- 2.0.x + - Complete rewrite diff --git a/core/components/imageplus/elements/chunks/imageplus.demo.html b/core/components/imageplus/elements/chunks/imageplus.demo.html index f764aa00..59d7c313 100644 --- a/core/components/imageplus/elements/chunks/imageplus.demo.html +++ b/core/components/imageplus/elements/chunks/imageplus.demo.html @@ -64,6 +64,16 @@

Image+ Demo Chunk

[[%imageplus.placeholder.crop.y?&namespace=`imageplus`]] [[+crop.y]] + +
[[+uid:options]]
+ [[%imageplus.placeholder.options?&namespace=`imageplus`]] + [[+options]] + + +
[[+uid:crop.options]]
+ [[%imageplus.placeholder.crop.options?&namespace=`imageplus`]] + [[+crop.options]] + \ No newline at end of file diff --git a/core/components/imageplus/elements/chunks/imageplus.image.html b/core/components/imageplus/elements/chunks/imageplus.image.html new file mode 100644 index 00000000..7d20fe7e --- /dev/null +++ b/core/components/imageplus/elements/chunks/imageplus.image.html @@ -0,0 +1 @@ +[[+alt]] \ No newline at end of file diff --git a/core/components/imageplus/elements/plugins/imageplus.plugin.php b/core/components/imageplus/elements/plugins/imageplus.plugin.php index 31efda6b..2583a3a9 100644 --- a/core/components/imageplus/elements/plugins/imageplus.plugin.php +++ b/core/components/imageplus/elements/plugins/imageplus.plugin.php @@ -17,35 +17,25 @@ * */ -$corePath = $modx->getOption( - 'imageplus.core_path', - null, - $modx->getOption('core_path', null, MODX_CORE_PATH) . 'components/imageplus/' -); -$assetsUrl = $modx->getOption( - 'imageplus.assets_url', - null, - $modx->getOption('assets_url', null, MODX_ASSETS_URL) . 'components/imageplus/js/mgr/' -); +$path = $modx->getOption('imageplus.core_path', null, $modx->getOption('core_path') . 'components/imageplus/'); +$imagePlus = $modx->getService('imageplus', 'ImagePlus', $path); $modx->lexicon->load('imageplus:default'); switch ($modx->event->name) { case 'OnTVInputRenderList': - $modx->event->output($corePath . 'elements/tv/input/'); + $modx->event->output($path . 'elements/tv/input/'); break; case 'OnTVOutputRenderList': - $modx->event->output($corePath . 'elements/tv/output/'); + $modx->event->output($path . 'elements/tv/output/'); break; case 'OnTVInputPropertiesList': - $modx->event->output($corePath . 'elements/tv/input/options/'); + $modx->event->output($path . 'elements/tv/input/options/'); break; case 'OnTVOutputRenderPropertiesList': - $modx->event->output($corePath . 'elements/tv/output/options/'); + $modx->event->output($path . 'elements/tv/output/options/'); break; case 'OnDocFormRender': - include $corePath."imageplus.class.php"; - $helper = new ImagePlus($modx); - $helper->includeScriptAssets(); + $imagePlus->includeScriptAssets(); break; }; \ No newline at end of file diff --git a/core/components/imageplus/elements/snippets/imageplus.snippet.php b/core/components/imageplus/elements/snippets/imageplus.snippet.php index 3aadb904..96fe1272 100644 --- a/core/components/imageplus/elements/snippets/imageplus.snippet.php +++ b/core/components/imageplus/elements/snippets/imageplus.snippet.php @@ -1,6 +1,6 @@ @@ -13,40 +13,42 @@ $path = $modx->getOption('imageplus.core_path', null, $modx->getOption('core_path') . 'components/imageplus/'); $imagePlus = $modx->getService('imageplus', 'ImagePlus', $path); -// If tag is empty, return nothing -if (!strlen($input)) - return ''; +$tvname = $modx->getOption('tvname', $scriptProperties, ''); +$docid = $modx->getOption('docid', $scriptProperties, $modx->resource->get('id')); +$type = $modx->getOption('type', $scriptProperties, ''); +$options = $modx->getOption('options', $scriptProperties, ''); +$tpl = $modx->getOption('tpl', $scriptProperties, 'ImagePlus.image'); -// Attempt to decode the input value as json -$data = json_decode($input); -if (is_null($data)) { - $this->modx->log(xPDO::LOG_LEVEL_ERROR, "[Image+] Unable to decode json - are you sure this is an ImagePlus TV?"); - return ''; -} - -// Extract render type -$outputParams = explode(':', $options, 2); -$outputType = array_shift($outputParams); +$tv = $modx->getObject('modTemplateVar', array('name' => $tvname)); +if ($tv) { + /* get the raw content of the TV */ + $value = $tv->getValue($docid); -// Render output -switch ($outputType) { - case 'pthumb': - // Run pthumb snippet - $params = (!empty($outputParams)) ? '&' . trim(array_shift($outputParams), '&') : ''; - $crop = array( - 'sx' => $data->crop->x, - 'sy' => $data->crop->y, - 'sw' => $data->crop->width, - 'sh' => $data->crop->height, - ); + // Attempt to decode the input value as json + $data = json_decode($value); + if (is_null($data)) { + $modx->log(xPDO::LOG_LEVEL_ERROR, "[Image+] Unable to decode json - are you sure this is an ImagePlus TV?"); + return ''; + } - $params = http_build_query($crop) . $params; - $output = $modx->runSnippet('pthumb', array( - 'input' => $data->sourceImg->src, - 'options' => $params - )); - break; - default: - $output = $imagePlus->getImageURL($input); + // Render output + switch ($type) { + case 'check': + $output = ($data->sourceImg->src) ? 'image' : 'noimage'; + break; + case 'tpl': + $output = ($data->sourceImg->src) ? $modx->getChunk($tpl, array( + 'url' => $imagePlus->getImageURL($value, array('phpThumbParams' => $options)), + 'alt' => $data->altTag + )) : ''; + break; + case 'thumb': + default: + $output = $imagePlus->getImageURL($value, array('phpThumbParams' => $options)); + break; + } +} else { + $modx->log(xPDO::LOG_LEVEL_ERROR, "[Image+] Template Variable '{$tvname}' not found."); + $output = ''; } return $output; \ No newline at end of file diff --git a/core/components/imageplus/elements/tv/output/imageplus.class.php b/core/components/imageplus/elements/tv/output/imageplus.class.php index bad6aca3..ad92dd12 100644 --- a/core/components/imageplus/elements/tv/output/imageplus.class.php +++ b/core/components/imageplus/elements/tv/output/imageplus.class.php @@ -21,16 +21,22 @@ * @author Alan Pich * @copyright Alan Pich 2013 */ +class ImagePlusOutputRender extends modTemplateVarOutputRender +{ -class ImagePlusOutputRender extends modTemplateVarOutputRender { + public function process($value, array $params = array()) + { + // Load the helper library if its not already here + if (!class_exists('ImagePlus')) { + require_once $this->modx->getOption('imageplus.core_path', null, $this->modx->getOption('core_path') . 'components/imageplus/') . 'imageplus.class.php'; + }; - public function process($value,array $params = array()) { - // Load the helper library if its not already here - if(!class_exists('ImagePlus')){ require_once $this->modx->getOption('imageplus.core_path',null,$this->modx->getOption('core_path').'components/imageplus/').'imageplus.class.php'; }; - $this->helper = new ImagePlus($this->modx); + $this->helper = new ImagePlus($this->modx); + return $this->helper->getImageURL($value, $params, $this->tv); - return $this->helper->getImageURL($value,$params,$this->tv); }// -}; +} + +; return 'ImagePlusOutputRender'; diff --git a/core/components/imageplus/elements/tv/output/tpl/imageplus.options.tpl b/core/components/imageplus/elements/tv/output/tpl/imageplus.options.tpl index a1ca026e..501290c7 100644 --- a/core/components/imageplus/elements/tv/output/tpl/imageplus.options.tpl +++ b/core/components/imageplus/elements/tv/output/tpl/imageplus.options.tpl @@ -4,7 +4,7 @@ var tvip_lex = {$imagepluslexicon}; {literal} for(i in tvip_lex){ MODx.lang[i] = tvip_lex[i];}; - + var params = { {/literal}{foreach from=$params key=k item=v name='p'} '{$k}': '{$v|escape:"javascript"}'{if NOT $smarty.foreach.p.last},{/if} @@ -19,41 +19,54 @@ MODx.load({ ,border: false ,labelAlign: 'top' ,items: [{ - xtype: 'textfield', - fieldLabel: _('imageplus.phpThumbParams'), - name: 'prop_phpThumbParams', - id: 'prop_phpThumbParams{/literal}{$tv}{literal}', - value: params['phpThumbParams'] || '', - width: '99%', - listeners: oc + xtype: 'textfield', + fieldLabel: _('imageplus.phpThumbParams'), + name: 'prop_phpThumbParams', + id: 'prop_phpThumbParams{/literal}{$tv}{literal}', + value: params['phpThumbParams'] || '', + width: '99%', + listeners: oc },{ - xtype: MODx.expandHelp ? 'label' : 'hidden' - ,forId: 'prop_phpThumbParams{/literal}{$tv}{literal}' - ,html: _('imageplus.phpThumbParams_desc') - ,cls: 'desc-under' - },{ - xtype: 'modx-combo', - url: MODx.config.connectors_url+'index.php', - baseParams: { - action: 'element/chunk/getlist' - }, - pageSize: 20, - fields: ['name','id'], - displayField: 'name', - valueField: 'name', - typeAhead: true, - editable: true, - fieldLabel: _('imageplus.outputChunk'), - name: 'prop_outputChunk', - id: 'prop_outputChunk{/literal}{$tv}{literal}', - value: params['outputChunk'] || '', - width: '99%', - listeners: oc - },{ - xtype: MODx.expandHelp ? 'label' : 'hidden' - ,forId: 'prop_outputChunk{/literal}{$tv}{literal}' - ,html: _('imageplus.outputChunk_desc') - ,cls: 'desc-under' + xtype: MODx.expandHelp ? 'label' : 'hidden' + ,forId: 'prop_phpThumbParams{/literal}{$tv}{literal}' + ,html: _('imageplus.phpThumbParams_desc') + ,cls: 'desc-under' + },{ + xtype: 'modx-combo', + url: MODx.config.connectors_url+'index.php', + baseParams: { + action: 'element/chunk/getlist' + }, + pageSize: 20, + fields: ['name','id'], + displayField: 'name', + valueField: 'name', + typeAhead: true, + editable: true, + fieldLabel: _('imageplus.outputChunk'), + name: 'prop_outputChunk', + id: 'prop_outputChunk{/literal}{$tv}{literal}', + value: params['outputChunk'] || '', + width: '99%', + listeners: oc + },{ + xtype: MODx.expandHelp ? 'label' : 'hidden' + ,forId: 'prop_outputChunk{/literal}{$tv}{literal}' + ,html: _('imageplus.outputChunk_desc') + ,cls: 'desc-under' + },{ + xtype: 'combo-boolean', + fieldLabel: _('imageplus.generateUrl'), + name: 'prop_generateUrl', + id: 'prop_generateUrl{/literal}{$tv}{literal}', + value: params['generateUrl'] || 1, + width: '99%', + listeners: oc + },{ + xtype: MODx.expandHelp ? 'label' : 'hidden' + ,forId: 'prop_generateUrl{/literal}{$tv}{literal}' + ,html: _('imageplus.generateUrl_desc') + ,cls: 'desc-under' }] ,renderTo: 'tv-output-properties-form{/literal}{$tv}{literal}' }); diff --git a/core/components/imageplus/lexicon/de/default.inc.php b/core/components/imageplus/lexicon/de/default.inc.php index d2e0cf1d..5c120626 100644 --- a/core/components/imageplus/lexicon/de/default.inc.php +++ b/core/components/imageplus/lexicon/de/default.inc.php @@ -18,4 +18,6 @@ $_lang['imageplus.phpThumbParams'] = 'phpThumb Parameter'; $_lang['imageplus.phpThumbParams_desc'] = '(Optional) Geben Sie zusätzliche phpThumb Parameter an. Mehr Informationen zu phpThumb Parametern erhalten Sie hier.'; $_lang['imageplus.outputChunk'] = 'Ausgabe Chunk'; -$_lang['imageplus.outputChunk_desc'] = '(Optional) Wählen Sie einen Ausgabe Chunk aus. Wenn kein Wert angebeben ist wird der Bildpfad ausgegeben.'; \ No newline at end of file +$_lang['imageplus.outputChunk_desc'] = '(Optional) Wählen Sie einen Ausgabe Chunk aus. Wenn kein Wert angebeben ist wird der Bildpfad ausgegeben.'; +$_lang['imageplus.generateUrl'] = 'Thumbnail URL generieren'; +$_lang['imageplus.generateUrl_desc'] = '(Optional) Die Thumbnail URL eventuell wird nicht benötigt, wenn das Thumbnail im Ausgabe Chunk z.B. mit einem phpthumbof output filter generiert wird'; \ No newline at end of file diff --git a/core/components/imageplus/lexicon/en/default.inc.php b/core/components/imageplus/lexicon/en/default.inc.php index b3487442..52d9ab39 100644 --- a/core/components/imageplus/lexicon/en/default.inc.php +++ b/core/components/imageplus/lexicon/en/default.inc.php @@ -18,4 +18,6 @@ $_lang['imageplus.phpThumbParams'] = 'Additional phpThumb parameters'; $_lang['imageplus.phpThumbParams_desc'] = 'Add additional filters etc for phpThumb. Documentation can be found here.'; $_lang['imageplus.outputChunk'] = 'Output chunk'; -$_lang['imageplus.outputChunk_desc'] = 'Select a chunk for tv output. Leave blank for raw url output'; \ No newline at end of file +$_lang['imageplus.outputChunk_desc'] = 'Select a chunk for tv output. Leave blank for raw url output'; +$_lang['imageplus.generateUrl'] = 'Generate thumb url'; +$_lang['imageplus.generateUrl_desc'] = '(Optional) The thumb url is maybe not necessary, if you generate the thumbnail in output chunk i.e. by the phpthumbof output filter.'; \ No newline at end of file diff --git a/core/components/imageplus/lib/CropEngines/PhpThumbOf.php b/core/components/imageplus/lib/CropEngines/PhpThumbOf.php index c354c2a7..6cc0745e 100644 --- a/core/components/imageplus/lib/CropEngines/PhpThumbOf.php +++ b/core/components/imageplus/lib/CropEngines/PhpThumbOf.php @@ -1,5 +1,5 @@ * * This file is part of ImagePlus @@ -80,61 +80,65 @@ public function getImageUrl($json, $opts = array(), \modTemplateVar $tv) $imgPath = $source->getBasePath() . $data->sourceImg->src; // Prepare arguments for phpthumbof snippet call - $params = array( - 'src' => $imgPath, - 'w' => $data->targetWidth, - 'h' => $data->targetHeight, - 'far' => true, + $cropParams = array( 'sx' => $data->crop->x, 'sy' => $data->crop->y, 'sw' => $data->crop->width, - 'sh' => $data->crop->height + 'sh' => $data->crop->height, ); + $params = array_merge($cropParams, array( + 'w' => $data->targetWidth, + 'h' => $data->targetHeight, + 'far' => true + )); - // Add in output render params - $options = array(); - if (isset($opts['phpThumbParams'])) { - $optParams = explode('&', $opts['phpThumbParams']); - foreach ($optParams as $oP) { - if (empty($oP)) { - continue; + // Add phpThumbParams to phpthumbof snippet call arguments + $phpThumbParams = $this->modx->getOption('phpThumbParams', $opts, ''); + $optParams = array(); + if ($phpThumbParams) { + parse_str($phpThumbParams, $optParams); + foreach ($optParams as $key => $val) { + if (empty($val)) { + unset($optParams[$key]); }; - $bits = explode('=', $oP); - $params[$bits[0]] = $bits[1]; } - - foreach ($params as $key => $val) { - $options[] = $key . '=' . $val; - }; }; - $options = implode('&', $options); - + $options = ($optParams) ? http_build_query(array_merge($cropParams, $optParams)) : http_build_query(array_merge($params, $optParams)); + $cropOptions = http_build_query($cropParams); // Call phpthumbof for url - $url = $this->modx->runSnippet( - 'phpthumbof', - array( - 'options' => $options, - 'input' => $imgPath - ) - ); + $generateUrl = $this->modx->getOption('generateUrl', $opts, 1); + if ($generateUrl) { + $url = $this->modx->runSnippet( + 'phpthumbof', + array( + 'options' => $options, + 'input' => $imgPath + ) + ); + } else { + $url = ''; + } // If an output chunk is selected, parse that - if (isset($opts['outputChunk']) && !empty($opts['outputChunk'])) { + $outputChunk = $this->modx->getOption('outputChunk', $opts, ''); + if ($outputChunk) { $chunkParams = array( 'url' => $url, 'alt' => $data->altTag, 'width' => $data->targetWidth, 'height' => $data->targetHeight, - 'source.src' => $data->sourceImg->src, + 'source.src' => $imgPath, 'source.width' => $data->sourceImg->width, 'source.height' => $data->sourceImg->height, 'crop.width' => $data->crop->width, 'crop.height' => $data->crop->height, 'crop.x' => $data->crop->x, 'crop.y' => $data->crop->y, + 'options' => $options, + 'crop.options' => $cropOptions ); - return $this->modx->getChunk($opts['outputChunk'], $chunkParams); + return $this->modx->getChunk($outputChunk, $chunkParams); } else { // Otherwise return raw url return $url; diff --git a/core/components/imageplus/lib/CropEngines/PhpThumbsUp.php b/core/components/imageplus/lib/CropEngines/PhpThumbsUp.php index ce321111..33eee470 100644 --- a/core/components/imageplus/lib/CropEngines/PhpThumbsUp.php +++ b/core/components/imageplus/lib/CropEngines/PhpThumbsUp.php @@ -77,62 +77,74 @@ public function getImageUrl($json, $opts = array(), \modTemplateVar $tv) $source->initialize(); // Grab absolute system path to image - $imgPath = $data->sourceImg->src; + $imgPath = $source->getBasePath() . $data->sourceImg->src; // Prepare arguments for phpthumbof snippet call - $params = array( - 'w' => $data->targetWidth, - 'h' => $data->targetHeight, - 'far' => true, + $cropParams = array( 'sx' => $data->crop->x, 'sy' => $data->crop->y, 'sw' => $data->crop->width, - 'sh' => $data->crop->height + 'sh' => $data->crop->height, ); - - // Add in output render params - $options = array(); - if (isset($opts['phpThumbParams'])) { - $optParams = explode('&', $opts['phpThumbParams']); - foreach ($optParams as $oP) { - if (empty($oP)) { - continue; + $params = array_merge($cropParams, array( + 'w' => $data->targetWidth, + 'h' => $data->targetHeight, + 'far' => true + )); + + // Add phpThumbParams to phpthumbsup snippet call arguments + $phpThumbParams = $this->modx->getOption('phpThumbParams', $opts, ''); + $optParams = array(); + if ($phpThumbParams) { + parse_str($phpThumbParams, $optParams); + foreach ($optParams as $key => $val) { + if (empty($val)) { + unset($optParams[$key]); }; - $bits = explode('=', $oP); - $params[$bits[0]] = $bits[1]; } - - foreach ($params as $key => $val) { - $options[] = $key . '=' . $val; - }; }; - $options = implode('&', $options); - - - // Call phpthumbof for url - $url = $this->modx->runSnippet( - 'phpthumbsup', - array( - 'options' => $options, - 'input' => $imgPath - ) - ); + $options = ($optParams) ? http_build_query(array_merge($cropParams, $optParams)) : http_build_query(array_merge($params, $optParams)); + $cropOptions = http_build_query($cropParams); + + // Call phpthumbsup for url + $generateUrl = $this->modx->getOption('generateUrl', $opts, 1); + if ($generateUrl) { + $url = $this->modx->runSnippet( + 'phpthumbsup', + array( + 'options' => $options, + 'input' => $imgPath + ) + ); + } else { + $url = ''; + } $url = str_replace('%2F', '/', $url); // If an output chunk is selected, parse that - if (isset($opts['outputChunk']) && !empty($opts['outputChunk'])) { + $outputChunk = $this->modx->getOption('outputChunk', $opts, ''); + if ($outputChunk) { $chunkParams = array( 'url' => $url, 'alt' => $data->altTag, 'width' => $data->targetWidth, - 'height' => $data->targetHeight + 'height' => $data->targetHeight, + 'source.src' => $imgPath, + 'source.width' => $data->sourceImg->width, + 'source.height' => $data->sourceImg->height, + 'crop.width' => $data->crop->width, + 'crop.height' => $data->crop->height, + 'crop.x' => $data->crop->x, + 'crop.y' => $data->crop->y, + 'options' => $options, + 'crop.options' => $cropOptions ); - return $this->modx->getChunk($opts['outputChunk'], $chunkParams); + return $this->modx->getChunk($outputChunk, $chunkParams); } else { // Otherwise return raw url return $url; - }; + } } From 34d680cd0b7f92f30c4c0bf1fcffd5f31cef503a Mon Sep 17 00:00:00 2001 From: Thomas Jakobi Date: Thu, 21 May 2015 01:12:56 +0200 Subject: [PATCH 039/515] Update to 2.3.0-rc1 - MODX 2.3 compatibility (and dropping 2.2 compatibility) - Inline Trigger fields - Bugfix for fireResourceFormChange issue - Some better styling --- .gitignore | 3 - _build/config.json | 2 +- _packages/imageplus-2.3.0-rc1.transport.zip | Bin 0 -> 115141 bytes assets/components/imageplus/mgr/connector.php | 13 +- .../imageplus/mgr/css/imageplus.css | 24 + .../mgr/js/imageplus.jquery.imagecrop.js | 110 ++-- .../components/imageplus/mgr/js/imageplus.js | 72 +-- .../imageplus/mgr/js/imageplus.panel.input.js | 475 ++++++++++++------ .../mgr/js/imageplus.window.editor.js | 260 +++++----- core/components/imageplus/docs/changelog.txt | 5 +- core/components/imageplus/docs/readme.tpl | 25 +- .../elements/tv/input/imageplus.class.php | 163 +++--- .../elements/tv/input/options/imageplus.php | 18 +- .../tv/input/tpl/imageplus.inputrender.tpl | 23 +- .../elements/tv/output/imageplus.class.php | 13 +- .../elements/tv/output/options/imageplus.php | 19 +- .../tv/output/tpl/imageplus.options.tpl | 2 +- core/components/imageplus/imageplus.class.php | 41 +- 18 files changed, 737 insertions(+), 531 deletions(-) create mode 100644 _packages/imageplus-2.3.0-rc1.transport.zip create mode 100644 assets/components/imageplus/mgr/css/imageplus.css diff --git a/.gitignore b/.gitignore index f56a23d9..e69de29b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +0,0 @@ -config.core.php -.idea -*.zip diff --git a/_build/config.json b/_build/config.json index ae653601..99a12232 100644 --- a/_build/config.json +++ b/_build/config.json @@ -3,7 +3,7 @@ "lowCaseName": "imageplus", "description": "Advanced Image template variable input type", "author": "Alan Pich", - "version": "2.2.3", + "version": "2.3.0-rc1", "package": { "elements": { "chunks": [ diff --git a/_packages/imageplus-2.3.0-rc1.transport.zip b/_packages/imageplus-2.3.0-rc1.transport.zip new file mode 100644 index 0000000000000000000000000000000000000000..e0793b01c68e96250d0ceac39a6389ec7ad81feb GIT binary patch literal 115141 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'imageplus:default'); - + // Handle request $modx->request->handleRequest(array( - 'processors_path' => $modx->getOption('imageplus.core_path',null,$modx->getOption('core_path').'components/imageplus/').'processors/', + 'processors_path' => $modx->getOption('imageplus.core_path', null, $modx->getOption('core_path') . 'components/imageplus/') . 'processors/', 'location' => '', )); diff --git a/assets/components/imageplus/mgr/css/imageplus.css b/assets/components/imageplus/mgr/css/imageplus.css new file mode 100644 index 00000000..2664c297 --- /dev/null +++ b/assets/components/imageplus/mgr/css/imageplus.css @@ -0,0 +1,24 @@ +.x-form-field-wrap .x-form-triple-triggers { + border: 0; + border-radius: 0 3px 3px 0; + box-shadow: none; + padding: 0; + width: 30px; + height: 100% !important; + position: absolute; + top: 0; +} + +.x-form-field-wrap .x-form-triple-triggers .x-form-trigger { + position: relative; + top: auto; + vertical-align: top; +} + +.x-form-field-wrap .x-form-trigger.x-form-clear-trigger:before { + content: "\f00d"; +} + +.x-form-field-wrap .x-form-trigger.x-form-crop-trigger:before { + content: "\f125"; +} \ No newline at end of file diff --git a/assets/components/imageplus/mgr/js/imageplus.jquery.imagecrop.js b/assets/components/imageplus/mgr/js/imageplus.jquery.imagecrop.js index 61d75f80..f77b0146 100644 --- a/assets/components/imageplus/mgr/js/imageplus.jquery.imagecrop.js +++ b/assets/components/imageplus/mgr/js/imageplus.jquery.imagecrop.js @@ -21,68 +21,68 @@ * @copyright Alan Pich 2013 */ - -ImagePlus.jquery.ImageCrop= function(config) { +ImagePlus.jquery.ImageCrop = function (config) { config = config || {}; this.imageplus = config.imageplus; this.window = config.window; this.imageDOMid = Ext.id(); - - Ext.apply(config,{ - cropData: this.imageplus.crop - ,collapsable: false - ,items: [{ - html: '' - }] - ,listeners: { - 'afterRender':{fn:this.on_afterRender,scope:this} - ,'destroy': {fn:function(){this.cropper.destroy()},scope:this} + + Ext.apply(config, { + cropData: this.imageplus.crop, + collapsable: false, + items: [{ + html: '' + }], + listeners: { + afterRender: {fn: this.on_afterRender, scope: this}, + destroy: { + fn: function () { + this.cropper.destroy() + }, scope: this + } } }); - ImagePlus.jquery.ImageCrop.superclass.constructor.call(this,config); + ImagePlus.jquery.ImageCrop.superclass.constructor.call(this, config); }; Ext.extend(ImagePlus.jquery.ImageCrop, Ext.Panel, { - - - on_afterRender: function(){ - this.initJcrop.defer(10, this) - }// - - ,initJcrop: function(){ - this.$image = $('#'+this.imageDOMid) - .data('ext',this.window); - - var conf = { - minSize: this.window.getMinCropSize() - ,aspectRatio: this.window.getAspectRatio() - ,setSelect: this.window.getCropCoords() - ,outerImage: this.window.getOuterImageUrl() - ,onSelect: function(ext){ - return function(crop){ - ext.on_cropChange({ - x: crop.x, - y: crop.y, - width: crop.w, - height: crop.h - }) - } - }(this.window) - }; - this.$image.Jcrop(conf,function(ths){ return function(){ - ths.cropper = this; - this.setOptions({ - outerImage: ths.window.getOuterImageUrl() - ,bgOpacity: 0.5 + on_afterRender: function () { + this.initJcrop.defer(10, this) + }, + + initJcrop: function () { + this.$image = $('#' + this.imageDOMid).data('ext', this.window); + + var conf = { + minSize: this.window.getMinCropSize(), + aspectRatio: this.window.getAspectRatio(), + setSelect: this.window.getCropCoords(), + outerImage: this.window.getOuterImageUrl(), + onSelect: function (ext) { + return function (crop) { + ext.on_cropChange({ + x: crop.x, + y: crop.y, + width: crop.w, + height: crop.h }) - }}(this)) - }// - - ,get_image: function(){ - return this.$image; - }// - - - - }); -Ext.reg('imageplus-jquery-imagecrop',ImagePlus.jquery.ImageCrop); + } + }(this.window) + }; + this.$image.Jcrop(conf, function (ths) { + return function () { + ths.cropper = this; + this.setOptions({ + outerImage: ths.window.getOuterImageUrl(), + bgOpacity: 0.5 + }) + } + }(this)) + }, + + get_image: function () { + return this.$image; + } + +}); +Ext.reg('imageplus-jquery-imagecrop', ImagePlus.jquery.ImageCrop); diff --git a/assets/components/imageplus/mgr/js/imageplus.js b/assets/components/imageplus/mgr/js/imageplus.js index dede2cde..6ce4eed3 100644 --- a/assets/components/imageplus/mgr/js/imageplus.js +++ b/assets/components/imageplus/mgr/js/imageplus.js @@ -22,55 +22,61 @@ */ -var ImagePlus = function(config) { +var imagePlus = function (config) { config = config || {}; - ImagePlus.superclass.constructor.call(this,config); + imagePlus.superclass.constructor.call(this, config); }; -Ext.extend(ImagePlus,Ext.Component,{ - page:{},window:{},grid:{},tree:{},panel:{},combo:{},config: {},jquery:{}, - generateThumbUrl: function(params){ +Ext.extend(imagePlus, Ext.Component, { + page: {}, window: {}, grid: {}, tree: {}, panel: {}, combo: {}, config: {}, jquery: {}, form: {}, + + generateThumbUrl: function (params) { return this.generatePhpThumbOfUrl(params); }, - generatePhpThumbOfUrl: function(params){ - var url = MODx.config.connectors_url+'system/phpthumb.php?imageplus=1' + generatePhpThumbOfUrl: function (params) { + var url = MODx.config.connectors_url + 'system/phpthumb.php?imageplus=1'; var defaults = { - wctx: 'mgr' - ,f: 'png' - ,q: 90 - ,w: 150 - ,source: 1 + wctx: 'mgr', + f: 'png', + q: 90, + w: 150, + source: 1 }; - for(i in params){ defaults[i] = params[i]}; - for(i in defaults){ - url+= '&'+i+'='+defaults[i]; + for (var i in params) { + defaults[i] = params[i] + } + for (i in defaults) { + url += '&' + i + '=' + defaults[i]; } return url; }, - warnAboutUnmetDependencies: function(){ + warnAboutUnmetDependencies: function () { var warningWindow = MODx.load({ - xtype: 'modx-window' - ,title: "   Image+ Warning - Unmet Dependencies   " - ,modal: true - ,padding: 25 - ,allowDrop: false - ,resizable: true - ,collapsible: true - ,maximizable: true - ,buttons: [{ - text: _('ok') - ,handler: function(L) { L.ownerCt.ownerCt.close(); } - }] - ,html: "

You don't have any crop engines!

"+ - "

Before you can use Image+, you need at least one Crop Engine installed to handle image manipulation.

"+ - "

A quick fix is to install either phpThumbOf or phpThumbsUp from the MODX Package Repository

" + xtype: 'modx-window', + title: "   Image+ Warning - Unmet Dependencies   ", + modal: true, + padding: 25, + allowDrop: false, + resizable: true, + collapsible: true, + maximizable: true, + buttons: [{ + text: _('ok'), + handler: function (L) { + L.ownerCt.ownerCt.close(); + } + }], + html: "

You don't have any crop engines!

" + + "

Before you can use Image+, you need at least one Crop Engine installed to handle image manipulation.

" + + "

A quick fix is to install either pThumb, phpThumbOf or phpThumbsUp from the MODX Package Repository

" }); warningWindow.show(); } }); -Ext.reg('imageplus',ImagePlus); -ImagePlus = new ImagePlus(); +Ext.reg('imageplus', imagePlus); + +ImagePlus = new imagePlus(); diff --git a/assets/components/imageplus/mgr/js/imageplus.panel.input.js b/assets/components/imageplus/mgr/js/imageplus.panel.input.js index fd8f9406..bcc50170 100644 --- a/assets/components/imageplus/mgr/js/imageplus.panel.input.js +++ b/assets/components/imageplus/mgr/js/imageplus.panel.input.js @@ -26,34 +26,37 @@ ImagePlus.panel.input = function (config) { config = config || {}; this.imageplus = config.imageplus; - this.create_editButton(); - this.create_clearButton(); - this.create_imageBrowser(); - this.create_imagePreview(); - this.create_altTextField(); + this.createImageBrowser(); + this.createImagePreview(); + this.createAltTextField(); // Warn if has no dependencies if (ImagePlus.config.has_unmet_dependencies) { ImagePlus.warnAboutUnmetDependencies() } - Ext.apply(config, { - border: false, baseCls: 'modx-formpanel', cls: 'container', updateTo: config.updateTo, width: '100%', + border: false, + baseCls: 'modx-formpanel', + cls: 'container', + updateTo: config.updateTo, + width: '100%', items: [{ - xtype: 'compositefield', anchor: '98%', hideLabel: true, + xtype: 'compositefield', + anchor: '98%', + hideLabel: true, listeners: { - 'render': {fn: this.on_Render, scope: this}, - 'afterRender': {fn: this.onAfterRender, scope: this} + 'render': { + fn: this.on_Render, + scope: this + }, + 'afterRender': { + fn: this.onAfterRender, + scope: this + } }, items: [this.imageBrowser] }, { - cls: 'modx-tv-image-preview', - items: [ - this.editButton, - this.clearButton - ] - },{ cls: 'modx-tv-image-preview', items: [ this.imagePreview, @@ -67,8 +70,6 @@ ImagePlus.panel.input = function (config) { this.listenForResetEvent(); }; Ext.extend(ImagePlus.panel.input, MODx.Panel, { - - /** * Bind change event on tv input DOM element so * that we can be notified when the user hits the @@ -80,229 +81,240 @@ Ext.extend(ImagePlus.panel.input, MODx.Panel, { if (changed.id = this.imageplus.tv.id) { this.on_Reset(); } - }, this) + }, this); }, - /** - * Create the 'edit image' button - */ - create_editButton: function () { - - this.editButton = new Ext.Button({ - text: _('imageplus.edit_image'), handler: this.editImage, scope: this, icon: ImagePlus.config.crop_icon, style: { marginRight: '5px' } - }) - }// - - , create_clearButton: function () { - this.clearButton = new Ext.Button({ - text: _('imageplus.clear_image') || "Clear Image", handler: this.clearImage, scope: this - }) - }// - /** * Create the image browser combo - */, create_imageBrowser: function () { + */ + createImageBrowser: function () { // Generate opento path var openToPath = this.imageplus.sourceImg.src.split('/'); openToPath.pop(); openToPath = openToPath.join('/'); + var _this = this; // Create browser component - this.imageBrowser = new MODx.combo.Browser({ - value: this.imageplus.sourceImg.src, source: this.imageplus.mediaSource, hideSourceCombo: true, openTo: openToPath, listeners: { - 'select': {fn: this.on_imageSelected, scope: this} + this.imageBrowser = new ImagePlus.combo.Browser({ + value: this.imageplus.sourceImg.src, + source: this.imageplus.mediaSource, + hideSourceCombo: true, + openTo: openToPath, + listeners: { + select: { + fn: this.onImageSelected, + scope: this + } + }, + onTrigger1Click: function () { + _this.clearImage(); + }, + + onTrigger2Click: function () { + _this.editImage(); } }) - } + }, /** * Create image preview img - */, create_imagePreview: function () { - this.imagePreview = new Ext.BoxComponent({autoEl: {tag: 'img', src: ''}}); - } + */ + createImagePreview: function () { + this.imagePreview = new Ext.BoxComponent({ + autoEl: { + tag: 'img', + src: '' + } + }); + }, /** * Create field for alt-text input - */, create_altTextField: function () { + */ + createAltTextField: function () { this.altTextField = MODx.load({ - xtype: this.imageplus.altTagOn ? 'textfield' : 'hidden', value: this.imageplus.altTag || '', listeners: { - 'change': {fn: this.on_altTagChange, scope: this} - }, width: 300, style: {marginBottom: '5px'} + xtype: this.imageplus.altTagOn ? 'textfield' : 'hidden', + value: this.imageplus.altTag || '', + listeners: { + 'change': { + fn: this.onAltTagChange, + scope: this + } + }, width: 300, style: { + marginBottom: '5px' + } }) - }, generateThumbUrl: function (params) { + }, + generateThumbUrl: function (params) { var url = MODx.config.connectors_url + 'system/phpthumb.php?imageplus=1'; var defaults = { - wctx: 'mgr', f: 'png', q: 90, w: 150, source: this.imageplus.sourceImg.source - } - for (i in params) { + wctx: 'mgr', + f: 'png', + q: 90, + w: 150, + source: this.imageplus.sourceImg.source + }; + for (var i in params) { defaults[i] = params[i] } for (i in defaults) { url += '&' + i + '=' + defaults[i]; } return url; - } + }, /** * Fires when the TV field is reset - */, on_Reset: function () { + */ + on_Reset: function () { this.imageBrowser.setValue(''); this.imageplus.sourceImg = false; - this.editButton.disable(); this.updatePreviewImage.defer(10, this); - } + }, /** * Render form elements to page - */, on_Render: function () { - }// + */ + on_Render: function () { + }, /** * Runs after initial render of panel - */, onAfterRender: function () { + */ + onAfterRender: function () { this.updateDisplay(); - }// + }, /** * Fired when user has selected an image from the browser - */, on_imageSelected: function (img) { - - var diffImg = (this.imageplus.sourceImg && this.imageplus.sourceImg.src != img.relativeUrl); - + */ + onImageSelected: function (img) { + var diffImg = (!this.imageplus.sourceImg || this.imageplus.sourceImg && this.imageplus.sourceImg.src != img.relativeUrl); this.oldSourceImg = {}; - for (i in this.imageplus.sourceImg) { + for (var i in this.imageplus.sourceImg) { this.oldSourceImg[i] = this.imageplus.sourceImg[i]; } - this.imageplus.sourceImg = { src: img.relativeUrl, width: img.image_width, height: img.image_height, source: this.imageplus.mediaSource - } - + }; // Reset crop rectangle everytime an image is selected to be different from browser if (diffImg) { this.imageplus.crop.x = 0; this.imageplus.crop.y = 0; - this.imageplus.crop.width = this.imageplus.targetWidth; - this.imageplus.crop.height = this.imageplus.targetHeight; + this.imageplus.crop.width = this.imageplus.targetWidth || this.imageplus.sourceImg.width; + this.imageplus.crop.height = this.imageplus.targetHeight || this.imageplus.sourceImg.height; } - // If server returns 800x600 or higher, image may be larger // so need to get size manually if (img.image_width >= 800 || img.image_height >= 600) { - this.manual_getImageSize(); + this.manualGetImageSize(); } else { // Update display this.updateDisplay(); - if (this.imageplus.crop.width == 0 || this.imageplus.crop.height == 0) this.editImage(); + if (diffImg) { + this.editImage(); + } } - ; - }// + }, /** * Fired when alt-tag field is changed - */, on_altTagChange: function (field, value) { + */ + onAltTagChange: function (field, value) { this.imageplus.altTag = value; this.updateExternalField(); - } + }, /** * Manually get image size * @return void - */, manual_getImageSize: function () { + */ + manualGetImageSize: function () { var baseUrl = ImagePlus.config['sources'][this.imageplus.sourceImg.source].url; var img = new Image(); img.onload = (function (ths) { return function () { ths.imageplus.sourceImg.width = this.width; ths.imageplus.sourceImg.height = this.height; - ths.updateDisplay(); - if (ths.imageplus.crop.width == 0 || ths.imageplus.crop.height == 0) ths.editImage(); + if (ths.imageplus.crop.width == 0 || ths.imageplus.crop.height == 0) { + ths.editImage(); + } } })(this); img.src = baseUrl + this.imageplus.sourceImg.src; - }// - + }, /** * Update the component display on state change - */, updateDisplay: function () { + */ + updateDisplay: function () { // Make sure image is large enough to use if (!this.checkImageIsLargeEnough()) { - this.imageplus.sourceImg = this.oldSourceImg; - - if (!this.oldSourceImg) this.imageBrowser.reset(); - else { + if (!this.oldSourceImg) { + this.imageBrowser.reset(); + } else { if (this.oldSourceImg.crop) { this.imageplus.crop.x = this.oldSourceImg.crop.x; this.imageplus.crop.y = this.oldSourceImg.crop.y; this.imageplus.crop.width = this.oldSourceImg.crop.width; this.imageplus.crop.height = this.oldSourceImg.crop.height; } - this.imageBrowser.setValue(this.lastFileLabel || ""); + this.imageBrowser.setValue(this.lastFileLabel || ''); } MODx.msg.alert("Image too small", "The selected image is too small to be used here. Please select a different image"); return; } this.lastFileLabel = this.imageplus.sourceImg.src; - // Hide 'edit' button if field is empty - if (this.imageBrowser.getValue() == '') { - this.editButton.disable(); - this.clearButton.hide(); - } else { - this.editButton.enable(); - this.clearButton.show(); - } this.updatePreviewImage.defer(10, this); - this.updateExternalField(); - }// + }, /** * Update updateTo field input field value - */, updateExternalField: function () { + */ + updateExternalField: function () { // console.log(this.updateTo); - - var TV = { - sourceImg: this.imageplus.sourceImg, crop: this.imageplus.crop, targetWidth: this.imageplus.targetWidth, targetHeight: this.imageplus.targetHeight, altTag: this.imageplus.altTag - } + sourceImg: this.imageplus.sourceImg, + crop: this.imageplus.crop, + targetWidth: this.imageplus.targetWidth, + targetHeight: this.imageplus.targetHeight, + altTag: this.imageplus.altTag + }; var json = JSON.stringify(TV, null, ' '); - var external = document.getElementById(this.updateTo); var current = external.value || ''; if (current == '') { - current = external.innerHTML + current = external.innerHTML; } - // Has value changed? - if (current == json) { - return + // Has value changed or is source image empty? + if (current == json || this.imageplus.sourceImg.src == '') { + return; } - if (document.getElementById(this.updateTo)) { document.getElementById(this.updateTo).value = json; -// document.getElementById(this.updateTo).innerHTML = json; } // Mark resource as dirty MODx.fireResourceFormChange() - } - + }, /** * Checks whether the image is larger than specified crop dimensions * @returns bool - */, checkImageIsLargeEnough: function () { + */ + checkImageIsLargeEnough: function () { if (!this.imageplus.sourceImg || this.imageplus == undefined) return true; if (this.imageplus.targetWidth > 0 && this.imageplus.sourceImg.width > 0) { @@ -316,59 +328,66 @@ Ext.extend(ImagePlus.panel.input, MODx.Panel, { } } return true; - } - + }, /** * Launch the editor window - */, editImage: function () { + */ + editImage: function () { // Create the editor window (if it doesnt exist) - if (!this.editorWindow) { + if (!this.editorWindow && this.imageplus.sourceImg && this.imageplus.sourceImg.src) { // Calculate safe image ratio var imgW = this.imageplus.sourceImg.width; var imgH = this.imageplus.sourceImg.height; var maxH = window.innerHeight * 0.7; var maxW = window.innerWidth * 0.7; + var ratio; + // Is image taller than screen? if (imgH > maxH) { - var ratio = maxH / imgH - } else if (imgW > maxW) { - var ratio = maxW / imgW + ratio = maxH / imgH } else { - var ratio = 1; + if (imgW > maxW) { + ratio = maxW / imgW + } else { + ratio = 1; + } } - this.editorWindow = MODx.load({ - xtype: 'imageplus-window-editor', title: _('imageplus.editor_title'), imageplus: this.imageplus, inputPanel: this, displayRatio: ratio - // ,autoWidth: true - , width: imgW * ratio, crop: this.imageplus.crop + xtype: 'imageplus-window-editor', + title: _('imageplus.editor_title'), + imageplus: this.imageplus, + inputPanel: this, + displayRatio: ratio, + width: (imgW * ratio + 20), + crop: this.imageplus.crop, + padding: '10px' }); + // Show the window + this.editorWindow.show(); } - ; - // Show the window - this.editorWindow.show(); - }// - , clearImage: function () { + }, + + clearImage: function () { this.imageplus.sourceImg = null; this.oldSourceImg = null; - this.lastFileLabel = ""; - this.editButton.disable(); - this.clearButton.hide(); + this.lastFileLabel = ''; if (this.imagePreview.el) { jQuery(this.imagePreview.el.dom).attr('src', 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=='); } - document.getElementById(this.updateTo).innerHTML = ""; - document.getElementById(this.updateTo).value = ""; - this.imageBrowser.setValue(""); + document.getElementById(this.updateTo).innerHTML = ''; + document.getElementById(this.updateTo).value = ''; + this.imageBrowser.setValue(''); MODx.fireResourceFormChange(); - } + }, /** * Receive new cropping dimensions from editor - */, updateFromEditor: function (crop) { + */ + updateFromEditor: function (crop) { this.imageplus.crop.x = crop.x; this.imageplus.crop.y = crop.y; this.imageplus.crop.width = crop.width; @@ -376,7 +395,7 @@ Ext.extend(ImagePlus.panel.input, MODx.Panel, { if (!this.oldSourceImg) { this.oldSourceImg = {}; - for (i in this.imageplus.sourceImg) { + for (var i in this.imageplus.sourceImg) { this.oldSourceImg[i] = this.imageplus.sourceImg[i]; } } @@ -389,20 +408,190 @@ Ext.extend(ImagePlus.panel.input, MODx.Panel, { this.editorWindow = null; this.updateDisplay(); - }, updatePreviewImage: function () { + }, + + updatePreviewImage: function () { if (!this.imageplus.sourceImg || this.imageplus.crop.width == 0) { this.imagePreview.hide(); return; } - url = this.generateThumbUrl({ - src: this.imageplus.sourceImg.src, sw: this.imageplus.crop.width, sh: this.imageplus.crop.height, sx: this.imageplus.crop.x, sy: this.imageplus.crop.y - }) + var url = this.generateThumbUrl({ + src: this.imageplus.sourceImg.src, + sw: this.imageplus.crop.width, + sh: this.imageplus.crop.height, + sx: this.imageplus.crop.x, + sy: this.imageplus.crop.y + }); if (this.imagePreview.el) { this.imagePreview.el.dom.src = url; this.imagePreview.show() } - ; } }); Ext.reg('imageplus-panel-input', ImagePlus.panel.input); + +ImagePlus.form.TripleTriggerField = Ext.extend(Ext.form.TriggerField, { + /** + * @cfg {String} trigger1Class + * An additional CSS class used to style the trigger button. The trigger will always get the + * class 'x-form-trigger' by default and triggerClass will be appended if specified. + */ + + /** + * @cfg {String} trigger2Class + * An additional CSS class used to style the trigger button. The trigger will always get the + * class 'x-form-trigger' by default and triggerClass will be appended if specified. + */ + + /** + * @cfg {String} trigger3Class + * An additional CSS class used to style the trigger button. The trigger will always get the + * class 'x-form-trigger' by default and triggerClass will be appended if specified. + */ + + initComponent: function () { + ImagePlus.form.TripleTriggerField.superclass.initComponent.call(this); + + this.triggerConfig = { + tag: 'span', cls: 'x-form-triple-triggers', cn: [ + {tag: "div", cls: "x-form-trigger " + this.trigger1Class}, + {tag: "div", cls: "x-form-trigger " + this.trigger2Class}, + {tag: "div", cls: "x-form-trigger " + this.trigger3Class} + ] + }; + }, + + getTrigger: function (index) { + return this.triggers[index]; + }, + + initTrigger: function () { + var ts = this.trigger.select('.x-form-trigger', true); + var triggerField = this; + ts.each(function (t, all, index) { + var triggerIndex = 'Trigger' + (index + 1); + t.hide = function () { + var w = triggerField.wrap.getWidth(); + this.dom.style.display = 'none'; + triggerField.el.setWidth(w - triggerField.trigger.getWidth()); + this['hidden' + triggerIndex] = true; + }; + t.show = function () { + var w = triggerField.wrap.getWidth(); + this.dom.style.display = ''; + triggerField.el.setWidth(w - triggerField.trigger.getWidth()); + this['hidden' + triggerIndex] = false; + }; + + if (this['hide' + triggerIndex]) { + t.dom.style.display = 'none'; + this['hidden' + triggerIndex] = true; + } + this.mon(t, 'click', this['on' + triggerIndex + 'Click'], this, {preventDefault: true}); + t.addClassOnOver('x-form-trigger-over'); + t.addClassOnClick('x-form-trigger-click'); + }, this); + this.triggers = ts.elements; + }, + + getTriggerWidth: function () { + var tw = 0; + Ext.each(this.triggers, function (t, index) { + var triggerIndex = 'Trigger' + (index + 1), + w = t.getWidth(); + if (w === 0 && !this['hidden' + triggerIndex]) { + tw += this.defaultTriggerWidth; + } else { + tw += w; + } + }, this); + return tw; + }, + + // private + onDestroy: function () { + Ext.destroy(this.triggers); + ImagePlus.form.TripleTriggerField.superclass.onDestroy.call(this); + }, + + + /** + * The function that should handle the trigger's click event. This method does nothing by default + * until overridden by an implementing function. See {@link Ext.form.TriggerField#onTriggerClick} + * for additional information. + * @method + * @param {EventObject} e + */ + onTrigger1Click: Ext.emptyFn, + + /** + * The function that should handle the trigger's click event. This method does nothing by default + * until overridden by an implementing function. See {@link Ext.form.TriggerField#onTriggerClick} + * for additional information. + * @method + * @param {EventObject} e + */ + onTrigger2Click: Ext.emptyFn, + + /** + * The function that should handle the trigger's click event. This method does nothing by default + * until overridden by an implementing function. See {@link Ext.form.TriggerField#onTriggerClick} + * for additional information. + * @method + * @param {EventObject} e + */ + onTrigger3Click: Ext.emptyFn +}); + +ImagePlus.combo.Browser = function (config) { + config = config || {}; + Ext.applyIf(config, { + width: 400, + triggerAction: 'all', + trigger1Class: 'x-form-clear-trigger', + trigger2Class: 'x-form-crop-trigger', + trigger3Class: 'x-form-image-trigger', + source: config.source || MODx.config.default_media_source + }); + ImagePlus.combo.Browser.superclass.constructor.call(this, config); + this.config = config; +}; +Ext.extend(ImagePlus.combo.Browser, ImagePlus.form.TripleTriggerField, { + browser: null, + + onTrigger3Click: function (btn) { + if (this.disabled) { + return false; + } + this.browser = MODx.load({ + xtype: 'modx-browser', + closeAction: 'close', + id: Ext.id(), + multiple: true, + source: this.config.source || 1, + hideFiles: this.config.hideFiles || false, + rootVisible: this.config.rootVisible || false, + allowedFileTypes: this.config.allowedFileTypes || '', + wctx: this.config.wctx || 'web', + openTo: this.config.openTo || '', + rootId: this.config.rootId || '/', + hideSourceCombo: this.config.hideSourceCombo || false, + listeners: { + 'select': { + fn: function (data) { + this.setValue(data.relativeUrl); + this.fireEvent('select', data); + }, scope: this + } + } + }); + this.browser.show(btn); + return true; + }, + + onDestroy: function () { + ImagePlus.combo.Browser.superclass.onDestroy.call(this); + } +}); +Ext.reg('imageplus-combo-browser', ImagePlus.combo.Browser); diff --git a/assets/components/imageplus/mgr/js/imageplus.window.editor.js b/assets/components/imageplus/mgr/js/imageplus.window.editor.js index 253948ad..e173d5d0 100644 --- a/assets/components/imageplus/mgr/js/imageplus.window.editor.js +++ b/assets/components/imageplus/mgr/js/imageplus.window.editor.js @@ -22,166 +22,172 @@ */ -ImagePlus.window.Editor = function(config) { +ImagePlus.window.Editor = function (config) { config = config || {}; this.imageplus = config.imageplus; this.inputPanel = config.inputPanel; this.displayRatio = config.displayRatio; - - var cropSettings = { - x: this.imageplus.crop.x, - y: this.imageplus.crop.y, - width: this.imageplus.crop.width, - height: this.imageplus.crop.height - } - - Ext.apply(config,{ - bodyStyle: { 'padding': '0'}, - border: false - ,crop: cropSettings - ,resizable: false - ,closeAction: 'close' - ,listeners: { - 'close': {fn: this.on_close,scope:this} - ,'success': {fn:function(){console.log('success')}} - ,'show': {fn:this.on_show,scope:this} - } - ,items: [{ - xtype: 'imageplus-jquery-imagecrop' - ,imageplus: this.imageplus - ,initialWidth: this.getDisplayWidth() - ,initialHeight: this.getDisplayHeight() - ,imageUrl: this.getImageUrl() - ,window: this - ,listeners: { - 'change': {fn: this.on_cropChange,scope:this} - } - ,cropData: this.imageplus.crop - }] - ,buttonAlign: 'right' - ,buttons: [{ - text: _('cancel') - ,handler: this.closeFromEditor - ,scope: this - },{ - text: _('update') - ,handler: this.updateFromEditor - ,scope: this + + var cropSettings = { + x: this.imageplus.crop.x, + y: this.imageplus.crop.y, + width: this.imageplus.crop.width, + height: this.imageplus.crop.height + }; + + Ext.apply(config, { + bodyStyle: {'padding': '0'}, + border: false, + crop: cropSettings, + resizable: false, + closeAction: 'close', + listeners: { + 'close': {fn: this.on_close, scope: this}, + 'success': { + fn: function () { + console.log('success') + } + }, + 'show': {fn: this.on_show, scope: this} + }, + items: [{ + xtype: 'imageplus-jquery-imagecrop', + imageplus: this.imageplus, + initialWidth: this.getDisplayWidth(), + initialHeight: this.getDisplayHeight(), + imageUrl: this.getImageUrl(), + window: this, + listeners: { + 'change': {fn: this.on_cropChange, scope: this} + }, + cropData: this.imageplus.crop + }], + buttonAlign: 'right', + buttons: [{ + text: _('cancel'), + handler: this.closeFromEditor, + scope: this + }, { + text: _('update'), + handler: this.updateFromEditor, + scope: this }] }); - ImagePlus.window.Editor.superclass.constructor.call(this,config); + ImagePlus.window.Editor.superclass.constructor.call(this, config); }; Ext.extend(ImagePlus.window.Editor, Ext.Window, { - + // Get the required width of the cropper - getDisplayWidth: function(){ + getDisplayWidth: function () { return Math.round(this.imageplus.sourceImg.width * this.displayRatio); - }// - ,getDisplayHeight: function(){ + }, + getDisplayHeight: function () { return Math.round(this.imageplus.sourceImg.height * this.displayRatio); } - + /** * Get a url to image resized for window - */ - ,getImageUrl: function(){ - var url = this.inputPanel.generateThumbUrl({ - src: this.imageplus.sourceImg.src - ,w: this.getDisplayWidth() - ,h: this.getDisplayHeight() - }) - return url; - }// - - ,getOuterImageUrl: function(){ - var url = this.inputPanel.generateThumbUrl({ - src: this.imageplus.sourceImg.src - ,w: this.getDisplayWidth() - ,h: this.getDisplayHeight() - ,'fltr[]': 'blur|25' - }) - return url; - }// - - ,getMinCropSize: function(){ - return [ - this.imageplus.targetWidth * this.displayRatio - ,this.imageplus.targetHeight * this.displayRatio + */, + getImageUrl: function () { + return this.inputPanel.generateThumbUrl({ + src: this.imageplus.sourceImg.src, + w: this.getDisplayWidth(), + h: this.getDisplayHeight() + }); + }, + + getOuterImageUrl: function () { + return this.inputPanel.generateThumbUrl({ + src: this.imageplus.sourceImg.src, + w: this.getDisplayWidth(), + h: this.getDisplayHeight(), + 'fltr[]': 'blur|25' + }); + }, + + getMinCropSize: function () { + return [ + this.imageplus.targetWidth * this.displayRatio, + this.imageplus.targetHeight * this.displayRatio ] - } - - ,getMinCropWidth: function(){ + }, + + getMinCropWidth: function () { return this.imageplus.targetWidth * this.displayRatio; - } - ,getMinCropHeight: function(){ + }, + getMinCropHeight: function () { return this.imageplus.targetHeight * this.displayRatio; - } - ,getInitialCropX: function(){ + }, + getInitialCropX: function () { return this.imageplus.crop.x * this.displayRatio; - } - ,getInitialCropY: function(){ + }, + getInitialCropY: function () { return this.imageplus.crop.y * this.displayRatio; - } - ,getInitialCropWidth: function(){ - if(this.imageplus.crop.width==0){ + }, + getInitialCropWidth: function () { + if (this.imageplus.crop.width == 0) { return this.imageplus.targetWidth * this.displayRatio; } else { return this.imageplus.crop.width * this.displayRatio; - }; - } - ,getInitialCropHeight: function(){ - if(this.imageplus.crop.height==0){ + } + }, + getInitialCropHeight: function () { + if (this.imageplus.crop.height == 0) { return this.imageplus.targetHeight * this.displayRatio } else { return this.imageplus.crop.height * this.displayRatio; - }; - } - ,getAspectRatio: function(){ - if( this.imageplus.targetWidth>0 && this.imageplus.targetHeight>0){ + } + }, + getAspectRatio: function () { + if (this.imageplus.targetWidth > 0 && this.imageplus.targetHeight > 0) { return this.imageplus.targetWidth / this.imageplus.targetHeight; - } else { return false} - } - - ,getCropCoords: function(){ - var W = this.getInitialCropWidth(); - var H = this.getInitialCropHeight(); - if(W==0||H==0){ return false; } - var X = this.getInitialCropX(); - var Y = this.getInitialCropY(); - return [X,Y,(X+W),(Y+H)]; + } else { + return false + } + }, + + getCropCoords: function () { + var W = this.getInitialCropWidth(); + var H = this.getInitialCropHeight(); + if (W == 0 || H == 0) { + return false; + } + var X = this.getInitialCropX(); + var Y = this.getInitialCropY(); + return [X, Y, (X + W), (Y + H)]; } - + /** * Handle window closing - */ - ,on_close: function(){ - this.inputPanel.editorWindow = false; - } - - ,on_show: function(){ - this.center.defer(150,this); + */, + on_close: function () { + this.inputPanel.editorWindow = false; + }, + + on_show: function () { + this.center.defer(150, this); }// - + /** * Handle crop area change - */ - ,on_cropChange: function(data){ - this.crop.height = Math.round(data.height/this.displayRatio); - this.crop.width = Math.round(data.width/this.displayRatio); - this.crop.x = Math.round(data.x/this.displayRatio); - this.crop.y = Math.round(data.y/this.displayRatio); - } - - ,updateFromEditor: function(){ + */, + on_cropChange: function (data) { + this.crop.height = Math.round(data.height / this.displayRatio); + this.crop.width = Math.round(data.width / this.displayRatio); + this.crop.x = Math.round(data.x / this.displayRatio); + this.crop.y = Math.round(data.y / this.displayRatio); + }, + + updateFromEditor: function () { this.inputPanel.updateFromEditor(this.crop); this.close(); + }, + closeFromEditor: function () { + this.crop.width = this.imageplus.crop.width; + this.crop.height = this.imageplus.crop.height; + this.crop.x = this.imageplus.crop.x; + this.crop.y = this.imageplus.crop.y; + this.close(); } - ,closeFromEditor: function() { - this.crop.width = this.imageplus.crop.width; - this.crop.height = this.imageplus.crop.height; - this.crop.x = this.imageplus.crop.x; - this.crop.y = this.imageplus.crop.y; - this.close(); - } }); -Ext.reg('imageplus-window-editor',ImagePlus.window.Editor); +Ext.reg('imageplus-window-editor', ImagePlus.window.Editor); diff --git a/core/components/imageplus/docs/changelog.txt b/core/components/imageplus/docs/changelog.txt index 93cbb9cc..72129fc6 100644 --- a/core/components/imageplus/docs/changelog.txt +++ b/core/components/imageplus/docs/changelog.txt @@ -2,7 +2,10 @@ Changelog ================================================================================ - 2.3.x - - MODX 2.3 compatibility + - MODX 2.3 compatibility (and dropping 2.2 compatibility) + - Inline Trigger fields + - Bugfix for fireResourceFormChange issue + - Some better styling - 2.2.x - Added gui warning of missing dependencies diff --git a/core/components/imageplus/docs/readme.tpl b/core/components/imageplus/docs/readme.tpl index cf1f33a0..88709559 100644 --- a/core/components/imageplus/docs/readme.tpl +++ b/core/components/imageplus/docs/readme.tpl @@ -1,15 +1,9 @@ ---------------------- - Image+ TV type ---------------------- - Version: {$version} - Author: Alan Pich - License: GNU GPLv2 - Date: {$date} - Build: {$commit} - - Dependencies: phpThumbOf - +Image+ TV type +============== +Author: Alan Pich +Contributor: Thomas Jakobi +License: GNU GPLv2 Advanced image TV input type for MODx Revolution. The required dimensions for the image can (optionally) @@ -19,9 +13,10 @@ they can then use a graphical tool to crop the image to the required dimensions/proportions. Usage ---------- -Install via package manager -Create a TV with input & output types of Image+ +----- +Install via package manager and Create a TV with input & output types of Image+ Full documentation can be found at -https://github.com/alanpich/tvImagePlus \ No newline at end of file +https://github.com/Jako/ImagePlus + +Dependencies: MODX Cropping Engine i.e. pthumb diff --git a/core/components/imageplus/elements/tv/input/imageplus.class.php b/core/components/imageplus/elements/tv/input/imageplus.class.php index 54413ea8..8f7280a0 100644 --- a/core/components/imageplus/elements/tv/input/imageplus.class.php +++ b/core/components/imageplus/elements/tv/input/imageplus.class.php @@ -1,4 +1,5 @@ * @@ -21,104 +22,104 @@ * @author Alan Pich * @copyright Alan Pich 2013 */ +class ImagePlusInputRender extends modTemplateVarInputRender +{ + /* @var ImagePlus $imageplus */ + private $imageplus; + + public function getTemplate() + { + return dirname(__FILE__) . '/tpl/imageplus.inputrender.tpl'; + } -class ImagePlusInputRender extends modTemplateVarInputRender { - - /* @var ImagePlus $helper */ - private $helper; - - public function getTemplate() { - return dirname(__FILE__).'/tpl/imageplus.inputrender.tpl'; - }// - - - public function getLexiconTopics(){ + public function getLexiconTopics() + { return array('imageplus:default'); - }// - - - public function process($value,array $params = array()) { + } + + public function process($value, array $params = array()) + { $this->modx->lexicon->load('imageplus:default'); - - // Load helper class - if(!class_exists('ImagePlus')){ - require $this->modx->getOption('imageplus.core_path',null,$this->modx->getOption('core_path').'components/imageplus/').'imageplus.class.php'; }; - $this->helper = new ImagePlus($this->modx); + + // Load imageplus class + if (!class_exists('ImagePlus')) { + require $this->modx->getOption('imageplus.core_path', null, $this->modx->getOption('core_path') . 'components/imageplus/') . 'imageplus.class.php'; + }; + $this->imageplus = new ImagePlus($this->modx); // Load required javascripts & register global config - $this->helper->includeScriptAssets(); + $this->imageplus->includeScriptAssets(); // Prepare tv config for jsonification - $tvConfig = $this->helper->loadTvConfig($this,$value,$params); - $this->setPlaceholder('imageplusconfig',json_encode($tvConfig)); - $this->setPlaceholder('tvValue',$value); - + $tvConfig = $this->imageplus->loadTvConfig($this, $value, $params); + $this->setPlaceholder('imageplusconfig', json_encode($tvConfig)); + $this->setPlaceholder('tvValue', $value); - $this->setPlaceholder('mediasource',$this->tv->get('source')); - $this->setPlaceholder('tvparams',json_encode($this->getInputOptions())); + $this->setPlaceholder('mediasource', $this->tv->get('source')); + $this->setPlaceholder('tvparams', json_encode($this->getInputOptions())); - $this->setPlaceholder('imgData',$this->getImageDataJSON($value,$params)); + $this->setPlaceholder('imgData', $this->getImageDataJSON($value, $params)); - $this->setPlaceholder('config',json_encode($this->helper->config)); - + $this->setPlaceholder('config', json_encode($this->imageplus->config)); } - - -private function getImageDataJSON($value,$params){ - $I = json_decode($value); - $Opts = $this->getInputOptions(); - - $data = new stdClass; - - // Grab MediaSource info - + + private function getImageDataJSON($value, $params) + { + $value = json_decode($value); + + $data = new stdClass; + + // Grab MediaSource info $source = $this->modx->getObject('modMediaSource', $this->tv->get('source')); $properties = $source->getProperties(); $data->mediasource = new stdClass; $data->mediasource->id = $source->get('id'); $data->mediasource->path = (isset($properties['basePath'])) ? $properties['basePath']['value'] : $this->modx->getOption('base_path'); $data->mediasource->url = (isset($properties['baseUrl'])) ? $properties['baseUrl']['value'] : $this->modx->getOption('base_url'); - // Grab constraint info - $data->constraint = new stdClass; - $data->constraint->width = empty($params['targetWidth']) ? 0 : (int) $params['targetWidth']; - $data->constraint->height = empty($params['targetHeight'])? 0 : (int) $params['targetHeight']; - - // Generate ratio value - if( $data->constraint->width >0 && $data->constraint->height >0 ){ - // If both width/height constraints set, use that for ratio calc - $data->constraint->ratio = $data->constraint->width/$data->constraint->height; - } else - if( isset($I->source->width) && isset($I->source->height) ){ - // Use source image size for ratio - $data->constraint->ratio = $I->source->width / $I->source->height; - } else { - // Fail safe (and square) - $data->constraint->ratio = false; - }; - - // Grab source image info (if it exists yet) - if( isset($I->source) ){ - $data->source = new stdClass; - $data->source->height = $I->source->height; - $data->source->width = $I->source->width; - $data->source->path = $I->source->path; - $data->source->filename = $I->source->filename; - $data->source->size = $I->source->size; - } else { - $data->source = false; - }; - - // Grab crop params (if they exist yet) - if( isset($I->crop)){ - $data->crop = new stdClass; - $data->crop->x = $I->crop->x; - $data->crop->y = $I->crop->y; - $data->crop->width = $I->crop->width; - $data->crop->height = $I->crop->height; - }; - - return json_encode($data); - }// + // Grab constraint info + $data->constraint = new stdClass; + $data->constraint->width = empty($params['targetWidth']) ? 0 : (int)$params['targetWidth']; + $data->constraint->height = empty($params['targetHeight']) ? 0 : (int)$params['targetHeight']; + + // Generate ratio value + if ($data->constraint->width > 0 && $data->constraint->height > 0) { + // If both width/height constraints set, use that for ratio calc + $data->constraint->ratio = $data->constraint->width / $data->constraint->height; + } else { + + if (isset($value->source->width) && isset($value->source->height)) { + // Use source image size for ratio + $data->constraint->ratio = $value->source->width / $value->source->height; + } else { + // Fail safe (and square) + $data->constraint->ratio = false; + }; + } + + // Grab source image info (if it exists yet) + if (isset($value->source)) { + $data->source = new stdClass; + $data->source->height = $value->source->height; + $data->source->width = $value->source->width; + $data->source->path = $value->source->path; + $data->source->filename = $value->source->filename; + $data->source->size = $value->source->size; + } else { + $data->source = false; + }; + + // Grab crop params (if they exist yet) + if (isset($value->crop)) { + $data->crop = new stdClass; + $data->crop->x = $value->crop->x; + $data->crop->y = $value->crop->y; + $data->crop->width = $value->crop->width; + $data->crop->height = $value->crop->height; + }; + + return json_encode($data); + } } + return 'ImagePlusInputRender'; diff --git a/core/components/imageplus/elements/tv/input/options/imageplus.php b/core/components/imageplus/elements/tv/input/options/imageplus.php index 4f653319..4f0f99c8 100644 --- a/core/components/imageplus/elements/tv/input/options/imageplus.php +++ b/core/components/imageplus/elements/tv/input/options/imageplus.php @@ -22,16 +22,18 @@ * @copyright Alan Pich 2013 */ -$root = $modx->getOption('imageplus.core_path',null,$modx->getOption('core_path').'components/imageplus/'); -if(!class_exists('ImagePlus')){ require $root.'imageplus.class.php'; }; -$helper = new ImagePlus($modx); +/** @var \modX $modx */ +$root = $modx->getOption('imageplus.core_path', null, $modx->getOption('core_path') . 'components/imageplus/'); +if (!class_exists('ImagePlus')) { + require $root . 'imageplus.class.php'; +}; +$imageplus = new ImagePlus($modx); $modx->lexicon->load('imageplus:default'); -$a = print_r($this->getInputProperties(),1); +$a = print_r($this->getInputProperties(), 1); -$modx->controller->setPlaceholder('t_width',$a); -$modx->controller->setPlaceholder('imagepluslexicon',json_encode($helper->config['lexicon'])); +$modx->controller->setPlaceholder('t_width', $a); +$modx->controller->setPlaceholder('imagepluslexicon', json_encode($imageplus->config['lexicon'])); $modx->controller->addLexiconTopic('imageplus:default'); - -return $modx->smarty->fetch($root.'elements/tv/input/tpl/imageplus.options.tpl'); +return $modx->smarty->fetch($root . 'elements/tv/input/tpl/imageplus.options.tpl'); diff --git a/core/components/imageplus/elements/tv/input/tpl/imageplus.inputrender.tpl b/core/components/imageplus/elements/tv/input/tpl/imageplus.inputrender.tpl index c5e5cc30..509e5d85 100644 --- a/core/components/imageplus/elements/tv/input/tpl/imageplus.inputrender.tpl +++ b/core/components/imageplus/elements/tv/input/tpl/imageplus.inputrender.tpl @@ -1,15 +1,16 @@ - +
diff --git a/core/components/imageplus/elements/tv/output/imageplus.class.php b/core/components/imageplus/elements/tv/output/imageplus.class.php index ad92dd12..8494bddd 100644 --- a/core/components/imageplus/elements/tv/output/imageplus.class.php +++ b/core/components/imageplus/elements/tv/output/imageplus.class.php @@ -1,4 +1,5 @@ * @@ -23,20 +24,16 @@ */ class ImagePlusOutputRender extends modTemplateVarOutputRender { - public function process($value, array $params = array()) { - // Load the helper library if its not already here + // Load the imageplus library if its not already here if (!class_exists('ImagePlus')) { require_once $this->modx->getOption('imageplus.core_path', null, $this->modx->getOption('core_path') . 'components/imageplus/') . 'imageplus.class.php'; }; - $this->helper = new ImagePlus($this->modx); - return $this->helper->getImageURL($value, $params, $this->tv); - - }// - + $this->imageplus = new ImagePlus($this->modx); + return $this->imageplus->getImageURL($value, $params, $this->tv); + } } -; return 'ImagePlusOutputRender'; diff --git a/core/components/imageplus/elements/tv/output/options/imageplus.php b/core/components/imageplus/elements/tv/output/options/imageplus.php index 8031b229..28db7a2a 100644 --- a/core/components/imageplus/elements/tv/output/options/imageplus.php +++ b/core/components/imageplus/elements/tv/output/options/imageplus.php @@ -23,17 +23,18 @@ */ /** @var \modX $modx */ -$root = $modx->getOption('imageplus.core_path',null,$modx->getOption('core_path').'components/imageplus/'); -if(!class_exists('ImagePlus')){ require $root.'imageplus.class.php'; }; -$helper = new ImagePlus($modx); +$root = $modx->getOption('imageplus.core_path', null, $modx->getOption('core_path') . 'components/imageplus/'); +if (!class_exists('ImagePlus')) { + require $root . 'imageplus.class.php'; +}; +$imageplus = new ImagePlus($modx); $modx->lexicon->load('imageplus:default'); -$a = print_r($this->getProperties(),1); +$a = print_r($this->getProperties(), 1); -$modx->controller->setPlaceholder('t_width',$a); -$modx->controller->setPlaceholder('imagepluslexicon',json_encode($helper->config['lexicon'])); -$modx->controller->setPlaceholder('imageplus',$helper); +$modx->controller->setPlaceholder('t_width', $a); +$modx->controller->setPlaceholder('imagepluslexicon', json_encode($imageplus->config['lexicon'])); +$modx->controller->setPlaceholder('imageplus', $imageplus); $modx->controller->addLexiconTopic('imageplus:default'); - -return $modx->smarty->fetch($root.'elements/tv/output/tpl/imageplus.options.tpl'); +return $modx->smarty->fetch($root . 'elements/tv/output/tpl/imageplus.options.tpl'); diff --git a/core/components/imageplus/elements/tv/output/tpl/imageplus.options.tpl b/core/components/imageplus/elements/tv/output/tpl/imageplus.options.tpl index 501290c7..3e0036ab 100644 --- a/core/components/imageplus/elements/tv/output/tpl/imageplus.options.tpl +++ b/core/components/imageplus/elements/tv/output/tpl/imageplus.options.tpl @@ -3,7 +3,7 @@ // $assets, 'connectorUrl' => $assets . 'mgr/connector.php', 'sources' => array(), - 'crop_icon' => $this->modx->getOption('imageplus.crop_icon', null, $assets . "mgr/icons/icon.crop.png"), 'has_unmet_dependencies' => false, ); } @@ -87,11 +86,12 @@ private function checkDependencies() }); // Do some basic intelligent sniffing - if( ! CropEngines\PhpThumbsUp::engineRequirementsMet($this->modx) - && ! CropEngines\PhpThumbOf::engineRequirementsMet($this->modx) ){ - // Handle unmet dependencies - $this->config['has_unmet_dependencies'] = TRUE; - } + if (!CropEngines\PhpThumbsUp::engineRequirementsMet($this->modx) + && !CropEngines\PhpThumbOf::engineRequirementsMet($this->modx) + ) { + // Handle unmet dependencies + $this->config['has_unmet_dependencies'] = TRUE; + } } /** @@ -197,6 +197,7 @@ public function loadTvConfig(ImagePlusInputRender $render, $value, array $params */ public function includeScriptAssets() { + $this->modx->regClientCSS($this->config['assets_url'] . 'mgr/css/imageplus.css'); $this->modx->regClientCSS($this->config['assets_url'] . 'mgr/css/jquery/jquery.jcrop.min.css'); $this->modx->regClientStartupScript($this->config['assets_url'] . 'mgr/js/imageplus.js'); $this->modx->regClientStartupScript($this->config['assets_url'] . 'mgr/js/imageplus.panel.input.js'); @@ -207,9 +208,9 @@ public function includeScriptAssets() $this->modx->regClientStartupScript($this->config['assets_url'] . 'mgr/js/jquery/jquery.jcrop.min.js'); $this->modx->regClientStartupScript($this->config['assets_url'] . 'mgr/js/imageplus.jquery.imagecrop.js'); $this->modx->regClientStartupHTMLBlock(''); + . ' ImagePlus.config = ' . json_encode($this->config) . ';' + . ' for(i in ImagePlus.config.lexicon){ MODx.lang[i] = ImagePlus.config.lexicon[i] }' + . ''); } /** @@ -223,16 +224,14 @@ public function includeScriptAssets() */ public function getImageURL($json, $opts = array(), modTemplateVar $tv) { - // Check system settings for crop engine override $engineClass = $this->modx->getOption('imageplus.crop_engine_class', null, false); // Do some basic intelligent sniffing if (!$engineClass) { - if( CropEngines\PhpThumbsUp::engineRequirementsMet($this->modx)) { + if (CropEngines\PhpThumbsUp::engineRequirementsMet($this->modx)) { $engineClass = '\\ImagePlus\\CropEngines\\PhpThumbsUp'; - } - else if( CropEngines\PhpThumbOf::engineRequirementsMet($this->modx)) { + } else if (CropEngines\PhpThumbOf::engineRequirementsMet($this->modx)) { $engineClass = '\\ImagePlus\\CropEngines\\PhpThumbOf'; } } @@ -250,20 +249,6 @@ public function getImageURL($json, $opts = array(), modTemplateVar $tv) return $cropEngine->getImageUrl($json, $opts, $tv); } - -// /** -// * Check if a snippet exists by name -// * -// * @param string $snippet Name of snippet to check for -// * @return bool -// */ -// protected function snippetExists($snippet) -// { -// $obj = $this->modx->getObject('modSnippet', array( -// 'name' => $snippet -// )); -// return $obj instanceof modSnippet; -// } - } + define('imageplus', true); From 3b62f6e0006d5e7ea2af7abed3004c76f8af3aa5 Mon Sep 17 00:00:00 2001 From: Thomas Jakobi Date: Thu, 21 May 2015 15:36:36 +0200 Subject: [PATCH 040/515] Update to 2.3.0-rc2 - Bugfix for fireResourceFormChange issue - Updated Jcrop plugin and jQuery - Set thumbnail width in template variable panel - Set crop aspect ratio in template variable input options - Bugfix for a Firefox display issue --- _build/config.json | 2 +- _packages/imageplus-2.3.0-rc2.transport.zip | Bin 0 -> 174012 bytes .../imageplus/mgr/css/imageplus.css | 4 + .../mgr/css/jquery/jquery.jcrop.min.css | 30 +--- .../mgr/js/imageplus.jquery.imagecrop.js | 4 +- .../mgr/js/imageplus.migx_renderer.js | 18 +-- .../imageplus/mgr/js/imageplus.panel.input.js | 49 +++--- .../mgr/js/imageplus.window.editor.js | 10 +- .../mgr/js/jquery/jquery.jcrop.min.js | 21 +-- .../imageplus/mgr/js/jquery/jquery.min.js | 9 +- .../imageplus/mgr/js/jquery/jquery.min.map | 1 + core/components/imageplus/docs/changelog.txt | 7 +- .../elements/snippets/imageplus.snippet.php | 4 +- .../elements/tv/input/imageplus.class.php | 55 +++++-- .../tv/input/tpl/imageplus.inputrender.tpl | 17 +- .../tv/input/tpl/imageplus.options.tpl | 114 +++++++++----- .../tv/output/tpl/imageplus.options.tpl | 148 +++++++++--------- core/components/imageplus/imageplus.class.php | 5 + .../imageplus/lexicon/de/default.inc.php | 10 +- .../imageplus/lexicon/en/default.inc.php | 12 +- 20 files changed, 284 insertions(+), 236 deletions(-) create mode 100644 _packages/imageplus-2.3.0-rc2.transport.zip mode change 100644 => 100755 assets/components/imageplus/mgr/css/jquery/jquery.jcrop.min.css mode change 100644 => 100755 assets/components/imageplus/mgr/js/jquery/jquery.jcrop.min.js create mode 100644 assets/components/imageplus/mgr/js/jquery/jquery.min.map diff --git a/_build/config.json b/_build/config.json index 99a12232..5d4c2163 100644 --- a/_build/config.json +++ b/_build/config.json @@ -3,7 +3,7 @@ "lowCaseName": "imageplus", "description": "Advanced Image template variable input type", "author": "Alan Pich", - "version": "2.3.0-rc1", + "version": "2.3.0-rc2", "package": { "elements": { "chunks": [ diff --git a/_packages/imageplus-2.3.0-rc2.transport.zip b/_packages/imageplus-2.3.0-rc2.transport.zip new file mode 100644 index 0000000000000000000000000000000000000000..9d7041f2461cb01b8d9148d17b763cfa6230c0fe GIT binary patch literal 174012 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
dS7roN*H~{T6U)&c_xiT5}6XiQdGL^2J{Ur$%}g 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 Lf(OEv!)mO7BTnSD72eVlP2$u#Pt&6b zI_uwMT$bg5%FsdG!8eA}r|$^QoBoR})>rx;d92B#)Yu^sEk}+XNV@-mlW0h{MCJ+EAG^P193YL@3)9tu?Ew z#4$3PH4?#Ep1>k93)B>`2TB@aEpI1XXmxJkI5S-U2PrC^6|*3+Wd$XAct*Gy1^_SkV0xxE}Zf zYMs;>?V5{C4Ul>b&Ig>s6uDK;Rrrm)+9;TCtu*3F}yYQ`P2>%c1Y*hc3ra=8z zZHI~y4Og8EGh&6+qR0%nqPJQB zHB0C$r-VhHMn3yXpbid`qeT11OyE3RRwhklmWB4Q4;1Zf8Rd|O89H8hom z9xq)Z?G;mlIcX0pPK%^gT#+Gkyy#uqrsaF>@p>9&WrUgstTEEDQ>SWfFmsRE?AlDi z!(D)UG6uNDTVcln#Cv}deqJThkRg`_$ULqFU002bMn|{c(;`e4Gg=W%d@b1K;)j?R zP7i#OjxNcbNeYXG&K%CVneZT;o4@V0l3(hCwz}p=JKwQP%5{&uput5R4jYy`hKhx8IrLCfHqbs3L?qc>F-N7&;mj=%?g=Ut`^>5hMA# z>d_dBtJ|km9l=&ZbbkA{-e0lA20b02{6T$?#uRz1AMr{wR~YCLAo^Iy?lQ@kZ!@Fj zj%AP^Jt1hBDEn<1u^LXMjS9?clh6Jy4k*(e40GpBf7^N#n zAHt(r2G7`JspMe9k_>|cn9Dm|idd6ZeWvpWAwn3h2|?&V1jN9*KF8W`eP;V??Ai|M zJml`ToXWnPds5e{E)kI+syDr%Dbj*65A+*x9uf{S{OG8Pf(0LN%4zty7`#?sYf&LyHSqHGq?_A1#$uJeRkMS`O~57?lN@7TCaiEqrEMFlU7`F7}wlx}=!L6c?Aaw)pWQ8|k^$*wF zIWOq~k}s{D)4L?wZse}wX}|DOg|%eEi0N2rKO%#PU%;Z%<`nk;p{zOb9_26<(9@HE zPZ!d6jI$z9cTM3AW`JjX{XP3c7g)_F*yYCYz|;g$C%*~YtQa!a(%%4pTVVe749jdW zWlTYy1WNCkNP5)!07Jj_X`Hb5z6F1;;|a+9Mm8Rf)+H@y$RXrr&RH9p>1LXu2^Ld0 z_kpFVf2TMo-1{UT9iI9+vblxyV~Q?u#(KYoMg|PzWKwrlse+XIss66!KK&UAo)r{^ z+%V>TQ_GM#-Im0oDWIYuO!MR;Ex);;7eqpJ3L6HDV555HIDKIm38*i9`j|amLa)0s zY{G~!Z8Oyj#`P&{uQKge1Pj1v@bv`?9*+!-t&gY%2dD<`L}~muTo70-poSRB@bN6n zggY|ETabxmt}NUR> zCWDk;$%m%%BEQTeR?!FLb;dn0L2_ewp93-E+6$P2J!U#V0nY}L@>+rcJ4``O1CQXA zF>3;L-j}n|lmqqyliyb!Gp3)Nq-_ocRch&T2S5!>@eOUxwLDk$LEodoqr;XSV-y^p zxu$?6BZ~LIkX;ZMaY7he2+qJRs0<1o>*iJk4V9#pVTz`ShU-YQA5BcYUGPeYE7tHq zvcGXk@4W<+<3+OYpgVH3uIF%$>>s@a;32-Es`v~_^=7H<7^H4FxNK*Ks`xwO<6m;O{cY^VXjTTVP6^-x!G*D8cw( z4uPe~UA3n7B=+z*Wh8H7479Bg^D#9)%mHVJdlSz+u>gPl2YlRcRaR@4keeT8n)n-T z0{5#VlMxt|rNKyJfNd^CMAIcDsS%-HfeBb>iOvI@>&HHG1xlo6u&AEg<#cQ9+#;zs z-e(0Ar9z?tEBNC!HFOwIUZpVyvQ^KD$?u;!kQYA$Q3ZQ*ok^*)7fPw};tGsyW39Z8 z1?*t!&tI~}i$6D>qw%zzO=|YfCnaAf_*Xe(S$X-VFU|4Nyq%SMUwmH*jR^jEDTHt3 zQXC8e)Y#AR-|UBp$=FlbuwZyIC(zA~rZGkS-xe24fToYvr`Il$(DqWP4qvifMlV11 zQcss%!Vo)>7wRL*-kSXI)(I;HGi)+}@=}!6S)gD`1J*eErJ6Sr!_sG32SG zr%gg9#bF;9@y6jO?AuL7%%d~9S5Z%-MF)WmG4 z3!l|Fmi|(8B~>D3QB(N1)f!6w;RBgEO`G%zPu{Jssw(}Qs?7?jq0s!9s)=xXwB3>4 zS6Jz>KWMR=?NK+GW^e}%@K0iw9Y2%LX~Xs7>MQl8(0sQAU2_(Jroqu9FYV|4%}82L5NNnPBN6vxBm$n5q&Y zo&Ag4`1BtO6eBJ)e^h!>Ez!rUF0~9f$lx2f7#Weco6ydyBQF_ENl0@+8(zAIFfryt zS_E*t`Sbr3v1YCPkG#5S?D=JLlGIKXwqG5N! zdR0`Z9oepH8hFqsY4+MSD*zcW_CE59hJL=`bu}Hq?V-Vy#FeJXTS(Bod0t@)6N)TF zS)|~4g`nD(0@rj*f2N_7@QNQHD+Y$%Tv}RPMyR%i)Vn1*p;)aE!%G+_Ml88-2?;YM zd3&Q{kONB1#v^;RV_xJL(@+t%Su^%aU3An$HP3>fp5XLg0xd-|M9%dVjW!1+jw~a> za$;EULiE1U2TZ>~HJ8{S8i8M%G7=d@(u0AasXB%MI=meqosqeOa_%<#1_|NQ392`~ zU@F~H+Inb9P97j{VXuoKABK+~T9u(?5sRc29{KU&364|?_3E^kaY@6hz)t4;xIOW!X;aR@U^sRb@0)rE$?jv z(KSD|AkP!z&U2b#Qq8lUE#k1q`pp_Td0#jD#LbFaDDLRb3+8qVl(-FArH3OV=WewvxN zR}%=pv%@2p%c50YbCjk@C7z@cSa2|CQ|kQOW>$53>b1YLX8 zywdkw2Fy@ov+m}P{s%=yG#KD__}Tdtrq#3;-Q3Y~*3#c(j4-ywrsJ+8ovE24Ji4iR zXNS}mem2h5vYUxc;e}>2Hg5ZyGRPf-xAwl9|1LEN4RK1b6uzz(w*AAFi$>p|h9uiD z?_`dc8%b<&5>4IkG@D#QvdLSij6r9Fv@!f+Ng&;a$cH3;YT+d}z{&cB&c(w^h-_?TolOEse(- zYgqakfVeIMC*1mre`{Z7P4f9oH+74%K-RkS5?OQ*MalHFSy7cb2~IjN)qTNoo_;u6p15W9dX-_bj3 zp>#4?*8EDXvlFCcWLV=AFZKN*v*2mz_a4URli6sDF~;shpvCU*6qk&4eVGCB#{Lk0 zdxN+9Ik{riSGq!UMus6yARQ6y#5ZoCz4 z&{PmDNpNV^DEXgwHq|7<`DYdXtjo^v?2vz^`k*vHiKs!j8@<^pz*}{{x``*h-7~0y zfZ7KE1?Ak`ru3}nkFMNp-L3OiPC*W(S<_<3kYvlSW$3V;f9LF#!xs@QC>lwp+7yqY zTR2~tyW`~z+y^ANl!0#3N{MZ_Uk-cY~cZNw8uwPI`huDlF% z^vBPp?WU!z@KvH2YxVv){S~0JS2g1QS%6M9EnEGiZW8`HhS7+39kJBc#)Qd#u z)u~yt%gsA;VzFu>kC@Sy=lZOn=0V|V$OT&PyjkbRB#9twv-dfCpp!jHE}n}Ejkos) z^f~{0m+Wt|0LEc&mhM8s!cMWB?Fry7jRYX!W^Pd$mTE!;?ih;JF67W=+~oJlUH3gp zv0jmsFSqGZ<^Zc)`t2rQcPUu-x~jYuB*Il4*WI#)1-Gojv<(C+Z6Ptvg4Tk2U7L@G z{NfG~Ad#-__#sQ5aY)WJCA3!EnyL0Q|#VtPBjz%O0GY+}kZxGcpX zB)B=h&56G|$Sg=+&;(FD@s#v($EPXZM6K@7>|*yC4tQPbZVN9QitHoj>GL-Zl*VpZ zabRY^ndCOtq9f`*PMDcN(<@FK?vV*!fhXxn+xJSB0Xng#9;Y!4_jQ-JJ$7P!{S4(o z=;L`0N3&?+Ga#gX(o;WSInN_g=6D1iSk7rmeuoaq@ti(U5^-SR0PI3-z=b_aboZRk zi76P(=t(xDFHaH+JyiM}m7JI4=$0yt@u+?J{`Jwq@KKZ7MgdPsY+6}^Tu6K%lt6W7 z8S=U-*4dDleRT+i44pupX~^NSOEw~H*GJlMA6mG{yIUbWCGrvOp15mv| z){u!=zPp=5m3_E8`KjJEL7i6Vpni|SV*Oj>|E)yOVoniKm(40_K18Jjr zQa_Z>tclzk5!`iDfNT8f+m-lj$RIYo;4M=fH#WP{p2g_a7KGAXO6gX^; zuN!h4Qe-B4+Nvp<<;FObY%Oczr9zb=42lsmf?`D@=JV*ka?B<9Ycx5u7ADMaS{VDMb0nQ2C(BZNeE?_2oA|C~Y>3{xDPlljb-!!4f6(o`_xt7#to`1%# zoHkEnO5=q*;tbexC_y~LDv&+n4OMW==277*E1?z9QW^2aq?dtE^u|!l`X>XnPW27e z@kPS&XkgB%L}s=MeLoq3kLvrQ^b+P{Pez1{dtPl#p_%D)z)&~lEP}g!(t9%UN=Vbk z5x}o#CVIkQ=m%@WA6Aodk=`Rnl+|d%oLXN7bl@VkE)nhCU`SGJC?5$%Rd^;v)jbo+ z%AmsEUHvVC-5~9T#7@h38L+R~r7U55pgrY@B_ux#7^x@d11AO|vbkM9VORk<3MCMFlE@yw` zYeguRPnxlQ3=U8;F2!NRld}A6Z|3inS+Dm&SAP%Qlv|Q~>t2pVOgOE>igo8cTC& zGToe#*NjGmX%4;N>(5jS#ZE6@S$rH;sPqJ9FVEk;o^H5foxf$Og<|jfr%QkT>5yvB zaBogtGr_Ht|9ABU6V)`Xd)A@Zuuo=G)WrkI4>{MKFy#yNq1vbYz#}I#cg(cF^W@sOLp1DYn0nOFjEobK#6;v7QvhjYPOPAh^WBOlU%x^SAsQm3dwMfw7gK zh=EA3VX-=X%g)sVv`~}3PZ0a}`m$GeE8P0< ztS9-S{t5JFZ%Vd>U{>Xu$t0V(#SRaBF&F$6Hly!XbBMN*8=Bdtloj)e#CI8?ml$d~ zm@^$rIsfjdPrF!GeLUXjp+cMBMnQVgly!Rf09#QnYkyaLDvn3*x&9_*s2O3zK02UH z`n*pyO@7o?{1Y&L05k54Fke167maZk9f)&b$9=k>k&0U;1uF^f63kOjreq@yDe>Fqb%vUcW~m?sTT?e^W z!;$ClXe@t3a65Fnt$tDyRv{CRGgkM=)uUi(!BE#&`_vsM<-tqNg&Ao@vad~cf*z8J zJ5a}jBX_Kd-RwNAIoTBfU(yu{*M9$@EcWOPh?c&3vcTpcm8H!CjN4%}c+aDyA@;@| z`@!HCG`E8+5GJ~Sk?#H3asCp70Ze5)?;AqH8^iY>0bYAen0_aLNnvdYjMa5eT+AA| zG{4jsTp=6qs{$PSvV8Xi2iW`UomvY1i2Hu*OG>%s@#tF)k7{2V zEn8FMX}9YfmHc7Or0^Gb8ne+pdn$3%baTas_ zj^>F*CQ+3egX|FIiCC^w#k#Ip;ST)zE7aUi6Qs*}p+Es+;5{Km{IP<^<~L*}#2rb} z%>xrPC$sSA6m4m$oUxGdP|pF1)67lAhDPW2u$9g4VKX@GxSMk3ujl|qN(?})0?thB zOuu>Ubj>mHmdSBkDI2{qq68C(I5?%MvdhDi?t)BhPq9~X$`hfS3(Q7kvdl#)i*XOg z*scv2DKGW^|0E)aOB!9*k=zfCTV|jM6OT!`cG3E5MSEY{USCpQTyRHDLkDOQR(PiR zH5v!X2%sVD@6K6YU>RNu(J2k#IPvV8-b2Wl@P5KBu?!D~H|8ISkYcPQh6lw!>ZAuu z`T+)SZMdk&5Xu0cGVNF!eEr!mADlq_%h;I+BVu2ZmrFXNqid!&ea zhWu$>&bs`rWgG5`gJb(GQb+IQV1xU%i0K-cZjJg(4D!^5I-Luxh{S}aqVJ3D&b3>1 zub7e^a9UMNIV@&&BXnQVYp2{NVo>iz3K8|WaHR3Tu#y_If^GU{; zZnOC*g_}iWi1Xiuy4z@t^DN;`RWugb`Nfb5k<;&8d*8l-)r_}6Sre0SGSEm*#8Y2- z_>_C*ktA8J+FJ0ZB@0$`Nxaf`QEXk`&3_%RkfeEk)cOQ|beZqTvIjH+6XTAH6i{}BAvOnH6H?9h@lP<^Tfim)&Q z74u1h!z)ZTCk(cbNtOLmF3HjBm$VR10w7#E9=5ksnA#^+=KQ!N@~w$ELC`wA@H@Xw z0C0w*tT|&=_t(ZQ>YM%^r@!sDS3a~&Yu;*(RE|;&1+u;yEp*+QjeihM!ve!vSKOI=cq7uRoyCvuXwax+W zwM&}gfN9uT=bU|80HGLiqiol*7b_%_(uXyISb52;B%Z8CIlR*^`X7%(cS z*s61A<|7K{1$;`CT^DTfKpSr|#Gl?N1MlW!`H{Y9WYqXDRm&5M49F%dRXc$+dKJAF zdFtlNn0|D2DysT$X%Gn+-zytc&OlsNV@2k;BFuUynYd(L^oDI+DB*%XO^@09S~&AG zhJ~ZxU+T24(0r<`s1BO=D_?D)g7&8Utjwr+-oNJ_ts?a|lB5X)za$Tg=4}w>-u*;z z$SxCsX@%V%(pPz%aW1c+mAiLih6ln6q%~+$)I+kYbBS&WS<IUGkA}KC`MWcB zx8bUdi`%CUiL1^$CU5#%hEo{%Ib{bEZzdb8Y#U)*$ov?b1|uHwc$L7T>}j3kE+scR zJ!wzgiC#l-4sq{nMC7p8cAL1%w$`byEz{Rx(dsiU48@$yZ>^6tLMU=nZ080#hWR?p z9C3>Laf&Rq0-(otI{RFP2Ea=<)n_7VOLL=&u-^D6x6YtnkcA7;Wi_8lJIjs|2&( z$Umd~k&+C{V7$@gJLs{r53iU#TA901bDu`~$KN7S$Bli^1yY2*KKy;dd5$ z)&CM4m5BZC&inr*LNLJmUv$U9O%)v~UeaOpB zjn~kFRS`Ru6}sUOq-v5++5?bPN+M0#!ul$^1A)@(Tyd3}l@U1bPmJ#s&p!P8Ls5%f ze?6HP9AfI;buMUY$NJ`);?M?n#C1!AeEj~1+?8-E?z_QWmn3A z4}qE6qx4EBc=-rz&e@dJY#PRu2sHcag&wezF~x$(NSQ3|`&?1AWUmZohIz<~;_7ezgU~G%?&!x(m-Si{)(Q+ z-K|#1s%X~EK2!S4$a;Nn16FjtMeGLE5PK4qT?e14p0UEpQm6FgHDsOTd*hIi3|w0w z68iv=0L=B9P+)bL`#d+aK;ouhl)TEj;LX*$E%VE3Sybp>Qo*t%CSy#yi#^SlNpWa1 zYfaFx4u}g9Rc#*p9p}=SXp4=e8G^QnRqSet?OTTz@;jek%UcCl+JfKbDom;FHvI_1 ze1RPNLK1$<2=A!#rNVVf^C(@h*`3$bAY2N%1>s<>XW^9>ah&y46=!F?@UGp(NR zQgXUjx0F~A)fku}R5zu4%od>_z=|G~{TmklzR8+f5W;B6um2p0nxg0u!>aaHV$Sk) z06Rd$zYS{YFzNv}|hPKiG`ChXiJbF;u5%UtU+X#y&q>`R107X8)rKP4~) ze@vxq-`D($45V+((kq$VNRtVYkX`~1AmEN9do!^|vZ0VYbUmF@0kS90P#aQ}qeW`u zwWR?5t+(R%I%`MVsK+5iJN4)9d05^61$1bIH48%upQY@vBG?U+^~B!sla?IrOD2jb zO?W<$SxSsOH*S}W53*QlY+S_0Cyr5xo;1 zsu!wGFdE<7(4<5|60)^MnA6iRncj%Ya?}^nG|#f{s)~cJzcgI08pitrT;-^ zjMn0dM7;z<70Z<7zIub(-X%a^@x#}a5+->)M4&KDp|z#Tm2>)V9JH(^NkRh}VO1i; zCz`zDP1!Z~y1+KQgPh~p2npUtRUMNakOPY zMe7Um^UP{l7i=Frf73Kz^5BVrg^#*8-#&XPcsNm$-yFe3vKQhJc;3juqfZgtG$Z}1 zE5gzbZEnCRZ)Jl5>Up9AASiq!MI!}iF~Glp{2mr5oUvf0=fHc(dF8_!E%_(c*%^F2 z18T<9L-6i^qbYd$Z@F^Kkhd4RdkqGhTaP(inc(UIuB^|*JfAn}_BMrE^Ta>nIO=n# ze0qFQt`MuG=tN8Y&Y`pea@Zp!zqbPr_fC&@`ID-i)8W^*rOhW+eqWs^=bm974WL}% zjCV(4V4v0z_R$p2g+Ou8`3+Ipfja7vQ1PI0R9HuPb^-u5tiE}q1Ulds7;2ha+=$XM z8dXav;zi#X9v0LVW`@!khHrViwNxJ-BnQ<;L`mje zvC-v?xQ4VPBjIhlWghXJaOmbY^D)SkEW_d(WQ0Q9J@-91Zy&kyMjIb98+0*Mn&OJn@9pOQBMvToW4b% z^CzU5_f721jXelu*j4Lu#%wVwU(&CArQ==~IpAUzM_y^JGqy_;OI||kiZ&rtJt5dY z`Ql~ni*y1ED#C75J=#kX)&o>?D9^`jiGQceadYYqhk0Rk!dQm2V~i87Cd9)A(SL9= zhb!~U|D+aY2g9g&-Kzw)BU!HNt4oP0v3tZ^t@RaIi+HBlt~MRI5F}2=V;LSz>82T} zFJ96YfYAh@_mT9ozF_77!)kl@a+Hlk3fMaJl7z92z*E;xq3-zICz9!Gr%La%wkyf+ zCA|bDLW^1m#Ji0zG=_k%GXgs!PG>)NRL~?0<4hrH<+HI;62N=7U~22|v6`7Cwy-wQ zIr#@MVUjww2AZhZ5tC2dvLczL-&3Usos2OsuS#qB{zzG@F%#9Vxw`RY#^Dyx&XUD5 zU|n;|~VDYGo_f~hHxrz9K&r3jG;b6F8%0*-5Hr!@`p;~L!jXya| zPo*+R7;T2kVK`@`^Bx|Y=6wpXUE@F-OL0L724q>}gK~7-mm~mX%e06ZMvRbOwXvw5 z`R6V3mI;2{=NmIVxLf#=k{gXh0J@z}PMxBTJ!>g7fJWQJd_Nbzq0TMm`?*AFZ+^6t zZ+ywdm3-qXZ5&Invo$~JBv@qRD*3wL^ug-mu4JLjFK?sIW8LWCw1`?EUIvvE^bqk` zBHepAM314f>RG>7FP^Bh=l7p9p zl%opF#bfFhj|6gYnHftPbCQt_)Qf`dhA4%6pidNh*+vLelLz)2V1nRhS1(KQ#oF&a z(l2=uUJ|^YArG^dN3zc)`nmc~pSzk_%O_6MEM&=(uVzy{k<0jtqx^_yQjH zKbRb)x-4mq(*H1buMRYHEFos-5b_LTFuH>1d1OZ*Yb3Uo`i z?wywX-+Z>R0jfSVQMr{4e^MAI6x}6|QALy3Zga7JnqT{1ax~4nRG`*3R0F8tRrsF{ zA<(>5;6xRM43oKC&W}YcCK%T!$`=n&<;6iI$y@89)&e9Y8MtU^X` zDXf{EBiM<3_fjlsS9hwWzSeb9!%B2H0jQXp34L`A{!9LTa9dWN&(DdkE>ZXzT_HVW zl&j7ZW8}XbJ#v=jwyZp=2D7fU-~=_oYu_<*9}60eDwF)IuO_N|RS=$sV#*s-wccvS zG0jb8dO7v=5Ha0($_3_EKJw;L)o*&VLCIkZ9t;u#vxuxUYQbVOItnh-uySdBUHOt8 zpsa`H!|2kqT;{3;AuU>5r@Pg$z_uiY%I(8eKT;7cG^Ub2m=9#Ft$^!pl|=mBKBD-HW-*nFO!A>*{3r*fETs6{#F^!T7ja!)r;ucS7ZGdNsBFBi(`eBiOZz_H37HRDgW^aInxg! ztXi4WczbD04lmm) zM5V-mRT(bC5ivqF)3?%fjt~6+pZ=y~^MW-R&9UM63mE3gjzY6(;Fuu^DD#}+C9=@$ z{fVym^uv)=q@-N`2qf+k3JBRJ%4YGNc0=#>)7b5vc!ikR^y_z^`TO#nA2yZhS@>Xy zYo{bfR=)b5Pan9iSpE4FN;1iQ|7bTfMfDibOuf^e!;|F{m8<2S)<+$E^M~lH3nP|W zpE-0eDQMr)k%8Y;NMBU{6G#t>Rn^>m9dCLf{i zjk>nr(0lojOSq2!>p}BRjiGuN0|~rQ-iT=@TVAW4kVc2ULHJb^>x`>cu6ROA3dBp+ zL3fOQKBpa2X6Hb@pS6xS(~np<_mjuiylxjc`t8-unU5QW&`V}Br1n9E(ak7zs93%N za~*eS^GIIi*fgj6xYp?Mo4hzUI6Bdp5ig=&ez*;efnK?RAq!OdvlPo1CMiR9doL-o zFwQWczG4J*l;sndthTlPg2b8aDu%u;IQVA>*S*_Aq=-TVYbHrbPG2d5NPb5%xc@^x zfGL(T$AEsJ5=J3#o2kK^mH)-zLin;$)X3mt(cRz8%!@Ixo4v0yo7YvGWBKje)U1H5 zQ*$m=hqR-**QlgSS}wRYcW8XZ^)q^;tyNN5edzJ$JQDgv zx>24GehUn>Jx7~>C#|-H95_V|(SZ-U$|LJ}ub5VEi{M%fwnjx;bEhL^a7zpE^h~jR zKLMy~OB!07P-lPm8;ZSBEr5oPMH}w#0b$2Q^SSUd zlhEi-087_EU8^JqJbwq`NGnt_CvVvYHrGeZ^F820AJhh}um2Q*Zg zXXgV88+UM9mXPD%F@Jhjq*gq>nvt~d{?my(AqdSn`SZAQ;P4JEnkNu3;Z1?q#~5S} zjO!)i7GIHRb!39v=}XUsMN$v$Y(z(ALo~Whi}GXAj-ROQSLl*}iD++5#yN-65#@De z8PJMi+rLQ;a-<>5UIt)^EE+D%RWHqkYsI5Z*1ZCgW@B-wZeV}}Ljz96gynz!DRv=V zxYdE6lp6JrCo`OvxnKTp*?Z)Jj9Ej}wy*+Q^=%R&R`hiXTc;#uE*dppnacPQ5Y?Ex ziS&)y33UdSY9X25CsaIXi^sj&Sdmx&4h%C2p}UV@;%)!By!C>2@F#YeE;Vv4WI7ru zhw5alEi1uMx2dU+Ay*>>*_yBzhELBJgdm4h82cCXuxcU|0LXA#iznERoZ0!kYvZ|b zt-E5n6YWO`M}n>hUi!khrF!q+X^bWw6&xuse^RWeBZ5Z$KBUW@tS-x4@NQiPwD65f zjN^rzR!3kjf48ag*!nz^ysP}X=!d0ir6Kmg)WAbnWLF6*$==WiUI|-1_1D*Q)6&v+ z5_!?n^pqYeUx8Tg(g~-Npbzlr?KRbg4@B?(mdc3>_t_?SIszLvLF3qW44K!tdHbEghcQwT;q=H`;yT-Xn4QITZ- zx&%+>dOuOsYU(ijv=WNO9is>RSKeO5D>VAr?$|ZKBDEmR6gx?}>5|t0P6sQSG@S-4`5; zyrn3NJfS?b}HIH&nw2sA}jAlD%Y#WTX-JQ?# zBH;RP^z5Knxs4K_fjiyG%ywdUXaSel`57qpau3r zKegm)X)QNmhx!H1-`J-Lr&!rFt&q;i-aK^0A729wL=LU0VCen;^E^Mv@ELS#JZcZ&ZNWbt9b?PkX z1%hdAzl^Q&MqcJh73ljf&sp|30kcu@>21-Ve_g#Ss5oG?1)3Vf2ygDMh?^G?@~X_) zxPn5YkJ#|ydp@uTkW?be5@kd7B4$^pYmS)#5^%OZnJXk;&$r?>%pIV5jQ z)*G|)BqejENV77dO8aV-T?@!%xnqTWK3QZ>>t0l%c|PT&PLFoc)w?oZ*g zVV*R(PkegII!b_r=u*7#YgX#iXgkp?ws9Q!{6n41NPW(!zdm=n@g_Z=R+;BOE~V#X zlD!!s6XWXuli2x8OY2AxU4J5QrlR5J4#kh8MBoDBB5OE~06Ec6&|0)G=d5A6oH00r zPNS03rj7!jIy|)v*7J{JC|qA5NWHivic}UQIxQe?S8Kvg_CH{{jAlSRuSG)g2ehHA zI65<~pFQJG7n+aeS42WJdnKFz}SbmyOc#zQ6xA&br9#Db?O9O9-i`0|&-O z?}~|Q^Q#(A2X6%mC9|E%Qj?j%8GlZWwufZyJr)XCWOEFt9t*csH&LdDVTMN-PRf1- zwGJMIm+dmGl-De>c}*)=}a-X%`mKIO9M2?Gx#JHTV1{zz`z4m63ED z)Cp2vQ9eGd@F*{sXXz{<>uup=SskmR88z{ho?~`nH6%n7%H`LzDk_9gb*j+9EbNUk zn4`ueh1!Y;5*D7Bh%dUJ)AF1-z;RyII=>6DhM!Z71cQNYSal7)6>MzqZlbn;)9S4(?*S_lR@!DE#r!*H# z1sUkNK+;XT=(Ormgb&r<%SiB|#w5e}^brE31+o>Ernb*-R}nb=_evMz7ef45?(?W& z04rA2!@l0qMIhRU4zG4cSto)b%6Z%(x};SUXI)du=Qp@!pqWZ~tvPd?xEN}EZ%OV5 zj<^gbOAartM+uX@reB^tVggVry4U)%;g66!nWakbwxmo}MfHk8zZ?=ezSh@qHZAkA z<<%J@V;JPfXVKc<(viVI_G!n$W775fJpj6S`lt{x{>zlvjBZU09*vp+F_Rpj9e?XQ4iT4g?hCx=hm(-W{2AEv* zqD-w+nKEyskFT>L%Hvn!3jCVhl_P1FQm_qDS-npFYpgQKVV%>;)F&)!w*oOi1cDjP zs9T-fXT|B5T6yK8UO*i<@Iggm*40qg&rb$0SCF@6=9hA6us*stDvn~7J}WfT*D3)Z z>G}I5Fo!+*X)3v{$ev7B`eSfq5K|l<41ZEwK_I8+4@TQve63oMNUW0i}nd5Dr1XSG84hO&^>3wu}fWF{oNGQy!kY4+Hy~B$BFN1o0(qcx$xO_?&gQ) z8mtkAgiFP8psd_Zme|G#4wO^et% z%E}g~@8H?JfMmQh!?!Q{u>YrXSsEQbJd(`QBFXs`wWh=455lQE-kQ%%-qA#U9scXT zgtbCZ!nkC{waj5@3%t|3z^cWl0C-D`OI5PD0gkH^tGBeK0Xtx+x+c;KG$4L2tLG^y z4*p(u8I=4J(#9*@{J|>64V$$S6~}$fp89!6AgH#S#xHd&)?d+`zFl7by#y|vJyo@_ z_a48BG%oN#dXOu7PgExk*=n zbtMP70@d97pZ+}kkV@xhL~O3?AOPsM>gbhg8{B2j;+bF8{N4-&uH?DI)Knn3s_51z z?T|Arl?@{`GK1R;A1|tz{^VkjDNbam61yZ6l)xN}XjWlnF_wlKRPlYN*gP$6bipO) zL$(hNRb?V%NhD5|KKMEUIm9QldXy+^?bdD#i6}$IIdos9GT~pK2eOR|n#ME$7&*@T z^Bj+%3gKmk&TsI0gkw=}1z%+)BnYEp1@eiO17RT_^P*ajF?gTm`i>R?RUitKZcPDx z-Z1>9E)N%~sQn<**C~(>DitU99#HZ_i3KoWBLBep6VZRG@})mMS3D1~LrzIsMg zdh;Q`-?DDt1oR8K& zKOYej(`BpNhI%WS`MSFzlrVEW*oN>Hq{!U552utKV#^$U9E&Vd<~PdSUu(8wIfhsj zMg=1oc#}1ty3n({cq|P2Hwbr^XYUbW~uF=H;1J!;s}IT=``x?%!r8L~U6 zDAsL9tcUGF6}^`Xm@lR$4gQcceI0x5$eIn2#a^>x5U^_(RA{TAH`>9R_O^#A_;%~N z(c6xQ&@~gi=H=Khs7eh(JE;v491L@;$K&TOI~7^EOUtyqK$zY!^Qsen1muOVF7=JQ zB1{?BP-`^dq(I)<2FwaqKVc50wUmMm80vEBuO4|b)j>2w78`1YPt-~XAGD~2kt)WK zcjr{b&5@FQErfTX+DeL8bTu0amu?nSrp)fJ-}+?5%Ar4)@!nJ^I~BkPt|v?!mV8jh z@~rBVTA9AAN{OywN1a*ZpybaPrFc8q94SuD)U{)+det{aeWR_JK}u~rENfc^q3d@L+Y7_3$wV(FWHBVN94)yeesbVDZ2nf zAh(K0`b<1ha!PBa@oCKH{_t{ktRi47k+{N;@?WT>`6Y)}k%m!{EL~3J-_9uUN<3h& zr$#KEiIYiiTOjI~BbADkpLKcXic+_#?V8GCC!XY z#NsG@rp5ws>$QDYzLUBJuS5B6z7RXU0PO|N-avi(V04oA@oLm*UCPC0Z+;K+%z&A`3Uv5BE`mmD_2)d zwWiKosrJ0EPAj1WFWlNY7PX8HR`I6%$nzw~B?f2ypZ+{Zp1% z(1Mn7pJmV$Uy0Nf6|cuU{8ta4#bsTcuZ3!$t!=7D%C)-5tORy~0GXd^kD4tC#vt`M z(qtGzCc{A42lI5rfkH>(bxNQHXUur9_misy6UH!|G>d$d)gJ@>gbXMCec4yP5SUAf zK0+&+5NnzRg(|5x;mxa#({U?zD|Xzla!uEaGZ*VELtQqhJo#v5_ts5yKwF~3?JQs> zji?WAOLMDru%aPTdfwjtY3P=*(vL~aqox-xQeAVt}1@9&M z##{zm^dIa7pZLf<9)alruH+!*K~-P4OXksI?IlTbvQ|`g^!Sq@+CmN;q7bxKEh@Xb z`}VjdhWc|=eUWD9BjpE9sLfFU7b0EFZNL1#XVh~=3rN(74dbztpZhSP3!5455`fTR zOaNq$7UvpH3}anaJoZdK+;CpM6M}tHExyfDGOvv~5;q1L(1Ad5YkH5OGL&QcPZT+l z-?z$dYReOr-NMA<<@nZ=X*3jA7p@_C)9`(H)D-HHx8+gS zxHs~TzaWSvxjn4XoPVw~obfzIZ-S66IE~AidMeIo16wd|EDyr2QXWBgx)EX+zCQko zKt@)WY7-KEk~Z7x4?y+_Alv>8keMHW>C!-@b;vmcxf^-S zrysxs9ykQXX88zADrT-QN5793@g*t-uh&H60ZA9^twP8}CS5b5%cZw^!7FDmg zi!pqZle<$5;?V*-N`X~Lo(lo%T7lYR<;~712G5zCcL2#QJf}m$7^l~QJVt)zi??c{ zNTzwB*?fK?rd1NQthia4mN{Z^%v|L$RgRgZVFJ_ofL1&v!RWu>pu>A71ffq{`iDI=8z+qRD*Njnx{nrV`}rQqq&~K1;mDf}YOadYc#+8(-^{MRcu zUgo2LOaKpyy|Tj$&?*|LX7v1X`-6WC843%l9EO}+>)p*7XqM9^p%yjE4*@pxlbupazAf&=%N8}a(EJZ&OAw#hS=E={NV>P!`7tv~Ey&XcWI!!e zB@AB;H5=>&y=y3_l&MXXJbl0LWl?S-vqg<+oe5Gy(7BR{1A zj>}}8ei$uWB5PM$dQN2_W-j|&^8#c$Dfv*3V{Zllp;KA)AyA~5_=RVv0h!Pj(S(nR zp2oy}lLrycZh+$->E*Aw->sg%+MFH$pHQv5@TP#JWlvsM>9$^A5v&3$u78hHGHcW4 z(3(0#g=-#vK~Jb-9xZoGJnO=*VdAxB0^G`P}yt{%Nc!JSx9g}&ya+l^$%PMZ=)t|ScuZb%1`$)$% zftNKD#WiHIRnWeoll9bBo-&!MqZ-9QIweOFu5NRzB3zMKk;GCBg$BAs5x)B^ZEIs1 z@1(Dg1uuEr*b&O&G<9e3M7)5_A`svR>9^UZ!_vxE?$imuA9Qf2Wde~@MT=Mt$Iel; zv2zk5rflyrlA|Rl9qe@=an|0`nmtWZJ4~?kNs5I^2N?D(y@FLdm)me#d7kf?W#d$H zOwQ^*fz5|9>LtKxYyX}uO0uG_>kQ?w0x{Zq&((jSOE49m?|ew@0I!3Ht(-K0PFE*Iv4^Q`~yg>ZYVM{A%dz|vX3B6kl!!;sV zV6hLZ=)js8$ra~*MdVpjB7R9vp8?qPvd=;?M{3T7ICVdG6MA^FNMLQO$@R8AReY|y z+F{c94}Q zt9yiz7R{-iVj>B8oySZthVDN|a<6P=1-yP_2^(wfkWD3sGl6dj0y7-8KYzV8b4EsYS2-=kob?!iv?plnz%u72@KG<%O3E>}ma(GXhEXaVNZ%$oWBaX{z-nTUMT zeHrI6NM%cvXJmkBHE?{yVClFIbP~hnY+nC(0s`;T2luu1X{`RwpuMy^5_Spolkh)) z`cqR;(?!ksE3bVzASNuG^c}Dh0(LZlP$pXOE4UWk{&QLvNsNT|sI+b_vWC!~9nxG_ zPJH6BnGdzW9_T+pX1Qmw2;kd+|4$tUQFRnb821ypu+maKQQ|V@7BIrB&ZWme>5KFU zKN>4CKRH&%&k!n+t^6W$3^%`1^JOu)##S&Z{z$Iu-{uPWmKj|UBVBhGPBEU2CM``$ zcYk6(RyZ>15lp7XjDm^!Q0&zbv(2+oj5#Q#Rbl?bbj1>67n1k*ktcf?2nA|Y2iMuu zemG*t^MXS`;To{oC}tcOg2KTNj`u$cF+(bs)~5O=mO}n6{uh`xIgEJOy`52_9Hqa>xw=*Ypv2#`4CmIFtQ4q%owG&16 zgAO4%RJQFIB0I^+psGq=W_?JgvaL<%m^N4bj~d$w<&q*aeeuJ2dZ{UfnCtH>1v34*bI< z;stD%^7^Mb6Bjw556$%bp=FRnFoD-)z)+6c8Bq(}S1(Cco0YtALBQegE}V*q_Jg@8u9DYWSJMbKWZjT`vXbKV$Inzr#AY5N6}aY zTbAa=+w6XpvYCU532ZB@l0)CwTiW5Mc4N7#SSdbZHY-1(@P4id&p74ya8Lc%ey{ok z#4UdQ6u0=z5hk}HnxXke2HA`hzEqOR;u~r_!ok8^=@Aoh%goYH<24Tlg-Il`KP!A~ zMSpoTtBFPHJYP@Y6mISeCs>h*erEk>x-XZI5;HzKa3qC;R)|9%VaYEPz9rXu(F&;x z;2d$Tm5yHNdd)$+mkE3BZb2w)O>-JS=}}XT%Grrr!qXAui1_T&|DPU;HYIBBV2;RS zc7}avGQHI2KkGzJaH%>d5Fk#@eD(UVx8H#w(4nj)jd{Z}0N-ozEO!9@`BzeGHL6y0 z#TYP4e~{lUq)@XP@#aD+xLk6>8kEH3nC|_u_HtfTgQ|!ZMV6}RqcA{y04Mf%2(?VY z!Y*+i3e~dDs+#e%s+tKooHM?DRd9n4uo>ynI4Nv&pHfN*$PTvE#qVFo?k0#R_UdD> z#tD;Bp6YlxLznWk09H>^;X(i~OaJ^x&^={orVILcvbW|En(#)Embn;Fa>2m#&vP6J z{RS~0{JhyS%H(f`HTTie#E%zRPKC=`-+lUYJe!>>xKpD;d9c3JHR|iha+@O?R~Pa} z`{L+4zh~O1E5RrKfg*%IG_!0&rTX)?h3r`F(7iOoHrI8xb$e$iTu3hFvE~q-=qmu1 z;M6F*=x0Akkw^aGcsQR7s*BfW`J%H5%`V)PFc**DGJY^x2v+wQ(zB&i%lquo?jfY- z;OCA0i1KarzK6gO*YxPf$8{*srf2zQ!PdANs7Y|Qgtf#t00O|Qc(e&J%s>zz9fNaj z(fs>Kkw`E(R}?jRfIo+?B?k4e@Vhnm+lVqtik5wO2y)uWdZ?e85pf}Cb3Wiup;9cGknqA z-6%UN+LVK-9D`8&{O!D27UK2`1l6RSsLq7TvOAu}@4Cezy?^-LL14)&qUPGiN}K7SP5_LMJ@JBc=(yHlTqm-j4k*qpx3SjG}P(Gdiki zHHV6Of|Mg#AgeBhk?`?AWn5$SKt4xa2E%PWId1CH#FZ}`!37c$G_$o!s`c}~JMm}g zTDl+?zyd7Msn3MA^k=S*^1J8NXPPid{(t^tM??74b@qa}o?=ixbL+B3ez*=sj$;!R z%1sD7S{E-Ik8!whvz^ZpbxJF(;y5d0ere5Io^vuCSs1jJj7wmB@F`TOibVFI% z5|tq#7<|;2gJ9@a7PDa!eX>EnXr5amej^UmOjMS{G zr6oFB)dH?Gzdn34W27L`93Idcm>c4c9xz|?6tt^1(CXVK=iFP+(rT%j9W(U?8WN;i z!rj$eSlCy8AOOP^xk2KSHZuX$5Adf*uDGwQeI93tP%FoT2+jhG%&w!_+cQ z%YrRM`T~__Yfij&Nm^N_xr0&NwGW)V#*%#R3VXb-s%U$G<$t(fsGB!nYTqLz;VV&5 zW26o+N(qN((?rz>voJfI*RrU{@{1c!!wU=kTuIMXYBHH;rXF*qiz`h`Hc}m~NE%?* zd?tEKK6zjcEqCS2sw0xECS6#QQ)q;w&=D*fyX$XvnPld-KKWz_s@VRbn`JBeR&Y;s z#f(*~CD-H2^!3XvD-H#@;dyIafHPfya?ediQUr)2m(etH*@)U+twtm4{777^1 zN^gd$`ekTKB2}}fl8jlhZ_jj(JNgmo)n^+-=%Dp%rS?K}sFnZ)fApYg2@kO1R-V&M z3uWicn|tHyzV-x0)nlmd=lsB$8boMu>I}A;k-vh8@)CN?fteNmG=`|GcGkKj9}*~f zg$@=%{JwuCELHm~(4jiyz`K6s&N}}$%aGLGnD838cFoh#k_jZ4mxDU$Nl2sUTVIFK zx27&&PmNOZAb4cdb=BwE5cxl#PmuIjktpbn`T)ppfS!6}|HST;@60ke&HJjlDhK?DrKw;lmI92%(~^4Jr?Lh!L6g zVCG1tW!VxO0ir#aO9z_QvB6qLjjcHAhclm-f5d?uNisJ)&?#+WvRCDURB}ngtZJR> zm)yPno@zRF9v8QMs@;1!+#I!p^kw-m_I=zG^x_JBEw@|E{pAXel~N>a3VD9h(l9z& zpU(fZH8>8&ZEXy{{}>EW?)6WYy6S!P^R4FAjsT-77m8ePs17F8GK+s))ib{+*IMPN zB?Kia?VnR|d#l=S$GwdYe!ktr&+~+d8iBm0IoNk5uBF&FSG|AiwN9xBpW;xq%QO}P ze4Xi&$^B|&QjV$a-l;RjyvivWXjL#)-Gd0)6TaZh8>lme8kf~?;1USqAbC_}t(bJF zSD{v9?^83K;)59xf;#G|>K+C&yEZ2rNW%??GNkvt1Fv}?#~`e0$^UH9g8(+kx4sT@ zpc2NMCJKjQW+Ll^@6($jlAgDe!%9G}j)tBjnCgt+#S%Ftb?LZd#@hot4a~dy23IP2 z!%AMliq$w^o$fhSS=Tt7+?PpxHo0^|zjIjpU*C^pZj8`XHAiORO4h>XYD)bqmTu3(e0aczbujo>BE zQPUU6?$^g#u4#RbZL5F6LkoGx;{o$POnwtCSsD9)b*qn+D zV`qL(#h4a6XlA7kO_G~+6NA0CKu!$NE`#T2NZv&Y*t3peJ+VLawIF-0D7-8XxnCo3 zang2FOrO?iW#xy)h^8wOxF%JB8rEtTb_13++OOA`n`M5dOjp&KL=<>^Qh*S)E1;m+oT=7kaZ!0tbU&5p2kg(=LJw` zb63wjfpbW3s3PaX2_-Ovioyj+Q6GXCPPN^j$3ru-^{hm8)@t-cLWb=-d{Ho4afO@f zAD|6JO{vQcWeea@b5#`aUAP8Rz4Hq{)fXhE1lxZHLhY00fTeTB(B9q7x_CT3DX=KCitRaB>Ls5wCr9vD%sHHzHPt#SQmS9)TCEd4O60M^y2 zcS@uAr>ii?O1@uZ*@;7pDx#)ek+5xOm1`_JJoN>$zk5aapShGvLw)TW{A@??Xi)TZ zv0b{c%R?TZDq}U~T#Uco7LjT~gJU}dRAgpwJv!~?6^fcXZ7{CMdn-~zJo5GCf=6rK$u(Jb;E-%4&**El&5wOgX6?&eW_2nUt%i7! z@2=8;pNoHuabM*h4PFH>3jRnbOOYtLR6LsMv_NyW>A1)u556xiI`qI%A{rDid z?fjW|r!9T&g04GjmSb6eu~uzg=pq&%gkPpM^3OWCH+DX`1YVj$kX_0**9DbVw7)sM z>&q9%pW*F#`l?;5&ex%^O>OWbnu9fv(<^ImMUyrRjQ+UoE?to4)@1iI8aaB^TP4cG z$pxuQBnkV1wn+Bh7cCSTc%ik>w|Ef~x73(`<)C~>Cw~U7=mc0l6Mvv^ zQYF6h8af^)`7d>2;JRyu+=rOtL-aebn5D1H6s%~Q#Y5pl@V?Lvr%D{R3XNi2G221j z(I@$YAZlJtOKSI16XB-qUX`mInBS5=YiA79fPy>|ueIkdzcMd(urV5$+$JW>#0m|} z4xo^Q`x}&Rk{w>|gD-0ftUP`2yg$)J!Mv=LF&QFf;RkooN-EZvPn>6CA@KT>L;@a7O4q z_vO{+xQe%`1-ybo$GUp<{`CtM+VW|8>vZj@tuKfN&f64mj_dK2U+8LPR9zw~ccH2@ zT`kwNe*;Zcu?tVX>n~5wu#p1#u>%mhqlK50yM8_+w3ZbwjTxY8o7ZMOeOTIOFZ3c@ zUi^&zE&>|M=6SEW1u%aEjn7T&!5%N&yyk78!nr*C5r~+7_J-^K6A*w8+o+ay0H!O^ z@i*iVE40>UM^C!)w(x=!|kY#Qmvd(2DO20|8#bj#=^mz)o zzce(J?MM+j?-m*J+$IINPFSg2OH(5xB3AIs_ zUMO?sYYMVjg{!MAp4jIQUq52;5WDhdK6y}TuO!4JGR@Bp3oq$NO=O1)bKQmax7-GL z!=t6i-TrLtUj|LmCKg%*W0%$I*-|fE<>-dwEE>}G#rDSt5}~_6>#IdkVm432IFj%#p!n>!dXOzXh9i-A*OBPl#= zVYFh>bV7ViqyXo<{Ql|jO&VLv)C3p_w!M{In|}Hy8!t$p`3~Ca1MDi&1S&cnTVB&? z+O*$An#|tkVEJ&V8<(S{UI?l#Koj_3>_%2T>SwL4nauX!3Icj&`}Wn3#f_dBqPr~7 z@s0VdFy8-gm)BA!qPdsj*4)0&qBL|c?SXV|AurjHnVgO=$_bed#4qW+!|H+|jvtf2 z7d2LcZ$_#L5p!)NBo;7HVsig68w(a&hnuJ(lYdJMjDNCtr86+f)r#Ox7gT&M0TkfS(y)-)%ofZ8Sf%H~i z%Brk7HC%#4r4Xv#G3gWD${RsezlT&oH+ggBwOFeW+e{S@1b>$N8Jig!R9LVQ{r<4H ztRi=S%_gyXn^^slEnnLU{w8XF-$XoCYAbeR$(BX+nAVfCjsJW>Tq0dNN0W)g;9v&sOQl`S zok$yg?I)xggZsQ+Q$4zK1g!s>(RB&R)qO$b^XI*#)l?TUbg0{!kKYC2mrUN)QRG>S z9L84j9VE4E330^^j6j%5MyZ4UFmd7}*wQ2PKX8gar_CY4IRt-C>L8Co8Zgz01*nX8 zzpR-)G|T)V7Bi)!i1J6FIwZOoah=4t>oa30x!O?N$)l67K(xNup>=!RH=d<`U8a}< zDM}*Dn#@y%RpAA3g8r&d?!d!10N90k$&$$X@A9XBi%I8k2byB)gg#+lQw7q~UT&cy zMpRfFa4PCdNRNKTcNVKgI-cosb`*a#NgS>t%zJ42ruy1(cSr&z0BbAOnc#q~wXM$k zBkf;htLSu~Ks1MsmfRSQtaEpVDwGf0lKw9hKseufFQ2+|J)Wo-3d5J))?O$ICxY_O zUs;Q_B*8{L6jVs#UdC@dRn=oiu43b;^L34DDzoFa-M}>=;{Ie56vAcuQVIWe08`yhpzo(qUSCMPhe;O$Kp?3-LwUBh}U{uslNWnAp+~{WKaM zvx+olr3+k=OyrwK@;jPN>u^neq6%B1mC8a_Fv^J~5cJN+kE45pzDW|(D5FxD z%jj+RK09bnxv;eWO04yErR+i7nvfk+U6yuT$F$3~gZ7`Ue;O3;jz}Wge$Ub8SAsqa zf`^7*v09aK-r#>(ghXQ}Cx(H+&rGnt2lf}Gq7_K{^v2vkV*$CxpfrJN5~S63+?oZM z{ZOio#Fxfhjx1C$cK=y{hloM}gr!CF>W4cH9y^IUrr9%nmUI6Ue_hI-M3d!p^mg}e z+5M49DtrRCP==0mgj9YmKN{Z5!6zageZDV%6H&bxoHx@h=^`5TQ4_L8Ha&^msR5~{DwVa%v)JnBBFvNoNkNTm za~{cxrmV6PV?T<-G;v%cW9|Fo6=^am^OH*qmq<*_9&ES5Eb@E|^b0&b;C{*Z3himL z{wjvES@P&HGgB%lfjI}stt!qW?H|=LD1`nawM$86mrL)1c9rag25T zBiNCv#gB|1gmR;@Ypag|&Bl2yA=P@_^~X|7U8~Zc#{6?m9D=0}NjHMC%Z941|5zR^ zX61P;tUeSs6ZU0^q03*ryk<`9rj_33WkNducvmw6VdTo}5}5J1X~a(6t{C86I5sSS zjl_Y(K#J+aFNCrBn<;kgOnb>`e6*@}a9u5XqV-O!!W<0pST`7J`iI@S38Iqw)ll5l zZp8~YCK%<^C|jiv`3q_0tB^hcUQCxRgBc&EnQ?C~Dy05{d9Ck34a(Og;hKL?>hZFUqdkrH|>&;P-%6u1nzl<9EfYy zHHUel0V68#bJZA15+cGGSdepjlVDE>u5H%g6p?CJ3SLV7vMuq_0pq43yAhokGvt%t&+B1G1+^9xiZI$Pm1;^oG^iK4buY2F4JstZjhO72_9Ix3 z7&0zDFjyMjfwEPph^X+&QfY($XQN}0J(~JUh`4l-n=vZV&ZgZS zgL_Y|w@;^A=+92OwVvVW354fw4#j@d=;Ud(wX;c5cnkr84b*M6U$yH0%LfSV#BiiD6z;Ec_}&fit^d^H0A&z3g{8^y*GyJ|$O>{? zraa{K_Dmjjq@KpV#N6zVBGwYsmGn(?dU=|mJYVAPAtkbX5&a4?cgB_HPxc0}7A(iD%@gOR4^ z*il#8%MVe=U6~_x@0J;wfF*_pWzya^S7%yWKxy(cbxe15-a*@lzz)JpCc0gYU7Ghl zX<(`u{MFa@G(7&V^CP_qi2?`9WQ0 zdP#33R__oERTrGe1Wp$x>5?Y9?;1ZSNYf>tDEeAp1;*mg(%1ysZ!O7!7NF9?VT{kc zR^%XUl%Mo*F7I@G>O@ny?b(Z&#W5K=QHMHMs$WxmB|C$tR337B;wCg~n6Bv0AXOfD z*)&ZK5!9&5J&~R_f1RI$ZeOjEr(9JqPeS7Ql5&+R2)#(&g1%Vk&fX@;f@6Sm)#Fe! zenbuF9<|DS9f}MxNQ_rUq11r2T>f=`R4K*^22*9HMyQ?W>EZJtG9q`++*xVvl zh6L*6)_c?Oou!-LXrMR>%gA6PuhZL#5H#MkVP%_QB_%@QztI^NSz~?z_qWG9COyHZ(tkk-|M5GTj0RT z!d#kPz(di{nj*+cj2$x{&jmlqGbN|xxW=;x`zYonb>HDOt|Asm544&^A_{|zg2%$Q zs}u_zix4ZQn6+0H=VZFdB;)BtPes$tvIs^(P#k$^=OqlF7%es=pp(3?8IPQ`QA~aE z!0kHq#&59gdrIf|g-@5RVkDY>1y@O}*BDI3qI*e_$24mY?q^d(r(=3zPqjBLoc3VU zP_H(edUoZvOLe(%S<~{80~3Ni;X<$NCxT*MzX={{qS$_!Zxe{^8q)ePPY~!V4x>)zIi{T-(+} zC4g@07%f3H<5OZA_DXfTMP-8-bjaMnyHWuOpZSGG)ISbrFYIhU0d~sh=LIecdwL5P zE}PKuX2vj1)q{z_KB@`5#zT9?$S?nrM)aua=+HhhpUES?X{n zjuMuLFgX+LFC_7zjJ98(YXMUFW@%}?RT-!pOo367B7!jBVAdw1eBE*Yn~kOmSf101 z^QqEt$bW9F5ho+TAIez)d|Y3#k3OhAaK=beJh-+<283+jj>eL@x%5tYs~yQpUT`w} z1&e>%@~H84r-TbPLD0KCwPYH<-m~F8dG4J)pNo zJ3|lb4uWo*(MxFQA53q)o$sfmN;hy#{f;sg*3;rp=p>gFwe?GlG?^I0-sLefD9lNq z2Kb1Or>9U&96^C07b9+uzEC6m(=ryBoVh}BmU!y`3QFK0$TJMtz*;+X1v&&+>iF_{ zJ2m_8A=o4695)*xPZeN82P?kwS?1Mr+n9>~jZ7g3WR5AgYNAr{qi1?1WgDxM|0Z*@ zR9Ews72UHtw-|estCC7?s|LOnh1`hjz|bfLu-zzzurQw4_qR?_#POyw2yK^%%Z0a% z^pGE1YpVrFane0>mq)G&qJF?L()qyIv z6^-pO3OiLNkiKN}n*Wrj`~rbRt@TVdX;PEg@p!O5=$K^t!>rB^_tD0$lD1(R>_hwp z>RUv!5*#ob@8K_!MNu)~MERx~>CVQcu#fsUuLfc@IMwuBm4|kd@#;r7&{e9=Jzoj1 z=G60gJP;XbJ}U`Ig-D4hr0doJ@+G(C<7*0jJwSM6LC77c5RHA`fHCycc@ODahRuis z+XDoB7DLN{+m2hqxfya-t8I3El&iW%L_(HS{X);skuv0QW9`1@aYw3DKOmU?UQJ)V_BB@1 zH9rmI&GF_aM&8jwlC;F}e}!=anCPdMs|sadP{iuF89#V-q~{9iyyo?|%aZ3VWgv!- zK+iG>+qnpokRuNii47AI51a<3bx7b~7EL$;n!ExcVA?buu$Me*$4R~4Pzx}fq3B9R zeUn5C%0W?#m3D}IWh{0!|E+_1CI5#G#2}6QYkxjq_itAsn4t9BlHbN#*!qagT(ZL| z5XBCD$E;)l=c<6kKOft z`Mb*NE4oZOax_i#y#CBTX9vNE8NSy%LSf*crQj(OI!wIKP0}$r*uq7*#+`c>Zt2_Z zLgie19kH{zhwI!Qw46=Y!Q$+iiYK4UvplXlRX&T>ADyOZ5@)M{P#&7lyfT*4Px;rh zY5+(0p&UvX0Y=irdfy?demJBZyT4HNIg&ad_k3^BbTU1Y!yk1U?$Rea+5Y(V-)A*D z*o%eX>;_&~!CrrnI&LqKu>g=3cIYgA$Z>F7+Xqhp{vh<02_`sn5>O4E$LQQjN4z?B$!oaW4a=T$YrsZkW-nWe^(*QDEvlbjRS;demJ}T0Z+Y1 zRZ*9<-;O)^GGNxbqp?r^(4W?NS9BtvHdoqLU>0v{Q~G&4R2*uM#*zm4N*7Ka*_-Il zaXoSyUt;#ZXB!swl>+J>Co5aDR~5JeDt~QH`EBMFzu$RfKpgcKrVTJ$&)q04%bu@> z+z*BfgdWc-)JW=sdb>PLgEBD(*j_Vq!^6y{cWB$JNKhq88?9VCnK!CrtI!3aMF}vl zPqN_S)rZcS3hzoWdYPHMn3qq`1GbDZn~2aLSb7)|^_Qe)exRsFGEz!0Q%G6~;x|xa z=BC^&8jGc2X3k_R2Q4)eTdsYDvA_&69$15{CL8+O`V`m;Dr3yYaOK>f9&l%;FPF{h z={9u>VHXv zNZAFd{HkQ!iM(vr`kgucw?Y6<5ncbqt5is%{Z}(vB@|>;A(WFjuB>wjXW|)~cahU6 zxkwqg0{L0)8)<2Bjh;I{WKffSI?}yMdT-2|}0d*(+K4TKotzoF!rK;%mgSStpw4!EA3B$P6g1TXE<5TLV7OiQMX z2J)ZfOsxrs_X8DzbG!36$B*#(YVtFgm7|C^O;f@A(l;!l7E=LjW|z{%c}n44F?DL( zfbrWLpT8jw+l}4UY1wMLIjuU`w_Iob%hF0C&db`-^bEmp&n^p~{8=cblkbYzcsxe= zqOdbiUtf3Rs%o|$&^)pY-dFz-ON(?6vL%wHPoPEpvvAe7#mWKv1Z6o-mX7=+ zT>z|k=QiSRi=pKe&*i;>R-mXbt+Ivk$xK(N2=2KL1*=P&qjK=Y~fnj|;s$eMHpZ~O8jD_!6NTUp_yWkBH zOikwss`6AxkhPC!D0dlXovTYlv^!(7^jt-vZiD7gYADo%0!mT^qjm#Zc0T155XUK~JqgmY?^ zebl8En9&#$cph!DYx(Ie90K6=je}%DAuhR|x?00z%{lX8kb_RXx(Q05pa|#Phu+AZ z9CUb_LG#TBg@CG@mBC!lSY8!K#14#VY(5VV!H|lu>}N4abwHzFi+6Rfa&GSItsgxs zbo=M~caJa3{kU1EW)-2Rr%{y(F`dwQ2*f_;eP{@=l&FmX1i zqkXNE36)M!No97xs@-e0UuOI2S);Ssx`v37^P#|@iM{Snkd?Xo`0c{TNr&(XZV^?T zJ(57-Y~>oA>9G`|dtQk~AaY~%<`EZe(GDsf-B(;NM9+xo?F<~6( zFeZt(sF=Hm*dX0@ow4`t_f=*SH)xu5o{!!tGBS5guj-oVD((F)dX8>3*KV}Ksmj*X zT2M^Wce_TkE8m4VmDUdxm&lrq<}O=u{~Xo)a83%{w<_oFWO&Okoua?*FjhoPcs}dB6JsACTTY1nsQB=IMp@CRevyt~$qJ(fMFdW>O94 zMqGCm54nE$n^;Scp4+JK&t;|ch?nCjQ7%k%-*9BaHnw&o^VRPOr6>#IS5d=8b^Rg| zHh4=zmXq%@J##0#T&QdsW!8p_&-gU_;&!xe`*sDJqH2`---jZSiy!L{P~cy3r!Lj= zzb4?UU2@KcE{oM^1Yt(GNjsA#2C>mSZ)YeDcG*A83^q6z99Y_bdpl2=IIX7*q$a?Z zw)m+&3d}_WAm4hsdIZ@s?=I(b~;%=HzXN^R9TKy&3;B096ZeLUs zuJ|I`Wjqebqx<>WV-75gOu!Mfr9TsK`RO3=XJ%60B|i7rbOgj%_ldN=K3{w!?pw`R zxs!H?>LJPoZQbuHB>1|7Zjh=TCqqNr4Wnm1 zzmJ2$064eY3wd(@?`sJKKYV=O1$IDxC+lZ6B<7~qRP>qzbp+lciaFLgftT$pQ$gUH zD)dB1r1I+$`=cmgm4VJgw6fIzoIvpRl|k!>`6^SSPNK%k-j;LQ$3YwD@i+D>$1QFT zKAMx*jk1CGhRIt}ybiB&E?)8cbN6Qo5wF>iXt; zug1Pv+>fO#My#%ev7s7Kx{bvl0+HRSLx*t}o)JlilTg5Q8mwgL7bhmK+Lh1lsb3N= zNji?MsXC*K`HF^#&LscOjpJ_*{aZJf4kO|k&T71G4#n&oeCAp>&N1>Y)eR<^!bwj5 zn$8vK#vm-)WL5sxqE>)w9lF!0THHA9 z?{TEe{mMtn=q7pE)I}b)_JTu238mi2_MA5IKv5wQ{gP+~F=K&t>GkNgV$Fdl$qQqW z-_3>ctwoI3tUzcbn-#BT-NXlaF*ppebv#TrOYpV{9sGd}2fLjJ*Y^vFsE0s0RS4LR zqH;IMj>_%Ps0VBlHuARvdW)y^)aZE^;VQ6x{QNDO1+V@~XJ)vxpop zO%*NFt50AVcdBXrKR~e2#TFZgh4? z;_vx$Iy6pD&$n@T2)tUXE*$c?Jv?Xe&;rh`cDT{tx`%*QIa?uR939HzYf!$NUVM1e z`5vuw2-B9BW})OwQ_7y6-s&M@Kb2EuH0KdBx`ODM<@O79Z~aT@#F*>x^-9FN?D<2D z4^^A&qF7Yv7zg){ z-ok`mlaulwq1$FTv)0CD=5I;yKgf$i2!(-1E$;4|nurK)hrba(KP9n7`jyC=&3#cn zv#+z7gB12FozrU8-<|?{btCH5wUCP0)~NxsWf**LTCJEYZ{T@_=2*b&ri& zkxo(#EMsJKmGfluY-gJ)`wr9$5y|}9AI`l1CbbU)0hx{m%h)fdL08$r{#`0D{SCQs zk$1}49!0}-YfhVXwi)>9YFw5l{tjRHkyE*mg#dNw_x~0q)VpeIa5U9kL8-HZVLGG!JoC; zOY(55n%^+b#@d^oB+O5L%tI2zR_whuWzp6*jz9ErDUvPApsT^*qIzweI4g#Hlc7k^ zc-|}d)ni3Q<;ldmymf;h%*DR7YX(q9xP(k-&l-I`!(S?V5_;|oEgJraU#sRLRYrbU zj&Z?V)cEEn8svahh4v_|t*4X;l3Xk%_u95!5W`&t#O_A%tx`8u*~1-2AvBADy(qa8 zYxVUyD>`%oj}*i z#EX|R^&ZPjGBmR^m;w35YHSgwvER_M$Z--N%!3V#Y*CLXIZOgHhFmL=dF>#_mbZy1 z%!}!TYCA#hJ>&HR#w9nmXRN4|Ly)J{Ls$^EDi$5d(pY5{*SNJZhk2juV z&%ro|f79O^Y(*t!IVcqtBqkpncPbBjnF@mX;U*%-B9{N`wFd4`(Z-*Ut$~LBV+;JI zge=HzX&k?*ZI**{YsA+o)O7 zdy$2UNz9Ph^A4&=i=G1@hf)%ssQ|&Dd$mrLv*j$G(laJx=C%<(e>BE4!cH`wUX#>= z^Z(Kj4e8J=Q~}7tJb@lImkVTTnKf!m;5=8dqcB72kI(B!d*obQAU(^i7QM3R zQ@F3}G%S+o3wgRs99(ri>gVqB&z&bF58OcS>Td5vffrL^HE(6N0x@+fW@M{_ej^GW z_$JxxyOcCYxKx1(7ogfgY81(BsIP0zU|TghqKQ9tx7vyoo$#?xl~!7p4rZs?vbpIo z>z>D(jrA2(&w5?nbQOIpllNI|(nJ;rmSbWPI^7wo>EtDl^5u|XZDHwAF-rRkBv|rV zD75cI6Y|G42K-4G^|{}r&X%sDYb1_Qw^K=B zyx9GT(KY<~sTf)DF=ktEA+ylSUVflR;%Q$tBW-Qz$!b_$NK%ERd5c(mk({y;AGLGtfK_33^JGITCYsYPpK zr^*Ecj55()tthbEX2j27hq^kJazV%gShip@hl_3d_$I~Q51r%wbI7$!0rO?M5mQgQ zk4UGy3hCC)?DZa+Jw0s5?)Wq-t2wLGn9%V)yEpM@CgWdGx6avxIjTGm2g;2=!gG}U z>TRq!O*=tjloNJ2xf75Gp`;rIUO0@epLj)L%IPXp-uC+J=w)ewBoZmBhDd5hFvd(I zgNoq$JO2zHO2>P>h{fx*q6(Jm%C%H9dfQI(1w?7Nc;6j@E|h0-<2F5WcABnD?r7aE zbNz~6P>J|ZDfC#4wFl%MZN0Xf9hEh`&C4YE*4PrijfKVY=`v}f0(xt@nnv4o$f50TS#3qX8QJ_R#{w-SL}XU~TkUm@;G9b+eod5BISl~cs(xcOT#>sW`f zF=%zt*(KKpdT%~bJ!OSnAcMgMWMANhBld}(!mL4fD(Hg^tKZBZ(lAX7>UUSDZ?_X^PJ&Fnz0zbK@%{Ed-@ z&qx1Pu$1oeTt(w~Yth1HOJ8en zyp3!t0`8i0oOY3MAfae=cRp%U$-)!rx)ESL6`eHupL!`Nmg;Tu_;Wz6lvOBo7Yl8p z6b?_Vi@@zT6f;EDvhc;?vxb`uskdUPP+13Lbj;&ahx~2#O4N0dcX**>TC2BR(r9kU9za0E)U{j)_IL8!H zeHl6y;F8~YCwqTquSDg~T;};KyfSXRjk3uu(_fVJ>{ViL{4uh#&GG4nv-3H6Btr)3DYVXdm7ZawQRemLFKb8USR>S|^52;tBQlPRa?hLUo zFBI`&S;{#46x1gQu!}I}Y#1AcwOS}GkK}-JIuA`cTP}QO9s2xoOk7ROj?qme1>|f6 z&~i&n$L(rynrS{tP@%8j0E>TUXbbl0cd|AqsL-`c&Gk;VO#Ok|aNb#w9%6U)bYQEl z!1Pw;mr2)|)h~R|W=m)lYES}wq4G2v-U%(7`$_rZ9i^MP$f(?59cMpUW+}1kO@|?} ziS&05AF3Zea&h3u%C*diZm0u?-@hK=uI$>1ZM1hK`#F=YolnG!9 zysMCAqumr*(2j$08nvO^m}Mr}?NKs=KCmIn$5o6rkH1*7IMGB9k#sW_{*TVF{8oe0 zyD(b`);W>+TMw(~RE`oK=Jby=|A%=_3)NRw(#It=)H_2{K8S4+ISEYl>VdKnl(<%B zL?m|`N*T|i8^#vRzfz6*oZ~ky#44I5*W)2Q4$t^SK0Zh&EU)k|7b@VBKrVa6X`KZgt)QovD7d79I8SaWeys6l+<*C4jt z?S^{^04|OEN69>JNAW9?+Y4~Cza~dM%tBljj1(kcgfciX&Dvlm4XUmyti07fwsNF# zZ4TnF|4!M84nip)(>>AYb-@8W?1g?d z0ujw%b49Deez?I}dvlW7yY)?D7n8d}Ad^-T#x$2M#jf}5E9dwZdv+?3cd%v;pko=L zJWIpjMrqnN9#LMe7ZCbpzu1mvvbn6QBX&_heIxKG7v;W{W@sD6fj0aLksU!&Pb;U` zu6IE&Q_2vZH=jVDQDQAsI>^n$?l}Ea}f-5NOO=uJH~^Dw))a&(+YW z!^|W18Gi|4UUo>h*oj$l95dMSL@N7gkd1EAFDx!DfpM8Zt~P1!uQ9o_ntEMA1ksd{ zw?}Sx`@8NMzym>$CAX@z@qzxMW>|?_5jmk`$FMi!RR$2O?pg058rk1B7DOl0eFA?H z@|PIv-9ZVUTlPYmko*oCvB;PeOHH2i&HRU&cz=lgp*0_yEU1>+{?R`!Pk>yuoQ~|k zHT;E1;-I8&2P)CFkG4l?j&l0;jZHf0sO&5grn3Ey7TPCr4jD}>xCJ%UgwUyOZ1b=9 zJdI1G#?pCVuEQ+70V%|B68f3avnoAh)&1^kXwFP_4(4iMmc{`#OUsayx*=1%xYJvI zto^-+!2Dh`=NfERCu&<4rA7@Lo4nHbZ`<+Gob84he})o1YLB5XY*jTB_{)Dy(my4z z)oAxK(vfkT4W}t%E!I3A@6lz|FrGPxF8xlcBk%ByM`eM*7sn9wIbty zNCAQ^Of^+v52jg1** zSDAby=-a|es-VZ%*12ShqUfsl@VZl35QUZIT;{?V(i)Y231gOr3wgWd#7mEG8nj;} z=%09Ts5%2T<@fbW4d}*h!y&lY$$(O1%O7xqhYQ?2nDG{s9+|iJmng7s39NFE}^(@%SIhRtVCMU0J@E*YWaOcpVKv4fQf?vQ14#}{8MOgF?DxhO+ z@nO;@)4-I1MUZ0f5QB6C!ywx2EVkwFMIg?!L$mHZ_dxGyb`(&}48b3b1NOfPq6!!4 z_0+*ZeXJ2+x%}pz&0kkYd8ox)sVKCXAR^ZpV}BTVfrZyYfDVkJ_A5LV{sty)l17qn z5)*$ax3^V>d1rXV?}5G2-0KHB%lEJxQDu9V^4-V^%zKTtrLScXit8>JN&mjw66}RM z=O-ApyyBzHKZ(plBQ_WiC6^)2_xDD5*M*4x8d>rvOy_yWztO8vBy@OHhFgfJfANCTsr5BJ$`$e=; zwWFs!w=YeGNSAi~5%GH>P8{7~(2zG3+14c$MDx4G?Pwm#@$J!<-gdcz9Ctlhj_StM zrPDbjnD{WXuY*(h-Z&gR39}b&p!H9mYUN9)$Y1v6o(HnNXdU?jnW{~a*tclAvUOek z>*^0=2Y#5tY(BtIk1qd@$LZ?Cczy45vf_8n?*~Rv1_Tru2nYxgNLH^!{3;Q<=r1S` zkT47oki&ncmVXV+P3>)5oamV8S?C$*9F3V7{@R&{7&@Dp+c|nLu$r=SaWI-O8ZmJ) znXqs%o3gSQGaE9p7&9?(FfkgLFfcOwzb6>}nmaOBIsNYey_JKDsiOz||Gi=CXlGAv zo7rjuDpo_vShOAiy@l*7WPmDGPaJmGTBU2&@t?Ej$Lnlj zGUerBCIb2d7f%|Cc_=>*mt{YcGoW$V8y%;e(@uZT8LHO+8Jsu#0Ix`!pNjwpvf46r%?$D99hhCT(RJt ziS=OWKXET>nO+qyA@fO`L}bOtq!kDL%-d3Mj>Rt^yU!xMEZa|*1&!a2hoD#r8J*Z@ zw}>gCogA{a2`X+1yt+|Cyfip~ zB)_WdvCO0D1u%ltIgK?=A>4_VsdN|!@uw0_HA;rUfP~WbI%4>q!2Al6xVozn!2Lit z8iNmztA_Mf&}ct=6t#blb+II$Sv>XiW4ZPv>i%tTTf-69e6sU83d>r6wEYyhnhy&Q zzgK~H5*4YGTtgF3mQb0L4MuFDD4qo$&!c1j|5I^I zri&sy`|x1}>*_B-nBrhqz*R9^{_ShawiJ>J%Zsu518z)eg$N!9cCM9IG|k=K&Fgkh zBpm~`_i69DVB4m!m3G!QXmXr(qC-LZmc>lyd10qqj$NxMetm@@3#9{*wNW|mIyvsX zYGE_^`16rlpy&A>RjUTo9Y&cHQ1f4JHxWMf-^%qLXEX&+N;}`5V1g=nTV~dTUGg=! zV$T*ZZF{Uru@I_Uw{P#uy~lV#j=9mJf~8AVM}Hp^DdJR9TiXonT!NC{2rSo@q*!w} zTQC*jdQwxB0ChyB1S8WT@R=o=w<1TYy7lQ1G}gU;@38J~KLC{7Yts+#%sRrAfz%et z>8yf@jU0=EX6WsWuv7B>%QE71Al>lqZ@X7%DbAn5D^@ z9E1c{f34fjmNXYNmu?rJ2FvIZCZU^@-RxC-XMjwhnI7AvTb0_v!;$jSVss%`U!DQSyN+g7jjW|g>);Y7a5Iaw^I2-OtfmjM9cP$dGa*9a{^*!kpt#pRCacrE4pdz5zuSVZT?DW zqA8p@Mg)VO*&a+6J7m;M(>*)_VORyCqCvoGuFboG>I#3cFcp%;pzapMi&ECLeS_p3 zuEX87i%qJ8Q|1IDvLGe){Y8-V1o`YT(XGLBWzBuHM3I7HHPi9xn%A(}pqrAkR*Ap~ z_B|S<3ZJI$*fe6T^isJ{Z#`E_7{gN5@h+N!?sduPX9!i4AkaHJKGOHUxz9qhMcji1 zH@*`X2#6F62*~#Td+z&dY3{D?XliR>>S*ftKZ#Gp&~B3v@q4zeok(t;9Zr!|j^?kJ zS_-=g3}hfTzZ`i7qMbbM20Ux#$DSK}v&m&K8v*jz>(^~hm($r>`=2p;x<}=IE=K#+ zTUSGspbGV{rM$BHfeVW>mRvez(J&mz7if5mXMw@i;T?kccC*QUu!8a$+2q9vUh~)d zU?S0oEwHlaR5<;W(Giu&Ly*?Q{{alcr+}skV^!lP!^cW?C>tTs(n0Bpgi@@sB7Y8C zyZyDN6`B4l8Iid|zVZ&sk}x8hx;Y0Xu$dl^&=~Y$7)*#Kwr3nL;{Z7ZQm*GOJ|UPh zaJ>Y>$Ct9RsI>xTY>7w|w}1{vCYf##xcr`c8!!Rq0)``|6VOGa@Y{4CHHc8LkAyh| zCEcHbx+aK$?7Ex1<92OMV}efn`^ghP`{8cO-7{h2r;lYCrjyk^hi0xnV()j=e|Hg5 z)qchiMmZk2qRClg&IgvWzT2k=jT<=F~(#r%gIfN z1B3s@bK?;2#nXcm$!&OblAE;FetiQ5{@i0STjH)$%c~e2Z~3lfUijyQ)Pm&o3i_*J z2Ui#nai==zX$1QAUG=M1#DEF7&+}b9dzSV1zW(P_y1P5eXnw$;EO=7l)|+L8*%(+^ zx9cEdfZ4lS1G2fx4DE^?qwaMZeI&>$Z5!m2>jD{Y!z zE94BVpvv-GeAUL z!T&~4B-npmA1@k=oBvf1dH)p^2LIoq=zj`^zbadth(Edd4P#;C{??GPXQiN?#i*Op zisQ$ooTW<_lrP+?fK*i}aw+Yf&zft_2#}sCfpu%k*Nv6lO9Q*QKVJ3)PlNZCm;2}S zKCnq(&R|LNXG+jz(c_9J9{e+y7>31-9Hhr5;#6(%_5p(WGtnR^f(*tg*HPQ_8EU_| zR7~LpfJ3us1Bn0HwQyFf=nj`q1xE=D`1ELmd!&> zVgo3wzl{~s*$jJrGsY&FHU=T)#_>XG;enI6J^>RrJwouNU9?5QXmR*&J^PX`tD0yT2K_i@Se|B z*KN#g&%1ih!pw<1qx|o$`8^| z;@dllFRyE4O^UmPQw%xswALa6)z-r}6^giQcxsUrTR5B_4^zz6jPnnNAJFZMIDHUu} zuocQ>*{EcDPU%M*X7=Ew7l>z!)Qw4kAEtB1qo%yA`o!z9PQ+e0$?im|@8+7~(T}}M z?_@`k@oxgVy_um0)*q4uuXW#lS)cRGFjtH`^A)c6T%?C}fYa=jtQ>5kXsD@>M??Lp zhdEluM-&S)l_gj!9H<&At{ts!SKvB?D;d=Mm#P{z8C{w}$`&ABpLj|HG7w4;EKeJQEFUQ@EHub2b|Ylp2y|T$XS;5sqiHGGNmXgK;N}| zIZ>=>=q;X=v{f>aL>JcjO}r-+eVLn>wE6&AY!(g;mUQ6QfBO2 z@D4JI#k(8(KXieS=ww7$?VqTd=oya}YfEgcWyOiByi0o8Y|)uh(B9_EOKT?%_r{#X zWef{;5Z9g@_7x|*N-V&?5N#il0@_wr9))!RYnr&ct4Ni!1amj}r6Ues=MiakU9OHV zow)HJf5%C(O#yj?a7&06>j$2)j~Q**FVbpy7S_J0h86-;Yvk`YC&GBmP9mvb7z8iP ze&rYqi3Q^S)7yE+Q~AgJ|3dbtkjmbKPG+`}$jTNOv_GPa3wwlpAAh3f= zOOz_7dYukqf)sRUt6KP-AnpVI#_I~dh!j%7NWN%q{?lC|;$BSY+Wm;ik@Jk}gg@#k z00jD!sDPz(qZxu%8^fx6JI&z0+ni3hRGxo;CMVrk=IMnGQ;7k)m^PrYyAN#Af?)^c~YJ4auhpJOo3g7jM(} z5PLS6ZC4>Z(wR;gMtg5EM5z7T%f6gbkOL!pD@Muk2xh{GqCBVb@!mEUcF#T&ysmJ{ zVr=ALBXfUm^-$>-Ax$EeJ@4XOv|pulUML2*J_=~;lUaDXJ~dDDL-ehFHpQ3d-v-{B z-0e`}sS=rdS|Sm&s73$)a6DU9|2o{awzWckaVaj+{Ak{19$){c$gU%AeSKZ*-1&Y# z)S=EubL*#o5tlrXl}co*HiH&~{T5L)sV&sJ|3-CVx!f}1()Q&i_1QA74JJ#6_s2)g z$w8K?tLYrBqMq1M9MaHen|)IV;XeJEHp=8aaR1uXR~h7nvJO0O=8)IMm4x^0Ptr?} zm#O$W>{RU3v{gM^X0_9pS}^choxfUr!EF-YhhNBm(;*W_ZIfY5r@%y@BLe_OJgf74 zUc~OJNJv{0CN*vuA|n#P@j6H+7`D=JkpXmlpBTS4|C{}=aN!)c;s}T7m%2*m)0!Pdtf)-%c4epT*H2#p+V>| zF&|&rxg(6nymdYh>uHr=nlp(JE_=6{o*QTqo7)9G$N{X>9gE0a^TD_hIkLkCnm+jqMv*S;TKr1YZzt9e;eL zcYHg2;dqZw3aJv!(i8onp1x}81y=6vd98bQdW4qJ+}|)?_v+DwT%}u)RPm*nm)?;q zG**mw@V5Vc*<}e=LQU`L^A(z-vpf6q)e{aYU+{bgT@B6dirC&? zO1Jl{)->1q2PU4461wQ?6I{6!PCFK?2J8D-Qk=AM+A70sPN(q{>Z-SQ6>^zM*W@1x zum0d87h%!GK`5|BGu8wU!ZV^?Xrb?irBIZ_fxD6Ua{4lCh4@FH zZ!JJZ_y}}c3kTHZM-8U-oC`_Lr332@E%;@LKcg7akgr+gh_e1fHHjV?i0+4(oA=Gl zI+7E%5wbTuCgC19w648PFPf)dC(q+WTb_Yns=DBF6PD*1M|d*@yXQ8UbJ)0Xf$STro=V`&Yu zFH3tiSs#FWV)Z;dnJ!M^v*)9zrFY<;JA&_i`Oe-|VEwxD3QedR|MjzeB7qz$MWNLM z3FMk`+DT#$`4ykQhoW(XhMn31!afUx5pVV@Pdi6xKJGYqY(R7nNC zkWbfXuWc%Mm@bFM$4NCaDgap31pw8*;1q}(+{V@d0Uu|!cj!`?US16eh`Ko@?&h{= z9Ie$aZsS}De3o`JO+Rc}w!B9@pGS{pACF4kx^FQzPZTZu&DH4H0t#CHw>NHlX=!QF z^ICI$%@j>Pt;-Tr^GW+OH`lXo!+kFDH4~R?ko_XpfzGwV0!6;*d4MN3kQ0$oi6Gl#jhURc6s3V)pRx zpz6tWV*-{N!3B>4wD-ppT2~(+U2?jTwPWa`>Flv0vJ+t$lw6@>4M)uiEsfdakJYf8 zU6@?uZwpGlyWZtMa$~Px>*zfmHiZ>2Q3__p`)QfM~_WTru8x-QI-r!wz6U6?T}+ij6s}zev|8@Mn&@yG{A-E^Xo@C6n-J>gSAi&XO0OJ!w{;ZGUOjwz$o-@Idn%W1Fdi=CzFaS9eNk za~G58YmJgl9r3uYdjpSYd(#Z%GLR_*@WxOILHzL7wt^Lrdd%2(|HGA z(-1xRY16(Bk9V;74bvQLKcv&pmlI)kCowxOx9%w?k4ch>Q=D903#s!frTNHR(f-^4 zd$ieW_6snl*O&*=!)w>4Cel;uy+0Cr`p>W2^=l7U$#`_v`$fVHYXLQIHsy>c{PUe?=3PfY8MUtbFTi>Bw1`K?-J8qlHy`{Qw!zkr)UDllSo`$EyOv-|erQ#p` zI~ZGx$~|9lN-is2R2QcoPJ2DpL%Rz#bLfucow1!H8s~?bTjAxf(hL)JN%p{1{`=ym zV5LBBqMBX`zhS#}#r@=-N(E^-IfccM>4oOS#1GFTv$OfKbKr8#jmFbVi#(8?wfHG( z{+P4v9FdR zVrc_WVy8Jol=J(%?WwZpc231EiTlvegySv&UNZ3x230cQI!~sLynlF|)d(d#^BL;k z@rsH1qij@&;)z?g=D}&!m=l~HDF)|wdKVToU4{<7NTy-3GR@_#QPDphUlXc($gH5e zS=Cc8sBRfWW-cQ-m%BV3u4c?J6cd*Lkx9O(<9so{RxN^jlK&OyT%~Y~Q<_qZYKd%K zgSETbsi;m}HcdN|tUPxOi_(PJgE6nIXuC9FiE0S3U?lI9WIgv)@ig|n_UJa~m6I}n zmG15`dt!nw+}UIA!})nwwDs7yC)p?Ell6@*>;lMMUY@Rohx6ankqn9Zk{Zt=MBG;f z{z3a1lSk)*k{E<`yp8D@KQLWr$B9hQF8O$$Vw~#uz*(__dymqUQFrq{qRcpO#4bS3 zB!aH&t+S$tk)YjT#J!=YyXhvw@f`~}wi$%T`IbOp8w1`?&bFoKK|OslwM62ok}|gz#i6XO zj>BXUMJ}v+Ir95p!KRe8Ul_^~x^`%qR5|)nvFvc;XCAbDel-HVuMW8%O7nrail&6Q zfq8rxm7;{yFgyRj_&k+duFsR&(u3Zftp&EuVTY?|vq`oqs9^m8H*N5(uN`c=FPCO_{3d_V8!2bODW%47{v+-W=f} z91psn*M+tfet4)VdZd$jx{AIXU9FR9<6->fydMAcCwt+HPrG+%^(`^a7(cB>H05x( z*qDns=JpLUM;AK`ZY!jlE97RmqJDBn)956Dz>{iW655Nh+X@bxHX`QF=Np`xd6M4~ zIkaZ=Dk76G_ypl(Z1AV<+wv-vhlOd{t6U2^71~*crt37KhHSZyN&B3qau#`p94sPk zg{8^HQN-yq`!CTHm>6e?ITaIk#F1QJFsclt?do2$e@9>x9^yhj^a4;lpjIGyM_X?g z#(iF#%kIiR!y^~{XKqdIhDK>N@M~v+>c~6TI8IIn?FpszREdrsJ{nGvC2v^}-mrrl z{^cw>t-WldO#J>s`#YyO%lRg_HB@`(Ja2W(?Xh2uS7lG95+~QsSP*IS*46a&U4B^@ zo`eR=yF`d~6q~A%OUAQ*HHQr8WbYgbYWRBZJxq9l5TquDdcia#dgRA*bAr&JaXo46rBeS=UOuemq zW_YsH_-xw_y-jHADy11Csz?@~)aIU9O%zag&qwOf_aah#Pz*`RAXRW@TS+W=uK|p4 z`AYvG%@K5zTj-ayo6lB~wa=`3Esm}(OIlAH=&h7l{sN13dm*B%(sA>esF-|$z}edm zqw~iYO#I}e&lU$}WNL&d9};ElmeQ5A7*@`6n0}X*kwbVwpdS&RkvVi6YKK&wVK}zP z``T05JegF0ZmvD~@@0J{_Afs-*$Yz+L(XbG>`gU zci_OegDCjFU)=%RBclaH!qJXU3phB<_5+CQ>s0QUdIrHm;6T?EoK8~PxEg;nLDjxTv%wTw2OXTm%jivk(>$hD%CY{1|5aY<9BUUyqLo0MOuEGCPjh z-5|&>KLr$JYXwKUKpbrxv3J|5D)w#|Ref0gA9vfdZ|J}7rntd|xm(5m;%>j)h4f$M zlyJ=LW&J(;Z_SBpa`{%Zj^h~g`a1?U-1ncR!GZkuhLLvQZ<|Kg!v53z=^xg=W}gAu zUy&O7$uZ`Yz-?s8C~I3395cm)&ASvJSY@yzmamfp0PN@hz~2Nu z6~qDoMWb1_~zEJmvo~jirMHZiHi|Q9XAr7p5_Qu95`+Y_efMM(|=EVQT?L zq2Ul050}l!w&+!&vM~Ri(HV@KI8p#G+mHftK>{vc{#D0(mBPXXin4|y9IStafsmD` zNO0#uZ-GzT2Jk_LSyaQeIb(dlIK!cqNKh6>1Xh-<5rSF9{njuM!hGs4lOW(8nECEa zWpFD3`02kl48mo6A;33NkOB4R5|xXWU{VOs9XrAJu>Jw@^(Qgtp}!g*KZF1&Ea6sA zSA+}17G?3f{Kb`K{tTX=P>4+qA_Fj4On$(~u?~z@J#ZTpt~3ZRlkg%9Nb$$gltS?Y zWeMFP&7Ft{=>||5sV&m%hvARnkEQVj*Rt^9FH77}#XOi$W6u29nEF<-C84J9Nb$$g z9J0ZaG|sMDqGku0f5H@$W)|GpiPtw@BY^gQ#Vx`DdP#U`}(!}GD;*X^ncf*r3R?b_bQ8;jr&&?s2;4ubs%Fk&~g+xUmsC}5E9e820Zn{4o5#`y+W^H33}}K9sqFO&;)bA;fF^}zQJI<_P?4LvDo0l_-t1Y-ub|B z_$Kd>0d@K%D)n3;nY+OGiO19c;IRROxw!gofUu%DIJ($^TjFr13&;T2$r6JfDups5Y_njfwSWU9-09xre?Ws3 z>VH*6EOF%Gj>W%RKi3gMu#Q|mWqer?46!zF5*q9R_4VhrYyXZ4E8uSu6r2P6-Y~*d+`tzi_`(Hn z1#5FZkqq!42v&Ji6V}!UJ`Kjf4m9pV{$LWmSvHCEmF{;PGwkvMMytpaeDPV>xT5TF zr8?>#tWx*-jTt*=m>c{8hoqYtWh$Oguu6Tsg4nnqH!TB@0lDB(Buzv1gOi{qtH7$^ zxCsu7s(*)P2}e5oM7OnAC~eST{Fs*h7sM0Z^qk&m5O;Z;DC4gf-0;bNn%2entf;?j z8uR`W?0OIxKmi_?_HNN!UIU-F?cfs^TV606@9<$BTn|FQEnFO&f0w=nI8qqp{ADkE ze-#W?jjeHT5{IAxPXsOw4hY=pfteL8RpV`-+XYsRqu)+GZlC~)x%g4y8;82Sww5UP zG6<|LWB?yHx8IR=pEm$}MrwnjJIt#ou&uocKRg==197)SSvt5w;Fh+Su)$>$Gb&Np zxh*m%oE98JY5cr-Vc-eA*&LxLI09VE1N*W#WLu*NT-p5IFlB7zHGar8&Q)SJo?y-n zE(pC(kz@h@N#md0=lTY(AX^R+;=1nwIKrd}gvX4Z2Y?PY0sz}F#Aqco_b=Em#~X2} zE`n4x@A(JBdcYzmKnU1=ciguhH{A*T|EIZs@m8wuuKTVSh6)MYwCU~FugAiY!B2po z|N3QFo6E$n-e7~pgMvp_@r(EK`)oF|{p!6SShnml_-5N2Ut3Fq;RXt(G^|_Tf#%!U zdTden)#>^T3c%SCPY4?kfH_c%bkPIXJdy4x*rF4vGI)Y+RsOLe_((`9Dfiv2YNR< p?N{elu|&?`&ZCWF_`|({*lpItV9yKy48ea6;HF4PPp~@={14$2Y|Q`w literal 0 HcmV?d00001 diff --git a/assets/components/imageplus/mgr/css/imageplus.css b/assets/components/imageplus/mgr/css/imageplus.css index 2664c297..44221c19 100644 --- a/assets/components/imageplus/mgr/css/imageplus.css +++ b/assets/components/imageplus/mgr/css/imageplus.css @@ -21,4 +21,8 @@ .x-form-field-wrap .x-form-trigger.x-form-crop-trigger:before { content: "\f125"; +} + +.imageplus-hidden-textarea { + display: none; } \ No newline at end of file diff --git a/assets/components/imageplus/mgr/css/jquery/jquery.jcrop.min.css b/assets/components/imageplus/mgr/css/jquery/jquery.jcrop.min.css old mode 100644 new mode 100755 index a59f0a73..51ee2c8f --- a/assets/components/imageplus/mgr/css/jquery/jquery.jcrop.min.css +++ b/assets/components/imageplus/mgr/css/jquery/jquery.jcrop.min.css @@ -1,28 +1,2 @@ -/* jquery.Jcrop.min.css v0.9.10 (build:20120429) */ -.jcrop-holder{direction:ltr;text-align:left;} -.jcrop-vline,.jcrop-hline{background:#FFF url(Jcrop.gif) top left repeat;font-size:0;position:absolute;} -.jcrop-vline{height:100%;width:1px!important;} -.jcrop-hline{height:1px!important;width:100%;} -.jcrop-vline.right{right:0;} -.jcrop-hline.bottom{bottom:0;} -.jcrop-handle{background-color:#333;border:1px #eee solid;font-size:1px;} -.jcrop-tracker{-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-user-select:none;height:100%;width:100%;} -.jcrop-handle.ord-n{left:50%;margin-left:-4px;margin-top:-4px;top:0;} -.jcrop-handle.ord-s{bottom:0;left:50%;margin-bottom:-4px;margin-left:-4px;} -.jcrop-handle.ord-e{margin-right:-4px;margin-top:-4px;right:0;top:50%;} -.jcrop-handle.ord-w{left:0;margin-left:-4px;margin-top:-4px;top:50%;} -.jcrop-handle.ord-nw{left:0;margin-left:-4px;margin-top:-4px;top:0;} -.jcrop-handle.ord-ne{margin-right:-4px;margin-top:-4px;right:0;top:0;} -.jcrop-handle.ord-se{bottom:0;margin-bottom:-4px;margin-right:-4px;right:0;} -.jcrop-handle.ord-sw{bottom:0;left:0;margin-bottom:-4px;margin-left:-4px;} -.jcrop-dragbar.ord-n,.jcrop-dragbar.ord-s{height:7px;width:100%;} -.jcrop-dragbar.ord-e,.jcrop-dragbar.ord-w{height:100%;width:7px;} -.jcrop-dragbar.ord-n{margin-top:-4px;} -.jcrop-dragbar.ord-s{bottom:0;margin-bottom:-4px;} -.jcrop-dragbar.ord-e{margin-right:-4px;right:0;} -.jcrop-dragbar.ord-w{margin-left:-4px;} -.jcrop-light .jcrop-vline,.jcrop-light .jcrop-hline{background:#FFF;filter:Alpha(opacity=70)!important;opacity:.70!important;} -.jcrop-light .jcrop-handle{-moz-border-radius:3px;-webkit-border-radius:3px;background-color:#000;border-color:#FFF;border-radius:3px;} -.jcrop-dark .jcrop-vline,.jcrop-dark .jcrop-hline{background:#000;filter:Alpha(opacity=70)!important;opacity:.7!important;} -.jcrop-dark .jcrop-handle{-moz-border-radius:3px;-webkit-border-radius:3px;background-color:#FFF;border-color:#000;border-radius:3px;} -.jcrop-holder img,img.jcrop-preview{max-width:none;} \ No newline at end of file +/* jquery.Jcrop.min.css v0.9.12 (build:20140524) */ +.jcrop-holder{direction:ltr;text-align:left;-ms-touch-action:none}.jcrop-hline,.jcrop-vline{background:#fff url(Jcrop.gif);font-size:0;position:absolute}.jcrop-vline{height:100%;width:1px!important}.jcrop-vline.right{right:0}.jcrop-hline{height:1px!important;width:100%}.jcrop-hline.bottom{bottom:0}.jcrop-tracker{height:100%;width:100%;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-user-select:none}.jcrop-handle{background-color:#333;border:1px #eee solid;width:7px;height:7px;font-size:1px}.jcrop-handle.ord-n{left:50%;margin-left:-4px;margin-top:-4px;top:0}.jcrop-handle.ord-s{bottom:0;left:50%;margin-bottom:-4px;margin-left:-4px}.jcrop-handle.ord-e{margin-right:-4px;margin-top:-4px;right:0;top:50%}.jcrop-handle.ord-w{left:0;margin-left:-4px;margin-top:-4px;top:50%}.jcrop-handle.ord-nw{left:0;margin-left:-4px;margin-top:-4px;top:0}.jcrop-handle.ord-ne{margin-right:-4px;margin-top:-4px;right:0;top:0}.jcrop-handle.ord-se{bottom:0;margin-bottom:-4px;margin-right:-4px;right:0}.jcrop-handle.ord-sw{bottom:0;left:0;margin-bottom:-4px;margin-left:-4px}.jcrop-dragbar.ord-n,.jcrop-dragbar.ord-s{height:7px;width:100%}.jcrop-dragbar.ord-e,.jcrop-dragbar.ord-w{height:100%;width:7px}.jcrop-dragbar.ord-n{margin-top:-4px}.jcrop-dragbar.ord-s{bottom:0;margin-bottom:-4px}.jcrop-dragbar.ord-e{margin-right:-4px;right:0}.jcrop-dragbar.ord-w{margin-left:-4px}.jcrop-light .jcrop-hline,.jcrop-light .jcrop-vline{background:#fff;filter:alpha(opacity=70)!important;opacity:.7!important}.jcrop-light .jcrop-handle{-moz-border-radius:3px;-webkit-border-radius:3px;background-color:#000;border-color:#fff;border-radius:3px}.jcrop-dark .jcrop-hline,.jcrop-dark .jcrop-vline{background:#000;filter:alpha(opacity=70)!important;opacity:.7!important}.jcrop-dark .jcrop-handle{-moz-border-radius:3px;-webkit-border-radius:3px;background-color:#fff;border-color:#000;border-radius:3px}.solid-line .jcrop-hline,.solid-line .jcrop-vline{background:#fff}.jcrop-holder img,img.jcrop-preview{max-width:none} \ No newline at end of file diff --git a/assets/components/imageplus/mgr/js/imageplus.jquery.imagecrop.js b/assets/components/imageplus/mgr/js/imageplus.jquery.imagecrop.js index f77b0146..d98bd952 100644 --- a/assets/components/imageplus/mgr/js/imageplus.jquery.imagecrop.js +++ b/assets/components/imageplus/mgr/js/imageplus.jquery.imagecrop.js @@ -34,7 +34,7 @@ ImagePlus.jquery.ImageCrop = function (config) { html: '' }], listeners: { - afterRender: {fn: this.on_afterRender, scope: this}, + afterRender: {fn: this.onAfterRender, scope: this}, destroy: { fn: function () { this.cropper.destroy() @@ -46,7 +46,7 @@ ImagePlus.jquery.ImageCrop = function (config) { }; Ext.extend(ImagePlus.jquery.ImageCrop, Ext.Panel, { - on_afterRender: function () { + onAfterRender: function () { this.initJcrop.defer(10, this) }, diff --git a/assets/components/imageplus/mgr/js/imageplus.migx_renderer.js b/assets/components/imageplus/mgr/js/imageplus.migx_renderer.js index f2fc771a..f4efb559 100644 --- a/assets/components/imageplus/mgr/js/imageplus.migx_renderer.js +++ b/assets/components/imageplus/mgr/js/imageplus.migx_renderer.js @@ -21,16 +21,16 @@ * @copyright Alan Pich 2013 */ -ImagePlus.MIGX_Renderer = function(json){ - if(!json.length) return ''; +ImagePlus.MIGX_Renderer = function (json) { + if (!json.length) return ''; var data = JSON.parse(json); var url = ImagePlus.generateThumbUrl({ - src: data.sourceImg.src - ,source: data.sourceImg.source - ,sw: data.crop.width - ,sh: data.crop.height - ,sx: data.crop.x - ,sy: data.crop.y + src: data.sourceImg.src, + source: data.sourceImg.source, + sw: data.crop.width, + sh: data.crop.height, + sx: data.crop.x, + sy: data.crop.y }) - return ''; + return ''; } diff --git a/assets/components/imageplus/mgr/js/imageplus.panel.input.js b/assets/components/imageplus/mgr/js/imageplus.panel.input.js index bcc50170..f64a2893 100644 --- a/assets/components/imageplus/mgr/js/imageplus.panel.input.js +++ b/assets/components/imageplus/mgr/js/imageplus.panel.input.js @@ -37,19 +37,14 @@ ImagePlus.panel.input = function (config) { Ext.apply(config, { border: false, - baseCls: 'modx-formpanel', - cls: 'container', - updateTo: config.updateTo, - width: '100%', + baseCls: 'modx-panel', + hiddenField: config.hiddenField, + width: '400px', items: [{ xtype: 'compositefield', anchor: '98%', hideLabel: true, listeners: { - 'render': { - fn: this.on_Render, - scope: this - }, 'afterRender': { fn: this.onAfterRender, scope: this @@ -79,7 +74,7 @@ Ext.extend(ImagePlus.panel.input, MODx.Panel, { var resourcePanel = Ext.getCmp('modx-panel-resource'); resourcePanel.on('tv-reset', function (changed) { if (changed.id = this.imageplus.tv.id) { - this.on_Reset(); + this.onReset(); } }, this); }, @@ -93,8 +88,8 @@ Ext.extend(ImagePlus.panel.input, MODx.Panel, { openToPath.pop(); openToPath = openToPath.join('/'); - var _this = this; // Create browser component + var _this = this; this.imageBrowser = new ImagePlus.combo.Browser({ value: this.imageplus.sourceImg.src, source: this.imageplus.mediaSource, @@ -140,7 +135,7 @@ Ext.extend(ImagePlus.panel.input, MODx.Panel, { fn: this.onAltTagChange, scope: this } - }, width: 300, style: { + }, width: 400, style: { marginBottom: '5px' } }) @@ -151,7 +146,7 @@ Ext.extend(ImagePlus.panel.input, MODx.Panel, { wctx: 'mgr', f: 'png', q: 90, - w: 150, + w: this.imageplus.thumbnailWidth, source: this.imageplus.sourceImg.source }; for (var i in params) { @@ -166,18 +161,12 @@ Ext.extend(ImagePlus.panel.input, MODx.Panel, { /** * Fires when the TV field is reset */ - on_Reset: function () { + onReset: function () { this.imageBrowser.setValue(''); this.imageplus.sourceImg = false; this.updatePreviewImage.defer(10, this); }, - /** - * Render form elements to page - */ - on_Render: function () { - }, - /** * Runs after initial render of panel */ @@ -226,7 +215,7 @@ Ext.extend(ImagePlus.panel.input, MODx.Panel, { */ onAltTagChange: function (field, value) { this.imageplus.altTag = value; - this.updateExternalField(); + this.updateHiddenField(); }, /** @@ -274,15 +263,15 @@ Ext.extend(ImagePlus.panel.input, MODx.Panel, { this.lastFileLabel = this.imageplus.sourceImg.src; this.updatePreviewImage.defer(10, this); - this.updateExternalField(); + this.updateHiddenField(); }, /** - * Update updateTo field input field value + * Update hidden field value */ - updateExternalField: function () { - // console.log(this.updateTo); + updateHiddenField: function () { + // console.log(this.hiddenField); var TV = { sourceImg: this.imageplus.sourceImg, crop: this.imageplus.crop, @@ -292,18 +281,19 @@ Ext.extend(ImagePlus.panel.input, MODx.Panel, { }; var json = JSON.stringify(TV, null, ' '); - var external = document.getElementById(this.updateTo); + var external = document.getElementById(this.hiddenField); var current = external.value || ''; if (current == '') { current = external.innerHTML; } + current = JSON.stringify(JSON.parse(current), null, ' '); // Has value changed or is source image empty? if (current == json || this.imageplus.sourceImg.src == '') { return; } - if (document.getElementById(this.updateTo)) { - document.getElementById(this.updateTo).value = json; + if (document.getElementById(this.hiddenField)) { + document.getElementById(this.hiddenField).value = json; } // Mark resource as dirty @@ -378,8 +368,8 @@ Ext.extend(ImagePlus.panel.input, MODx.Panel, { if (this.imagePreview.el) { jQuery(this.imagePreview.el.dom).attr('src', 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=='); } - document.getElementById(this.updateTo).innerHTML = ''; - document.getElementById(this.updateTo).value = ''; + document.getElementById(this.hiddenField).innerHTML = ''; + document.getElementById(this.hiddenField).value = ''; this.imageBrowser.setValue(''); MODx.fireResourceFormChange(); }, @@ -405,7 +395,6 @@ Ext.extend(ImagePlus.panel.input, MODx.Panel, { this.oldSourceImg.crop.width = crop.width; this.oldSourceImg.crop.height = crop.height; - this.editorWindow = null; this.updateDisplay(); }, diff --git a/assets/components/imageplus/mgr/js/imageplus.window.editor.js b/assets/components/imageplus/mgr/js/imageplus.window.editor.js index e173d5d0..71f949e0 100644 --- a/assets/components/imageplus/mgr/js/imageplus.window.editor.js +++ b/assets/components/imageplus/mgr/js/imageplus.window.editor.js @@ -139,10 +139,14 @@ Ext.extend(ImagePlus.window.Editor, Ext.Window, { } }, getAspectRatio: function () { - if (this.imageplus.targetWidth > 0 && this.imageplus.targetHeight > 0) { - return this.imageplus.targetWidth / this.imageplus.targetHeight; + if (this.imageplus.targetRatio) { + return this.imageplus.targetRatio; } else { - return false + if (this.imageplus.targetWidth > 0 && this.imageplus.targetHeight > 0) { + return this.imageplus.targetWidth / this.imageplus.targetHeight; + } else { + return false + } } }, diff --git a/assets/components/imageplus/mgr/js/jquery/jquery.jcrop.min.js b/assets/components/imageplus/mgr/js/jquery/jquery.jcrop.min.js old mode 100644 new mode 100755 index a6231e74..d9ae1adf --- a/assets/components/imageplus/mgr/js/jquery/jquery.jcrop.min.js +++ b/assets/components/imageplus/mgr/js/jquery/jquery.jcrop.min.js @@ -1,22 +1,7 @@ /** - * jquery.Jcrop.min.js v0.9.10 (build:20120626) + * jquery.Jcrop.min.js v0.9.12 (build:20140524) * jQuery Image Cropping Plugin - released under MIT License - * Copyright (c) 2008-2012 Tapmodo Interactive LLC + * Copyright (c) 2008-2013 Tapmodo Interactive LLC * https://github.com/tapmodo/Jcrop */ -(function(a){a.Jcrop=function(b,c){function h(a){return Math.round(a)+"px"}function i(a){return d.baseClass+"-"+a}function j(){return a.fx.step.hasOwnProperty("backgroundColor")}function k(b){var c=a(b).offset();return[c.left,c.top]}function l(a){return[a.pageX-e[0],a.pageY-e[1]]}function m(b){typeof b!="object"&&(b={}),d=a.extend(d,b),a.each(["onChange","onSelect","onRelease","onDblClick"],function(a,b){typeof d[b]!="function"&&(d[b]=function(){})})}function n(a,b){e=k(C),bb.setCursor(a==="move"?a:a+"-resize");if(a==="move")return bb.activateHandlers(p(b),u);var c=Z.getFixed(),d=q(a),f=Z.getCorner(q(d));Z.setPressed(Z.getCorner(d)),Z.setCurrent(f),bb.activateHandlers(o(a,c),u)}function o(a,b){return function(c){if(!d.aspectRatio)switch(a){case"e":c[1]=b.y2;break;case"w":c[1]=b.y2;break;case"n":c[0]=b.x2;break;case"s":c[0]=b.x2}else switch(a){case"e":c[1]=b.y+1;break;case"w":c[1]=b.y+1;break;case"n":c[0]=b.x+1;break;case"s":c[0]=b.x+1}Z.setCurrent(c),ba.update()}}function p(a){var b=a;return bc.watchKeys(),function( -a){Z.moveOffset([a[0]-b[0],a[1]-b[1]]),b=a,ba.update()}}function q(a){switch(a){case"n":return"sw";case"s":return"nw";case"e":return"nw";case"w":return"ne";case"ne":return"sw";case"nw":return"se";case"se":return"nw";case"sw":return"ne"}}function r(a){return function(b){return d.disabled?!1:a==="move"&&!d.allowMove?!1:(e=k(C),V=!0,n(a,l(b)),b.stopPropagation(),b.preventDefault(),!1)}}function s(a,b,c){var d=a.width(),e=a.height();d>b&&b>0&&(d=b,e=b/a.width()*a.height()),e>c&&c>0&&(e=c,d=c/a.height()*a.width()),S=a.width()/d,T=a.height()/e,a.width(d).height(e)}function t(a){return{x:a.x*S,y:a.y*T,x2:a.x2*S,y2:a.y2*T,w:a.w*S,h:a.h*T}}function u(a){var b=Z.getFixed();b.w>d.minSelect[0]&&b.h>d.minSelect[1]?(ba.enableHandles(),ba.done()):ba.release(),bb.setCursor(d.allowSelect?"crosshair":"default")}function v(a){if(d.disabled)return!1;if(!d.allowSelect)return!1;V=!0,e=k(C),ba.disableHandles(),bb.setCursor("crosshair");var b=l(a);return Z.setPressed(b),ba.update(),bb.activateHandlers(w,u),bc.watchKeys(),a.stopPropagation -(),a.preventDefault(),!1}function w(a){Z.setCurrent(a),ba.update()}function x(){var b=a("
").addClass(i("tracker"));return a.browser.msie&&b.css({opacity:0,backgroundColor:"white"}),b}function bd(a){F.removeClass().addClass(i("holder")).addClass(a)}function be(a,b){function t(){window.setTimeout(u,l)}var c=a[0]/S,e=a[1]/T,f=a[2]/S,g=a[3]/T;if(W)return;var h=Z.flipCoords(c,e,f,g),i=Z.getFixed(),j=[i.x,i.y,i.x2,i.y2],k=j,l=d.animationDelay,m=h[0]-j[0],n=h[1]-j[1],o=h[2]-j[2],p=h[3]-j[3],q=0,r=d.swingSpeed;c=k[0],e=k[1],f=k[2],g=k[3],ba.animMode(!0);var s,u=function(){return function(){q+=(100-q)/r,k[0]=Math.round(c+q/100*m),k[1]=Math.round(e+q/100*n),k[2]=Math.round(f+q/100*o),k[3]=Math.round(g+q/100*p),q>=99.8&&(q=100),q<100?(bg(k),t()):(ba.done(),ba.animMode(!1),typeof b=="function"&&b.call(br))}}();t()}function bf(a){bg([a[0]/S,a[1]/T,a[2]/S,a[3]/T]),d.onSelect.call(br,t(Z.getFixed())),ba.enableHandles()}function bg(a){Z.setPressed([a[0],a[1]]),Z.setCurrent([a[2],a[3]]),ba.update()}function bh(){return t -(Z.getFixed())}function bi(){return Z.getFixed()}function bj(a){m(a),bq()}function bk(){d.disabled=!0,ba.disableHandles(),ba.setCursor("default"),bb.setCursor("default")}function bl(){d.disabled=!1,bq()}function bm(){ba.done(),bb.activateHandlers(null,null)}function bn(){F.remove(),z.show(),a(b).removeData("Jcrop")}function bo(a,b){ba.release(),bk();var c=new Image;c.onload=function(){var e=c.width,f=c.height,g=d.boxWidth,h=d.boxHeight;C.width(e).height(f),C.attr("src",a),G.attr("src",a),s(C,g,h),D=C.width(),E=C.height(),G.width(D).height(E),L.width(D+K*2).height(E+K*2),F.width(D).height(E),_.resize(D,E),bl(),typeof b=="function"&&b.call(br)},c.src=a}function bp(a,b,c){var e=b||d.bgColor;d.bgFade&&j()&&d.fadeTime&&!c?a.animate({backgroundColor:e},{queue:!1,duration:d.fadeTime}):a.css("backgroundColor",e)}function bq(a){d.allowResize?a?ba.enableOnly():ba.enableHandles():ba.disableHandles(),bb.setCursor(d.allowSelect?"crosshair":"default"),ba.setCursor(d.allowMove?"move":"default"),d.hasOwnProperty("trueSize")&& -(S=d.trueSize[0]/D,T=d.trueSize[1]/E),d.hasOwnProperty("setSelect")&&(bf(d.setSelect),ba.done(),delete d.setSelect),_.refresh(),d.bgColor!=M&&(bp(d.shade?_.getShades():F,d.shade?d.shadeColor||d.bgColor:d.bgColor),M=d.bgColor),N!=d.bgOpacity&&(N=d.bgOpacity,d.shade?_.refresh():ba.setBgOpacity(N)),O=d.maxSize[0]||0,P=d.maxSize[1]||0,Q=d.minSize[0]||0,R=d.minSize[1]||0,d.hasOwnProperty("outerImage")&&(C.attr("src",d.outerImage),delete d.outerImage),ba.refresh()}var d=a.extend({},a.Jcrop.defaults),e,f,g=!1;a.browser.msie&&a.browser.version.split(".")[0]==="6"&&(g=!0),typeof b!="object"&&(b=a(b)[0]),typeof c!="object"&&(c={}),m(c);var y={border:"none",visibility:"visible",margin:0,padding:0,position:"absolute",top:0,left:0},z=a(b),A=!0;if(b.tagName=="IMG"){if(z[0].width!=0&&z[0].height!=0)z.width(z[0].width),z.height(z[0].height);else{var B=new Image;B.src=z[0].src,z.width(B.width),z.height(B.height)}var C=z.clone().removeAttr("id").css(y).show();C.width(z.width()),C.height(z.height()),z.after(C).hide()}else C=z.css -(y).show(),A=!1,d.shade===null&&(d.shade=!0);s(C,d.boxWidth,d.boxHeight);var D=C.width(),E=C.height(),F=a("
").width(D).height(E).addClass(i("holder")).css({position:"relative",backgroundColor:d.bgColor}).insertAfter(z).append(C);d.addClass&&F.addClass(d.addClass);var G=a("
"),H=a("
").width("100%").height("100%").css({zIndex:310,position:"absolute",overflow:"hidden"}),I=a("
").width("100%").height("100%").css("zIndex",320),J=a("
").css({position:"absolute",zIndex:600}).dblclick(function(){var a=Z.getFixed();d.onDblClick.call(br,a)}).insertBefore(C).append(H,I);A&&(G=a("").attr("src",C.attr("src")).css(y).width(D).height(E),H.append(G)),g&&J.css({overflowY:"hidden"});var K=d.boundary,L=x().width(D+K*2).height(E+K*2).css({position:"absolute",top:h(-K),left:h(-K),zIndex:290}).mousedown(v),M=d.bgColor,N=d.bgOpacity,O,P,Q,R,S,T,U=!0,V,W,X;e=k(C);var Y=function(){function a(){var a={},b=["touchstart","touchmove","touchend"],c=document.createElement("div"),d;try{for(d=0;da+f&&(f-=f+a),0>b+g&&(g-=g+b),ED&&(r=D,u=Math.abs((r-a)/f),s=k<0?b-u:u+b)):(r=c,u=l/f,s=k<0?b-u:b+u,s<0?(s=0,t=Math.abs((s-b)*f),r=j<0?a-t:t+a):s>E&&(s=E,t=Math.abs(s-b)*f,r=j<0?a-t:t+a)),r>a?(r-ah&&(r=a+h),s>b?s=b+(r-a)/f:s=b-(r-a)/f):rh&&(r=a-h),s>b?s=b+(a-r)/f:s=b-(a-r)/f),r<0?(a-=r,r=0):r>D&&(a-=r-D,r=D),s<0?(b-=s,s=0):s>E&&(b-=s-E,s=E),q(o(a,b,r,s))}function n(a){return a[0]<0&&(a[0]=0),a[1]<0&&(a[1]=0),a[0]>D&&(a[0]=D),a[1]>E&&(a[1]=E),[a[0],a[1]]}function o(a,b,c,d){var e=a,f=c,g=b,h=d;return cO&&(c=d>0?a+O:a-O),P&&Math.abs(f)>P&&(e=f>0?b+P:b-P),R/T&&Math.abs(f)0?b+R/T:b-R/T),Q/S&&Math. -abs(d)0?a+Q/S:a-Q/S),a<0&&(c-=a,a-=a),b<0&&(e-=b,b-=b),c<0&&(a-=c,c-=c),e<0&&(b-=e,e-=e),c>D&&(g=c-D,a-=g,c-=g),e>E&&(g=e-E,b-=g,e-=g),a>D&&(g=a-E,e-=g,b-=g),b>E&&(g=b-E,e-=g,b-=g),q(o(a,b,c,e))}function q(a){return{x:a[0],y:a[1],x2:a[2],y2:a[3],w:a[2]-a[0],h:a[3]-a[1]}}var a=0,b=0,c=0,e=0,f,g;return{flipCoords:o,setPressed:h,setCurrent:i,getOffset:j,moveOffset:k,getCorner:l,getFixed:m}}(),_=function(){function f(a,b){e.left.css({height:h(b)}),e.right.css({height:h(b)})}function g(){return i(Z.getFixed())}function i(a){e.top.css({left:h(a.x),width:h(a.w),height:h(a.y)}),e.bottom.css({top:h(a.y2),left:h(a.x),width:h(a.w),height:h(E-a.y2)}),e.right.css({left:h(a.x2),width:h(D-a.x2)}),e.left.css({width:h(a.x)})}function j(){return a("
").css({position:"absolute",backgroundColor:d.shadeColor||d.bgColor}).appendTo(c)}function k(){b||(b=!0,c.insertBefore(C),g(),ba.setBgOpacity(1,0,1),G.hide(),l(d.shadeColor||d.bgColor,1),ba.isAwake()?n(d.bgOpacity,1):n(1,1))}function l(a,b){bp(p(),a,b)}function m(){ -b&&(c.remove(),G.show(),b=!1,ba.isAwake()?ba.setBgOpacity(d.bgOpacity,1,1):(ba.setBgOpacity(1,1,1),ba.disableHandles()),bp(F,0,1))}function n(a,e){b&&(d.bgFade&&!e?c.animate({opacity:1-a},{queue:!1,duration:d.fadeTime}):c.css({opacity:1-a}))}function o(){d.shade?k():m(),ba.isAwake()&&n(d.bgOpacity)}function p(){return c.children()}var b=!1,c=a("
").css({position:"absolute",zIndex:240,opacity:0}),e={top:j(),left:j().height(E),right:j().height(E),bottom:j()};return{update:g,updateRaw:i,getShades:p,setBgColor:l,enable:k,disable:m,resize:f,refresh:o,opacity:n}}(),ba=function(){function k(b){var c=a("
").css({position:"absolute",opacity:d.borderOpacity}).addClass(i(b));return H.append(c),c}function l(b,c){var d=a("
").mousedown(r(b)).css({cursor:b+"-resize",position:"absolute",zIndex:c}).addClass("ord-"+b);return Y.support&&d.bind("touchstart.jcrop",Y.createDragger(b)),I.append(d),d}function m(a){var b=d.handleSize;return l(a,c++).css({opacity:d.handleOpacity}).width(b).height(b).addClass(i("handle" -))}function n(a){return l(a,c++).addClass("jcrop-dragbar")}function o(a){var b;for(b=0;b').css({position:"fixed",left:"-120px",width:"12px"}).addClass("jcrop-keymgr"),c=a("
").css({position:"absolute",overflow:"hidden"}).append(b);return d.keySupport&&(b.keydown(i).blur(f),g||!d.fixedSupport?(b.css({position:"absolute",left:"-20px"}),c.append(b).insertBefore(C)):b.insertBefore(C)),{watchKeys:e}}();Y.support&&L.bind("touchstart.jcrop",Y.newSelection),I.hide(),bq(!0);var br={setImage:bo,animateTo:be,setSelect:bf,setOptions:bj,tellSelect:bh,tellScaled:bi,setClass:bd,disable:bk,enable:bl,cancel:bm,release:ba.release,destroy:bn,focus:bc.watchKeys,getBounds:function(){return[D*S,E*T]},getWidgetSize:function(){return[D,E]},getScaleFactor:function(){return[S,T]},getOptions:function(){return d},ui:{holder:F,selection:J}};return a.browser.msie&&F.bind("selectstart",function(){return!1}),z.data -("Jcrop",br),br},a.fn.Jcrop=function(b,c){var d;return this.each(function(){if(a(this).data("Jcrop")){if(b==="api")return a(this).data("Jcrop");a(this).data("Jcrop").setOptions(b)}else this.tagName=="IMG"?a.Jcrop.Loader(this,function(){a(this).css({display:"block",visibility:"hidden"}),d=a.Jcrop(this,b),a.isFunction(c)&&c.call(d)}):(a(this).css({display:"block",visibility:"hidden"}),d=a.Jcrop(this,b),a.isFunction(c)&&c.call(d))}),this},a.Jcrop.Loader=function(b,c,d){function g(){f.complete?(e.unbind(".jcloader"),a.isFunction(c)&&c.call(f)):window.setTimeout(g,50)}var e=a(b),f=e[0];e.bind("load.jcloader",g).bind("error.jcloader",function(b){e.unbind(".jcloader"),a.isFunction(d)&&d.call(f)}),f.complete&&a.isFunction(c)&&(e.unbind(".jcloader"),c.call(f))},a.Jcrop.defaults={allowSelect:!0,allowMove:!0,allowResize:!0,trackDocument:!0,baseClass:"jcrop",addClass:null,bgColor:"black",bgOpacity:.6,bgFade:!1,borderOpacity:.4,handleOpacity:.5,handleSize:7,aspectRatio:0,keySupport:!0,createHandles:["n","s","e","w","nw","ne" -,"se","sw"],createDragbars:["n","s","e","w"],createBorders:["n","s","e","w"],drawBorders:!0,dragEdges:!0,fixedSupport:!0,touchSupport:null,shade:null,boxWidth:0,boxHeight:0,boundary:2,fadeTime:400,animationDelay:20,swingSpeed:3,minSelect:[0,0],maxSize:[0,0],minSize:[0,0],onChange:function(){},onSelect:function(){},onDblClick:function(){},onRelease:function(){}}})(jQuery); \ No newline at end of file +!function($){$.Jcrop=function(obj,opt){function px(n){return Math.round(n)+"px"}function cssClass(cl){return options.baseClass+"-"+cl}function supportsColorFade(){return $.fx.step.hasOwnProperty("backgroundColor")}function getPos(obj){var pos=$(obj).offset();return[pos.left,pos.top]}function mouseAbs(e){return[e.pageX-docOffset[0],e.pageY-docOffset[1]]}function setOptions(opt){"object"!=typeof opt&&(opt={}),options=$.extend(options,opt),$.each(["onChange","onSelect","onRelease","onDblClick"],function(i,e){"function"!=typeof options[e]&&(options[e]=function(){})})}function startDragMode(mode,pos,touch){if(docOffset=getPos($img),Tracker.setCursor("move"===mode?mode:mode+"-resize"),"move"===mode)return Tracker.activateHandlers(createMover(pos),doneSelect,touch);var fc=Coords.getFixed(),opp=oppLockCorner(mode),opc=Coords.getCorner(oppLockCorner(opp));Coords.setPressed(Coords.getCorner(opp)),Coords.setCurrent(opc),Tracker.activateHandlers(dragmodeHandler(mode,fc),doneSelect,touch)}function dragmodeHandler(mode,f){return function(pos){if(options.aspectRatio)switch(mode){case"e":pos[1]=f.y+1;break;case"w":pos[1]=f.y+1;break;case"n":pos[0]=f.x+1;break;case"s":pos[0]=f.x+1}else switch(mode){case"e":pos[1]=f.y2;break;case"w":pos[1]=f.y2;break;case"n":pos[0]=f.x2;break;case"s":pos[0]=f.x2}Coords.setCurrent(pos),Selection.update()}}function createMover(pos){var lloc=pos;return KeyManager.watchKeys(),function(pos){Coords.moveOffset([pos[0]-lloc[0],pos[1]-lloc[1]]),lloc=pos,Selection.update()}}function oppLockCorner(ord){switch(ord){case"n":return"sw";case"s":return"nw";case"e":return"nw";case"w":return"ne";case"ne":return"sw";case"nw":return"se";case"se":return"nw";case"sw":return"ne"}}function createDragger(ord){return function(e){return options.disabled?!1:"move"!==ord||options.allowMove?(docOffset=getPos($img),btndown=!0,startDragMode(ord,mouseAbs(e)),e.stopPropagation(),e.preventDefault(),!1):!1}}function presize($obj,w,h){var nw=$obj.width(),nh=$obj.height();nw>w&&w>0&&(nw=w,nh=w/$obj.width()*$obj.height()),nh>h&&h>0&&(nh=h,nw=h/$obj.height()*$obj.width()),xscale=$obj.width()/nw,yscale=$obj.height()/nh,$obj.width(nw).height(nh)}function unscale(c){return{x:c.x*xscale,y:c.y*yscale,x2:c.x2*xscale,y2:c.y2*yscale,w:c.w*xscale,h:c.h*yscale}}function doneSelect(){var c=Coords.getFixed();c.w>options.minSelect[0]&&c.h>options.minSelect[1]?(Selection.enableHandles(),Selection.done()):Selection.release(),Tracker.setCursor(options.allowSelect?"crosshair":"default")}function newSelection(e){if(!options.disabled&&options.allowSelect){btndown=!0,docOffset=getPos($img),Selection.disableHandles(),Tracker.setCursor("crosshair");var pos=mouseAbs(e);return Coords.setPressed(pos),Selection.update(),Tracker.activateHandlers(selectDrag,doneSelect,"touch"===e.type.substring(0,5)),KeyManager.watchKeys(),e.stopPropagation(),e.preventDefault(),!1}}function selectDrag(pos){Coords.setCurrent(pos),Selection.update()}function newTracker(){var trk=$("
").addClass(cssClass("tracker"));return is_msie&&trk.css({opacity:0,backgroundColor:"white"}),trk}function setClass(cname){$div.removeClass().addClass(cssClass("holder")).addClass(cname)}function animateTo(a,callback){function queueAnimator(){window.setTimeout(animator,interv)}var x1=a[0]/xscale,y1=a[1]/yscale,x2=a[2]/xscale,y2=a[3]/yscale;if(!animating){var animto=Coords.flipCoords(x1,y1,x2,y2),c=Coords.getFixed(),initcr=[c.x,c.y,c.x2,c.y2],animat=initcr,interv=options.animationDelay,ix1=animto[0]-initcr[0],iy1=animto[1]-initcr[1],ix2=animto[2]-initcr[2],iy2=animto[3]-initcr[3],pcent=0,velocity=options.swingSpeed;x1=animat[0],y1=animat[1],x2=animat[2],y2=animat[3],Selection.animMode(!0);var animator=function(){return function(){pcent+=(100-pcent)/velocity,animat[0]=Math.round(x1+pcent/100*ix1),animat[1]=Math.round(y1+pcent/100*iy1),animat[2]=Math.round(x2+pcent/100*ix2),animat[3]=Math.round(y2+pcent/100*iy2),pcent>=99.8&&(pcent=100),100>pcent?(setSelectRaw(animat),queueAnimator()):(Selection.done(),Selection.animMode(!1),"function"==typeof callback&&callback.call(api))}}();queueAnimator()}}function setSelect(rect){setSelectRaw([rect[0]/xscale,rect[1]/yscale,rect[2]/xscale,rect[3]/yscale]),options.onSelect.call(api,unscale(Coords.getFixed())),Selection.enableHandles()}function setSelectRaw(l){Coords.setPressed([l[0],l[1]]),Coords.setCurrent([l[2],l[3]]),Selection.update()}function tellSelect(){return unscale(Coords.getFixed())}function tellScaled(){return Coords.getFixed()}function setOptionsNew(opt){setOptions(opt),interfaceUpdate()}function disableCrop(){options.disabled=!0,Selection.disableHandles(),Selection.setCursor("default"),Tracker.setCursor("default")}function enableCrop(){options.disabled=!1,interfaceUpdate()}function cancelCrop(){Selection.done(),Tracker.activateHandlers(null,null)}function destroy(){$div.remove(),$origimg.show(),$origimg.css("visibility","visible"),$(obj).removeData("Jcrop")}function setImage(src,callback){Selection.release(),disableCrop();var img=new Image;img.onload=function(){var iw=img.width,ih=img.height,bw=options.boxWidth,bh=options.boxHeight;$img.width(iw).height(ih),$img.attr("src",src),$img2.attr("src",src),presize($img,bw,bh),boundx=$img.width(),boundy=$img.height(),$img2.width(boundx).height(boundy),$trk.width(boundx+2*bound).height(boundy+2*bound),$div.width(boundx).height(boundy),Shade.resize(boundx,boundy),enableCrop(),"function"==typeof callback&&callback.call(api)},img.src=src}function colorChangeMacro($obj,color,now){var mycolor=color||options.bgColor;options.bgFade&&supportsColorFade()&&options.fadeTime&&!now?$obj.animate({backgroundColor:mycolor},{queue:!1,duration:options.fadeTime}):$obj.css("backgroundColor",mycolor)}function interfaceUpdate(alt){options.allowResize?alt?Selection.enableOnly():Selection.enableHandles():Selection.disableHandles(),Tracker.setCursor(options.allowSelect?"crosshair":"default"),Selection.setCursor(options.allowMove?"move":"default"),options.hasOwnProperty("trueSize")&&(xscale=options.trueSize[0]/boundx,yscale=options.trueSize[1]/boundy),options.hasOwnProperty("setSelect")&&(setSelect(options.setSelect),Selection.done(),delete options.setSelect),Shade.refresh(),options.bgColor!=bgcolor&&(colorChangeMacro(options.shade?Shade.getShades():$div,options.shade?options.shadeColor||options.bgColor:options.bgColor),bgcolor=options.bgColor),bgopacity!=options.bgOpacity&&(bgopacity=options.bgOpacity,options.shade?Shade.refresh():Selection.setBgOpacity(bgopacity)),xlimit=options.maxSize[0]||0,ylimit=options.maxSize[1]||0,xmin=options.minSize[0]||0,ymin=options.minSize[1]||0,options.hasOwnProperty("outerImage")&&($img.attr("src",options.outerImage),delete options.outerImage),Selection.refresh()}var docOffset,options=$.extend({},$.Jcrop.defaults),_ua=navigator.userAgent.toLowerCase(),is_msie=/msie/.test(_ua),ie6mode=/msie [1-6]\./.test(_ua);"object"!=typeof obj&&(obj=$(obj)[0]),"object"!=typeof opt&&(opt={}),setOptions(opt);var img_css={border:"none",visibility:"visible",margin:0,padding:0,position:"absolute",top:0,left:0},$origimg=$(obj),img_mode=!0;if("IMG"==obj.tagName){if(0!=$origimg[0].width&&0!=$origimg[0].height)$origimg.width($origimg[0].width),$origimg.height($origimg[0].height);else{var tempImage=new Image;tempImage.src=$origimg[0].src,$origimg.width(tempImage.width),$origimg.height(tempImage.height)}var $img=$origimg.clone().removeAttr("id").css(img_css).show();$img.width($origimg.width()),$img.height($origimg.height()),$origimg.after($img).hide()}else $img=$origimg.css(img_css).show(),img_mode=!1,null===options.shade&&(options.shade=!0);presize($img,options.boxWidth,options.boxHeight);var boundx=$img.width(),boundy=$img.height(),$div=$("
").width(boundx).height(boundy).addClass(cssClass("holder")).css({position:"relative",backgroundColor:options.bgColor}).insertAfter($origimg).append($img);options.addClass&&$div.addClass(options.addClass);var $img2=$("
"),$img_holder=$("
").width("100%").height("100%").css({zIndex:310,position:"absolute",overflow:"hidden"}),$hdl_holder=$("
").width("100%").height("100%").css("zIndex",320),$sel=$("
").css({position:"absolute",zIndex:600}).dblclick(function(){var c=Coords.getFixed();options.onDblClick.call(api,c)}).insertBefore($img).append($img_holder,$hdl_holder);img_mode&&($img2=$("").attr("src",$img.attr("src")).css(img_css).width(boundx).height(boundy),$img_holder.append($img2)),ie6mode&&$sel.css({overflowY:"hidden"});var xlimit,ylimit,xmin,ymin,xscale,yscale,btndown,animating,shift_down,bound=options.boundary,$trk=newTracker().width(boundx+2*bound).height(boundy+2*bound).css({position:"absolute",top:px(-bound),left:px(-bound),zIndex:290}).mousedown(newSelection),bgcolor=options.bgColor,bgopacity=options.bgOpacity;docOffset=getPos($img);var Touch=function(){function hasTouchSupport(){var i,support={},events=["touchstart","touchmove","touchend"],el=document.createElement("div");try{for(i=0;ix1+ox&&(ox-=ox+x1),0>y1+oy&&(oy-=oy+y1),y2+oy>boundy&&(oy+=boundy-(y2+oy)),x2+ox>boundx&&(ox+=boundx-(x2+ox)),x1+=ox,x2+=ox,y1+=oy,y2+=oy}function getCorner(ord){var c=getFixed();switch(ord){case"ne":return[c.x2,c.y];case"nw":return[c.x,c.y];case"se":return[c.x2,c.y2];case"sw":return[c.x,c.y2]}}function getFixed(){if(!options.aspectRatio)return getRect();var xx,yy,w,h,aspect=options.aspectRatio,min_x=options.minSize[0]/xscale,max_x=options.maxSize[0]/xscale,max_y=options.maxSize[1]/yscale,rw=x2-x1,rh=y2-y1,rwa=Math.abs(rw),rha=Math.abs(rh),real_ratio=rwa/rha;return 0===max_x&&(max_x=10*boundx),0===max_y&&(max_y=10*boundy),aspect>real_ratio?(yy=y2,w=rha*aspect,xx=0>rw?x1-w:w+x1,0>xx?(xx=0,h=Math.abs((xx-x1)/aspect),yy=0>rh?y1-h:h+y1):xx>boundx&&(xx=boundx,h=Math.abs((xx-x1)/aspect),yy=0>rh?y1-h:h+y1)):(xx=x2,h=rwa/aspect,yy=0>rh?y1-h:y1+h,0>yy?(yy=0,w=Math.abs((yy-y1)*aspect),xx=0>rw?x1-w:w+x1):yy>boundy&&(yy=boundy,w=Math.abs(yy-y1)*aspect,xx=0>rw?x1-w:w+x1)),xx>x1?(min_x>xx-x1?xx=x1+min_x:xx-x1>max_x&&(xx=x1+max_x),yy=yy>y1?y1+(xx-x1)/aspect:y1-(xx-x1)/aspect):x1>xx&&(min_x>x1-xx?xx=x1-min_x:x1-xx>max_x&&(xx=x1-max_x),yy=yy>y1?y1+(x1-xx)/aspect:y1-(x1-xx)/aspect),0>xx?(x1-=xx,xx=0):xx>boundx&&(x1-=xx-boundx,xx=boundx),0>yy?(y1-=yy,yy=0):yy>boundy&&(y1-=yy-boundy,yy=boundy),makeObj(flipCoords(x1,y1,xx,yy))}function rebound(p){return p[0]<0&&(p[0]=0),p[1]<0&&(p[1]=0),p[0]>boundx&&(p[0]=boundx),p[1]>boundy&&(p[1]=boundy),[Math.round(p[0]),Math.round(p[1])]}function flipCoords(x1,y1,x2,y2){var xa=x1,xb=x2,ya=y1,yb=y2;return x1>x2&&(xa=x2,xb=x1),y1>y2&&(ya=y2,yb=y1),[xa,ya,xb,yb]}function getRect(){var delta,xsize=x2-x1,ysize=y2-y1;return xlimit&&Math.abs(xsize)>xlimit&&(x2=xsize>0?x1+xlimit:x1-xlimit),ylimit&&Math.abs(ysize)>ylimit&&(y2=ysize>0?y1+ylimit:y1-ylimit),ymin/yscale&&Math.abs(ysize)0?y1+ymin/yscale:y1-ymin/yscale),xmin/xscale&&Math.abs(xsize)0?x1+xmin/xscale:x1-xmin/xscale),0>x1&&(x2-=x1,x1-=x1),0>y1&&(y2-=y1,y1-=y1),0>x2&&(x1-=x2,x2-=x2),0>y2&&(y1-=y2,y2-=y2),x2>boundx&&(delta=x2-boundx,x1-=delta,x2-=delta),y2>boundy&&(delta=y2-boundy,y1-=delta,y2-=delta),x1>boundx&&(delta=x1-boundy,y2-=delta,y1-=delta),y1>boundy&&(delta=y1-boundy,y2-=delta,y1-=delta),makeObj(flipCoords(x1,y1,x2,y2))}function makeObj(a){return{x:a[0],y:a[1],x2:a[2],y2:a[3],w:a[2]-a[0],h:a[3]-a[1]}}var ox,oy,x1=0,y1=0,x2=0,y2=0;return{flipCoords:flipCoords,setPressed:setPressed,setCurrent:setCurrent,getOffset:getOffset,moveOffset:moveOffset,getCorner:getCorner,getFixed:getFixed}}(),Shade=function(){function resizeShades(w,h){shades.left.css({height:px(h)}),shades.right.css({height:px(h)})}function updateAuto(){return updateShade(Coords.getFixed())}function updateShade(c){shades.top.css({left:px(c.x),width:px(c.w),height:px(c.y)}),shades.bottom.css({top:px(c.y2),left:px(c.x),width:px(c.w),height:px(boundy-c.y2)}),shades.right.css({left:px(c.x2),width:px(boundx-c.x2)}),shades.left.css({width:px(c.x)})}function createShade(){return $("
").css({position:"absolute",backgroundColor:options.shadeColor||options.bgColor}).appendTo(holder)}function enableShade(){enabled||(enabled=!0,holder.insertBefore($img),updateAuto(),Selection.setBgOpacity(1,0,1),$img2.hide(),setBgColor(options.shadeColor||options.bgColor,1),Selection.isAwake()?setOpacity(options.bgOpacity,1):setOpacity(1,1))}function setBgColor(color,now){colorChangeMacro(getShades(),color,now)}function disableShade(){enabled&&(holder.remove(),$img2.show(),enabled=!1,Selection.isAwake()?Selection.setBgOpacity(options.bgOpacity,1,1):(Selection.setBgOpacity(1,1,1),Selection.disableHandles()),colorChangeMacro($div,0,1))}function setOpacity(opacity,now){enabled&&(options.bgFade&&!now?holder.animate({opacity:1-opacity},{queue:!1,duration:options.fadeTime}):holder.css({opacity:1-opacity}))}function refreshAll(){options.shade?enableShade():disableShade(),Selection.isAwake()&&setOpacity(options.bgOpacity)}function getShades(){return holder.children()}var enabled=!1,holder=$("
").css({position:"absolute",zIndex:240,opacity:0}),shades={top:createShade(),left:createShade().height(boundy),right:createShade().height(boundy),bottom:createShade()};return{update:updateAuto,updateRaw:updateShade,getShades:getShades,setBgColor:setBgColor,enable:enableShade,disable:disableShade,resize:resizeShades,refresh:refreshAll,opacity:setOpacity}}(),Selection=function(){function insertBorder(type){var jq=$("
").css({position:"absolute",opacity:options.borderOpacity}).addClass(cssClass(type));return $img_holder.append(jq),jq}function dragDiv(ord,zi){var jq=$("
").mousedown(createDragger(ord)).css({cursor:ord+"-resize",position:"absolute",zIndex:zi}).addClass("ord-"+ord);return Touch.support&&jq.bind("touchstart.jcrop",Touch.createDragger(ord)),$hdl_holder.append(jq),jq}function insertHandle(ord){var hs=options.handleSize,div=dragDiv(ord,hdep++).css({opacity:options.handleOpacity}).addClass(cssClass("handle"));return hs&&div.width(hs).height(hs),div}function insertDragbar(ord){return dragDiv(ord,hdep++).addClass("jcrop-dragbar")}function createDragbars(li){var i;for(i=0;i').css({position:"fixed",left:"-120px",width:"12px"}).addClass("jcrop-keymgr"),$keywrap=$("
").css({position:"absolute",overflow:"hidden"}).append($keymgr);return options.keySupport&&($keymgr.keydown(parseKey).blur(onBlur),ie6mode||!options.fixedSupport?($keymgr.css({position:"absolute",left:"-20px"}),$keywrap.append($keymgr).insertBefore($img)):$keymgr.insertBefore($img)),{watchKeys:watchKeys}}();Touch.support&&$trk.bind("touchstart.jcrop",Touch.newSelection),$hdl_holder.hide(),interfaceUpdate(!0);var api={setImage:setImage,animateTo:animateTo,setSelect:setSelect,setOptions:setOptionsNew,tellSelect:tellSelect,tellScaled:tellScaled,setClass:setClass,disable:disableCrop,enable:enableCrop,cancel:cancelCrop,release:Selection.release,destroy:destroy,focus:KeyManager.watchKeys,getBounds:function(){return[boundx*xscale,boundy*yscale]},getWidgetSize:function(){return[boundx,boundy]},getScaleFactor:function(){return[xscale,yscale]},getOptions:function(){return options},ui:{holder:$div,selection:$sel}};return is_msie&&$div.bind("selectstart",function(){return!1}),$origimg.data("Jcrop",api),api},$.fn.Jcrop=function(options,callback){var api;return this.each(function(){if($(this).data("Jcrop")){if("api"===options)return $(this).data("Jcrop");$(this).data("Jcrop").setOptions(options)}else"IMG"==this.tagName?$.Jcrop.Loader(this,function(){$(this).css({display:"block",visibility:"hidden"}),api=$.Jcrop(this,options),$.isFunction(callback)&&callback.call(api)}):($(this).css({display:"block",visibility:"hidden"}),api=$.Jcrop(this,options),$.isFunction(callback)&&callback.call(api))}),this},$.Jcrop.Loader=function(imgobj,success,error){function completeCheck(){img.complete?($img.unbind(".jcloader"),$.isFunction(success)&&success.call(img)):window.setTimeout(completeCheck,50)}var $img=$(imgobj),img=$img[0];$img.bind("load.jcloader",completeCheck).bind("error.jcloader",function(){$img.unbind(".jcloader"),$.isFunction(error)&&error.call(img)}),img.complete&&$.isFunction(success)&&($img.unbind(".jcloader"),success.call(img))},$.Jcrop.defaults={allowSelect:!0,allowMove:!0,allowResize:!0,trackDocument:!0,baseClass:"jcrop",addClass:null,bgColor:"black",bgOpacity:.6,bgFade:!1,borderOpacity:.4,handleOpacity:.5,handleSize:null,aspectRatio:0,keySupport:!0,createHandles:["n","s","e","w","nw","ne","se","sw"],createDragbars:["n","s","e","w"],createBorders:["n","s","e","w"],drawBorders:!0,dragEdges:!0,fixedSupport:!0,touchSupport:null,shade:null,boxWidth:0,boxHeight:0,boundary:2,fadeTime:400,animationDelay:20,swingSpeed:3,minSelect:[0,0],maxSize:[0,0],minSize:[0,0],onChange:function(){},onSelect:function(){},onDblClick:function(){},onRelease:function(){}}}(jQuery); \ No newline at end of file diff --git a/assets/components/imageplus/mgr/js/jquery/jquery.min.js b/assets/components/imageplus/mgr/js/jquery/jquery.min.js index 93adea19..0f60b7bd 100644 --- a/assets/components/imageplus/mgr/js/jquery/jquery.min.js +++ b/assets/components/imageplus/mgr/js/jquery/jquery.min.js @@ -1,4 +1,5 @@ -/*! jQuery v1.7.2 jquery.com | jquery.org/license */ -(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+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(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
"+""+"
",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
t
",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( -a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f -.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file +/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1; + +return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/\s*$/g,ra={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:k.htmlSerialize?[0,"",""]:[1,"X
","
"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?""!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m("