From f5467a6d511c2fbf2ba88e026f75e8a304a9ab2d Mon Sep 17 00:00:00 2001 From: Thomas Willingham Date: Tue, 25 Mar 2014 04:24:26 +0000 Subject: Fix wall photo uploads. --- include/photos.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/include/photos.php b/include/photos.php index c0243cc15..f9f160eb5 100644 --- a/include/photos.php +++ b/include/photos.php @@ -221,9 +221,13 @@ function photo_upload($channel, $observer, $args) { $arr['plink'] = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . $arr['mid']; + if ($width_x_height) + $tag = '[zmg=' . $width_x_height. ']'; + else + $tag = '[zmg]'; $arr['body'] = '[zrl=' . z_root() . '/photos/' . $channel['channel_address'] . '/image/' . $photo_hash . ']' - . '[zmg=' . $width_x_height. ']' . z_root() . "/photo/{$photo_hash}-{$smallest}.".$ph->getExt() . '[/zmg]' + . $tag . z_root() . "/photo/{$photo_hash}-{$smallest}.".$ph->getExt() . '[/zmg]' . '[/zrl]'; $result = item_store($arr); -- cgit v1.2.3 From 89b573a6f3b7409ba9f8ba9fe41ed06b8106836b Mon Sep 17 00:00:00 2001 From: marijus Date: Tue, 25 Mar 2014 15:27:45 +0100 Subject: fix lock permissions view and autoload not kicking in on touch devices under certain conditions --- mod/lockview.php | 12 ++++++------ view/css/conversation.css | 19 ++++--------------- view/js/main.js | 26 ++++---------------------- view/theme/redbasic/css/style.css | 9 --------- view/theme/redbasic/js/redbasic.js | 3 +++ view/tpl/conv_item.tpl | 4 ++-- view/tpl/hdr.tpl | 2 -- view/tpl/head.tpl | 2 +- 8 files changed, 20 insertions(+), 57 deletions(-) diff --git a/mod/lockview.php b/mod/lockview.php index 32e7a3afb..785f491aa 100644 --- a/mod/lockview.php +++ b/mod/lockview.php @@ -40,7 +40,7 @@ function lockview_content(&$a) { $deny_users = expand_acl($item['deny_cid']); $deny_groups = expand_acl($item['deny_gid']); - $o = t('Visible to:') . '
'; + $o = '
  • ' . t('Visible to:') . '
  • '; $l = array(); stringify_array_elms($allowed_groups,true); @@ -52,28 +52,28 @@ function lockview_content(&$a) { $r = q("SELECT name FROM `groups` WHERE hash IN ( " . implode(', ', $allowed_groups) . " )"); if($r) foreach($r as $rr) - $l[] = '' . $rr['name'] . ''; + $l[] = '
  • ' . $rr['name'] . '
  • '; } if(count($allowed_users)) { $r = q("SELECT xchan_name FROM xchan WHERE xchan_hash IN ( " . implode(', ',$allowed_users) . " )"); if($r) foreach($r as $rr) - $l[] = $rr['xchan_name']; + $l[] = '
  • ' . $rr['xchan_name'] . '
  • '; } if(count($deny_groups)) { $r = q("SELECT name FROM `groups` WHERE hash IN ( " . implode(', ', $deny_groups) . " )"); if($r) foreach($r as $rr) - $l[] = '' . $rr['name'] . ''; + $l[] = '
  • ' . $rr['name'] . '
  • '; } if(count($deny_users)) { $r = q("SELECT xchan_name FROM xchan WHERE xchan_hash IN ( " . implode(', ', $deny_users) . " )"); if($r) foreach($r as $rr) - $l[] = '' . $rr['xchan_name'] . ''; + $l[] = '
  • ' . $rr['xchan_name'] . '
  • '; } - echo $o . implode(', ', $l); + echo $o . implode($l); killme(); } diff --git a/view/css/conversation.css b/view/css/conversation.css index 8d7404b5d..46e1ed436 100644 --- a/view/css/conversation.css +++ b/view/css/conversation.css @@ -204,25 +204,14 @@ } -/* -.wall-item-lock { - position: absolute; - left: 105px; - top: 1px; -} - -.comment .wall-item-lock { - left: 65px; -} - -.wall-item-lock { - -} -*/ .lockview { cursor: pointer; } +.lockview-panel { + padding: 3px 20px; +} + .wall-item-location { text-overflow: ellipsis; max-width: 30%; diff --git a/view/js/main.js b/view/js/main.js index 5f88ea9ca..38cde749c 100644 --- a/view/js/main.js +++ b/view/js/main.js @@ -728,27 +728,10 @@ function updateConvItems(mode,data) { return cursor; } - var lockvisible = false; - function lockview(event,id) { - event = event || window.event; - cursor = getPosition(event); - if(lockvisible) { - lockviewhide(); - } - else { - lockvisible = true; - $.get('lockview/' + id, function(data) { - $('#panel').html(data); - $('#panel').css({ 'left': cursor.x + 5 , 'top': cursor.y + 5}); - $('#panel').show(); - }); - } - } - - function lockviewhide() { - lockvisible = false; - $('#panel').hide(); + $.get('lockview/' + id, function(data) { + $('#panel-' + id).html(data); + }); } function post_comment(id) { @@ -1022,7 +1005,7 @@ $(window).scroll(function () { $('#more').show(); } - if($(window).scrollTop() + $(window).height() == $(document).height()) { + if($(window).scrollTop() + $(window).height() > $(document).height() - 100) { if((pageHasMoreContent) && (! loadingPage)) { $('#more').hide(); $('#no-more').hide(); @@ -1032,7 +1015,6 @@ $(window).scroll(function () { loadingPage = true; liveUpdate(); } - } } }); diff --git a/view/theme/redbasic/css/style.css b/view/theme/redbasic/css/style.css index 6a4f836b1..edc8eebbb 100644 --- a/view/theme/redbasic/css/style.css +++ b/view/theme/redbasic/css/style.css @@ -113,15 +113,6 @@ blockquote { padding: 5px; } -#panel { - background-color: ivory; - position: absolute; - z-index: 2; - width: 30%; - padding: 25px; - border: 1px solid #444; -} - .heart { color: #FF0000; font-size: 100%; diff --git a/view/theme/redbasic/js/redbasic.js b/view/theme/redbasic/js/redbasic.js index c58711e94..70869f44b 100644 --- a/view/theme/redbasic/js/redbasic.js +++ b/view/theme/redbasic/js/redbasic.js @@ -30,6 +30,9 @@ if ($('aside').html().length == 0) { } $('#expand-tabs').click(function() { + if(!$('#tabs-collapse-1').hasClass('in')){ + $('html, body').animate({ scrollTop: 0 }, 'slow'); + } $('#expand-tabs-icon').toggleClass('icon-circle-arrow-down').toggleClass('icon-circle-arrow-up'); }); diff --git a/view/tpl/conv_item.tpl b/view/tpl/conv_item.tpl index 8d59951e7..dcf82e765 100755 --- a/view/tpl/conv_item.tpl +++ b/view/tpl/conv_item.tpl @@ -34,8 +34,8 @@
    -
    - {{if $item.lock}} {{/if}}{{$item.name}}{{if $item.owner_url}} {{$item.via}} {{$item.owner_name}}{{/if}}
    +
    diff --git a/view/tpl/hdr.tpl b/view/tpl/hdr.tpl index f1e78b897..efb43224c 100644 --- a/view/tpl/hdr.tpl +++ b/view/tpl/hdr.tpl @@ -3,5 +3,3 @@ - - diff --git a/view/tpl/head.tpl b/view/tpl/head.tpl index c676cd773..e7b41523f 100755 --- a/view/tpl/head.tpl +++ b/view/tpl/head.tpl @@ -1,6 +1,6 @@ - + + + + + +
    +
    + +
    +
    +

    + Colorpicker plugin for the Twitter Bootstrap toolkit. Originally written by @eyecon + and maintained in Github by @mjolnic and the community +
    +
    It basically adds a color picker to a field or any other element. +

    +
      +
    • can be used as a component
    • +
    • alpha picker
    • +
    • multiple formats: hex, rgb, rgba, hsl, hsla
    • +
    +
    + +
    +
    +
    +
    + +
    +

    Examples

    +
    +

    1) Attached to a field with hex format specified via options:

    +
    + +
    +<input type="text" class="demo1" value="#5367ce" />
    +<script>
    +    $(function(){
    +        $('.demo1').colorpicker();
    +    });
    +</script>
    +            
    +
    +
    +

    As a component:

    +
    +
    + + +
    +
    +<div class="input-group demo2">
    +    <input type="text" value="" class="form-control" />
    +    <span class="input-group-addon"><i></i></span>
    +</div>
    +<script>
    +    $(function(){
    +        $('.demo2').colorpicker();
    +    });
    +</script>
    +            
    +
    +

    Using events to work with the color:

    + +

    Horizonal mode:

    +
    + +
    +

    Inline mode:

    +
    +
    +
    +
    +

    Enabled / disabled

    +
    +
    + + +
    +
    + Enable + Disable +
    + Destroy plugin instances + Create instances again +
    +
    +

    Documentation

    +

    Call the colopicker via javascript:

    +
    $('.sample-selector').colorpicker({ /*options...*/ });
    +

    Options

    +

    + You can set colorpicker options either as a plugin parameter or data-* attributes +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDefaultDescription
    formatstringfalseIf not false, forces the color format to be hex, rgb or rgba, otherwise the format is automatically detected.
    colorstringfalseIf not false, sets the color to this value.
    containerstring or jQuery ElementfalseIf not false, the picker will be contained inside this element, otherwise it will be appended to the document body.
    componentstring or jQuery Element'.add-on, .input-group-addon'Children selector for the component or element that trigger the colorpicker and which background color will change (needs an inner <i> element).
    inputstring or jQuery Element'input'Children selector for the input that will store the picker selected value.
    horizontalbooleanfalseIf true, the hue and alpha channel bars will be rendered horizontally, above the saturation selector.
    templatestring[...] + Customizes the default colorpicker HTML template.
    + +

    + (behind this line, docs need to be updated) +

    + +

    Methods

    +

    .colorpicker(options)

    +

    Initializes an colorpicker.

    +

    .colorpicker('show')

    +

    Show the color picker

    +

    .colorpicker('update')

    +

    Refreshes the widget colors (this is done automatically)

    +

    .colorpicker('hide')

    +

    Hide the color picker

    +

    .colorpicker('disable')

    +

    Disable the color picker.

    +

    .colorpicker('enable')

    +

    Enable the color picker.

    +

    .colorpicker('place')

    +

    Updates the color picker's position relative to the element

    +

    .colorpicker('destroy')

    +

    Destroys the colorpicker widget and unbind all .colorpicker events from the element and component

    +

    .colorpicker('setValue', value)

    +

    Set a new value for the color picker (also for the input or component value). Triggers 'changeColor' event.

    +

    Color object methods

    +

    Each triggered events have a color object used internally by the picker. This object has several useful methods.

    +

    .setColor(value)

    +

    Set a new color. The value is parsed and tries to do a quess on the format.

    +

    .setHue(value)

    +

    Set the HUE with a value between 0 and 1.

    +

    .setSaturation(value)

    +

    Set the saturation with a value between 0 and 1.

    +

    .setLightness(value)

    +

    Set the lightness with a value between 0 and 1.

    +

    .setAlpha(value)

    +

    Set the transparency with a value between 0 and 1.

    +

    .toRGB()

    +

    Returns a hash with red, green, blue and alpha.

    +

    .toHex()

    +

    Returns a string with HEX format for the current color.

    +

    .toHSL()

    +

    Returns a hash with HSLA values.

    +

    Events

    +

    The colorpicker plugin exposes some events (with optional .colorpicker namespace)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDescription
    createThis event fires immediately when the color picker is created.
    showPickerThis event fires immediately when the color picker is displayed.
    hidePickerThis event is fired immediately when the color picker is hidden.
    disableThis event is fired immediately when the color picker is disabled, except if it was initialized as disabled.
    enableThis event is fired immediately when the color picker is enabled, except upon initialization.
    changeColorThis event is fired when the color is changed.
    destroyThis event fires immediately when the color picker is destroyed.
    +
    +$('.my-colorpicker-control').colorpicker().on('changeColor', function(ev){
    +  bodyStyle.backgroundColor = ev.color.toHex();
    +});
    +    
    +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/library/bootstrap-colorpicker/package.json b/library/bootstrap-colorpicker/package.json new file mode 100644 index 000000000..ebec4007b --- /dev/null +++ b/library/bootstrap-colorpicker/package.json @@ -0,0 +1,33 @@ +{ + "name": "mjolnic-bootstrap-colorpicker", + "version": "2.0.0", + "description": "Colorpicker plugin for Twitter Bootstrap", + "homepage": "http://mjolnic.github.io/bootstrap-colorpicker/", + "repository": { + "type": "git", + "url": "git@github.com:mjolnic/bootstrap-colorpicker.git" + }, + "bugs": { + "url" : "https://github.com/mjolnic/bootstrap-colorpicker/issues" + }, + "keywords": [ + "bootstrap", + "colorpicker" + ], + "author": "Javier Aguilar @mjolnic", + "licenses": [{ + "type": "Apache-2.0", + "url": "http://opensource.org/licenses/Apache-2.0" + }], + "devDependencies": { + "grunt": "~0.4.2", + "grunt-contrib-clean": "~0.5.0", + "grunt-contrib-jshint": "~0.7.2", + "grunt-recess": "~0.5.0", + "grunt-combine": "~0.8.1", + "grunt-contrib-uglify": "~0.2.7", + "grunt-bake": "~0.3.3", + "grunt-jsbeautifier": "~0.2.3", + "grunt-contrib-watch": "~0.5.3" + } +} \ No newline at end of file diff --git a/library/bootstrap-colorpicker/src/css/docs.css b/library/bootstrap-colorpicker/src/css/docs.css new file mode 100644 index 000000000..5babbf0ee --- /dev/null +++ b/library/bootstrap-colorpicker/src/css/docs.css @@ -0,0 +1,37 @@ +.container { + background: #fff; +} + +h4 ~ p{ + padding-left:20px; +} + +.inl-bl{ + display:inline-block; +} + +.well .markup-heading{ + +} +.well .markup{ + background: #fff; + color: #777; + position: relative; + padding: 45px 15px 15px; + margin: 15px 0 0 0; + background-color: #fff; + border-radius: 0 0 4px 4px; + box-shadow: none; +} + +.well .markup::after{ + content: "Example"; + position: absolute; + top: 15px; + left: 15px; + font-size: 12px; + font-weight: bold; + color: #bbb; + text-transform: uppercase; + letter-spacing: 1px; +} \ No newline at end of file diff --git a/library/bootstrap-colorpicker/src/docs.html b/library/bootstrap-colorpicker/src/docs.html new file mode 100644 index 000000000..8cb150f23 --- /dev/null +++ b/library/bootstrap-colorpicker/src/docs.html @@ -0,0 +1,153 @@ + + +
    +

    Documentation

    +

    Call the colopicker via javascript:

    +
    $('.sample-selector').colorpicker({ /*options...*/ });
    +

    Options

    +

    + You can set colorpicker options either as a plugin parameter or data-* attributes +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDefaultDescription
    formatstringfalseIf not false, forces the color format to be hex, rgb or rgba, otherwise the format is automatically detected.
    colorstringfalseIf not false, sets the color to this value.
    containerstring or jQuery ElementfalseIf not false, the picker will be contained inside this element, otherwise it will be appended to the document body.
    componentstring or jQuery Element'.add-on, .input-group-addon'Children selector for the component or element that trigger the colorpicker and which background color will change (needs an inner <i> element).
    inputstring or jQuery Element'input'Children selector for the input that will store the picker selected value.
    horizontalbooleanfalseIf true, the hue and alpha channel bars will be rendered horizontally, above the saturation selector.
    templatestring[...]Customizes the default colorpicker HTML template.
    + +

    + (behind this line, docs need to be updated) +

    + +

    Methods

    +

    .colorpicker(options)

    +

    Initializes an colorpicker.

    +

    .colorpicker('show')

    +

    Show the color picker

    +

    .colorpicker('update')

    +

    Refreshes the widget colors (this is done automatically)

    +

    .colorpicker('hide')

    +

    Hide the color picker

    +

    .colorpicker('disable')

    +

    Disable the color picker.

    +

    .colorpicker('enable')

    +

    Enable the color picker.

    +

    .colorpicker('place')

    +

    Updates the color picker's position relative to the element

    +

    .colorpicker('destroy')

    +

    Destroys the colorpicker widget and unbind all .colorpicker events from the element and component

    +

    .colorpicker('setValue', value)

    +

    Set a new value for the color picker (also for the input or component value). Triggers 'changeColor' event.

    +

    Color object methods

    +

    Each triggered events have a color object used internally by the picker. This object has several useful methods.

    +

    .setColor(value)

    +

    Set a new color. The value is parsed and tries to do a quess on the format.

    +

    .setHue(value)

    +

    Set the HUE with a value between 0 and 1.

    +

    .setSaturation(value)

    +

    Set the saturation with a value between 0 and 1.

    +

    .setLightness(value)

    +

    Set the lightness with a value between 0 and 1.

    +

    .setAlpha(value)

    +

    Set the transparency with a value between 0 and 1.

    +

    .toRGB()

    +

    Returns a hash with red, green, blue and alpha.

    +

    .toHex()

    +

    Returns a string with HEX format for the current color.

    +

    .toHSL()

    +

    Returns a hash with HSLA values.

    +

    Events

    +

    The colorpicker plugin exposes some events (with optional .colorpicker namespace)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDescription
    createThis event fires immediately when the color picker is created.
    showPickerThis event fires immediately when the color picker is displayed.
    hidePickerThis event is fired immediately when the color picker is hidden.
    disableThis event is fired immediately when the color picker is disabled, except if it was initialized as disabled.
    enableThis event is fired immediately when the color picker is enabled, except upon initialization.
    changeColorThis event is fired when the color is changed.
    destroyThis event fires immediately when the color picker is destroyed.
    +
    +$('.my-colorpicker-control').colorpicker().on('changeColor', function(ev){
    +  bodyStyle.backgroundColor = ev.color.toHex();
    +});
    +    
    +
    + \ No newline at end of file diff --git a/library/bootstrap-colorpicker/src/examples.html b/library/bootstrap-colorpicker/src/examples.html new file mode 100644 index 000000000..cde7cca16 --- /dev/null +++ b/library/bootstrap-colorpicker/src/examples.html @@ -0,0 +1,60 @@ +
    +

    Examples

    +
    +

    1) Attached to a field with hex format specified via options:

    +
    + +
    +<input type="text" class="demo1" value="#5367ce" />
    +<script>
    +    $(function(){
    +        $('.demo1').colorpicker();
    +    });
    +</script>
    +            
    +
    +
    +

    As a component:

    +
    +
    + + +
    +
    +<div class="input-group demo2">
    +    <input type="text" value="" class="form-control" />
    +    <span class="input-group-addon"><i></i></span>
    +</div>
    +<script>
    +    $(function(){
    +        $('.demo2').colorpicker();
    +    });
    +</script>
    +            
    +
    +

    Using events to work with the color:

    + +

    Horizonal mode:

    +
    + +
    +

    Inline mode:

    +
    +
    +
    +
    +

    Enabled / disabled

    +
    +
    + + +
    +
    + Enable + Disable +
    + Destroy plugin instances + Create instances again +
    \ No newline at end of file diff --git a/library/bootstrap-colorpicker/src/footer.html b/library/bootstrap-colorpicker/src/footer.html new file mode 100644 index 000000000..1cea02d09 --- /dev/null +++ b/library/bootstrap-colorpicker/src/footer.html @@ -0,0 +1,9 @@ +
    + +
    + + + + + + \ No newline at end of file diff --git a/library/bootstrap-colorpicker/src/header.html b/library/bootstrap-colorpicker/src/header.html new file mode 100644 index 000000000..7e8122050 --- /dev/null +++ b/library/bootstrap-colorpicker/src/header.html @@ -0,0 +1,69 @@ + + + + + + + Colorpicker for Twitter Bootstrap + + + + + + + +
    +
    + +
    +
    +

    + Colorpicker plugin for the Twitter Bootstrap toolkit. Originally written by @eyecon + and maintained in Github by @mjolnic and the community +

    It basically adds a color picker to a field or any other element. +

    +
      +
    • can be used as a component
    • +
    • alpha picker
    • +
    • multiple formats: hex, rgb, rgba, hsl, hsla
    • +
    +
    + +
    +
    +
    +
    + \ No newline at end of file diff --git a/library/bootstrap-colorpicker/src/js/colorpicker-color.js b/library/bootstrap-colorpicker/src/js/colorpicker-color.js new file mode 100644 index 000000000..2e0474067 --- /dev/null +++ b/library/bootstrap-colorpicker/src/js/colorpicker-color.js @@ -0,0 +1,508 @@ +// Color object +var Color = function(val) { + this.value = { + h: 0, + s: 0, + b: 0, + a: 1 + }; + this.origFormat = null; // original string format + if (val) { + if (val.toLowerCase !== undefined) { + this.setColor(val); + } else if (val.h !== undefined) { + this.value = val; + } + } +}; + +Color.prototype = { + constructor: Color, + // 140 predefined colors from the HTML Colors spec + colors : { + "aliceblue": "#f0f8ff", + "antiquewhite": "#faebd7", + "aqua": "#00ffff", + "aquamarine": "#7fffd4", + "azure": "#f0ffff", + "beige": "#f5f5dc", + "bisque": "#ffe4c4", + "black": "#000000", + "blanchedalmond": "#ffebcd", + "blue": "#0000ff", + "blueviolet": "#8a2be2", + "brown": "#a52a2a", + "burlywood": "#deb887", + "cadetblue": "#5f9ea0", + "chartreuse": "#7fff00", + "chocolate": "#d2691e", + "coral": "#ff7f50", + "cornflowerblue": "#6495ed", + "cornsilk": "#fff8dc", + "crimson": "#dc143c", + "cyan": "#00ffff", + "darkblue": "#00008b", + "darkcyan": "#008b8b", + "darkgoldenrod": "#b8860b", + "darkgray": "#a9a9a9", + "darkgreen": "#006400", + "darkkhaki": "#bdb76b", + "darkmagenta": "#8b008b", + "darkolivegreen": "#556b2f", + "darkorange": "#ff8c00", + "darkorchid": "#9932cc", + "darkred": "#8b0000", + "darksalmon": "#e9967a", + "darkseagreen": "#8fbc8f", + "darkslateblue": "#483d8b", + "darkslategray": "#2f4f4f", + "darkturquoise": "#00ced1", + "darkviolet": "#9400d3", + "deeppink": "#ff1493", + "deepskyblue": "#00bfff", + "dimgray": "#696969", + "dodgerblue": "#1e90ff", + "firebrick": "#b22222", + "floralwhite": "#fffaf0", + "forestgreen": "#228b22", + "fuchsia": "#ff00ff", + "gainsboro": "#dcdcdc", + "ghostwhite": "#f8f8ff", + "gold": "#ffd700", + "goldenrod": "#daa520", + "gray": "#808080", + "green": "#008000", + "greenyellow": "#adff2f", + "honeydew": "#f0fff0", + "hotpink": "#ff69b4", + "indianred ": "#cd5c5c", + "indigo ": "#4b0082", + "ivory": "#fffff0", + "khaki": "#f0e68c", + "lavender": "#e6e6fa", + "lavenderblush": "#fff0f5", + "lawngreen": "#7cfc00", + "lemonchiffon": "#fffacd", + "lightblue": "#add8e6", + "lightcoral": "#f08080", + "lightcyan": "#e0ffff", + "lightgoldenrodyellow": "#fafad2", + "lightgrey": "#d3d3d3", + "lightgreen": "#90ee90", + "lightpink": "#ffb6c1", + "lightsalmon": "#ffa07a", + "lightseagreen": "#20b2aa", + "lightskyblue": "#87cefa", + "lightslategray": "#778899", + "lightsteelblue": "#b0c4de", + "lightyellow": "#ffffe0", + "lime": "#00ff00", + "limegreen": "#32cd32", + "linen": "#faf0e6", + "magenta": "#ff00ff", + "maroon": "#800000", + "mediumaquamarine": "#66cdaa", + "mediumblue": "#0000cd", + "mediumorchid": "#ba55d3", + "mediumpurple": "#9370d8", + "mediumseagreen": "#3cb371", + "mediumslateblue": "#7b68ee", + "mediumspringgreen": "#00fa9a", + "mediumturquoise": "#48d1cc", + "mediumvioletred": "#c71585", + "midnightblue": "#191970", + "mintcream": "#f5fffa", + "mistyrose": "#ffe4e1", + "moccasin": "#ffe4b5", + "navajowhite": "#ffdead", + "navy": "#000080", + "oldlace": "#fdf5e6", + "olive": "#808000", + "olivedrab": "#6b8e23", + "orange": "#ffa500", + "orangered": "#ff4500", + "orchid": "#da70d6", + "palegoldenrod": "#eee8aa", + "palegreen": "#98fb98", + "paleturquoise": "#afeeee", + "palevioletred": "#d87093", + "papayawhip": "#ffefd5", + "peachpuff": "#ffdab9", + "peru": "#cd853f", + "pink": "#ffc0cb", + "plum": "#dda0dd", + "powderblue": "#b0e0e6", + "purple": "#800080", + "red": "#ff0000", + "rosybrown": "#bc8f8f", + "royalblue": "#4169e1", + "saddlebrown": "#8b4513", + "salmon": "#fa8072", + "sandybrown": "#f4a460", + "seagreen": "#2e8b57", + "seashell": "#fff5ee", + "sienna": "#a0522d", + "silver": "#c0c0c0", + "skyblue": "#87ceeb", + "slateblue": "#6a5acd", + "slategray": "#708090", + "snow": "#fffafa", + "springgreen": "#00ff7f", + "steelblue": "#4682b4", + "tan": "#d2b48c", + "teal": "#008080", + "thistle": "#d8bfd8", + "tomato": "#ff6347", + "turquoise": "#40e0d0", + "violet": "#ee82ee", + "wheat": "#f5deb3", + "white": "#ffffff", + "whitesmoke": "#f5f5f5", + "yellow": "#ffff00", + "yellowgreen": "#9acd32" + }, + _sanitizeNumber: function(val) { + if (typeof val === 'number') { + return val; + } + if (isNaN(val) || (val === null) || (val === '') || (val === undefined)) { + return 1; + } + if (val.toLowerCase !== undefined) { + return parseFloat(val); + } + return 1; + }, + //parse a string to HSB + setColor: function(strVal) { + strVal = strVal.toLowerCase(); + this.value = this.stringToHSB(strVal) ||  { + h: 0, + s: 0, + b: 0, + a: 1 + }; + }, + stringToHSB: function(strVal) { + strVal = strVal.toLowerCase(); + var that = this, + result = false; + $.each(this.stringParsers, function(i, parser) { + var match = parser.re.exec(strVal), + values = match && parser.parse.apply(that, [match]), + format = parser.format || 'rgba'; + if (values) { + if (format.match(/hsla?/)) { + result = that.RGBtoHSB.apply(that, that.HSLtoRGB.apply(that, values)); + } else { + result = that.RGBtoHSB.apply(that, values); + } + that.origFormat = format; + return false; + } + return true; + }); + return result; + }, + setHue: function(h) { + this.value.h = 1 - h; + }, + setSaturation: function(s) { + this.value.s = s; + }, + setBrightness: function(b) { + this.value.b = 1 - b; + }, + setAlpha: function(a) { + this.value.a = parseInt((1 - a) * 100, 10) / 100; + }, + toRGB: function(h, s, v, a) { + h = h || this.value.h; + s = s || this.value.s; + v = v || this.value.b; + a = a || this.value.a; + + var r, g, b, i, f, p, q, t; + if (h && s === undefined && v === undefined) { + s = h.s, v = h.v, h = h.h; + } + 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 { + r: Math.floor(r * 255), + g: Math.floor(g * 255), + b: Math.floor(b * 255), + a: a + }; + }, + toHex: function(h, s, b, a) { + var rgb = this.toRGB(h, s, b, a); + return '#' + ((1 << 24) | (parseInt(rgb.r) << 16) | (parseInt(rgb.g) << 8) | parseInt(rgb.b)).toString(16).substr(1); + }, + toHSL: function(h, s, b, a) { + h = h || this.value.h; + s = s || this.value.s; + b = b || this.value.b; + a = a || this.value.a; + + var H = h, + L = (2 - s) * b, + S = s * b; + if (L > 0 && L <= 1) { + S /= L; + } else { + S /= 2 - L; + } + L /= 2; + if (S > 1) { + S = 1; + } + return { + h: isNaN(H) ? 0 : H, + s: isNaN(S) ? 0 : S, + l: isNaN(L) ? 0 : L, + a: isNaN(a) ? 0 : a, + }; + }, + toAlias: function(r, g, b, a) { + var rgb = this.toHex(r, g, b, a); + for(var alias in this.colors){ + if(this.colors[alias] == rgb){ + return alias; + } + } + return false; + }, + RGBtoHSB: function(r, g, b, a) { + r /= 255; + g /= 255; + b /= 255; + + var H, S, V, C; + V = Math.max(r, g, b); + C = V - Math.min(r, g, b); + H = (C === 0 ? null : + V === r ? (g - b) / C : + V === g ? (b - r) / C + 2 : + (r - g) / C + 4 + ); + H = ((H + 360) % 6) * 60 / 360; + S = C === 0 ? 0 : C / V; + return { + h: this._sanitizeNumber(H), + s: S, + b: V, + a: this._sanitizeNumber(a) + }; + }, + HueToRGB: function(p, q, h) { + if (h < 0) { + h += 1; + } else if (h > 1) { + h -= 1; + } + if ((h * 6) < 1) { + return p + (q - p) * h * 6; + } else if ((h * 2) < 1) { + return q; + } else if ((h * 3) < 2) { + return p + (q - p) * ((2 / 3) - h) * 6; + } else { + return p; + } + }, + HSLtoRGB: function(h, s, l, a) { + if (s < 0) { + s = 0; + } + var q; + if (l <= 0.5) { + q = l * (1 + s); + } else { + q = l + s - (l * s); + } + + var p = 2 * l - q; + + var tr = h + (1 / 3); + var tg = h; + var tb = h - (1 / 3); + + var r = Math.round(this.HueToRGB(p, q, tr) * 255); + var g = Math.round(this.HueToRGB(p, q, tg) * 255); + var b = Math.round(this.HueToRGB(p, q, tb) * 255); + return [r, g, b, this._sanitizeNumber(a)]; + }, + toString: function(format) { + format = format ||  'rgba'; + switch (format) { + case 'rgb': + { + var rgb = this.toRGB(); + return 'rgb(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ')'; + } + break; + case 'rgba': + { + var rgb = this.toRGB(); + return 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + rgb.a + ')'; + } + break; + case 'hsl': + { + var hsl = this.toHSL(); + return 'hsl(' + Math.round(hsl.h * 360) + ',' + Math.round(hsl.s * 100) + '%,' + Math.round(hsl.l * 100) + '%)'; + } + break; + case 'hsla': + { + var hsl = this.toHSL(); + return 'hsla(' + Math.round(hsl.h * 360) + ',' + Math.round(hsl.s * 100) + '%,' + Math.round(hsl.l * 100) + '%,' + hsl.a + ')'; + } + break; + case 'hex': + { + return this.toHex(); + } + break; + case 'alias': + return this.toAlias() || this.toHex(); + default: + { + return false; + } + break; + } + }, + // a set of RE's that can match strings and generate color tuples. + // from John Resig color plugin + // https://github.com/jquery/jquery-color/ + stringParsers: [{ + re: /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/, + format: 'hex', + parse: function(execResult) { + return [ + parseInt(execResult[1], 16), + parseInt(execResult[2], 16), + parseInt(execResult[3], 16), + 1 + ]; + } + }, { + re: /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/, + format: 'hex', + parse: function(execResult) { + return [ + parseInt(execResult[1] + execResult[1], 16), + parseInt(execResult[2] + execResult[2], 16), + parseInt(execResult[3] + execResult[3], 16), + 1 + ]; + } + }, { + re: /rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*?\)/, + format: 'rgb', + parse: function(execResult) { + return [ + execResult[1], + execResult[2], + execResult[3], + 1 + ]; + } + }, { + re: /rgb\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/, + format: 'rgb', + parse: function(execResult) { + return [ + 2.55 * execResult[1], + 2.55 * execResult[2], + 2.55 * execResult[3], + 1 + ]; + } + }, { + re: /rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/, + format: 'rgba', + parse: function(execResult) { + return [ + execResult[1], + execResult[2], + execResult[3], + execResult[4] + ]; + } + }, { + re: /rgba\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/, + format: 'rgba', + parse: function(execResult) { + return [ + 2.55 * execResult[1], + 2.55 * execResult[2], + 2.55 * execResult[3], + execResult[4] + ]; + } + }, { + re: /hsl\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/, + format: 'hsl', + parse: function(execResult) { + return [ + execResult[1] / 360, + execResult[2] / 100, + execResult[3] / 100, + execResult[4] + ]; + } + }, { + re: /hsla\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/, + format: 'hsla', + parse: function(execResult) { + return [ + execResult[1] / 360, + execResult[2] / 100, + execResult[3] / 100, + execResult[4] + ]; + } + }, { + //predefined color name + re: /^([a-z]{3,})$/, + format: 'alias', + parse: function(execResult) { + var hexval = this.colorNameToHex(execResult[0]) ||  '#000000'; + var match = this.stringParsers[0].re.exec(hexval), + values = match && this.stringParsers[0].parse.apply(this, [match]); + return values; + } + }], + colorNameToHex: function(name) { + if (typeof this.colors[name.toLowerCase()] !== 'undefined') { + return this.colors[name.toLowerCase()]; + } + return false; + } +}; diff --git a/library/bootstrap-colorpicker/src/js/colorpicker.js b/library/bootstrap-colorpicker/src/js/colorpicker.js new file mode 100644 index 000000000..e68b965d1 --- /dev/null +++ b/library/bootstrap-colorpicker/src/js/colorpicker.js @@ -0,0 +1,464 @@ +/*! + * Bootstrap Colorpicker + * http://mjolnic.github.io/bootstrap-colorpicker/ + * + * Originally written by (c) 2012 Stefan Petre + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0.txt + * + * @todo Update DOCS + */ + +(function( factory ) { + "use strict"; + if(typeof define === 'function' && define.amd) { + define(['jquery'], factory); + } + else if(window.jQuery && !window.jQuery.fn.colorpicker) { + factory(window.jQuery); + } +} +(function($) { + 'use strict'; + + '{{color}}'; + + var defaults = { + horizontal: false, // horizontal mode layout ? + inline: false, //forces to show the colorpicker as an inline element + color: false, //forces a color + format: false, //forces a format + input: 'input', // children input selector + container: false, // container selector + component: '.add-on, .input-group-addon', // children component selector + sliders: { + saturation: { + maxLeft: 100, + maxTop: 100, + callLeft: 'setSaturation', + callTop: 'setBrightness' + }, + hue: { + maxLeft: 0, + maxTop: 100, + callLeft: false, + callTop: 'setHue' + }, + alpha: { + maxLeft: 0, + maxTop: 100, + callLeft: false, + callTop: 'setAlpha' + } + }, + slidersHorz: { + saturation: { + maxLeft: 100, + maxTop: 100, + callLeft: 'setSaturation', + callTop: 'setBrightness' + }, + hue: { + maxLeft: 100, + maxTop: 0, + callLeft: 'setHue', + callTop: false + }, + alpha: { + maxLeft: 100, + maxTop: 0, + callLeft: 'setAlpha', + callTop: false + } + }, + template: '