stefan pushed a commit to branch master.

http://git.enlightenment.org/website/www.git/commit/?id=ff52ab5568fae024730d6a61ce2b968c491464ef

commit ff52ab5568fae024730d6a61ce2b968c491464ef
Author: Stefan Schmidt <ste...@osg.samsung.com>
Date:   Tue Nov 29 15:41:35 2016 +0100

    www: plugins: install styling plugin for eo doc system
---
 public_html/lib/plugins/styling/.travis.yml        |   13 +
 public_html/lib/plugins/styling/README             |   27 +
 .../lib/plugins/styling/_test/general.test.php     |   33 +
 public_html/lib/plugins/styling/action.php         |   60 +
 public_html/lib/plugins/styling/admin.php          |  211 +++
 public_html/lib/plugins/styling/iris.js            | 1488 ++++++++++++++++++++
 public_html/lib/plugins/styling/lang/bg/lang.php   |   21 +
 public_html/lib/plugins/styling/lang/cs/intro.txt  |    2 +
 public_html/lib/plugins/styling/lang/cs/lang.php   |   23 +
 public_html/lib/plugins/styling/lang/cy/intro.txt  |    2 +
 public_html/lib/plugins/styling/lang/cy/lang.php   |   36 +
 public_html/lib/plugins/styling/lang/de/intro.txt  |    2 +
 public_html/lib/plugins/styling/lang/de/lang.php   |   23 +
 public_html/lib/plugins/styling/lang/en/intro.txt  |    2 +
 public_html/lib/plugins/styling/lang/en/lang.php   |   35 +
 public_html/lib/plugins/styling/lang/es/intro.txt  |    2 +
 public_html/lib/plugins/styling/lang/es/lang.php   |   23 +
 public_html/lib/plugins/styling/lang/fa/intro.txt  |    2 +
 public_html/lib/plugins/styling/lang/fa/lang.php   |   23 +
 public_html/lib/plugins/styling/lang/fr/intro.txt  |    2 +
 public_html/lib/plugins/styling/lang/fr/lang.php   |   24 +
 public_html/lib/plugins/styling/lang/hr/intro.txt  |    2 +
 public_html/lib/plugins/styling/lang/hr/lang.php   |   23 +
 public_html/lib/plugins/styling/lang/hu/intro.txt  |    2 +
 public_html/lib/plugins/styling/lang/hu/lang.php   |   23 +
 public_html/lib/plugins/styling/lang/it/intro.txt  |    2 +
 public_html/lib/plugins/styling/lang/it/lang.php   |   23 +
 public_html/lib/plugins/styling/lang/ja/intro.txt  |    2 +
 public_html/lib/plugins/styling/lang/ja/lang.php   |   23 +
 public_html/lib/plugins/styling/lang/ko/intro.txt  |    2 +
 public_html/lib/plugins/styling/lang/ko/lang.php   |   23 +
 public_html/lib/plugins/styling/lang/nl/intro.txt  |    2 +
 public_html/lib/plugins/styling/lang/nl/lang.php   |   24 +
 .../lib/plugins/styling/lang/pt-br/intro.txt       |    2 +
 .../lib/plugins/styling/lang/pt-br/lang.php        |   23 +
 public_html/lib/plugins/styling/lang/pt/lang.php   |   13 +
 public_html/lib/plugins/styling/lang/ru/intro.txt  |    1 +
 public_html/lib/plugins/styling/lang/ru/lang.php   |   23 +
 public_html/lib/plugins/styling/lang/sk/lang.php   |   18 +
 .../lib/plugins/styling/lang/zh-tw/lang.php        |   15 +
 public_html/lib/plugins/styling/lang/zh/intro.txt  |    1 +
 public_html/lib/plugins/styling/lang/zh/lang.php   |   23 +
 public_html/lib/plugins/styling/plugin.info.txt    |    7 +
 public_html/lib/plugins/styling/popup.php          |   30 +
 public_html/lib/plugins/styling/script.js          |   97 ++
 public_html/lib/plugins/styling/style.less         |   13 +
 46 files changed, 2471 insertions(+)

diff --git a/public_html/lib/plugins/styling/.travis.yml 
b/public_html/lib/plugins/styling/.travis.yml
new file mode 100644
index 0000000..75ee0b1
--- /dev/null
+++ b/public_html/lib/plugins/styling/.travis.yml
@@ -0,0 +1,13 @@
+# Config file for travis-ci.org
+
+language: php
+php:
+  - "5.5"
+  - "5.4"
+  - "5.3"
+env:
+  - DOKUWIKI=master
+  - DOKUWIKI=stable
+before_install: wget 
https://raw.github.com/splitbrain/dokuwiki-travis/master/travis.sh
+install: sh travis.sh
+script: cd _test && phpunit --stderr --group plugin_styling
diff --git a/public_html/lib/plugins/styling/README 
b/public_html/lib/plugins/styling/README
new file mode 100644
index 0000000..a1a5e89
--- /dev/null
+++ b/public_html/lib/plugins/styling/README
@@ -0,0 +1,27 @@
+styling Plugin for DokuWiki
+
+Allows to edit style.ini replacements
+
+All documentation for this plugin can be found at
+https://www.dokuwiki.org/plugin:styling
+
+If you install this plugin manually, make sure it is installed in
+lib/plugins/styling/ - if the folder is called different it
+will not work!
+
+Please refer to http://www.dokuwiki.org/plugins for additional info
+on how to install plugins in DokuWiki.
+
+----
+Copyright (C) Andreas Gohr <a...@splitbrain.org>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; version 2 of the License
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+See the COPYING file in your DokuWiki folder for details
diff --git a/public_html/lib/plugins/styling/_test/general.test.php 
b/public_html/lib/plugins/styling/_test/general.test.php
new file mode 100644
index 0000000..1337f6f
--- /dev/null
+++ b/public_html/lib/plugins/styling/_test/general.test.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * General tests for the styling plugin
+ *
+ * @group plugin_styling
+ * @group plugins
+ */
+class general_plugin_styling_test extends DokuWikiTest {
+
+    /**
+     * Simple test to make sure the plugin.info.txt is in correct format
+     */
+    public function test_plugininfo() {
+        $file = __DIR__.'/../plugin.info.txt';
+        $this->assertFileExists($file);
+
+        $info = confToHash($file);
+
+        $this->assertArrayHasKey('base', $info);
+        $this->assertArrayHasKey('author', $info);
+        $this->assertArrayHasKey('email', $info);
+        $this->assertArrayHasKey('date', $info);
+        $this->assertArrayHasKey('name', $info);
+        $this->assertArrayHasKey('desc', $info);
+        $this->assertArrayHasKey('url', $info);
+
+        $this->assertEquals('styling', $info['base']);
+        $this->assertRegExp('/^https?:\/\//', $info['url']);
+        $this->assertTrue(mail_isvalid($info['email']));
+        $this->assertRegExp('/^\d\d\d\d-\d\d-\d\d$/', $info['date']);
+        $this->assertTrue(false !== strtotime($info['date']));
+    }
+}
diff --git a/public_html/lib/plugins/styling/action.php 
b/public_html/lib/plugins/styling/action.php
new file mode 100644
index 0000000..896e14b
--- /dev/null
+++ b/public_html/lib/plugins/styling/action.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ * DokuWiki Plugin styling (Action Component)
+ *
+ * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
+ * @author  Andreas Gohr <a...@splitbrain.org>
+ */
+
+// must be run within Dokuwiki
+if(!defined('DOKU_INC')) die();
+
+/**
+ * Class action_plugin_styling
+ *
+ * This handles all the save actions and loading the interface
+ *
+ * All this usually would be done within an admin plugin, but we want to have 
this available outside
+ * the admin interface using our floating dialog.
+ */
+class action_plugin_styling extends DokuWiki_Action_Plugin {
+
+    /**
+     * Registers a callback functions
+     *
+     * @param Doku_Event_Handler $controller DokuWiki's event controller object
+     * @return void
+     */
+    public function register(Doku_Event_Handler $controller) {
+        $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 
'handle_header');
+    }
+
+    /**
+     * Adds the preview parameter to the stylesheet loading in non-js mode
+     *
+     * @param Doku_Event $event  event object by reference
+     * @param mixed      $param  [the parameters passed as fifth argument to 
register_hook() when this
+     *                           handler was registered]
+     * @return void
+     */
+    public function handle_header(Doku_Event &$event, $param) {
+        global $ACT;
+        global $INPUT;
+        if($ACT != 'admin' || $INPUT->str('page') != 'styling') return;
+        if(!auth_isadmin()) return;
+
+        // set preview
+        $len = count($event->data['link']);
+        for($i = 0; $i < $len; $i++) {
+            if(
+                $event->data['link'][$i]['rel'] == 'stylesheet' &&
+                strpos($event->data['link'][$i]['href'], 'lib/exe/css.php') 
!== false
+            ) {
+                $event->data['link'][$i]['href'] .= '&preview=1&tseed='.time();
+            }
+        }
+    }
+
+}
+
+// vim:ts=4:sw=4:et:
diff --git a/public_html/lib/plugins/styling/admin.php 
b/public_html/lib/plugins/styling/admin.php
new file mode 100644
index 0000000..c747c31
--- /dev/null
+++ b/public_html/lib/plugins/styling/admin.php
@@ -0,0 +1,211 @@
+<?php
+/**
+ * DokuWiki Plugin styling (Admin Component)
+ *
+ * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
+ * @author  Andreas Gohr <a...@splitbrain.org>
+ */
+
+// must be run within Dokuwiki
+if(!defined('DOKU_INC')) die();
+
+class admin_plugin_styling extends DokuWiki_Admin_Plugin {
+
+    public $ispopup = false;
+
+    /**
+     * @return int sort number in admin menu
+     */
+    public function getMenuSort() {
+        return 1000;
+    }
+
+    /**
+     * @return bool true if only access for superuser, false is for superusers 
and moderators
+     */
+    public function forAdminOnly() {
+        return true;
+    }
+
+    /**
+     * handle the different actions (also called from ajax)
+     */
+    public function handle() {
+        global $INPUT;
+        $run = $INPUT->extract('run')->str('run');
+        if(!$run) return;
+        $run = "run_$run";
+        $this->$run();
+    }
+
+    /**
+     * Render HTML output, e.g. helpful text and a form
+     */
+    public function html() {
+        $class = 'nopopup';
+        if($this->ispopup) $class = 'ispopup page';
+
+        echo '<div id="plugin__styling" class="'.$class.'">';
+        ptln('<h1>'.$this->getLang('menu').'</h1>');
+        $this->form();
+        echo '</div>';
+    }
+
+    /**
+     * Create the actual editing form
+     */
+    public function form() {
+        global $conf;
+        global $ID;
+        define('SIMPLE_TEST', 1); // hack, ideally certain functions should be 
moved out of css.php
+        require_once(DOKU_INC.'lib/exe/css.php');
+        $styleini     = css_styleini($conf['template'], true);
+        $replacements = $styleini['replacements'];
+
+        if($this->ispopup) {
+            $target = DOKU_BASE.'lib/plugins/styling/popup.php';
+        } else {
+            $target = wl($ID, array('do' => 'admin', 'page' => 'styling'));
+        }
+
+        if(empty($replacements)) {
+            echo '<p class="error">'.$this->getLang('error').'</p>';
+        } else {
+            echo $this->locale_xhtml('intro');
+
+            echo '<form class="styling" method="post" action="'.$target.'">';
+
+            echo '<table><tbody>';
+            foreach($replacements as $key => $value) {
+                $name = tpl_getLang($key);
+                if(empty($name)) $name = $this->getLang($key);
+                if(empty($name)) $name = $key;
+
+                echo '<tr>';
+                echo '<td><label 
for="tpl__'.hsc($key).'">'.$name.'</label></td>';
+                echo '<td><input type="text" name="tpl['.hsc($key).']" 
id="tpl__'.hsc($key).'" value="'.hsc($value).'" '.$this->colorClass($key).' 
dir="ltr" /></td>';
+                echo '</tr>';
+            }
+            echo '</tbody></table>';
+
+            echo '<p>';
+            echo '<button type="submit" name="run[preview]" class="btn_preview 
primary">'.$this->getLang('btn_preview').'</button> ';
+            echo '<button type="submit" 
name="run[reset]">'.$this->getLang('btn_reset').'</button>'; #FIXME only if 
preview.ini exists
+            echo '</p>';
+
+            echo '<p>';
+            echo '<button type="submit" name="run[save]" 
class="primary">'.$this->getLang('btn_save').'</button>';
+            echo '</p>';
+
+            echo '<p>';
+            echo '<button type="submit" 
name="run[revert]">'.$this->getLang('btn_revert').'</button>'; #FIXME only if 
local.ini exists
+            echo '</p>';
+
+            echo '</form>';
+
+            echo tpl_locale_xhtml('style');
+
+        }
+    }
+
+    /**
+     * set the color class attribute
+     */
+    protected function colorClass($key) {
+        static $colors = array(
+            'text',
+            'background',
+            'text_alt',
+            'background_alt',
+            'text_neu',
+            'background_neu',
+            'border',
+            'highlight',
+            'background_site',
+            'link',
+            'existing',
+            'missing',
+        );
+
+        if(preg_match('/colou?r/', $key) || in_array(trim($key,'_'), $colors)) 
{
+            return 'class="color"';
+        } else {
+            return '';
+        }
+    }
+
+    /**
+     * saves the preview.ini (alos called from ajax directly)
+     */
+    public function run_preview() {
+        global $conf;
+        $ini = $conf['cachedir'].'/preview.ini';
+        io_saveFile($ini, $this->makeini());
+    }
+
+    /**
+     * deletes the preview.ini
+     */
+    protected function run_reset() {
+        global $conf;
+        $ini = $conf['cachedir'].'/preview.ini';
+        io_saveFile($ini, '');
+    }
+
+    /**
+     * deletes the local style.ini replacements
+     */
+    protected function run_revert() {
+        $this->replaceini('');
+        $this->run_reset();
+    }
+
+    /**
+     * save the local style.ini replacements
+     */
+    protected function run_save() {
+        $this->replaceini($this->makeini());
+        $this->run_reset();
+    }
+
+    /**
+     * create the replacement part of a style.ini from submitted data
+     *
+     * @return string
+     */
+    protected function makeini() {
+        global $INPUT;
+
+        $ini = "[replacements]\n";
+        $ini .= ";These overwrites have been generated from the Template 
styling Admin interface\n";
+        $ini .= ";Any values in this section will be overwritten by that tool 
again\n";
+        foreach($INPUT->arr('tpl') as $key => $val) {
+            $ini .= $key.' = "'.addslashes($val).'"'."\n";
+        }
+
+        return $ini;
+    }
+
+    /**
+     * replaces the replacement parts in the local ini
+     *
+     * @param string $new the new ini contents
+     */
+    protected function replaceini($new) {
+        global $conf;
+        $ini = DOKU_CONF."tpl/".$conf['template']."/style.ini";
+        if(file_exists($ini)) {
+            $old = io_readFile($ini);
+            $old = preg_replace('/\[replacements\]\n.*?(\n\[.*]|$)/s', '\\1', 
$old);
+            $old = trim($old);
+        } else {
+            $old = '';
+        }
+
+        io_makeFileDir($ini);
+        io_saveFile($ini, "$old\n\n$new");
+    }
+
+}
+
+// vim:ts=4:sw=4:et:
diff --git a/public_html/lib/plugins/styling/iris.js 
b/public_html/lib/plugins/styling/iris.js
new file mode 100644
index 0000000..4eda502
--- /dev/null
+++ b/public_html/lib/plugins/styling/iris.js
@@ -0,0 +1,1488 @@
+/*! Iris Color Picker - v1.0.7 - 2014-11-28
+* https://github.com/Automattic/Iris
+* Copyright (c) 2014 Matt Wiebe; Licensed GPLv2 */
+(function( $, undef ){
+       var _html, nonGradientIE, gradientType, vendorPrefixes, _css, Iris, UA, 
isIE, IEVersion;
+
+       _html = '<div class="iris-picker"><div class="iris-picker-inner"><div 
class="iris-square"><a class="iris-square-value" href="#"><span 
class="iris-square-handle ui-slider-handle"></span></a><div 
class="iris-square-inner iris-square-horiz"></div><div class="iris-square-inner 
iris-square-vert"></div></div><div class="iris-slider iris-strip"><div 
class="iris-slider-offset"></div></div></div></div>';
+       _css = 
'.iris-picker{display:block;position:relative}.iris-picker,.iris-picker 
*{-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input+.iris-picker{margin-top:4px}.iris-error{background-color:#ffafaf}.iris-border{border-radius:3px;border:1px
 solid 
#aaa;width:200px;background-color:#fff}.iris-picker-inner{position:absolute;top:0;right:0;left:0;bottom:0}.iris-border
 .iris-picker-inner{top:10px;right:10px;left:10px;bottom:10px}.iris-picker 
.iris-square-inn [...]
+
+       // Even IE9 dosen't support gradients. Elaborate sigh.
+       UA = navigator.userAgent.toLowerCase();
+       isIE = navigator.appName === 'Microsoft Internet Explorer';
+       IEVersion = isIE ? parseFloat( UA.match( /msie ([0-9]{1,}[\.0-9]{0,})/ 
)[1] ) : 0;
+       nonGradientIE = ( isIE && IEVersion < 10 );
+       gradientType = false;
+
+       // we don't bother with an unprefixed version, as it has a different 
syntax
+       vendorPrefixes = [ '-moz-', '-webkit-', '-o-', '-ms-' ];
+
+       // Bail for IE <= 7
+       if ( nonGradientIE && IEVersion <= 7 ) {
+               $.fn.iris = $.noop;
+               $.support.iris = false;
+               return;
+       }
+
+       $.support.iris = true;
+
+       function testGradientType() {
+               var el, base,
+                       bgImageString = 'backgroundImage';
+
+               if ( nonGradientIE ) {
+                       gradientType = 'filter';
+               }
+               else {
+                       el = $( '<div id="iris-gradtest" />' );
+                       base = 'linear-gradient(top,#fff,#000)';
+                       $.each( vendorPrefixes, function( i, val ){
+                               el.css( bgImageString, val + base );
+                               if ( el.css( bgImageString ).match( 'gradient' 
) ) {
+                                       gradientType = i;
+                                       return false;
+                               }
+                       });
+                       // check for legacy webkit gradient syntax
+                       if ( gradientType === false ) {
+                               el.css( 'background', 
'-webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#000))' );
+                               if ( el.css( bgImageString ).match( 'gradient' 
) ) {
+                                       gradientType = 'webkit';
+                               }
+                       }
+                       el.remove();
+               }
+
+       }
+
+       /**
+       * Only for CSS3 gradients. oldIE will use a separate function.
+       *
+       * Accepts as many color stops as necessary from 2nd arg on, or 2nd
+       * arg can be an array of color stops
+       *
+       * @param  {string} origin Gradient origin - top or left, defaults to 
left.
+       * @return {string}        Appropriate CSS3 gradient string for use in
+       */
+       function createGradient( origin, stops ) {
+               origin = ( origin === 'top' ) ? 'top' : 'left';
+               stops = $.isArray( stops ) ? stops : 
Array.prototype.slice.call( arguments, 1 );
+               if ( gradientType === 'webkit' ) {
+                       return legacyWebkitGradient( origin, stops );
+               } else {
+                       return vendorPrefixes[ gradientType ] + 
'linear-gradient(' + origin + ', ' + stops.join(', ') + ')';
+               }
+       }
+
+       /**
+       * Stupid gradients for a stupid browser.
+       */
+       function stupidIEGradient( origin, stops ) {
+               var type, self, lastIndex, filter, startPosProp, endPosProp, 
dimensionProp, template, html;
+
+               origin = ( origin === 'top' ) ? 'top' : 'left';
+               stops = $.isArray( stops ) ? stops : 
Array.prototype.slice.call( arguments, 1 );
+               // 8 hex: AARRGGBB
+               // GradientType: 0 vertical, 1 horizontal
+               type = ( origin === 'top' ) ? 0 : 1;
+               self = $( this );
+               lastIndex = stops.length - 1;
+               filter = 'filter';
+               startPosProp = ( type === 1 ) ? 'left' : 'top';
+               endPosProp = ( type === 1 ) ? 'right' : 'bottom';
+               dimensionProp = ( type === 1 ) ? 'height' : 'width';
+               template = '<div class="iris-ie-gradient-shim" 
style="position:absolute;' + dimensionProp + ':100%;' + startPosProp + 
':%start%;' + endPosProp + ':%end%;' + filter + ':%filter%;" 
data-color:"%color%"></div>';
+               html = '';
+               // need a positioning context
+               if ( self.css('position') === 'static' ) {
+                       self.css( {position: 'relative' } );
+               }
+
+               stops = fillColorStops( stops );
+               $.each(stops, function( i, startColor ) {
+                       var endColor, endStop, filterVal;
+
+                       // we want two at a time. if we're on the last pair, 
bail.
+                       if ( i === lastIndex ) {
+                               return false;
+                       }
+
+                       endColor = stops[ i + 1 ];
+                       //if our pairs are at the same color stop, moving along.
+                       if ( startColor.stop === endColor.stop ) {
+                               return;
+                       }
+
+                       endStop = 100 - parseFloat( endColor.stop ) + '%';
+                       startColor.octoHex = new Color( startColor.color 
).toIEOctoHex();
+                       endColor.octoHex = new Color( endColor.color 
).toIEOctoHex();
+
+                       filterVal = 
'progid:DXImageTransform.Microsoft.Gradient(GradientType=' + type + ', 
StartColorStr=\'' + startColor.octoHex + '\', EndColorStr=\'' + 
endColor.octoHex + '\')';
+                       html += template.replace( '%start%', startColor.stop 
).replace( '%end%', endStop ).replace( '%filter%', filterVal );
+               });
+               self.find( '.iris-ie-gradient-shim' ).remove();
+               $( html ).prependTo( self );
+       }
+
+       function legacyWebkitGradient( origin, colorList ) {
+               var stops = [];
+               origin = ( origin === 'top' ) ? '0% 0%,0% 100%,' : '0% 
100%,100% 100%,';
+               colorList = fillColorStops( colorList );
+               $.each( colorList, function( i, val ){
+                       stops.push( 'color-stop(' + ( parseFloat( val.stop ) / 
100 ) + ', ' + val.color + ')' );
+               });
+               return '-webkit-gradient(linear,' + origin + stops.join(',') + 
')';
+       }
+
+       function fillColorStops( colorList ) {
+               var colors = [],
+                       percs = [],
+                       newColorList = [],
+                       lastIndex = colorList.length - 1;
+
+               $.each( colorList, function( index, val ) {
+                       var color = val,
+                               perc = false,
+                               match = val.match( /1?[0-9]{1,2}%$/ );
+
+                       if ( match ) {
+                               color = val.replace( /\s?1?[0-9]{1,2}%$/, '' );
+                               perc = match.shift();
+                       }
+                       colors.push( color );
+                       percs.push( perc );
+               });
+
+               // back fill first and last
+               if ( percs[0] === false ) {
+                       percs[0] = '0%';
+               }
+
+               if ( percs[lastIndex] === false ) {
+                       percs[lastIndex] = '100%';
+               }
+
+               percs = backFillColorStops( percs );
+
+               $.each( percs, function( i ){
+                       newColorList[i] = { color: colors[i], stop: percs[i] };
+               });
+               return newColorList;
+       }
+
+       function backFillColorStops( stops ) {
+               var first = 0,
+                       last = stops.length - 1,
+                       i = 0,
+                       foundFirst = false,
+                       incr,
+                       steps,
+                       step,
+                       firstVal;
+
+               if ( stops.length <= 2 || $.inArray( false, stops ) < 0 ) {
+                       return stops;
+               }
+               while ( i < stops.length - 1 ) {
+                       if ( ! foundFirst && stops[i] === false ) {
+                               first = i - 1;
+                               foundFirst = true;
+                       } else if ( foundFirst && stops[i] !== false ) {
+                               last = i;
+                               i = stops.length;
+                       }
+                       i++;
+               }
+               steps = last - first;
+               firstVal = parseInt( stops[first].replace('%'), 10 );
+               incr = ( parseFloat( stops[last].replace('%') ) - firstVal ) / 
steps;
+               i = first + 1;
+               step = 1;
+               while ( i < last ) {
+                       stops[i] = ( firstVal + ( step * incr ) ) + '%';
+                       step++;
+                       i++;
+               }
+               return backFillColorStops( stops );
+       }
+
+       $.fn.gradient = function() {
+               var args = arguments;
+               return this.each( function() {
+                       // this'll be oldishIE
+                       if ( nonGradientIE ) {
+                               stupidIEGradient.apply( this, args );
+                       } else {
+                               // new hotness
+                               $( this ).css( 'backgroundImage', 
createGradient.apply( this, args ) );
+                       }
+               });
+       };
+
+       $.fn.raninbowGradient = function( origin, args ) {
+               var opts, template, i, steps;
+
+               origin = origin || 'top';
+               opts = $.extend( {}, { s: 100, l: 50 }, args );
+               template = 'hsl(%h%,' + opts.s + '%,' + opts.l + '%)';
+               i = 0;
+               steps = [];
+               while ( i <= 360 ) {
+                       steps.push( template.replace('%h%', i) );
+                       i += 30;
+               }
+               return this.each(function() {
+                       $(this).gradient( origin, steps );
+               });
+       };
+
+       // the colorpicker widget def.
+       Iris = {
+               options: {
+                       color: false,
+                       mode: 'hsl',
+                       controls: {
+                               horiz: 's', // horizontal defaults to saturation
+                               vert: 'l', // vertical defaults to lightness
+                               strip: 'h' // right strip defaults to hue
+                       },
+                       hide: true, // hide the color picker by default
+                       border: true, // draw a border around the collection of 
UI elements
+                       target: false, // a DOM element / jQuery selector that 
the element will be appended within. Only used when called on an input.
+                       width: 200, // the width of the collection of UI 
elements
+                       palettes: false // show a palette of basic colors 
beneath the square.
+               },
+               _color: '',
+               _palettes: [ '#000', '#fff', '#d33', '#d93', '#ee2', '#81d742', 
'#1e73be', '#8224e3' ],
+               _inited: false,
+               _defaultHSLControls: {
+                       horiz: 's',
+                       vert: 'l',
+                       strip: 'h'
+               },
+               _defaultHSVControls: {
+                       horiz: 'h',
+                       vert: 'v',
+                       strip: 's'
+               },
+               _scale: {
+                       h: 360,
+                       s: 100,
+                       l: 100,
+                       v: 100
+               },
+               _create: function() {
+                       var self = this,
+                               el = self.element,
+                               color = self.options.color || el.val();
+
+                       if ( gradientType === false ) {
+                               testGradientType();
+                       }
+
+                       if ( el.is( 'input' ) ) {
+                               if ( self.options.target ) {
+                                       self.picker = $( _html ).appendTo( 
self.options.target );
+                               } else {
+                                       self.picker = $( _html ).insertAfter( 
el );
+                               }
+
+                               self._addInputListeners( el );
+                       } else {
+                               el.append( _html );
+                               self.picker = el.find( '.iris-picker' );
+                       }
+
+                       // Browsers / Versions
+                       // Feature detection doesn't work for these, and 
$.browser is deprecated
+                       if ( isIE ) {
+                               if ( IEVersion === 9 ) {
+                                       self.picker.addClass( 'iris-ie-9' );
+                               } else if ( IEVersion <= 8 ) {
+                                       self.picker.addClass( 'iris-ie-lt9' );
+                               }
+                       } else if ( UA.indexOf('compatible') < 0 && 
UA.indexOf('khtml') < 0 && UA.match( /mozilla/ ) ) {
+                               self.picker.addClass( 'iris-mozilla' );
+                       }
+
+                       if ( self.options.palettes ) {
+                               self._addPalettes();
+                       }
+
+                       self._color = new Color( color ).setHSpace( 
self.options.mode );
+                       self.options.color = self._color.toString();
+
+                       // prep 'em for re-use
+                       self.controls = {
+                               square:      self.picker.find( '.iris-square' ),
+                               squareDrag:  self.picker.find( 
'.iris-square-value' ),
+                               horiz:       self.picker.find( 
'.iris-square-horiz' ),
+                               vert:        self.picker.find( 
'.iris-square-vert' ),
+                               strip:       self.picker.find( '.iris-strip' ),
+                               stripSlider: self.picker.find( '.iris-strip 
.iris-slider-offset' )
+                       };
+
+                       // small sanity check - if we chose hsv, change default 
controls away from hsl
+                       if ( self.options.mode === 'hsv' && self._has('l', 
self.options.controls) ) {
+                               self.options.controls = 
self._defaultHSVControls;
+                       } else if ( self.options.mode === 'hsl' && 
self._has('v', self.options.controls) ) {
+                               self.options.controls = 
self._defaultHSLControls;
+                       }
+
+                       // store it. HSL gets squirrely
+                       self.hue = self._color.h();
+
+                       if ( self.options.hide ) {
+                               self.picker.hide();
+                       }
+
+                       if ( self.options.border ) {
+                               self.picker.addClass( 'iris-border' );
+                       }
+
+                       self._initControls();
+                       self.active = 'external';
+                       self._dimensions();
+                       self._change();
+               },
+               _has: function(needle, haystack) {
+                       var ret = false;
+                       $.each(haystack, function(i,v){
+                               if ( needle === v ) {
+                                       ret = true;
+                                       // exit the loop
+                                       return false;
+                               }
+                       });
+                       return ret;
+               },
+               _addPalettes: function () {
+                       var container = $( '<div class="iris-palette-container" 
/>' ),
+                               palette = $( '<a class="iris-palette" 
tabindex="0" />' ),
+                               colors = $.isArray( this.options.palettes ) ? 
this.options.palettes : this._palettes;
+
+                       // do we have an existing container? Empty and reuse it.
+                       if ( this.picker.find( '.iris-palette-container' 
).length ) {
+                               container = this.picker.find( 
'.iris-palette-container' ).detach().html( '' );
+                       }
+
+                       $.each(colors, function(index, val) {
+                               palette.clone().data( 'color', val )
+                                       .css( 'backgroundColor', val 
).appendTo( container )
+                                       .height( 10 ).width( 10 );
+                       });
+
+                       this.picker.append(container);
+               },
+               _paint: function() {
+                       var self = this;
+                       self._paintDimension( 'top', 'strip' );
+                       self._paintDimension( 'top', 'vert' );
+                       self._paintDimension( 'left', 'horiz' );
+               },
+               _paintDimension: function( origin, control ) {
+                       var self = this,
+                               c = self._color,
+                               mode = self.options.mode,
+                               color = self._getHSpaceColor(),
+                               target = self.controls[ control ],
+                               controlOpts = self.options.controls,
+                               stops;
+
+                       // don't paint the active control
+                       if ( control === self.active || ( self.active === 
'square' && control !== 'strip' ) ) {
+                               return;
+                       }
+
+                       switch ( controlOpts[ control ] ) {
+                               case 'h':
+                                       if ( mode === 'hsv' ) {
+                                               color = c.clone();
+                                               switch ( control ) {
+                                                       case 'horiz':
+                                                               
color[controlOpts.vert](100);
+                                                               break;
+                                                       case 'vert':
+                                                               
color[controlOpts.horiz](100);
+                                                               break;
+                                                       case 'strip':
+                                                               
color.setHSpace('hsl');
+                                                               break;
+                                               }
+                                               stops = color.toHsl();
+                                       } else {
+                                               if ( control === 'strip' ) {
+                                                       stops = { s: color.s, 
l: color.l };
+                                               } else {
+                                                       stops = { s: 100, l: 
color.l };
+                                               }
+                                       }
+
+                                       target.raninbowGradient( origin, stops 
);
+                                       break;
+                               case 's':
+                                       if ( mode === 'hsv' ) {
+                                               if ( control === 'vert' ) {
+                                                       stops = [ 
c.clone().a(0).s(0).toCSS('rgba'), c.clone().a(1).s(0).toCSS('rgba') ];
+                                               } else if ( control === 'strip' 
) {
+                                                       stops = [ 
c.clone().s(100).toCSS('hsl'), c.clone().s(0).toCSS('hsl') ];
+                                               } else if ( control === 'horiz' 
) {
+                                                       stops = [ '#fff', 
'hsl(' + color.h + ',100%,50%)' ];
+                                               }
+                                       } else { // implicit mode === 'hsl'
+                                               if ( control === 'vert' && 
self.options.controls.horiz === 'h' ) {
+                                                       stops = ['hsla(0, 0%, ' 
+ color.l + '%, 0)', 'hsla(0, 0%, ' + color.l + '%, 1)'];
+                                               } else {
+                                                       stops = ['hsl('+ 
color.h +',0%,50%)', 'hsl(' + color.h + ',100%,50%)'];
+                                               }
+                                       }
+
+
+                                       target.gradient( origin, stops );
+                                       break;
+                               case 'l':
+                                       if ( control === 'strip' ) {
+                                               stops = ['hsl(' + color.h + 
',100%,100%)', 'hsl(' + color.h + ', ' + color.s + '%,50%)', 'hsl('+ color.h 
+',100%,0%)'];
+                                       } else {
+                                               stops = ['#fff', 
'rgba(255,255,255,0) 50%', 'rgba(0,0,0,0) 50%', 'rgba(0,0,0,1)'];
+                                       }
+                                       target.gradient( origin, stops );
+                                       break;
+                               case 'v':
+                                               if ( control === 'strip' ) {
+                                                       stops = [ 
c.clone().v(100).toCSS(), c.clone().v(0).toCSS() ];
+                                               } else {
+                                                       stops = 
['rgba(0,0,0,0)', '#000'];
+                                               }
+                                               target.gradient( origin, stops 
);
+                                       break;
+                               default:
+                                       break;
+                       }
+               },
+
+               _getHSpaceColor: function() {
+                       return ( this.options.mode === 'hsv' ) ? 
this._color.toHsv() : this._color.toHsl();
+               },
+
+               _dimensions: function( reset ) {
+                       // whatever size
+                       var self = this,
+                               opts = self.options,
+                               controls = self.controls,
+                               square = controls.square,
+                               strip = self.picker.find( '.iris-strip' ),
+                               squareWidth = '77.5%',
+                               stripWidth = '12%',
+                               totalPadding = 20,
+                               innerWidth = opts.border ? opts.width - 
totalPadding : opts.width,
+                               controlsHeight,
+                               paletteCount = $.isArray( opts.palettes ) ? 
opts.palettes.length : self._palettes.length,
+                               paletteMargin, paletteWidth, 
paletteContainerWidth;
+
+                       if ( reset ) {
+                               square.css( 'width', '' );
+                               strip.css( 'width', '' );
+                               self.picker.css( {width: '', height: ''} );
+                       }
+
+                       squareWidth = innerWidth * ( parseFloat( squareWidth ) 
/ 100 );
+                       stripWidth = innerWidth * ( parseFloat( stripWidth ) / 
100 );
+                       controlsHeight = opts.border ? squareWidth + 
totalPadding : squareWidth;
+
+                       square.width( squareWidth ).height( squareWidth );
+                       strip.height( squareWidth ).width( stripWidth );
+                       self.picker.css( { width: opts.width, height: 
controlsHeight } );
+
+                       if ( ! opts.palettes ) {
+                               return self.picker.css( 'paddingBottom', '' );
+                       }
+
+                       // single margin at 2%
+                       paletteMargin = squareWidth * 2 / 100;
+                       paletteContainerWidth = squareWidth - ( ( paletteCount 
- 1 ) * paletteMargin );
+                       paletteWidth = paletteContainerWidth / paletteCount;
+                       self.picker.find('.iris-palette').each( function( i ) {
+                               var margin = i === 0 ? 0 : paletteMargin;
+                               $( this ).css({
+                                       width: paletteWidth,
+                                       height: paletteWidth,
+                                       marginLeft: margin
+                               });
+                       });
+                       self.picker.css( 'paddingBottom', paletteWidth + 
paletteMargin );
+                       strip.height( paletteWidth + paletteMargin + 
squareWidth );
+               },
+
+               _addInputListeners: function( input ) {
+                       var self = this,
+                               debounceTimeout = 100,
+                               callback = function( event ){
+                                       var color = new Color( input.val() ),
+                                               val = input.val().replace( 
/^#/, '' );
+
+                                       input.removeClass( 'iris-error' );
+                                       // we gave a bad color
+                                       if ( color.error ) {
+                                               // don't error on an empty 
input - we want those allowed
+                                               if ( val !== '' ) {
+                                                       input.addClass( 
'iris-error' );
+                                               }
+                                       } else {
+                                               if ( color.toString() !== 
self._color.toString() ) {
+                                                       // let's not do this on 
keyup for hex shortcodes
+                                                       if ( ! ( event.type === 
'keyup' && val.match( /^[0-9a-fA-F]{3}$/ ) ) ) {
+                                                               
self._setOption( 'color', color.toString() );
+                                                       }
+                                               }
+                                       }
+                               };
+
+                       input.on( 'change', callback ).on( 'keyup', 
self._debounce( callback, debounceTimeout ) );
+
+                       // If we initialized hidden, show on first focus. The 
rest is up to you.
+                       if ( self.options.hide ) {
+                               input.one( 'focus', function() {
+                                       self.show();
+                               });
+                       }
+               },
+
+               _initControls: function() {
+                       var self = this,
+                               controls = self.controls,
+                               square = controls.square,
+                               controlOpts = self.options.controls,
+                               stripScale = self._scale[controlOpts.strip];
+
+                       controls.stripSlider.slider({
+                               orientation: 'vertical',
+                               max: stripScale,
+                               slide: function( event, ui ) {
+                                       self.active = 'strip';
+                                       // "reverse" for hue.
+                                       if ( controlOpts.strip === 'h' ) {
+                                               ui.value = stripScale - 
ui.value;
+                                       }
+
+                                       self._color[controlOpts.strip]( 
ui.value );
+                                       self._change.apply( self, arguments );
+                               }
+                       });
+
+                       controls.squareDrag.draggable({
+                               containment: controls.square.find( 
'.iris-square-inner' ),
+                               zIndex: 1000,
+                               cursor: 'move',
+                               drag: function( event, ui ) {
+                                       self._squareDrag( event, ui );
+                               },
+                               start: function() {
+                                       square.addClass( 'iris-dragging' );
+                                       $(this).addClass( 'ui-state-focus' );
+                               },
+                               stop: function() {
+                                       square.removeClass( 'iris-dragging' );
+                                       $(this).removeClass( 'ui-state-focus' );
+                               }
+                       }).on( 'mousedown mouseup', function( event ) {
+                               var focusClass = 'ui-state-focus';
+                               event.preventDefault();
+                               if (event.type === 'mousedown' ) {
+                                       self.picker.find( '.' + focusClass 
).removeClass( focusClass ).blur();
+                                       $(this).addClass( focusClass ).focus();
+                               } else {
+                                       $(this).removeClass( focusClass );
+                               }
+                       }).on( 'keydown', function( event ) {
+                               var container = controls.square,
+                                       draggable = controls.squareDrag,
+                                       position = draggable.position(),
+                                       distance = self.options.width / 100; // 
Distance in pixels the draggable should be moved: 1 "stop"
+
+                               // make alt key go "10"
+                               if ( event.altKey ) {
+                                       distance *= 10;
+                               }
+
+                               // Reposition if one of the directional keys is 
pressed
+                               switch ( event.keyCode ) {
+                                       case 37: position.left -= distance; 
break; // Left
+                                       case 38: position.top  -= distance; 
break; // Up
+                                       case 39: position.left += distance; 
break; // Right
+                                       case 40: position.top  += distance; 
break; // Down
+                                       default: return true; // Exit and bubble
+                               }
+
+                               // Keep draggable within container
+                               position.left = Math.max( 0, Math.min( 
position.left, container.width() ) );
+                               position.top =  Math.max( 0, Math.min( 
position.top, container.height() ) );
+
+                               draggable.css(position);
+                               self._squareDrag( event, { position: position 
});
+                               event.preventDefault();
+                       });
+
+                       // allow clicking on the square to move there and keep 
dragging
+                       square.mousedown( function( event ) {
+                               var squareOffset, pos;
+                               // only left click
+                               if ( event.which !== 1 ) {
+                                       return;
+                               }
+
+                               // prevent bubbling from the handle: no 
infinite loops
+                               if ( ! $( event.target ).is( 'div' ) ) {
+                                       return;
+                               }
+
+                               squareOffset = self.controls.square.offset();
+                               pos = {
+                                               top: event.pageY - 
squareOffset.top,
+                                               left: event.pageX - 
squareOffset.left
+                               };
+                               event.preventDefault();
+                               self._squareDrag( event, { position: pos } );
+                               event.target = self.controls.squareDrag.get(0);
+                               self.controls.squareDrag.css( pos ).trigger( 
event );
+                       });
+
+                       // palettes
+                       if ( self.options.palettes ) {
+                               self._paletteListeners();
+                       }
+               },
+
+               _paletteListeners: function() {
+                       var self = this;
+                       
self.picker.find('.iris-palette-container').on('click.palette', 
'.iris-palette', function() {
+                               self._color.fromCSS( $(this).data('color') );
+                               self.active = 'external';
+                               self._change();
+                       }).on( 'keydown.palette', '.iris-palette', function( 
event ) {
+                               if ( ! ( event.keyCode === 13 || event.keyCode 
=== 32 ) ) {
+                                       return true;
+                               }
+                               event.stopPropagation();
+                               $( this ).click();
+                       });
+               },
+
+               _squareDrag: function( event, ui ) {
+                       var self = this,
+                               controlOpts = self.options.controls,
+                               dimensions = self._squareDimensions(),
+                               vertVal = Math.round( ( dimensions.h - 
ui.position.top ) / dimensions.h * self._scale[controlOpts.vert] ),
+                               horizVal = self._scale[controlOpts.horiz] - 
Math.round( ( dimensions.w - ui.position.left ) / dimensions.w * 
self._scale[controlOpts.horiz] );
+
+                       self._color[controlOpts.horiz]( horizVal 
)[controlOpts.vert]( vertVal );
+
+                       self.active = 'square';
+                       self._change.apply( self, arguments );
+               },
+
+               _setOption: function( key, value ) {
+                       var self = this,
+                               oldValue = self.options[key],
+                               doDimensions = false,
+                               hexLessColor,
+                               newColor,
+                               method;
+
+                       // ensure the new value is set. We can reset to 
oldValue if some check wasn't met.
+                       self.options[key] = value;
+
+                       switch(key) {
+                               case 'color':
+                                       // cast to string in case we have a 
number
+                                       value = '' + value;
+                                       hexLessColor = value.replace( /^#/, '' 
);
+                                       newColor = new Color( value 
).setHSpace( self.options.mode );
+                                       if ( newColor.error ) {
+                                               self.options[key] = oldValue;
+                                       } else {
+                                               self._color = newColor;
+                                               self.options.color = 
self.options[key] = self._color.toString();
+                                               self.active = 'external';
+                                               self._change();
+                                       }
+                                       break;
+                               case 'palettes':
+                                       doDimensions = true;
+
+                                       if ( value ) {
+                                               self._addPalettes();
+                                       } else {
+                                               
self.picker.find('.iris-palette-container').remove();
+                                       }
+
+                                       // do we need to add events?
+                                       if ( ! oldValue ) {
+                                               self._paletteListeners();
+                                       }
+                                       break;
+                               case 'width':
+                                       doDimensions = true;
+                                       break;
+                               case 'border':
+                                       doDimensions = true;
+                                       method = value ? 'addClass' : 
'removeClass';
+                                       self.picker[method]('iris-border');
+                                       break;
+                               case 'mode':
+                               case 'controls':
+                                       // if nothing's changed, let's bail, 
since this causes re-rendering the whole widget
+                                       if ( oldValue === value ) {
+                                               return;
+                                       }
+
+                                       // we're using these poorly named 
variables because they're already scoped.
+                                       // method is the element that Iris was 
called on. oldValue will be the options
+                                       method = self.element;
+                                       oldValue = self.options;
+                                       oldValue.hide = ! self.picker.is( 
':visible' );
+                                       self.destroy();
+                                       self.picker.remove();
+                                       return $(self.element).iris(oldValue);
+                       }
+
+                       // Do we need to recalc dimensions?
+                       if ( doDimensions ) {
+                               self._dimensions(true);
+                       }
+               },
+
+               _squareDimensions: function( forceRefresh ) {
+                       var square = this.controls.square,
+                               dimensions,
+                               control;
+
+                       if ( forceRefresh !== undef && 
square.data('dimensions') ) {
+                               return square.data('dimensions');
+                       }
+
+                       control = this.controls.squareDrag;
+                       dimensions = {
+                               w: square.width(),
+                               h: square.height()
+                       };
+                       square.data( 'dimensions', dimensions );
+                       return dimensions;
+               },
+
+               _isNonHueControl: function( active, type ) {
+                       if ( active === 'square' && this.options.controls.strip 
=== 'h' ) {
+                               return true;
+                       } else if ( type === 'external' || ( type === 'h' && 
active === 'strip' ) ) {
+                               return false;
+                       }
+
+                       return true;
+               },
+
+               _change: function() {
+                       var self = this,
+                               controls = self.controls,
+                               color = self._getHSpaceColor(),
+                               actions = [ 'square', 'strip' ],
+                               controlOpts = self.options.controls,
+                               type = controlOpts[self.active] || 'external',
+                               oldHue = self.hue;
+
+                       if ( self.active === 'strip' ) {
+                               // take no action on any of the square sliders 
if we adjusted the strip
+                               actions = [];
+                       } else if ( self.active !== 'external' ) {
+                               // for non-strip, non-external, strip should 
never change
+                               actions.pop(); // conveniently the last item
+                       }
+
+                       $.each( actions, function(index, item) {
+                               var value, dimensions, cssObj;
+                               if ( item !== self.active ) {
+                                       switch ( item ) {
+                                               case 'strip':
+                                                       // reverse for hue
+                                                       value = ( 
controlOpts.strip === 'h' ) ? self._scale[controlOpts.strip] - 
color[controlOpts.strip] : color[controlOpts.strip];
+                                                       
controls.stripSlider.slider( 'value', value );
+                                                       break;
+                                               case 'square':
+                                                       dimensions = 
self._squareDimensions();
+                                                       cssObj = {
+                                                               left: 
color[controlOpts.horiz] / self._scale[controlOpts.horiz] * dimensions.w,
+                                                               top: 
dimensions.h - ( color[controlOpts.vert] / self._scale[controlOpts.vert] * 
dimensions.h )
+                                                       };
+
+                                                       
self.controls.squareDrag.css( cssObj );
+                                                       break;
+                                       }
+                               }
+                       });
+
+                       // Ensure that we don't change hue if we triggered a 
hue reset
+                       if ( color.h !== oldHue && self._isNonHueControl( 
self.active, type ) ) {
+                               self._color.h(oldHue);
+                       }
+
+                       // store hue for repeating above check next time
+                       self.hue = self._color.h();
+
+                       self.options.color = self._color.toString();
+
+                       // only run after the first time
+                       if ( self._inited ) {
+                               self._trigger( 'change', { type: self.active }, 
{ color: self._color } );
+                       }
+
+                       if ( self.element.is( ':input' ) && ! self._color.error 
) {
+                               self.element.removeClass( 'iris-error' );
+                               if ( self.element.val() !== 
self._color.toString() ) {
+                                       self.element.val( 
self._color.toString() );
+                               }
+                       }
+
+                       self._paint();
+                       self._inited = true;
+                       self.active = false;
+               },
+               // taken from underscore.js _.debounce method
+               _debounce: function( func, wait, immediate ) {
+                       var timeout, result;
+                       return function() {
+                               var context = this,
+                                       args = arguments,
+                                       later,
+                                       callNow;
+
+                               later = function() {
+                                       timeout = null;
+                                       if ( ! immediate) {
+                                               result = func.apply( context, 
args );
+                                       }
+                               };
+
+                               callNow = immediate && !timeout;
+                               clearTimeout( timeout );
+                               timeout = setTimeout( later, wait );
+                               if ( callNow ) {
+                                       result = func.apply( context, args );
+                               }
+                               return result;
+                       };
+               },
+               show: function() {
+                       this.picker.show();
+               },
+               hide: function() {
+                       this.picker.hide();
+               },
+               toggle: function() {
+                       this.picker.toggle();
+               },
+               color: function(newColor) {
+                       if ( newColor === true ) {
+                               return this._color.clone();
+                       } else if ( newColor === undef ) {
+                               return this._color.toString();
+                       }
+                       this.option('color', newColor);
+               }
+       };
+       // initialize the widget
+       $.widget( 'a8c.iris', Iris );
+       // add CSS
+       $( '<style id="iris-css">' + _css + '</style>' ).appendTo( 'head' );
+
+}( jQuery ));
+/*! Color.js - v0.9.11 - 2013-08-09
+* https://github.com/Automattic/Color.js
+* Copyright (c) 2013 Matt Wiebe; Licensed GPLv2 */
+(function(global, undef) {
+
+       var Color = function( color, type ) {
+               if ( ! ( this instanceof Color ) )
+                       return new Color( color, type );
+
+               return this._init( color, type );
+       };
+
+       Color.fn = Color.prototype = {
+               _color: 0,
+               _alpha: 1,
+               error: false,
+               // for preserving hue/sat in fromHsl().toHsl() flows
+               _hsl: { h: 0, s: 0, l: 0 },
+               // for preserving hue/sat in fromHsv().toHsv() flows
+               _hsv: { h: 0, s: 0, v: 0 },
+               // for setting hsl or hsv space - needed for .h() & .s() 
functions to function properly
+               _hSpace: 'hsl',
+               _init: function( color ) {
+                       var func = 'noop';
+                       switch ( typeof color ) {
+                                       case 'object':
+                                               // alpha?
+                                               if ( color.a !== undef )
+                                                       this.a( color.a );
+                                               func = ( color.r !== undef ) ? 
'fromRgb' :
+                                                       ( color.l !== undef ) ? 
'fromHsl' :
+                                                       ( color.v !== undef ) ? 
'fromHsv' : func;
+                                               return this[func]( color );
+                                       case 'string':
+                                               return this.fromCSS( color );
+                                       case 'number':
+                                               return this.fromInt( parseInt( 
color, 10 ) );
+                       }
+                       return this;
+               },
+
+               _error: function() {
+                       this.error = true;
+                       return this;
+               },
+
+               clone: function() {
+                       var newColor = new Color( this.toInt() ),
+                               copy = ['_alpha', '_hSpace', '_hsl', '_hsv', 
'error'];
+                       for ( var i = copy.length - 1; i >= 0; i-- ) {
+                               newColor[ copy[i] ] = this[ copy[i] ];
+                       }
+                       return newColor;
+               },
+
+               setHSpace: function( space ) {
+                       this._hSpace = ( space === 'hsv' ) ? space : 'hsl';
+                       return this;
+               },
+
+               noop: function() {
+                       return this;
+               },
+
+               fromCSS: function( color ) {
+                       var list,
+                               leadingRE = /^(rgb|hs(l|v))a?\(/;
+                       this.error = false;
+
+                       // whitespace and semicolon trim
+                       color = color.replace(/^\s+/, '').replace(/\s+$/, 
'').replace(/;$/, '');
+
+                       if ( color.match(leadingRE) && color.match(/\)$/) ) {
+                               list = color.replace(/(\s|%)/g, 
'').replace(leadingRE, '').replace(/,?\);?$/, '').split(',');
+
+                               if ( list.length < 3 )
+                                       return this._error();
+
+                               if ( list.length === 4 ) {
+                                       this.a( parseFloat( list.pop() ) );
+                                       // error state has been set to true in 
.a() if we passed NaN
+                                       if ( this.error )
+                                               return this;
+                               }
+
+                               for (var i = list.length - 1; i >= 0; i--) {
+                                       list[i] = parseInt(list[i], 10);
+                                       if ( isNaN( list[i] ) )
+                                               return this._error();
+                               }
+
+                               if ( color.match(/^rgb/) ) {
+                                       return this.fromRgb( {
+                                               r: list[0],
+                                               g: list[1],
+                                               b: list[2]
+                                       } );
+                               } else if ( color.match(/^hsv/) ) {
+                                       return this.fromHsv( {
+                                               h: list[0],
+                                               s: list[1],
+                                               v: list[2]
+                                       } );
+                               } else {
+                                       return this.fromHsl( {
+                                               h: list[0],
+                                               s: list[1],
+                                               l: list[2]
+                                       } );
+                               }
+                       } else {
+                               // must be hex amirite?
+                               return this.fromHex( color );
+                       }
+               },
+
+               fromRgb: function( rgb, preserve ) {
+                       if ( typeof rgb !== 'object' || rgb.r === undef || 
rgb.g === undef || rgb.b === undef )
+                               return this._error();
+
+                       this.error = false;
+                       return this.fromInt( parseInt( ( rgb.r << 16 ) + ( 
rgb.g << 8 ) + rgb.b, 10 ), preserve );
+               },
+
+               fromHex: function( color ) {
+                       color = color.replace(/^#/, '').replace(/^0x/, '');
+                       if ( color.length === 3 ) {
+                               color = color[0] + color[0] + color[1] + 
color[1] + color[2] + color[2];
+                       }
+
+                       // rough error checking - this is where things go 
squirrely the most
+                       this.error = ! /^[0-9A-F]{6}$/i.test( color );
+                       return this.fromInt( parseInt( color, 16 ) );
+               },
+
+               fromHsl: function( hsl ) {
+                       var r, g, b, q, p, h, s, l;
+
+                       if ( typeof hsl !== 'object' || hsl.h === undef || 
hsl.s === undef || hsl.l === undef )
+                               return this._error();
+
+                       this._hsl = hsl; // store it
+                       this._hSpace = 'hsl'; // implicit
+                       h = hsl.h / 360; s = hsl.s / 100; l = hsl.l / 100;
+                       if ( s === 0 ) {
+                               r = g = b = l; // achromatic
+                       }
+                       else {
+                               q = l < 0.5 ? l * ( 1 + s ) : l + s - l * s;
+                               p = 2 * l - q;
+                               r = this.hue2rgb( p, q, h + 1/3 );
+                               g = this.hue2rgb( p, q, h );
+                               b = this.hue2rgb( p, q, h - 1/3 );
+                       }
+                       return this.fromRgb( {
+                               r: r * 255,
+                               g: g * 255,
+                               b: b * 255
+                       }, true ); // true preserves hue/sat
+               },
+
+               fromHsv: function( hsv ) {
+                       var h, s, v, r, g, b, i, f, p, q, t;
+                       if ( typeof hsv !== 'object' || hsv.h === undef || 
hsv.s === undef || hsv.v === undef )
+                               return this._error();
+
+                       this._hsv = hsv; // store it
+                       this._hSpace = 'hsv'; // implicit
+
+                       h = hsv.h / 360; s = hsv.s / 100; v = hsv.v / 100;
+                       i = Math.floor( h * 6 );
+                       f = h * 6 - i;
+                       p = v * ( 1 - s );
+                       q = v * ( 1 - f * s );
+                       t = v * ( 1 - ( 1 - f ) * s );
+
+                       switch( i % 6 ) {
+                               case 0:
+                                       r = v; g = t; b = p;
+                                       break;
+                               case 1:
+                                       r = q; g = v; b = p;
+                                       break;
+                               case 2:
+                                       r = p; g = v; b = t;
+                                       break;
+                               case 3:
+                                       r = p; g = q; b = v;
+                                       break;
+                               case 4:
+                                       r = t; g = p; b = v;
+                                       break;
+                               case 5:
+                                       r = v; g = p; b = q;
+                                       break;
+                       }
+
+                       return this.fromRgb( {
+                               r: r * 255,
+                               g: g * 255,
+                               b: b * 255
+                       }, true ); // true preserves hue/sat
+
+               },
+               // everything comes down to fromInt
+               fromInt: function( color, preserve ) {
+                       this._color = parseInt( color, 10 );
+
+                       if ( isNaN( this._color ) )
+                               this._color = 0;
+
+                       // let's coerce things
+                       if ( this._color > 16777215 )
+                               this._color = 16777215;
+                       else if ( this._color < 0 )
+                               this._color = 0;
+
+                       // let's not do weird things
+                       if ( preserve === undef ) {
+                               this._hsv.h = this._hsv.s = this._hsl.h = 
this._hsl.s = 0;
+                       }
+                       // EVENT GOES HERE
+                       return this;
+               },
+
+               hue2rgb: function( p, q, t ) {
+                       if ( t < 0 ) {
+                               t += 1;
+                       }
+                       if ( t > 1 ) {
+                               t -= 1;
+                       }
+                       if ( t < 1/6 ) {
+                               return p + ( q - p ) * 6 * t;
+                       }
+                       if ( t < 1/2 ) {
+                               return q;
+                       }
+                       if ( t < 2/3 ) {
+                               return p + ( q - p ) * ( 2/3 - t ) * 6;
+                       }
+                       return p;
+               },
+
+               toString: function() {
+                       var hex = parseInt( this._color, 10 ).toString( 16 );
+                       if ( this.error )
+                               return '';
+                       // maybe left pad it
+                       if ( hex.length < 6 ) {
+                               for (var i = 6 - hex.length - 1; i >= 0; i--) {
+                                       hex = '0' + hex;
+                               }
+                       }
+                       return '#' + hex;
+               },
+
+               toCSS: function( type, alpha ) {
+                       type = type || 'hex';
+                       alpha = parseFloat( alpha || this._alpha );
+                       switch ( type ) {
+                               case 'rgb':
+                               case 'rgba':
+                                       var rgb = this.toRgb();
+                                       if ( alpha < 1 ) {
+                                               return "rgba( " + rgb.r + ", " 
+ rgb.g + ", " + rgb.b + ", " + alpha + " )";
+                                       }
+                                       else {
+                                               return "rgb( " + rgb.r + ", " + 
rgb.g + ", " + rgb.b + " )";
+                                       }
+                                       break;
+                               case 'hsl':
+                               case 'hsla':
+                                       var hsl = this.toHsl();
+                                       if ( alpha < 1 ) {
+                                               return "hsla( " + hsl.h + ", " 
+ hsl.s + "%, " + hsl.l + "%, " + alpha + " )";
+                                       }
+                                       else {
+                                               return "hsl( " + hsl.h + ", " + 
hsl.s + "%, " + hsl.l + "% )";
+                                       }
+                                       break;
+                               default:
+                                       return this.toString();
+                       }
+               },
+
+               toRgb: function() {
+                       return {
+                               r: 255 & ( this._color >> 16 ),
+                               g: 255 & ( this._color >> 8 ),
+                               b: 255 & ( this._color )
+                       };
+               },
+
+               toHsl: function() {
+                       var rgb = this.toRgb();
+                       var r = rgb.r / 255, g = rgb.g / 255, b = rgb.b / 255;
+                       var max = Math.max( r, g, b ), min = Math.min( r, g, b 
);
+                       var h, s, l = ( max + min ) / 2;
+
+                       if ( max === min ) {
+                               h = s = 0; // achromatic
+                       } else {
+                               var d = max - min;
+                               s = l > 0.5 ? d / ( 2 - max - min ) : d / ( max 
+ min );
+                               switch ( max ) {
+                                       case r: h = ( g - b ) / d + ( g < b ? 6 
: 0 );
+                                               break;
+                                       case g: h = ( b - r ) / d + 2;
+                                               break;
+                                       case b: h = ( r - g ) / d + 4;
+                                               break;
+                               }
+                               h /= 6;
+                       }
+
+                       // maintain hue & sat if we've been manipulating things 
in the HSL space.
+                       h = Math.round( h * 360 );
+                       if ( h === 0 && this._hsl.h !== h ) {
+                               h = this._hsl.h;
+                       }
+                       s = Math.round( s * 100 );
+                       if ( s === 0 && this._hsl.s ) {
+                               s = this._hsl.s;
+                       }
+
+                       return {
+                               h: h,
+                               s: s,
+                               l: Math.round( l * 100 )
+                       };
+
+               },
+
+               toHsv: function() {
+                       var rgb = this.toRgb();
+                       var r = rgb.r / 255, g = rgb.g / 255, b = rgb.b / 255;
+                       var max = Math.max( r, g, b ), min = Math.min( r, g, b 
);
+                       var h, s, v = max;
+                       var d = max - min;
+                       s = max === 0 ? 0 : d / max;
+
+                       if ( max === min ) {
+                               h = s = 0; // achromatic
+                       } else {
+                               switch( max ){
+                                       case r:
+                                               h = ( g - b ) / d + ( g < b ? 6 
: 0 );
+                                               break;
+                                       case g:
+                                               h = ( b - r ) / d + 2;
+                                               break;
+                                       case b:
+                                               h = ( r - g ) / d + 4;
+                                               break;
+                               }
+                               h /= 6;
+                       }
+
+                       // maintain hue & sat if we've been manipulating things 
in the HSV space.
+                       h = Math.round( h * 360 );
+                       if ( h === 0 && this._hsv.h !== h ) {
+                               h = this._hsv.h;
+                       }
+                       s = Math.round( s * 100 );
+                       if ( s === 0 && this._hsv.s ) {
+                               s = this._hsv.s;
+                       }
+
+                       return {
+                               h: h,
+                               s: s,
+                               v: Math.round( v * 100 )
+                       };
+               },
+
+               toInt: function() {
+                       return this._color;
+               },
+
+               toIEOctoHex: function() {
+                       // AARRBBGG
+                       var hex = this.toString();
+                       var AA = parseInt( 255 * this._alpha, 10 ).toString(16);
+                       if ( AA.length === 1 ) {
+                               AA = '0' + AA;
+                       }
+                       return '#' + AA + hex.replace(/^#/, '' );
+               },
+
+               toLuminosity: function() {
+                       var rgb = this.toRgb();
+                       return 0.2126 * Math.pow( rgb.r / 255, 2.2 ) + 0.7152 * 
Math.pow( rgb.g / 255, 2.2 ) + 0.0722 * Math.pow( rgb.b / 255, 2.2);
+               },
+
+               getDistanceLuminosityFrom: function( color ) {
+                       if ( ! ( color instanceof Color ) ) {
+                               throw 'getDistanceLuminosityFrom requires a 
Color object';
+                       }
+                       var lum1 = this.toLuminosity();
+                       var lum2 = color.toLuminosity();
+                       if ( lum1 > lum2 ) {
+                               return ( lum1 + 0.05 ) / ( lum2 + 0.05 );
+                       }
+                       else {
+                               return ( lum2 + 0.05 ) / ( lum1 + 0.05 );
+                       }
+               },
+
+               getMaxContrastColor: function() {
+                       var lum = this.toLuminosity();
+                       var hex = ( lum >= 0.5 ) ? '000000' : 'ffffff';
+                       return new Color( hex );
+               },
+
+               getReadableContrastingColor: function( bgColor, minContrast ) {
+                       if ( ! bgColor instanceof Color ) {
+                               return this;
+                       }
+
+                       // you shouldn't use less than 5, but you might want to.
+                       var targetContrast = ( minContrast === undef ) ? 5 : 
minContrast;
+                       // working things
+                       var contrast = bgColor.getDistanceLuminosityFrom( this 
);
+                       var maxContrastColor = bgColor.getMaxContrastColor();
+                       var maxContrast = 
maxContrastColor.getDistanceLuminosityFrom( bgColor );
+
+                       // if current max contrast is less than the target 
contrast, we had wishful thinking.
+                       // still, go max
+                       if ( maxContrast <= targetContrast ) {
+                               return maxContrastColor;
+                       }
+                       // or, we might already have sufficient contrast
+                       else if ( contrast >= targetContrast ) {
+                               return this;
+                       }
+
+                       var incr = ( 0 === maxContrastColor.toInt() ) ? -1 : 1;
+                       while ( contrast < targetContrast ) {
+                               this.l( incr, true ); // 2nd arg turns this 
into an incrementer
+                               contrast = this.getDistanceLuminosityFrom( 
bgColor );
+                               // infininite loop prevention: you never know.
+                               if ( this._color === 0 || this._color === 
16777215 ) {
+                                       break;
+                               }
+                       }
+
+                       return this;
+
+               },
+
+               a: function( val ) {
+                       if ( val === undef )
+                               return this._alpha;
+
+                       var a = parseFloat( val );
+
+                       if ( isNaN( a ) )
+                               return this._error();
+
+                       this._alpha = a;
+                       return this;
+               },
+
+               // TRANSFORMS
+
+               darken: function( amount ) {
+                       amount = amount || 5;
+                       return this.l( - amount, true );
+               },
+
+               lighten: function( amount ) {
+                       amount = amount || 5;
+                       return this.l( amount, true );
+               },
+
+               saturate: function( amount ) {
+                       amount = amount || 15;
+                       return this.s( amount, true );
+               },
+
+               desaturate: function( amount ) {
+                       amount = amount || 15;
+                       return this.s( - amount, true );
+               },
+
+               toGrayscale: function() {
+                       return this.setHSpace('hsl').s( 0 );
+               },
+
+               getComplement: function() {
+                       return this.h( 180, true );
+               },
+
+               getSplitComplement: function( step ) {
+                       step = step || 1;
+                       var incr = 180 + ( step * 30 );
+                       return this.h( incr, true );
+               },
+
+               getAnalog: function( step ) {
+                       step = step || 1;
+                       var incr = step * 30;
+                       return this.h( incr, true );
+               },
+
+               getTetrad: function( step ) {
+                       step = step || 1;
+                       var incr = step * 60;
+                       return this.h( incr, true );
+               },
+
+               getTriad: function( step ) {
+                       step = step || 1;
+                       var incr = step * 120;
+                       return this.h( incr, true );
+               },
+
+               _partial: function( key ) {
+                       var prop = shortProps[key];
+                       return function( val, incr ) {
+                               var color = this._spaceFunc('to', prop.space);
+
+                               // GETTER
+                               if ( val === undef )
+                                       return color[key];
+
+                               // INCREMENT
+                               if ( incr === true )
+                                       val = color[key] + val;
+
+                               // MOD & RANGE
+                               if ( prop.mod )
+                                       val = val % prop.mod;
+                               if ( prop.range )
+                                       val = ( val < prop.range[0] ) ? 
prop.range[0] : ( val > prop.range[1] ) ? prop.range[1] : val;
+
+                               // NEW VALUE
+                               color[key] = val;
+
+                               return this._spaceFunc('from', prop.space, 
color);
+                       };
+               },
+
+               _spaceFunc: function( dir, s, val ) {
+                       var space = s || this._hSpace,
+                               funcName = dir + space.charAt(0).toUpperCase() 
+ space.substr(1);
+                       return this[funcName](val);
+               }
+       };
+
+       var shortProps = {
+               h: {
+                       mod: 360
+               },
+               s: {
+                       range: [0,100]
+               },
+               l: {
+                       space: 'hsl',
+                       range: [0,100]
+               },
+               v: {
+                       space: 'hsv',
+                       range: [0,100]
+               },
+               r: {
+                       space: 'rgb',
+                       range: [0,255]
+               },
+               g: {
+                       space: 'rgb',
+                       range: [0,255]
+               },
+               b: {
+                       space: 'rgb',
+                       range: [0,255]
+               }
+       };
+
+       for ( var key in shortProps ) {
+               if ( shortProps.hasOwnProperty( key ) )
+                       Color.fn[key] = Color.fn._partial(key);
+       }
+
+       // play nicely with Node + browser
+       if ( typeof exports === 'object' )
+               module.exports = Color;
+       else
+               global.Color = Color;
+
+}(this));
diff --git a/public_html/lib/plugins/styling/lang/bg/lang.php 
b/public_html/lib/plugins/styling/lang/bg/lang.php
new file mode 100644
index 0000000..7d17caf
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/bg/lang.php
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author Kiril <neohi...@gmail.com>
+ */
+$lang['menu']                  = 'Настройки на стила на шаблона';
+$lang['error']                 = 'За съжаление шаблона не поддържа тази 
функционалност.';
+$lang['btn_preview']           = 'Преглед на промените';
+$lang['btn_save']              = 'Запис на промените';
+$lang['btn_reset']             = 'Анулиране на промените';
+$lang['btn_revert']            = 'Връщане на стила към стандартните стойности';
+$lang['__text__']              = 'Цвят на основния текст';
+$lang['__background__']        = 'Цвят на основния фон';
+$lang['__text_alt__']          = 'Алтернативен цвят за текста';
+$lang['__background_alt__']    = 'Алтернативен цвят за фона';
+$lang['__text_neu__']          = 'Неутрален цвят за текста';
+$lang['__background_neu__']    = 'Неутрален цвят за фона';
+$lang['__border__']            = 'Цвят на рамката';
+$lang['__highlight__']         = 'Цвят за отличаване (основно на резултата от 
търсения)';
diff --git a/public_html/lib/plugins/styling/lang/cs/intro.txt 
b/public_html/lib/plugins/styling/lang/cs/intro.txt
new file mode 100644
index 0000000..00365a0
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/cs/intro.txt
@@ -0,0 +1,2 @@
+Tento nástroj umožňuje změnu určitých nastavení stylu právě používané šablony 
vzhledu.
+Všechny změny jsou uloženy v lokálním konfiguračním souboru a tím chráněny 
před smazáním při aktualizaci.
\ No newline at end of file
diff --git a/public_html/lib/plugins/styling/lang/cs/lang.php 
b/public_html/lib/plugins/styling/lang/cs/lang.php
new file mode 100644
index 0000000..8148b78
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/cs/lang.php
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author Jaroslav Lichtblau <jlichtb...@seznam.cz>
+ */
+$lang['menu']                  = 'Nastavení stylů vzhledu';
+$lang['js']['loader']          = 'Náhled se načítá...<br />pokud tento text 
nezmizí, pravděpodobně jsou nastaveny nesprávné hodnoty';
+$lang['js']['popup']           = 'Otevřit ve vlastním okně';
+$lang['error']                 = 'Omlouváme se, tento ';
+$lang['btn_preview']           = 'Náhled změn';
+$lang['btn_save']              = 'Uložit změny';
+$lang['btn_reset']             = 'Zrušit aktuální změny';
+$lang['btn_revert']            = 'Vrátit styly zpět na výchozí hodnoty 
vzhledu';
+$lang['__text__']              = 'Barva hlavního textu';
+$lang['__background__']        = 'Barva hlavního pozadí';
+$lang['__text_alt__']          = 'Barva alternativního textu';
+$lang['__background_alt__']    = 'Barva alternativního pozadí';
+$lang['__text_neu__']          = 'Barva neutrálního textu';
+$lang['__background_neu__']    = 'Barva neutrálního pozadí';
+$lang['__border__']            = 'Barva rámování';
+$lang['__highlight__']         = 'Zvýrazněná barva (hlavně pro výsledky 
vyhledávání)';
diff --git a/public_html/lib/plugins/styling/lang/cy/intro.txt 
b/public_html/lib/plugins/styling/lang/cy/intro.txt
new file mode 100644
index 0000000..7c82596
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/cy/intro.txt
@@ -0,0 +1,2 @@
+Mae'r teclyn hwn yn eich galluogi chi newid gosodiadau arddull penodol y 
templed rydych chi'n defnyddio'n bresennol.
+Caiff pob newid ei storio mewn ffeil ffurfwedd leol sy'n uwchradd-ddiogel.
\ No newline at end of file
diff --git a/public_html/lib/plugins/styling/lang/cy/lang.php 
b/public_html/lib/plugins/styling/lang/cy/lang.php
new file mode 100644
index 0000000..4d22a59
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/cy/lang.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Welsh language file for styling plugin
+ *
+ * @author Andreas Gohr <a...@splitbrain.org>
+ * @author Alan Davies <ben.brynsad...@gmail.com>
+ */
+
+// menu entry for admin plugins
+$lang['menu'] = 'Gosodiadau Arddull Templed';
+
+$lang['js']['loader'] = 'Rhagolwg yn llwytho...<br />os \'dyw hwn ddim yn 
diflannu, efallai bod eich gwerthoedd yn annilys';
+$lang['js']['popup'] = 'Agor fel ffurflen naid';
+
+// custom language strings for the plugin
+$lang['error'] = 'Sori, \'dyw\'r templed hwn ddim yn cynnal y swyddogaethedd 
hwn.';
+
+$lang['btn_preview'] = 'Rhagolwg newidiadau';
+$lang['btn_save']    = 'Cadw newidiadau';
+$lang['btn_reset']   = 'Ailosod newidiadau cyfredol';
+$lang['btn_revert']  = 'Troi arddulliau\'n ôl i ddiofyn y templed';
+
+// default guaranteed placeholders
+$lang['__text__']           = 'Lliw\'r prif destun';
+$lang['__background__']     = 'Lliw\'r prif gefndir';
+$lang['__text_alt__']       = 'Lliw testun amgen';
+$lang['__background_alt__'] = 'Lliw cefndir amgen';
+$lang['__text_neu__']       = 'lliw testun niwtral';
+$lang['__background_neu__'] = 'Lliw cefndir niwtral';
+$lang['__border__']         = 'Lliw border';
+$lang['__highlight__']      = 'Lliw uwcholeuad (am ganlyniadau chwiliad yn 
bennaf)';
+
+
+
+
+//Setup VIM: ex: et ts=4 :
diff --git a/public_html/lib/plugins/styling/lang/de/intro.txt 
b/public_html/lib/plugins/styling/lang/de/intro.txt
new file mode 100644
index 0000000..aa95773
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/de/intro.txt
@@ -0,0 +1,2 @@
+Dieses Plugin ermöglicht es, bestimmte Designeinstellungen des ausgewählten 
Templates zu ändern.
+Alle Änderungen werden in einer lokalen Konfigurationsdatei gespeichert und 
sind upgrade-sicher.
\ No newline at end of file
diff --git a/public_html/lib/plugins/styling/lang/de/lang.php 
b/public_html/lib/plugins/styling/lang/de/lang.php
new file mode 100644
index 0000000..8a46f81
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/de/lang.php
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author Anika Henke <an...@selfthinker.org>
+ */
+$lang['menu']                  = 'Einstellungen fürs Template-Design';
+$lang['js']['loader']          = 'Vorschau lädt...<br />Falls diese Nachricht 
nicht verschwindet, könnten Ihre Werte fehlerhaft sein';
+$lang['js']['popup']           = 'Öffne als Popup';
+$lang['error']                 = 'Dieses Template unterstützt diese Funktion 
nicht.';
+$lang['btn_preview']           = 'Vorschau der Änderungen anzeigen';
+$lang['btn_save']              = 'Änderungen speichern';
+$lang['btn_reset']             = 'Jetzige Änderungen rückgängig machen';
+$lang['btn_revert']            = 'Auf Templates Voreinstellungen zurückfallen';
+$lang['__text__']              = 'Haupttextfarbe';
+$lang['__background__']        = 'Haupthintergrundfarbe';
+$lang['__text_alt__']          = 'Alternative Textfarbe';
+$lang['__background_alt__']    = 'Alternative Hintergrundfarbe';
+$lang['__text_neu__']          = 'Neutrale Textfarbe';
+$lang['__background_neu__']    = 'Neutrale Hintergrundfarbe';
+$lang['__border__']            = 'Rahmenfarbe';
+$lang['__highlight__']         = 'Hervorhebungsfarbe (hauptsächlich für 
Suchergebnisse)';
diff --git a/public_html/lib/plugins/styling/lang/en/intro.txt 
b/public_html/lib/plugins/styling/lang/en/intro.txt
new file mode 100644
index 0000000..4ea5517
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/en/intro.txt
@@ -0,0 +1,2 @@
+This tool allows you to change certain style settings of your currently 
selected template.
+All changes are stored in a local configuration file and are upgrade safe.
\ No newline at end of file
diff --git a/public_html/lib/plugins/styling/lang/en/lang.php 
b/public_html/lib/plugins/styling/lang/en/lang.php
new file mode 100644
index 0000000..e0011eb
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/en/lang.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * English language file for styling plugin
+ *
+ * @author Andreas Gohr <a...@splitbrain.org>
+ */
+
+// menu entry for admin plugins
+$lang['menu'] = 'Template Style Settings';
+
+$lang['js']['loader'] = 'Preview is loading...<br />if this does not goes 
away, your values may be faulty';
+$lang['js']['popup'] = 'Open as a popup';
+
+// custom language strings for the plugin
+$lang['error'] = 'Sorry, this template does not support this functionality.';
+
+$lang['btn_preview'] = 'Preview changes';
+$lang['btn_save']    = 'Save changes';
+$lang['btn_reset']   = 'Reset current changes';
+$lang['btn_revert']  = 'Revert styles back to template\'s default';
+
+// default guaranteed placeholders
+$lang['__text__']           = 'Main text color';
+$lang['__background__']     = 'Main background color';
+$lang['__text_alt__']       = 'Alternative text color';
+$lang['__background_alt__'] = 'Alternative background color';
+$lang['__text_neu__']       = 'Neutral text color';
+$lang['__background_neu__'] = 'Neutral background color';
+$lang['__border__']         = 'Border color';
+$lang['__highlight__']      = 'Highlight color (for search results mainly)';
+
+
+
+
+//Setup VIM: ex: et ts=4 :
diff --git a/public_html/lib/plugins/styling/lang/es/intro.txt 
b/public_html/lib/plugins/styling/lang/es/intro.txt
new file mode 100644
index 0000000..8a55600
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/es/intro.txt
@@ -0,0 +1,2 @@
+Esta herramienta le permite cambiar algunos ajustes de estilo de la plantilla 
seleccionada.
+Todos los cambios se guardan en un archivo de configuración local y son una 
actualización segura.
\ No newline at end of file
diff --git a/public_html/lib/plugins/styling/lang/es/lang.php 
b/public_html/lib/plugins/styling/lang/es/lang.php
new file mode 100644
index 0000000..5c87c92
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/es/lang.php
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Domingo Redal <doc...@gmail.com>
+ */
+$lang['menu']                  = 'Ajustes de plantilla';
+$lang['js']['loader']          = 'La vista previa se está cargando ... <br /> 
si esto no se ve, sus valores pueden ser defectuosos';
+$lang['js']['popup']           = 'Abrir como una ventana emergente';
+$lang['error']                 = 'Lo sentimos, esta plantilla no admite esta 
funcionalidad.';
+$lang['btn_preview']           = 'Vista previa de los cambios';
+$lang['btn_save']              = 'Guardar cambios';
+$lang['btn_reset']             = 'Reiniciar los cambios actuales';
+$lang['btn_revert']            = 'Revertir estilos volviendo a los valores por 
defecto de la plantilla';
+$lang['__text__']              = 'Color del texto principal';
+$lang['__background__']        = 'Color de fondo del texto principal';
+$lang['__text_alt__']          = 'Color del texto alternativo';
+$lang['__background_alt__']    = 'Color de fondo del texto alternativo';
+$lang['__text_neu__']          = 'Color del texto neutro';
+$lang['__background_neu__']    = 'Color de fondo del texto neutro';
+$lang['__border__']            = 'Color del borde';
+$lang['__highlight__']         = 'Color resaltado (para los resultados de 
búsqueda, principalmente)';
diff --git a/public_html/lib/plugins/styling/lang/fa/intro.txt 
b/public_html/lib/plugins/styling/lang/fa/intro.txt
new file mode 100644
index 0000000..428a251
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/fa/intro.txt
@@ -0,0 +1,2 @@
+این ابزار این امکان را فراهم می‌سازد که برخی تنظیمات مشخص از قالبی که انتخاب 
کردید را تغییر دهید.
+تمام تغییرات در فایل داخلی تنظیمات ذخیره می‌شود و به‌روزرسانی هم ایمن است.
\ No newline at end of file
diff --git a/public_html/lib/plugins/styling/lang/fa/lang.php 
b/public_html/lib/plugins/styling/lang/fa/lang.php
new file mode 100644
index 0000000..c8d1bd6
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/fa/lang.php
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author Masoud Sadrnezhaad <mas...@sadrnezhaad.ir>
+ */
+$lang['menu']                  = 'تنظیمات ظاهری تمپلیت';
+$lang['js']['loader']          = 'پیش‌نمایش در حال باز شدن است... <br />اگر 
این پیش نرفت یعنی مقادیرتان اشکال دارد';
+$lang['js']['popup']           = 'باز کردن به صورت popup';
+$lang['error']                 = 'ببخشید، این قالب از این قابلیت پشتیبانی 
نمی‌کند';
+$lang['btn_preview']           = 'نمایش تغییرات';
+$lang['btn_save']              = 'ذخیره تغییرات';
+$lang['btn_reset']             = 'بازگردانی تغییر فعلی';
+$lang['btn_revert']            = 'بازگردانی ظاهر به پیشفرض قالب';
+$lang['__text__']              = 'رنگ اصلی متن';
+$lang['__background__']        = 'رنگ اصلی زمینه';
+$lang['__text_alt__']          = 'رنگ ثانویه متن';
+$lang['__background_alt__']    = 'رنگ ثانویه زمینه';
+$lang['__text_neu__']          = 'رنگ خنثی متن';
+$lang['__background_neu__']    = 'رنگ خنثی زمینه';
+$lang['__border__']            = 'رنگ حاشیه';
+$lang['__highlight__']         = 'رنگ برجسته‌سازی (برای نتیجه جستجو)';
diff --git a/public_html/lib/plugins/styling/lang/fr/intro.txt 
b/public_html/lib/plugins/styling/lang/fr/intro.txt
new file mode 100644
index 0000000..14a615c
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/fr/intro.txt
@@ -0,0 +1,2 @@
+Cet outil vous permet de changer les paramètres de certains style de votre 
thème actuel.
+Tous les changement sont enregistrés dans un fichier de configuration local 
qui sera inchangé en cas de mise à jour.
\ No newline at end of file
diff --git a/public_html/lib/plugins/styling/lang/fr/lang.php 
b/public_html/lib/plugins/styling/lang/fr/lang.php
new file mode 100644
index 0000000..92b8c3d
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/fr/lang.php
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author Carbain Frédéric <fcarb...@yahoo.fr>
+ * @author Nicolas Friedli <nico...@theologique.ch>
+ */
+$lang['menu']                  = 'Paramètres de style du thème (template)';
+$lang['js']['loader']          = 'La prévisualisation est en chargement... <br 
/>Si rien ne se passe, les données sont peut-être erronées';
+$lang['js']['popup']           = 'Ouvrir dans une nouvelle fenêtre';
+$lang['error']                 = 'Désolé, ce thème ne supporte pas cette 
fonctionnalité.';
+$lang['btn_preview']           = 'Aperçu des changements';
+$lang['btn_save']              = 'sauvegarder les changements.';
+$lang['btn_reset']             = 'Remettre les changements courants à zéro';
+$lang['btn_revert']            = 'Remettre les styles du thème aux valeurs par 
défaut';
+$lang['__text__']              = 'Couleur de texte principale';
+$lang['__background__']        = 'Couleur de fond principale';
+$lang['__text_alt__']          = 'Couleur de texte alternative';
+$lang['__background_alt__']    = 'Couleur de fond alternative';
+$lang['__text_neu__']          = 'Couleur de texte neutre';
+$lang['__background_neu__']    = 'Couleur de fond neutre';
+$lang['__border__']            = 'Couleur des contours';
+$lang['__highlight__']         = 'Couleur de surbrillance (utilisée 
pincipalement pour les résultats de recherche)';
diff --git a/public_html/lib/plugins/styling/lang/hr/intro.txt 
b/public_html/lib/plugins/styling/lang/hr/intro.txt
new file mode 100644
index 0000000..5c947dd
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/hr/intro.txt
@@ -0,0 +1,2 @@
+Ovaj alat omogućava izmjenu nekih postavki stila vašeg tekućeg wiki predloška.
+Sve postavke su snimljene u lokalnu konfiguracijsku datoteku i neće biti 
prebrisane kod nadogradnje.
\ No newline at end of file
diff --git a/public_html/lib/plugins/styling/lang/hr/lang.php 
b/public_html/lib/plugins/styling/lang/hr/lang.php
new file mode 100644
index 0000000..ab7c14f
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/hr/lang.php
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author Davor Turkalj <turki....@gmail.com>
+ */
+$lang['menu']                  = 'Postavke stila predloška';
+$lang['js']['loader']          = 'Pregled se učitava...<br />ako ovo ne 
nestane, vaše vrijednosti su možda neispravne';
+$lang['js']['popup']           = 'Otvori kao zasebni prozor';
+$lang['error']                 = 'Oprostite ali ovaj predložak ne podržava ovu 
funkcionalnost';
+$lang['btn_preview']           = 'Pregled izmjena';
+$lang['btn_save']              = 'Snimi promjene';
+$lang['btn_reset']             = 'Resetiraj trenutne promjene';
+$lang['btn_revert']            = 'Vrati postavke nazad na inicijalne 
vrijednosti predloška';
+$lang['__text__']              = 'Primarna boja teksta';
+$lang['__background__']        = 'Primarna boja pozadine';
+$lang['__text_alt__']          = 'Alternativna boja teksta';
+$lang['__background_alt__']    = 'Alternativna boja pozadine';
+$lang['__text_neu__']          = 'Boja neutralnog teksta';
+$lang['__background_neu__']    = 'Boja neutralne pozadine';
+$lang['__border__']            = 'Boja ruba';
+$lang['__highlight__']         = 'Boja isticanja (uglavnom za rezultat 
pretrage)';
diff --git a/public_html/lib/plugins/styling/lang/hu/intro.txt 
b/public_html/lib/plugins/styling/lang/hu/intro.txt
new file mode 100644
index 0000000..42f451d
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/hu/intro.txt
@@ -0,0 +1,2 @@
+Ezzel az eszközzel módosíthatod az aktuális sablon kinézetének néhány elemét.
+A változtatások egy helyi konfigurációs fájlban kerülnek tárolásra, így a 
frissítések során megmaradnak.
\ No newline at end of file
diff --git a/public_html/lib/plugins/styling/lang/hu/lang.php 
b/public_html/lib/plugins/styling/lang/hu/lang.php
new file mode 100644
index 0000000..c6ef5de
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/hu/lang.php
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author Marton Sebok <sebokmar...@gmail.com>
+ */
+$lang['menu']                  = 'Sablon kinézetének beállításai';
+$lang['js']['loader']          = 'Az előnézet töltődik...<br />ha ez az üzenet 
nem tűnik el, a beállított értékek hibásak lehetnek';
+$lang['js']['popup']           = 'Megnyitás felugró ablakban';
+$lang['error']                 = 'Ez a sablon sajnos nem támogatja ezt a 
funkciót';
+$lang['btn_preview']           = 'Változtatások előnézete';
+$lang['btn_save']              = 'Változtatások mentése';
+$lang['btn_reset']             = 'Jelenlegi változtatások visszaállítása';
+$lang['btn_revert']            = 'A sablon alapértelmezett kinézetének 
visszaállítása';
+$lang['__text__']              = 'Fő szövegszín';
+$lang['__background__']        = 'Fő háttérszín';
+$lang['__text_alt__']          = 'Alternatív szövegszín';
+$lang['__background_alt__']    = 'Alternatív háttérszín';
+$lang['__text_neu__']          = 'Semleges szövegszín';
+$lang['__background_neu__']    = 'Semleges háttérszín';
+$lang['__border__']            = 'Keret színe';
+$lang['__highlight__']         = 'Kijelölés színe (leginkább a keresési 
eredményeknél)';
diff --git a/public_html/lib/plugins/styling/lang/it/intro.txt 
b/public_html/lib/plugins/styling/lang/it/intro.txt
new file mode 100644
index 0000000..6c798e4
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/it/intro.txt
@@ -0,0 +1,2 @@
+Questo strumento ti permette di cambiare certe configurazioni di stile del 
tema attualmente in uso.
+Tutte le modifiche sono salvate in un file di configurazione locale e sono 
aggiornate in modo sicuro.
\ No newline at end of file
diff --git a/public_html/lib/plugins/styling/lang/it/lang.php 
b/public_html/lib/plugins/styling/lang/it/lang.php
new file mode 100644
index 0000000..03b7aa7
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/it/lang.php
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Torpedo <dgtorp...@gmail.com>
+ */
+$lang['menu']                  = 'Configurazioni di stile del tema';
+$lang['js']['loader']          = 'Anteprima in corso...<br />se questo non 
sparisce, potresti aver fornito dei valori sbagliati';
+$lang['js']['popup']           = 'Apri in un finestra a parte';
+$lang['error']                 = 'Spiacente, questo template non supporta 
questa funzionalità.';
+$lang['btn_preview']           = 'Cambiamenti precedenti';
+$lang['btn_save']              = 'Salva i cambiamenti';
+$lang['btn_reset']             = 'Azzera le modifiche correnti';
+$lang['btn_revert']            = 'Ripristina gli stili ai valori originari del 
tema';
+$lang['__text__']              = 'Colore principale del testo';
+$lang['__background__']        = 'Colore principale dello sfondo';
+$lang['__text_alt__']          = 'Colore alternativo per il testo';
+$lang['__background_alt__']    = 'Colore alternativo dello sfondo';
+$lang['__text_neu__']          = 'Colore testo neutrale';
+$lang['__background_neu__']    = 'Colore sfondo neutrale';
+$lang['__border__']            = 'Colore del bordo';
+$lang['__highlight__']         = 'Colore di evidenziazione (principalmente per 
i risultati di ricerca)';
diff --git a/public_html/lib/plugins/styling/lang/ja/intro.txt 
b/public_html/lib/plugins/styling/lang/ja/intro.txt
new file mode 100644
index 0000000..1feb4e0
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/ja/intro.txt
@@ -0,0 +1,2 @@
+この画面上で、選択中のテンプレート固有のスタイル設定を変更できます。
+変更内容はすべてローカルの設定ファイル内に保存され、テンプレートを更新しても初期化されません。
\ No newline at end of file
diff --git a/public_html/lib/plugins/styling/lang/ja/lang.php 
b/public_html/lib/plugins/styling/lang/ja/lang.php
new file mode 100644
index 0000000..5c546a7
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/ja/lang.php
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Hideaki SAWADA <ch...@live.jp>
+ */
+$lang['menu']                  = 'テンプレートのスタイル設定';
+$lang['js']['loader']          = 
'プレビューを読込み中です・・・<br/>この表示が消えない場合、変更した設定値に問題があるかもしれません。';
+$lang['js']['popup']           = 'ポップアップとして表示';
+$lang['error']                 = 'このテンプレートは、この機能に対応していません。';
+$lang['btn_preview']           = '変更内容のプレビュー';
+$lang['btn_save']              = '変更内容の保存';
+$lang['btn_reset']             = '変更内容の初期化';
+$lang['btn_revert']            = 'テンプレートのデフォルト値に戻す';
+$lang['__text__']              = 'メイン文字色';
+$lang['__background__']        = 'メイン背景色';
+$lang['__text_alt__']          = '代替文字色';
+$lang['__background_alt__']    = '代替背景色';
+$lang['__text_neu__']          = '無彩色の文字色';
+$lang['__background_neu__']    = '無彩色の背景色';
+$lang['__border__']            = '枠線の色';
+$lang['__highlight__']         = '強調色(主に検索結果用)';
diff --git a/public_html/lib/plugins/styling/lang/ko/intro.txt 
b/public_html/lib/plugins/styling/lang/ko/intro.txt
new file mode 100644
index 0000000..c460801
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/ko/intro.txt
@@ -0,0 +1,2 @@
+이 도구는 현재 선택한 템플릿의 특정 스타일 설정을 바꿀 수 있습니다.
+모든 바뀜은 로컬 환경 설정 파일에 저장되며 안전하게 업그레이드됩니다.
\ No newline at end of file
diff --git a/public_html/lib/plugins/styling/lang/ko/lang.php 
b/public_html/lib/plugins/styling/lang/ko/lang.php
new file mode 100644
index 0000000..bcdf9dc
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/ko/lang.php
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Myeongjin <aranet...@gmail.com>
+ */
+$lang['menu']                  = '템플릿 스타일 설정';
+$lang['js']['loader']          = '미리 보기를 불러오는 중...<br />만약 이것이 사라지지 않는다면, 당신은 
실망하겠죠';
+$lang['js']['popup']           = '팝업으로 열기';
+$lang['error']                 = '죄송하지만 이 템플릿은 이 기능으로 지원하지 않습니다.';
+$lang['btn_preview']           = '바뀜 미리 보기';
+$lang['btn_save']              = '바뀜 저장';
+$lang['btn_reset']             = '현재 바뀜 재설정';
+$lang['btn_revert']            = '틀의 기본값으로 스타일을 되돌리기';
+$lang['__text__']              = '주요 텍스트 색';
+$lang['__background__']        = '주요 배경 색';
+$lang['__text_alt__']          = '대체 텍스트 색';
+$lang['__background_alt__']    = '대체 배경 색';
+$lang['__text_neu__']          = '중립 텍스트 색';
+$lang['__background_neu__']    = '중립 배경 색';
+$lang['__border__']            = '윤곽선 색';
+$lang['__highlight__']         = '(주로 검색 결과를 위한) 강조 색';
diff --git a/public_html/lib/plugins/styling/lang/nl/intro.txt 
b/public_html/lib/plugins/styling/lang/nl/intro.txt
new file mode 100644
index 0000000..7275938
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/nl/intro.txt
@@ -0,0 +1,2 @@
+Deze tool laat u een aantal stijlinstellingen van uw huidig geselecteerde 
template aanpassen.
+Alle aanpassingen worden in een lokaal configuratiebestand bewaard en zijn 
upgrade veilig.
diff --git a/public_html/lib/plugins/styling/lang/nl/lang.php 
b/public_html/lib/plugins/styling/lang/nl/lang.php
new file mode 100644
index 0000000..dd25805
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/nl/lang.php
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author Mark C. Prins <mpr...@users.sf.net>
+ * @author hugo smet <hugo.s...@scarlet.be>
+ */
+$lang['menu']                  = 'Template stijl-instellingen';
+$lang['js']['loader']          = 'Voorbeeldweergave is aan het laden...<br 
/>als dit niet verdwijnt zijn uw instellingen mogelijk foutief.';
+$lang['js']['popup']           = 'Open als popup';
+$lang['error']                 = 'Sorry, deze template ondersteunt deze 
functionaliteit niet.';
+$lang['btn_preview']           = 'Bekijk aanpassingen';
+$lang['btn_save']              = 'Sla aanpassingen op';
+$lang['btn_reset']             = 'Huidige aanpassingen verwerpen';
+$lang['btn_revert']            = 'Stijlen terugzetten naar de standaard 
waardes van de template';
+$lang['__text__']              = 'Hoofd tekstkleur';
+$lang['__background__']        = 'Hoofd achtergrondkleur';
+$lang['__text_alt__']          = 'Alternatieve tekstkleur';
+$lang['__background_alt__']    = 'Alternatieve achtergrondkleur';
+$lang['__text_neu__']          = 'Neutrale tekstkleur';
+$lang['__background_neu__']    = 'Neutrale achtergrondkleur';
+$lang['__border__']            = 'Kader kleur';
+$lang['__highlight__']         = 'Markeringskleur (hoofdzakelijk voor 
zoekresultaten)';
diff --git a/public_html/lib/plugins/styling/lang/pt-br/intro.txt 
b/public_html/lib/plugins/styling/lang/pt-br/intro.txt
new file mode 100644
index 0000000..3d0f47f
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/pt-br/intro.txt
@@ -0,0 +1,2 @@
+Essa ferramente permite a alteração de certas configurações do estilo do seu 
modelo atual.
+Todas as modificações são armazenadas em um arquivo de configuração local e 
estão protegidas contra atualizações.
\ No newline at end of file
diff --git a/public_html/lib/plugins/styling/lang/pt-br/lang.php 
b/public_html/lib/plugins/styling/lang/pt-br/lang.php
new file mode 100644
index 0000000..4ebcbe5
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/pt-br/lang.php
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Frederico Gonçalves Guimarães <freder...@teia.bio.br>
+ */
+$lang['menu']                  = 'Configurações de estilo do modelo';
+$lang['js']['loader']          = 'A visualização está carregando...<br />Caso 
essa mensagem não desapareça, pode ter algum problema com os seus valores.';
+$lang['js']['popup']           = 'Abrir como um popup';
+$lang['error']                 = 'Desculpe, mas esse modelo não suporta essa 
funcionalidade.';
+$lang['btn_preview']           = 'Ver alterações';
+$lang['btn_save']              = 'Salvar alterações';
+$lang['btn_reset']             = 'Eliminar as alterações atuais';
+$lang['btn_revert']            = 'Reverter o estilo para os padrões do modelo';
+$lang['__text__']              = 'Cor principal do texto';
+$lang['__background__']        = 'Cor principal do fundo';
+$lang['__text_alt__']          = 'Cor alternativa do texto';
+$lang['__background_alt__']    = 'Cor alternativa do fundo';
+$lang['__text_neu__']          = 'Cor neutra do texto';
+$lang['__background_neu__']    = 'Cor neutra do fundo';
+$lang['__border__']            = 'Cor da borda';
+$lang['__highlight__']         = 'Cor do destaque (primariamente em resultados 
da pesquisa)';
diff --git a/public_html/lib/plugins/styling/lang/pt/lang.php 
b/public_html/lib/plugins/styling/lang/pt/lang.php
new file mode 100644
index 0000000..6929a40
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/pt/lang.php
@@ -0,0 +1,13 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author Alfredo Silva <alfredo.si...@sky.com>
+ */
+$lang['js']['popup']           = 'Abrir como uma janela extra';
+$lang['error']                 = 'Desculpe, este modelo não suporta esta 
funcionalidade.';
+$lang['btn_preview']           = 'Pré-visualizar alterações';
+$lang['btn_save']              = 'Guardar alterações';
+$lang['btn_reset']             = 'Reiniciar alterações atuais';
+$lang['__text__']              = 'Cor do texto principal';
diff --git a/public_html/lib/plugins/styling/lang/ru/intro.txt 
b/public_html/lib/plugins/styling/lang/ru/intro.txt
new file mode 100644
index 0000000..3a01411
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/ru/intro.txt
@@ -0,0 +1 @@
+Этот инструмент позволяет изменять стилевые настройки выбранного шаблона. Все 
изменения хранятся в файле конфигурации и защищены от сброса при обновлении.
diff --git a/public_html/lib/plugins/styling/lang/ru/lang.php 
b/public_html/lib/plugins/styling/lang/ru/lang.php
new file mode 100644
index 0000000..beda176
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/ru/lang.php
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author RainbowSpike <1...@2.ru>
+ */
+$lang['menu']                  = 'Настройки стилей шаблона';
+$lang['js']['loader']          = 'Загружается предпросмотр...<br />Если здесь 
случился сбой, ваши настройки могут быть сброшены';
+$lang['js']['popup']           = 'Открыть во всплывающем окне';
+$lang['error']                 = 'Этот шаблон не поддерживает такой 
функционал.';
+$lang['btn_preview']           = 'Просмотреть изменения';
+$lang['btn_save']              = 'Сохранить изменения';
+$lang['btn_reset']             = 'Сбросить сделанные изменения';
+$lang['btn_revert']            = 'Откатить стили к исходным для шаблона';
+$lang['__text__']              = 'Цвет текста';
+$lang['__background__']        = 'Цвет фона';
+$lang['__text_alt__']          = 'Второй цвет текста';
+$lang['__background_alt__']    = 'Второй цвет фона';
+$lang['__text_neu__']          = 'Нейтральный цвет текста';
+$lang['__background_neu__']    = 'Нейтральный цвет фона';
+$lang['__border__']            = 'Цвет границ';
+$lang['__highlight__']         = 'Цвет подсветки (в основном для результатов 
поиска)';
diff --git a/public_html/lib/plugins/styling/lang/sk/lang.php 
b/public_html/lib/plugins/styling/lang/sk/lang.php
new file mode 100644
index 0000000..0058358
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/sk/lang.php
@@ -0,0 +1,18 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Martin Michalek <michalek....@gmail.com>
+ */
+$lang['btn_preview']           = 'Náhľad zmien';
+$lang['btn_save']              = 'Uloženie zmien';
+$lang['btn_reset']             = 'Zruš prevedené zmeny';
+$lang['__text__']              = 'Primárna farba textu';
+$lang['__background__']        = 'Primárna farba pozadia';
+$lang['__text_alt__']          = 'Alternatívna farba textu';
+$lang['__background_alt__']    = 'Alternatívna farba pozadia';
+$lang['__text_neu__']          = 'Neutrálna farba textu';
+$lang['__background_neu__']    = 'Neutrálna farba pozadia';
+$lang['__border__']            = 'Farba okraja';
+$lang['__highlight__']         = 'Farba zvýraznenia (zvyčajne výsledkov 
vyhľadávania)';
diff --git a/public_html/lib/plugins/styling/lang/zh-tw/lang.php 
b/public_html/lib/plugins/styling/lang/zh-tw/lang.php
new file mode 100644
index 0000000..ce4a9a9
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/zh-tw/lang.php
@@ -0,0 +1,15 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author Liou, Jhe-Yu <lioujh...@gmail.com>
+ */
+$lang['menu']                  = '模板風格設定';
+$lang['error']                 = '抱歉,該模板不支持這個功能';
+$lang['btn_preview']           = '預覽';
+$lang['btn_save']              = '儲存';
+$lang['btn_reset']             = '重設';
+$lang['btn_revert']            = '將風格復原至模板預設值';
+$lang['__text__']              = '主要文字顏色';
+$lang['__background__']        = '主要背景顏色';
diff --git a/public_html/lib/plugins/styling/lang/zh/intro.txt 
b/public_html/lib/plugins/styling/lang/zh/intro.txt
new file mode 100644
index 0000000..7091712
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/zh/intro.txt
@@ -0,0 +1 @@
+这个工具可以让您对当前选中的模板的某些样式设置进行改变。所有改动会保存在一个本地配置文件中,不会被升级所影响。
\ No newline at end of file
diff --git a/public_html/lib/plugins/styling/lang/zh/lang.php 
b/public_html/lib/plugins/styling/lang/zh/lang.php
new file mode 100644
index 0000000..386312a
--- /dev/null
+++ b/public_html/lib/plugins/styling/lang/zh/lang.php
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author lainme <lainme...@gmail.com>
+ */
+$lang['menu']                  = '模板样式设置';
+$lang['js']['loader']          = '正在载入预览...<br />如果本句一直没有消失,您的设置可能有错';
+$lang['js']['popup']           = '作为弹出窗口打开';
+$lang['error']                 = '抱歉,这个模板不支持这项功能。';
+$lang['btn_preview']           = '预览改动';
+$lang['btn_save']              = '保存改动';
+$lang['btn_reset']             = '重置当前改动';
+$lang['btn_revert']            = '回退样式到模板的默认值';
+$lang['__text__']              = '主要的字体颜色';
+$lang['__background__']        = '主要的背景颜色';
+$lang['__text_alt__']          = '备选字体的颜色';
+$lang['__background_alt__']    = '备选背景的颜色';
+$lang['__text_neu__']          = '中性字体的颜色';
+$lang['__background_neu__']    = '中性背景的颜色';
+$lang['__border__']            = '边框颜色';
+$lang['__highlight__']         = '高亮颜色 (主要用于搜索结果)';
diff --git a/public_html/lib/plugins/styling/plugin.info.txt 
b/public_html/lib/plugins/styling/plugin.info.txt
new file mode 100644
index 0000000..9f002e2
--- /dev/null
+++ b/public_html/lib/plugins/styling/plugin.info.txt
@@ -0,0 +1,7 @@
+base   styling
+author Andreas Gohr
+email  a...@splitbrain.org
+date   2015-07-26
+name   styling plugin
+desc   Allows to edit style.ini replacements
+url    https://www.dokuwiki.org/plugin:styling
diff --git a/public_html/lib/plugins/styling/popup.php 
b/public_html/lib/plugins/styling/popup.php
new file mode 100644
index 0000000..964b19e
--- /dev/null
+++ b/public_html/lib/plugins/styling/popup.php
@@ -0,0 +1,30 @@
+<?php
+if(!defined('DOKU_INC')) define('DOKU_INC', dirname(__FILE__) . '/../../../');
+require_once(DOKU_INC . 'inc/init.php');
+//close session
+session_write_close();
+header('Content-Type: text/html; charset=utf-8');
+header('X-UA-Compatible: IE=edge,chrome=1');
+
+/** @var admin_plugin_styling $plugin */
+$plugin = plugin_load('admin', 'styling');
+if(!auth_isadmin()) die('only admins allowed');
+$plugin->ispopup = true;
+
+// handle posts
+$plugin->handle();
+
+// output plugin in a very minimal template:
+?><!DOCTYPE html>
+<html lang="<?php echo $conf['lang'] ?>" dir="<?php echo $lang['direction'] 
?>">
+<head>
+    <meta charset="utf-8" />
+    <title><?php echo $plugin->getLang('menu') ?></title>
+    <?php tpl_metaheaders(false) ?>
+    <meta name="viewport" content="width=device-width,initial-scale=1" />
+    <?php echo tpl_favicon(array('favicon')) ?>
+</head>
+<body class="dokuwiki">
+    <?php $plugin->html() ?>
+</body>
+</html>
diff --git a/public_html/lib/plugins/styling/script.js 
b/public_html/lib/plugins/styling/script.js
new file mode 100644
index 0000000..074c8dc
--- /dev/null
+++ b/public_html/lib/plugins/styling/script.js
@@ -0,0 +1,97 @@
+/* DOKUWIKI:include_once iris.js */
+
+jQuery(function () {
+
+    /**
+     * Function to reload the preview styles in the main window
+     *
+     * @param {Window} target the main window
+     */
+    function applyPreview(target) {
+        // remove style
+        var $style = 
target.jQuery('link[rel=stylesheet][href*="lib/exe/css.php"]');
+        $style.attr('href', '');
+
+        // append the loader screen
+        var $loader = target.jQuery('#plugin__styling_loader');
+        if (!$loader.length) {
+            $loader = target.jQuery('<div id="plugin__styling_loader">' + 
LANG.plugins.styling.loader + '</div>');
+            $loader.css({
+                'position':         'absolute',
+                'width':            '100%',
+                'height':           '100%',
+                'top':              0,
+                'left':             0,
+                'z-index':          5000,
+                'background-color': '#fff',
+                'opacity':          '0.7',
+                'color':            '#000',
+                'font-size':        '2.5em',
+                'text-align':       'center',
+                'line-height':      1.5,
+                'padding-top':      '2em'
+            });
+            target.jQuery('body').append($loader);
+        }
+
+        // load preview in main window (timeout works around chrome updating 
CSS weirdness)
+        setTimeout(function () {
+            var now = new Date().getTime();
+            $style.attr('href', DOKU_BASE + 'lib/exe/css.php?preview=1&tseed=' 
+ now);
+        }, 500);
+    }
+
+    var doreload = 1;
+    var $styling_plugin = jQuery('#plugin__styling');
+
+    // if we are not on the plugin page (either main or popup)
+    if (!$styling_plugin.length) {
+        // handle the preview cookie
+        if(DokuCookie.getValue('styling_plugin') == 1) {
+            applyPreview(window);
+        }
+        return; // nothing more to do here
+    }
+
+    /* ---- from here on we're in the popup or admin page ---- */
+
+    // add the color picker
+    $styling_plugin.find('.color').iris({});
+
+    // add button on main page
+    if (!$styling_plugin.hasClass('ispopup')) {
+        var $form = $styling_plugin.find('form.styling').first();
+        var $btn = jQuery('<button>' + LANG.plugins.styling.popup + 
'</button>');
+        $form.prepend($btn);
+
+        $btn.click(function (e) {
+            var windowFeatures = 
"menubar=no,location=no,resizable=yes,scrollbars=yes,status=false,width=500,height=500";
+            window.open(DOKU_BASE + 'lib/plugins/styling/popup.php', 
'styling_popup', windowFeatures);
+            e.preventDefault();
+            e.stopPropagation();
+        }).wrap('<p></p>');
+        return; // we exit here if this is not the popup
+    }
+
+    /* ---- from here on we're in the popup only ---- */
+
+    // reload the main page on close
+    window.onunload = function(e) {
+        if(doreload) {
+            window.opener.DokuCookie.setValue('styling_plugin', 0);
+            window.opener.document.location.reload();
+        }
+        return null;
+    };
+
+    // don't reload on our own buttons
+    jQuery(':button').click(function(e){
+        doreload = false;
+    });
+
+    // on first load apply preview
+    applyPreview(window.opener);
+
+    // enable the preview cookie
+    window.opener.DokuCookie.setValue('styling_plugin', 1);
+});
diff --git a/public_html/lib/plugins/styling/style.less 
b/public_html/lib/plugins/styling/style.less
new file mode 100644
index 0000000..be0e16a
--- /dev/null
+++ b/public_html/lib/plugins/styling/style.less
@@ -0,0 +1,13 @@
+#plugin__styling {
+    button.primary {
+        font-weight: bold;
+    }
+
+    [dir=rtl] & table input {
+        text-align: right;
+    }
+}
+
+#plugin__styling_loader {
+    display: none;
+}

-- 


Reply via email to