mirror of
https://github.com/YunoHost-Apps/chtickynotes_ynh.git
synced 2024-09-03 18:15:57 +02:00
Created
Copied from ynh-chtickynotes and begining of boards management
This commit is contained in:
parent
a02b12114b
commit
c63ca08270
29 changed files with 14311 additions and 0 deletions
21
LICENSE.txt
Normal file
21
LICENSE.txt
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2014 Chtixof
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
17
README.md
Normal file
17
README.md
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
# chtickynotes_ynh : sticky notes for Yunohost #
|
||||||
|
|
||||||
|
chtickynotes_ynh is packaged to be installed on a [Yunohost](https://yunohost.org) server.
|
||||||
|
|
||||||
|
chtickynotes_ynh is a "simple post-it" application. Its main features are:
|
||||||
|
- notes movable and resizable
|
||||||
|
- edit note by just typing on it (or CTRL-V to paste chunks of HTML)
|
||||||
|
- menu on each note to change its color, and so on
|
||||||
|
- global menu to change board, and so on
|
||||||
|
- autosave every 10 seconds
|
||||||
|
- storage on the server (not on the browser local storage)
|
||||||
|
|
||||||
|
**Screen shot:**<br>
|
||||||
|

|
||||||
|
|
||||||
|
chtickynotes_ynh core is based on [Post It All!](https://github.com/txusko/PostItAll).
|
||||||
|
|
18
conf/nginx.conf
Normal file
18
conf/nginx.conf
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
location PATHTOCHANGE {
|
||||||
|
|
||||||
|
alias WWWPATH ;
|
||||||
|
|
||||||
|
index index.html index.php ;
|
||||||
|
try_files $uri $uri/ index.php;
|
||||||
|
location ~ [^/]\.php(/|$) {
|
||||||
|
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
|
||||||
|
fastcgi_pass unix:/var/run/php5-fpm.sock;
|
||||||
|
fastcgi_index index.php;
|
||||||
|
include fastcgi_params;
|
||||||
|
fastcgi_param REMOTE_USER $remote_user;
|
||||||
|
fastcgi_param PATH_INFO $fastcgi_path_info;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Include SSOWAT user panel.
|
||||||
|
include conf.d/yunohost_panel.conf.inc;
|
||||||
|
}
|
31
manifest.json
Normal file
31
manifest.json
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
{
|
||||||
|
"name": "ChtickyNotes",
|
||||||
|
"id": "chtickynotes",
|
||||||
|
"description": {
|
||||||
|
"en": "Generic sticky notes for all purpose",
|
||||||
|
"fr": "Des post-its génériques à tout faire"
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"developer": {
|
||||||
|
"name": "chtixof"
|
||||||
|
},
|
||||||
|
"multi_instance": "false",
|
||||||
|
"arguments": {
|
||||||
|
"install" : [ {
|
||||||
|
"name": "domain",
|
||||||
|
"ask": {
|
||||||
|
"en": "Choose a domain for ChtickyNotes",
|
||||||
|
"en": "Choisissez un domaine pour ChtickyNotes"
|
||||||
|
},
|
||||||
|
"example": "domain.org"
|
||||||
|
},{
|
||||||
|
"name": "path",
|
||||||
|
"ask": {
|
||||||
|
"en": "Choose a path for ChtickyNotes",
|
||||||
|
"en": "Choisissez un chemin pour ChtickyNotes"
|
||||||
|
},
|
||||||
|
"example": "/chtickynotes",
|
||||||
|
"default": "/chtickynotes"
|
||||||
|
} ]
|
||||||
|
}
|
||||||
|
}
|
15
scripts/backup
Normal file
15
scripts/backup
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#!/bin/bash
|
||||||
|
app=chtickynotes
|
||||||
|
|
||||||
|
# The parameter $1 is the backup directory location
|
||||||
|
# which will be compressed afterward
|
||||||
|
backup_dir=$1/apps/$app
|
||||||
|
mkdir -p $backup_dir
|
||||||
|
|
||||||
|
# Backup sources & data
|
||||||
|
sudo cp -a /var/www/$app/. $backup_dir/sources
|
||||||
|
|
||||||
|
# Copy Nginx and YunoHost parameters to make the script "standalone"
|
||||||
|
sudo cp -a /etc/yunohost/apps/$app/. $backup_dir/yunohost
|
||||||
|
domain=$(sudo yunohost app setting $app domain)
|
||||||
|
sudo cp -a /etc/nginx/conf.d/$domain.d/$app.conf $backup_dir/nginx.conf
|
28
scripts/install
Normal file
28
scripts/install
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# Installation de ChtickyNotes dans Yunohost
|
||||||
|
app=chtickynotes
|
||||||
|
|
||||||
|
# Retrieve arguments
|
||||||
|
domain=$1
|
||||||
|
path=$2
|
||||||
|
|
||||||
|
# Check domain/path availability
|
||||||
|
sudo yunohost app checkurl $domain$path -a $app
|
||||||
|
if [[ ! $? -eq 0 ]]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Copy files to the right place with the right permissions
|
||||||
|
final_path=/var/www/$app
|
||||||
|
sudo mkdir -p $final_path
|
||||||
|
sudo cp -a ../sources/* $final_path
|
||||||
|
sudo chown -R www-data: $final_path
|
||||||
|
|
||||||
|
# Modify Nginx configuration file and copy it to Nginx conf directory
|
||||||
|
sed -i "s@PATHTOCHANGE@$path@g" ../conf/nginx.conf
|
||||||
|
sed -i "s@WWWPATH@$final_path@g" ../conf/nginx.conf
|
||||||
|
sudo cp ../conf/nginx.conf /etc/nginx/conf.d/$domain.d/$app.conf
|
||||||
|
|
||||||
|
# Reload nginx and regenerate SSOwat conf
|
||||||
|
sudo service nginx reload
|
||||||
|
sudo yunohost app ssowatconf
|
15
scripts/remove
Normal file
15
scripts/remove
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#!/bin/bash
|
||||||
|
app=chtickynotes
|
||||||
|
|
||||||
|
# Retrieve arguments
|
||||||
|
domain=$(sudo yunohost app setting $app domain)
|
||||||
|
|
||||||
|
# Remove sources
|
||||||
|
sudo rm -rf /var/www/$app
|
||||||
|
|
||||||
|
# Remove configuration files
|
||||||
|
sudo rm -f /etc/nginx/conf.d/$domain.d/$app.conf
|
||||||
|
|
||||||
|
# Restart services
|
||||||
|
sudo service nginx reload
|
||||||
|
sudo yunohost app ssowatconf
|
16
scripts/restore
Normal file
16
scripts/restore
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
#!/bin/bash
|
||||||
|
app=chtickynotes
|
||||||
|
|
||||||
|
# The parameter $1 is the uncompressed restore directory location
|
||||||
|
backup_dir=$1/apps/$app
|
||||||
|
|
||||||
|
# Restore sources & data
|
||||||
|
sudo cp -a $backup_dir/sources/. /var/www/$app
|
||||||
|
|
||||||
|
# Restore Nginx and YunoHost parameters
|
||||||
|
sudo cp -a $backup_dir/yunohost/. /etc/yunohost/apps/$app
|
||||||
|
domain=$(sudo yunohost app setting $app domain)
|
||||||
|
sudo cp -a $backup_dir/nginx.conf /etc/nginx/conf.d/$domain.d/$app.conf
|
||||||
|
|
||||||
|
# Restart webserver
|
||||||
|
sudo service nginx reload
|
24
scripts/upgrade
Normal file
24
scripts/upgrade
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
#!/bin/bash
|
||||||
|
app=chtickynotes
|
||||||
|
|
||||||
|
# Retrieve arguments
|
||||||
|
domain=$(sudo yunohost app setting $app domain)
|
||||||
|
path=$(sudo yunohost app setting $app path)
|
||||||
|
|
||||||
|
# Remove trailing "/" for next commands
|
||||||
|
path=${path%/}
|
||||||
|
|
||||||
|
# Copy source files
|
||||||
|
final_path=/var/www/$app
|
||||||
|
sudo mkdir -p $final_path
|
||||||
|
sudo cp -a ../sources/* $final_path
|
||||||
|
|
||||||
|
# Modify Nginx configuration file and copy it to Nginx conf directory
|
||||||
|
sed -i "s@PATHTOCHANGE@$path@g" ../conf/nginx.conf
|
||||||
|
sed -i "s@WWWPATH@$final_path@g" ../conf/nginx.conf
|
||||||
|
sudo cp ../conf/nginx.conf /etc/nginx/conf.d/$domain.d/$app.conf
|
||||||
|
|
||||||
|
# Restart services
|
||||||
|
sudo service nginx reload
|
||||||
|
sudo yunohost app ssowatconf
|
||||||
|
|
10
sources/fav.php
Normal file
10
sources/fav.php
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<?php
|
||||||
|
$text=file_get_contents('php://input');
|
||||||
|
if ($text!="") {
|
||||||
|
file_put_contents('allnotes.json', $text);
|
||||||
|
header("Cache-Control: no-cache, must-revalidate");
|
||||||
|
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
|
||||||
|
header("Content-Type: application/json; charset=utf-8");
|
||||||
|
echo($text);
|
||||||
|
}
|
||||||
|
?>
|
250
sources/index.html
Normal file
250
sources/index.html
Normal file
|
@ -0,0 +1,250 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||||
|
<title>ChtickyNotes
|
||||||
|
</title>
|
||||||
|
<meta name="description" content="">
|
||||||
|
<meta name="viewport" content="width=device-width">
|
||||||
|
<link rel="stylesheet" href="libs/jquery-ui-1.10.0.custom.css">
|
||||||
|
<link rel="stylesheet" href="libs/bootstrap.min.css">
|
||||||
|
<link rel="stylesheet" href="libs/bootstrap-responsive.min.css">
|
||||||
|
<link rel="stylesheet" href="libs/jquery.minicolors.css">
|
||||||
|
<link rel="stylesheet" href="plugin/jquery.postitall.css">
|
||||||
|
<link rel="stylesheet" href="libs/main.css">
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
background: #41444f;
|
||||||
|
color: #bbb;
|
||||||
|
}
|
||||||
|
#chtimenu {
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
#chtimenu a, .chme a {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
#chtimenu a:hover {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
#saved {
|
||||||
|
position:absolute;
|
||||||
|
}
|
||||||
|
#saveallnotes {
|
||||||
|
position:absolute;
|
||||||
|
background: #41444f;
|
||||||
|
}
|
||||||
|
#chtoption {
|
||||||
|
background-image: url(data:image/gif;base64,R0lGODlhDQANALsAAMXFxbe3t76+vtvb2729vbi4uLy8vMHBwbm5ueHh4dra2tPT07e4t9TU1ODg4JmZmSH5BAEAAA8ALAAAAAANAA0AAAQvsIVJaxmIiM25OQMgjiSQPGiqruy6VHBwZV39hWV5tnz/vDEKQ1HQ1DwHRa7kiAAAOw==);
|
||||||
|
position:absolute;
|
||||||
|
top:15px;
|
||||||
|
right:15px;
|
||||||
|
cursor: pointer;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
background-position: center;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
}
|
||||||
|
.chme {
|
||||||
|
position: absolute;
|
||||||
|
display: none;
|
||||||
|
z-index: 100000;
|
||||||
|
right: 15px;
|
||||||
|
}
|
||||||
|
#chtoptmenu {
|
||||||
|
width: 275px;
|
||||||
|
height: 40px;
|
||||||
|
top: 15px;
|
||||||
|
}
|
||||||
|
#chlist {
|
||||||
|
width: 400px;
|
||||||
|
height: 40px;
|
||||||
|
top: 45px;
|
||||||
|
}
|
||||||
|
.chme label{
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
#chtoptmenu ul {
|
||||||
|
top: 30px;
|
||||||
|
width: 275px;
|
||||||
|
}
|
||||||
|
#chlist ul {
|
||||||
|
width: 400px;
|
||||||
|
}
|
||||||
|
.chme ul {
|
||||||
|
margin: 0;
|
||||||
|
list-style: none;
|
||||||
|
padding: 0;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
.chme ul li {
|
||||||
|
font: 14px;
|
||||||
|
margin-right: -4px;
|
||||||
|
position: relative;
|
||||||
|
padding: 5px 20px;
|
||||||
|
cursor: pointer;
|
||||||
|
background: #555;
|
||||||
|
display: block;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.chme ul li:hover { background: #666; }
|
||||||
|
.center { text-align: center; }
|
||||||
|
.float-left { float: left; }
|
||||||
|
.float-right { float: right; }
|
||||||
|
.vertical-bottom { vertical-align: bottom; }
|
||||||
|
.vertical-middle { vertical-align: middle; }
|
||||||
|
.vertical-top { vertical-align: top; }
|
||||||
|
.clear { clear: both; }
|
||||||
|
.red { color: red; }
|
||||||
|
.red a { color: red; font-weight: bold; text-decoration: none; }
|
||||||
|
.red a:hover { text-decoration: underline; }
|
||||||
|
|
||||||
|
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!--[if lt IE 7]>
|
||||||
|
<p class="chromeframe">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> or <a href="http://www.google.com/chromeframe/?redirect=true">activate Google Chrome Frame</a> to improve your experience.</p>
|
||||||
|
<![endif]-->
|
||||||
|
<div id="chtimenu">
|
||||||
|
<a id="addanote" href="javascript:void(0)">Add a note</a>
|
||||||
|
<span id="saved">(saved)</span>
|
||||||
|
<a id="saveallnotes" href="javascript:void(0)">Save all notes</a>
|
||||||
|
</div>
|
||||||
|
<div id="addanote_result">
|
||||||
|
</div>
|
||||||
|
<div id="chtoption">
|
||||||
|
</div>
|
||||||
|
<div id="chtoptmenu" class="chme">
|
||||||
|
<ul>
|
||||||
|
<li id="chboard">Change board</li>
|
||||||
|
<li><a href="javascript:alert('tbd')">Background color</a></li>
|
||||||
|
<li><a href="javascript:alert('tbd')">Title</a></li>
|
||||||
|
<li><a href="javascript:alert('tbd')">This board is shared. Make it private?</a></li>
|
||||||
|
<li><a href="javascript:alert('tbd')">Delete this board</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div id="chlist" class="chme">
|
||||||
|
<ul>
|
||||||
|
<li>First Board (shared)</li>
|
||||||
|
<li>Second Board (shared)</li>
|
||||||
|
<li><New board></a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
|
||||||
|
<script>window.jQuery || document.write('<script src="libs/jquery-1.9.1.min.js"><\/script>')</script>
|
||||||
|
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.1/jquery-ui.min.js"></script>
|
||||||
|
<script>window.jQuery || document.write('<script src="libs/jquery-ui-1.10.1.min.js"><\/script>')</script>
|
||||||
|
<script src="libs/bootstrap.min.js"></script>
|
||||||
|
<script src="//google-code-prettify.googlecode.com/svn/loader/run_prettify.js?autoload=true&skin=sunburst&lang=css" defer="defer"></script>
|
||||||
|
<script src="libs/jquery.minicolors.js"></script>
|
||||||
|
<script src="plugin/jquery.postitall.js"></script>
|
||||||
|
<script src="libs/main.js"></script>
|
||||||
|
<script>
|
||||||
|
|
||||||
|
function saveallnotes(){}
|
||||||
|
|
||||||
|
//global reqini for ajax
|
||||||
|
var reqini = new XMLHttpRequest();
|
||||||
|
|
||||||
|
//here we go
|
||||||
|
$(document).ready(function() {
|
||||||
|
|
||||||
|
//Minicolors for the form
|
||||||
|
$('.minicolors').minicolors();
|
||||||
|
|
||||||
|
//Add a note
|
||||||
|
$('#addanote').click(function() {
|
||||||
|
$('#addanote_result').postitall();
|
||||||
|
});
|
||||||
|
|
||||||
|
// set function to save all notes in the z-index order
|
||||||
|
saveallnotes=function() {
|
||||||
|
var allnotes=[];
|
||||||
|
var req = new XMLHttpRequest();
|
||||||
|
$('.PIApostit').each(function() {
|
||||||
|
var thisone=$(this).postitall('options');
|
||||||
|
allnotes.push({
|
||||||
|
"date": thisone.date,
|
||||||
|
"showdate": thisone.showdate,
|
||||||
|
"title": thisone.title,
|
||||||
|
"backgroundcolor": thisone.backgroundcolor,
|
||||||
|
"textcolor": thisone.textcolor,
|
||||||
|
"posX": thisone.posX,
|
||||||
|
"posY": thisone.posY,
|
||||||
|
"height": thisone.height,
|
||||||
|
"width": thisone.width,
|
||||||
|
"description": thisone.description,
|
||||||
|
"zindex": parseInt($(this).css('z-index'))
|
||||||
|
});
|
||||||
|
});
|
||||||
|
allnotes.sort(function (a,b) {
|
||||||
|
if (a.zindex < b.zindex)
|
||||||
|
return -1;
|
||||||
|
if (a.zindex > b.zindex)
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
allnotes.forEach(function(thisone){
|
||||||
|
delete thisone.zindex;
|
||||||
|
});
|
||||||
|
|
||||||
|
text=JSON.stringify(allnotes);
|
||||||
|
//ajax out
|
||||||
|
req.open("POST", "fav.php", true);
|
||||||
|
req.setRequestHeader("Content-type", "application/json");
|
||||||
|
req.onreadystatechange = function()
|
||||||
|
{
|
||||||
|
if (req.readyState == 4) {
|
||||||
|
$('#saveallnotes').hide(); //=(saved)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
req.send(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#saveallnotes').click(saveallnotes); // set function to link
|
||||||
|
|
||||||
|
$('#chtoption').click(function () { // set function to menu for options
|
||||||
|
$('#chtoptmenu').show();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('.chme').mouseleave(function(){
|
||||||
|
$(this).hide();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#chboard').click(function () {
|
||||||
|
$('#chlist').show();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ajax in
|
||||||
|
reqini.open("GET", "allnotes.json", true);
|
||||||
|
reqini.onreadystatechange = function()
|
||||||
|
{
|
||||||
|
if (reqini.readyState == 4) {
|
||||||
|
text=reqini.responseText;
|
||||||
|
try {
|
||||||
|
JSON.parse(text);
|
||||||
|
} catch (e) {
|
||||||
|
text = '[]';
|
||||||
|
}
|
||||||
|
JSON.parse(text).forEach(function(note){
|
||||||
|
$('#addanote_result').postitall(note);
|
||||||
|
});
|
||||||
|
$('.PIApostit').postitall('isittosave','#saveallnotes'); // prevents to save on load! and sets id to hide/show
|
||||||
|
$('#saveallnotes').hide(); //=(saved)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
reqini.send(null);
|
||||||
|
});
|
||||||
|
// timer to save every 10 s. if required
|
||||||
|
window.setInterval(function () {
|
||||||
|
if($('.PIApostit').postitall('isittosave')){saveallnotes()}
|
||||||
|
}, 10000);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
1109
sources/libs/bootstrap-responsive.css
vendored
Normal file
1109
sources/libs/bootstrap-responsive.css
vendored
Normal file
File diff suppressed because it is too large
Load diff
9
sources/libs/bootstrap-responsive.min.css
vendored
Normal file
9
sources/libs/bootstrap-responsive.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
6158
sources/libs/bootstrap.css
vendored
Normal file
6158
sources/libs/bootstrap.css
vendored
Normal file
File diff suppressed because it is too large
Load diff
2268
sources/libs/bootstrap.js
vendored
Normal file
2268
sources/libs/bootstrap.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
9
sources/libs/bootstrap.min.css
vendored
Normal file
9
sources/libs/bootstrap.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
6
sources/libs/bootstrap.min.js
vendored
Normal file
6
sources/libs/bootstrap.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
5
sources/libs/jquery-1.9.1.min.js
vendored
Normal file
5
sources/libs/jquery-1.9.1.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1174
sources/libs/jquery-ui-1.10.0.custom.css
vendored
Normal file
1174
sources/libs/jquery-ui-1.10.0.custom.css
vendored
Normal file
File diff suppressed because it is too large
Load diff
5
sources/libs/jquery-ui-1.10.1.min.js
vendored
Normal file
5
sources/libs/jquery-ui-1.10.1.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1174
sources/libs/jquery-ui.css
vendored
Normal file
1174
sources/libs/jquery-ui.css
vendored
Normal file
File diff suppressed because it is too large
Load diff
278
sources/libs/jquery.minicolors.css
Normal file
278
sources/libs/jquery.minicolors.css
Normal file
|
@ -0,0 +1,278 @@
|
||||||
|
.minicolors {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors-focus {
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors.minicolors-theme-default .minicolors-input {
|
||||||
|
margin: 0px;
|
||||||
|
margin-right: 3px;
|
||||||
|
border: solid 1px #CCC;
|
||||||
|
font: 14px sans-serif;
|
||||||
|
width: 65px;
|
||||||
|
height: 16px;
|
||||||
|
border-radius: 0;
|
||||||
|
box-shadow: inset 0 2px 4px rgba(0, 0, 0, .04);
|
||||||
|
padding: 2px;
|
||||||
|
margin-right: -1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors-theme-default.minicolors .minicolors-input {
|
||||||
|
vertical-align: middle;
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors-theme-default.minicolors-swatch-left .minicolors-input {
|
||||||
|
margin-left: -1px;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors-theme-default.minicolors-focus .minicolors-input,
|
||||||
|
.minicolors-theme-default.minicolors-focus .minicolors-swatch {
|
||||||
|
border-color: #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors-hidden {
|
||||||
|
position: absolute;
|
||||||
|
left: -9999em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors-swatch {
|
||||||
|
position: relative;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
text-align: left;
|
||||||
|
background: url(jquery.minicolors.png) -80px 0;
|
||||||
|
border: solid 1px #CCC;
|
||||||
|
vertical-align: middle;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors-swatch SPAN {
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: none;
|
||||||
|
box-shadow: inset 0 9px 0 rgba(255, 255, 255, .1);
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Panel */
|
||||||
|
.minicolors-panel {
|
||||||
|
position: absolute;
|
||||||
|
top: 26px;
|
||||||
|
left: 0;
|
||||||
|
width: 173px;
|
||||||
|
height: 152px;
|
||||||
|
background: white;
|
||||||
|
border: solid 1px #CCC;
|
||||||
|
box-shadow: 0 0 20px rgba(0, 0, 0, .2);
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors-position-top .minicolors-panel {
|
||||||
|
top: -156px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors-position-left .minicolors-panel {
|
||||||
|
left: -83px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors-position-left.minicolors-with-opacity .minicolors-panel {
|
||||||
|
left: -104px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors-with-opacity .minicolors-panel {
|
||||||
|
width: 194px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors .minicolors-grid {
|
||||||
|
position: absolute;
|
||||||
|
top: 1px;
|
||||||
|
left: 1px;
|
||||||
|
width: 150px;
|
||||||
|
height: 150px;
|
||||||
|
background: url(jquery.minicolors.png) -120px 0;
|
||||||
|
cursor: crosshair;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors .minicolors-grid-inner {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 150px;
|
||||||
|
height: 150px;
|
||||||
|
background: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors-slider-saturation .minicolors-grid {
|
||||||
|
background-position: -420px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors-slider-saturation .minicolors-grid-inner {
|
||||||
|
background: url(jquery.minicolors.png) -270px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors-slider-brightness .minicolors-grid {
|
||||||
|
background-position: -570px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors-slider-brightness .minicolors-grid-inner {
|
||||||
|
background: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors-slider-wheel .minicolors-grid {
|
||||||
|
background-position: -720px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors-slider,
|
||||||
|
.minicolors-opacity-slider {
|
||||||
|
position: absolute;
|
||||||
|
top: 1px;
|
||||||
|
left: 152px;
|
||||||
|
width: 20px;
|
||||||
|
height: 150px;
|
||||||
|
background: white url(jquery.minicolors.png) 0 0;
|
||||||
|
cursor: crosshair;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors-slider-saturation .minicolors-slider {
|
||||||
|
background-position: -60px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors-slider-brightness .minicolors-slider {
|
||||||
|
background-position: -20px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors-slider-wheel .minicolors-slider {
|
||||||
|
background-position: -20px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors-opacity-slider {
|
||||||
|
left: 173px;
|
||||||
|
background-position: -40px 0;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors-with-opacity .minicolors-opacity-slider {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Pickers */
|
||||||
|
.minicolors-grid .minicolors-picker {
|
||||||
|
position: absolute;
|
||||||
|
top: 70px;
|
||||||
|
left: 70px;
|
||||||
|
width: 10px;
|
||||||
|
height: 10px;
|
||||||
|
border: solid 1px black;
|
||||||
|
border-radius: 10px;
|
||||||
|
margin-top: -6px;
|
||||||
|
margin-left: -6px;
|
||||||
|
background: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors-grid .minicolors-picker SPAN {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 6px;
|
||||||
|
height: 6px;
|
||||||
|
border-radius: 6px;
|
||||||
|
border: solid 2px white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors-picker {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 18px;
|
||||||
|
height: 2px;
|
||||||
|
background: white;
|
||||||
|
border: solid 1px black;
|
||||||
|
margin-top: -2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Inline controls */
|
||||||
|
.minicolors-inline .minicolors-input,
|
||||||
|
.minicolors-inline .minicolors-swatch {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors-inline .minicolors-panel {
|
||||||
|
position: relative;
|
||||||
|
top: auto;
|
||||||
|
left: auto;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Bootstrap Theme (theme: 'bootstrap')
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Input styles */
|
||||||
|
.minicolors-theme-bootstrap .minicolors-input {
|
||||||
|
padding: 4px 6px;
|
||||||
|
padding-left: 30px;
|
||||||
|
background-color: white;
|
||||||
|
border: 1px solid #CCC;
|
||||||
|
border-radius: 3px;
|
||||||
|
color: #555;
|
||||||
|
font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
|
height: 19px;
|
||||||
|
margin: 0px;
|
||||||
|
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* When the input has focus */
|
||||||
|
.minicolors-theme-bootstrap.minicolors-focus .minicolors-input {
|
||||||
|
border-color: #6fb8f1;
|
||||||
|
box-shadow: 0 0 10px #6fb8f1;
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Swatch styles */
|
||||||
|
.minicolors-theme-bootstrap .minicolors-swatch {
|
||||||
|
position: absolute;
|
||||||
|
left: 4px;
|
||||||
|
top: 4px;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handle swatch position (left = default / right) */
|
||||||
|
.minicolors-theme-bootstrap.minicolors-swatch-position-right .minicolors-input {
|
||||||
|
padding-left: 6px;
|
||||||
|
padding-right: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors-theme-bootstrap.minicolors-swatch-position-right .minicolors-swatch {
|
||||||
|
left: auto;
|
||||||
|
right: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Panel styles */
|
||||||
|
.minicolors-theme-bootstrap .minicolors-panel {
|
||||||
|
top: 28px;
|
||||||
|
z-index: 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handle panel positions (top / left) */
|
||||||
|
.minicolors-theme-bootstrap.minicolors-position-top .minicolors-panel {
|
||||||
|
top: -154px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minicolors-theme-bootstrap.minicolors-position-left .minicolors-panel {
|
||||||
|
left: -63px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Don't forget to adjust the left position in case the opacity slider is visible! */
|
||||||
|
.minicolors-theme-bootstrap.minicolors-position-left.minicolors-with-opacity .minicolors-panel {
|
||||||
|
left: -84px;
|
||||||
|
}
|
857
sources/libs/jquery.minicolors.js
Normal file
857
sources/libs/jquery.minicolors.js
Normal file
|
@ -0,0 +1,857 @@
|
||||||
|
/*
|
||||||
|
* jQuery MiniColors: A tiny color picker built on jQuery
|
||||||
|
*
|
||||||
|
* Copyright Cory LaViska for A Beautiful Site, LLC. (http://www.abeautifulsite.net/)
|
||||||
|
*
|
||||||
|
* Dual-licensed under the MIT and GPL Version 2 licenses
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
if(jQuery) (function($) {
|
||||||
|
|
||||||
|
// Yay, MiniColors!
|
||||||
|
$.minicolors = {
|
||||||
|
// Default settings
|
||||||
|
defaultSettings: {
|
||||||
|
animationSpeed: 100,
|
||||||
|
animationEasing: 'swing',
|
||||||
|
change: null,
|
||||||
|
changeDelay: 0,
|
||||||
|
control: 'hue',
|
||||||
|
defaultValue: '',
|
||||||
|
hide: null,
|
||||||
|
hideSpeed: 100,
|
||||||
|
inline: false,
|
||||||
|
letterCase: 'lowercase',
|
||||||
|
opacity: false,
|
||||||
|
position: 'default',
|
||||||
|
show: null,
|
||||||
|
showSpeed: 100,
|
||||||
|
swatchPosition: 'left',
|
||||||
|
textfield: true,
|
||||||
|
theme: 'default'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Public methods
|
||||||
|
$.extend($.fn, {
|
||||||
|
minicolors: function(method, data) {
|
||||||
|
|
||||||
|
switch(method) {
|
||||||
|
|
||||||
|
// Destroy the control
|
||||||
|
case 'destroy':
|
||||||
|
$(this).each( function() {
|
||||||
|
destroy($(this));
|
||||||
|
});
|
||||||
|
return $(this);
|
||||||
|
|
||||||
|
// Hide the color picker
|
||||||
|
case 'hide':
|
||||||
|
hide();
|
||||||
|
return $(this);
|
||||||
|
|
||||||
|
// Get/set opacity
|
||||||
|
case 'opacity':
|
||||||
|
if( data === undefined ) {
|
||||||
|
// Getter
|
||||||
|
return $(this).attr('data-opacity');
|
||||||
|
} else {
|
||||||
|
// Setter
|
||||||
|
$(this).each( function() {
|
||||||
|
refresh($(this).attr('data-opacity', data));
|
||||||
|
});
|
||||||
|
return $(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get an RGB(A) object based on the current color/opacity
|
||||||
|
case 'rgbObject':
|
||||||
|
return rgbObject($(this), method === 'rgbaObject');
|
||||||
|
|
||||||
|
// Get an RGB(A) string based on the current color/opacity
|
||||||
|
case 'rgbString':
|
||||||
|
case 'rgbaString':
|
||||||
|
return rgbString($(this), method === 'rgbaString')
|
||||||
|
|
||||||
|
// Get/set settings on the fly
|
||||||
|
case 'settings':
|
||||||
|
if( data === undefined ) {
|
||||||
|
return $(this).data('minicolors-settings');
|
||||||
|
} else {
|
||||||
|
// Setter
|
||||||
|
$(this).each( function() {
|
||||||
|
var settings = $(this).data('minicolors-settings') || {};
|
||||||
|
destroy($(this));
|
||||||
|
$(this).minicolors($.extend(true, settings, data));
|
||||||
|
});
|
||||||
|
return $(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show the color picker
|
||||||
|
case 'show':
|
||||||
|
show( $(this).eq(0) );
|
||||||
|
return $(this);
|
||||||
|
|
||||||
|
// Get/set the hex color value
|
||||||
|
case 'value':
|
||||||
|
if( data === undefined ) {
|
||||||
|
// Getter
|
||||||
|
return $(this).val();
|
||||||
|
} else {
|
||||||
|
// Setter
|
||||||
|
$(this).each( function() {
|
||||||
|
refresh($(this).val(data));
|
||||||
|
});
|
||||||
|
return $(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initializes the control
|
||||||
|
case 'create':
|
||||||
|
default:
|
||||||
|
if( method !== 'create' ) data = method;
|
||||||
|
$(this).each( function() {
|
||||||
|
init($(this), data);
|
||||||
|
});
|
||||||
|
return $(this);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Initialize input elements
|
||||||
|
function init(input, settings) {
|
||||||
|
|
||||||
|
var minicolors = $('<span class="minicolors" />'),
|
||||||
|
defaultSettings = $.minicolors.defaultSettings;
|
||||||
|
|
||||||
|
// Do nothing if already initialized
|
||||||
|
if( input.data('minicolors-initialized') ) return;
|
||||||
|
|
||||||
|
// Handle settings
|
||||||
|
settings = $.extend(true, {}, defaultSettings, settings);
|
||||||
|
|
||||||
|
// The wrapper
|
||||||
|
minicolors
|
||||||
|
.addClass('minicolors-theme-' + settings.theme)
|
||||||
|
.addClass('minicolors-swatch-position-' + settings.swatchPosition)
|
||||||
|
.toggleClass('minicolors-swatch-left', settings.swatchPosition === 'left')
|
||||||
|
.toggleClass('minicolors-with-opacity', settings.opacity);
|
||||||
|
|
||||||
|
// Custom positioning
|
||||||
|
if( settings.position !== undefined ) {
|
||||||
|
$.each(settings.position.split(' '), function() {
|
||||||
|
minicolors.addClass('minicolors-position-' + this);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// The input
|
||||||
|
input
|
||||||
|
.addClass('minicolors-input')
|
||||||
|
.data('minicolors-initialized', true)
|
||||||
|
.data('minicolors-settings', settings)
|
||||||
|
.prop('size', 7)
|
||||||
|
.prop('maxlength', 7)
|
||||||
|
.wrap(minicolors)
|
||||||
|
.after(
|
||||||
|
'<span class="minicolors-panel minicolors-slider-' + settings.control + '">' +
|
||||||
|
'<span class="minicolors-slider">' +
|
||||||
|
'<span class="minicolors-picker"></span>' +
|
||||||
|
'</span>' +
|
||||||
|
'<span class="minicolors-opacity-slider">' +
|
||||||
|
'<span class="minicolors-picker"></span>' +
|
||||||
|
'</span>' +
|
||||||
|
'<span class="minicolors-grid">' +
|
||||||
|
'<span class="minicolors-grid-inner"></span>' +
|
||||||
|
'<span class="minicolors-picker"><span></span></span>' +
|
||||||
|
'</span>' +
|
||||||
|
'</span>'
|
||||||
|
);
|
||||||
|
|
||||||
|
// Prevent text selection in IE
|
||||||
|
input.parent().find('.minicolors-panel').on('selectstart', function() { return false; }).end();
|
||||||
|
|
||||||
|
// Detect swatch position
|
||||||
|
if( settings.swatchPosition === 'left' ) {
|
||||||
|
// Left
|
||||||
|
input.before('<span class="minicolors-swatch"><span></span></span>');
|
||||||
|
} else {
|
||||||
|
// Right
|
||||||
|
input.after('<span class="minicolors-swatch"><span></span></span>');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Disable textfield
|
||||||
|
if( !settings.textfield ) input.addClass('minicolors-hidden');
|
||||||
|
|
||||||
|
// Inline controls
|
||||||
|
if( settings.inline ) input.parent().addClass('minicolors-inline');
|
||||||
|
|
||||||
|
updateFromInput(input, false, true);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns the input back to its original state
|
||||||
|
function destroy(input) {
|
||||||
|
|
||||||
|
var minicolors = input.parent();
|
||||||
|
|
||||||
|
// Revert the input element
|
||||||
|
input
|
||||||
|
.removeData('minicolors-initialized')
|
||||||
|
.removeData('minicolors-settings')
|
||||||
|
.removeProp('size')
|
||||||
|
.removeProp('maxlength')
|
||||||
|
.removeClass('minicolors-input');
|
||||||
|
|
||||||
|
// Remove the wrap and destroy whatever remains
|
||||||
|
minicolors.before(input).remove();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Refresh the specified control
|
||||||
|
function refresh(input) {
|
||||||
|
updateFromInput(input);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Shows the specified dropdown panel
|
||||||
|
function show(input) {
|
||||||
|
|
||||||
|
var minicolors = input.parent(),
|
||||||
|
panel = minicolors.find('.minicolors-panel'),
|
||||||
|
settings = input.data('minicolors-settings');
|
||||||
|
|
||||||
|
// Do nothing if uninitialized, disabled, inline, or already open
|
||||||
|
if( !input.data('minicolors-initialized') ||
|
||||||
|
input.prop('disabled') ||
|
||||||
|
minicolors.hasClass('minicolors-inline') ||
|
||||||
|
minicolors.hasClass('minicolors-focus')
|
||||||
|
) return;
|
||||||
|
|
||||||
|
hide();
|
||||||
|
|
||||||
|
minicolors.addClass('minicolors-focus');
|
||||||
|
panel
|
||||||
|
.stop(true, true)
|
||||||
|
.fadeIn(settings.showSpeed, function() {
|
||||||
|
if( settings.show ) settings.show.call(input);
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hides all dropdown panels
|
||||||
|
function hide() {
|
||||||
|
|
||||||
|
$('.minicolors-input').each( function() {
|
||||||
|
|
||||||
|
var input = $(this),
|
||||||
|
settings = input.data('minicolors-settings'),
|
||||||
|
minicolors = input.parent();
|
||||||
|
|
||||||
|
// Don't hide inline controls
|
||||||
|
if( settings.inline ) return;
|
||||||
|
|
||||||
|
minicolors.find('.minicolors-panel').fadeOut(settings.hideSpeed, function() {
|
||||||
|
if(minicolors.hasClass('minicolors-focus')) {
|
||||||
|
if( settings.hide ) settings.hide.call(input);
|
||||||
|
}
|
||||||
|
minicolors.removeClass('minicolors-focus');
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Moves the selected picker
|
||||||
|
function move(target, event, animate) {
|
||||||
|
|
||||||
|
var input = target.parents('.minicolors').find('.minicolors-input'),
|
||||||
|
settings = input.data('minicolors-settings'),
|
||||||
|
picker = target.find('[class$=-picker]'),
|
||||||
|
offsetX = target.offset().left,
|
||||||
|
offsetY = target.offset().top,
|
||||||
|
x = Math.round(event.pageX - offsetX),
|
||||||
|
y = Math.round(event.pageY - offsetY),
|
||||||
|
duration = animate ? settings.animationSpeed : 0,
|
||||||
|
wx, wy, r, phi;
|
||||||
|
|
||||||
|
|
||||||
|
// Touch support
|
||||||
|
if( event.originalEvent.changedTouches ) {
|
||||||
|
x = event.originalEvent.changedTouches[0].pageX - offsetX;
|
||||||
|
y = event.originalEvent.changedTouches[0].pageY - offsetY;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Constrain picker to its container
|
||||||
|
if( x < 0 ) x = 0;
|
||||||
|
if( y < 0 ) y = 0;
|
||||||
|
if( x > target.width() ) x = target.width();
|
||||||
|
if( y > target.height() ) y = target.height();
|
||||||
|
|
||||||
|
// Constrain color wheel values to the wheel
|
||||||
|
if( target.parent().is('.minicolors-slider-wheel') && picker.parent().is('.minicolors-grid') ) {
|
||||||
|
wx = 75 - x;
|
||||||
|
wy = 75 - y;
|
||||||
|
r = Math.sqrt(wx * wx + wy * wy);
|
||||||
|
phi = Math.atan2(wy, wx);
|
||||||
|
if( phi < 0 ) phi += Math.PI * 2;
|
||||||
|
if( r > 75 ) {
|
||||||
|
r = 75;
|
||||||
|
x = 75 - (75 * Math.cos(phi));
|
||||||
|
y = 75 - (75 * Math.sin(phi));
|
||||||
|
}
|
||||||
|
x = Math.round(x);
|
||||||
|
y = Math.round(y);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Move the picker
|
||||||
|
if( target.is('.minicolors-grid') ) {
|
||||||
|
picker
|
||||||
|
.stop(true)
|
||||||
|
.animate({
|
||||||
|
top: y + 'px',
|
||||||
|
left: x + 'px'
|
||||||
|
}, duration, settings.animationEasing, function() {
|
||||||
|
updateFromControl(input, target);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
picker
|
||||||
|
.stop(true)
|
||||||
|
.animate({
|
||||||
|
top: y + 'px'
|
||||||
|
}, duration, settings.animationEasing, function() {
|
||||||
|
updateFromControl(input, target);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sets the input based on the color picker values
|
||||||
|
function updateFromControl(input, target) {
|
||||||
|
|
||||||
|
function getCoords(picker, container) {
|
||||||
|
|
||||||
|
var left, top;
|
||||||
|
if( !picker.length || !container ) return null;
|
||||||
|
left = picker.offset().left;
|
||||||
|
top = picker.offset().top;
|
||||||
|
|
||||||
|
return {
|
||||||
|
x: left - container.offset().left + (picker.outerWidth() / 2),
|
||||||
|
y: top - container.offset().top + (picker.outerHeight() / 2)
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
var hue, saturation, brightness, rgb, x, y, r, phi,
|
||||||
|
|
||||||
|
hex = input.val(),
|
||||||
|
opacity = input.attr('data-opacity'),
|
||||||
|
|
||||||
|
// Helpful references
|
||||||
|
minicolors = input.parent(),
|
||||||
|
settings = input.data('minicolors-settings'),
|
||||||
|
panel = minicolors.find('.minicolors-panel'),
|
||||||
|
swatch = minicolors.find('.minicolors-swatch'),
|
||||||
|
|
||||||
|
// Panel objects
|
||||||
|
grid = minicolors.find('.minicolors-grid'),
|
||||||
|
slider = minicolors.find('.minicolors-slider'),
|
||||||
|
opacitySlider = minicolors.find('.minicolors-opacity-slider'),
|
||||||
|
|
||||||
|
// Picker objects
|
||||||
|
gridPicker = grid.find('[class$=-picker]'),
|
||||||
|
sliderPicker = slider.find('[class$=-picker]'),
|
||||||
|
opacityPicker = opacitySlider.find('[class$=-picker]'),
|
||||||
|
|
||||||
|
// Picker positions
|
||||||
|
gridPos = getCoords(gridPicker, grid),
|
||||||
|
sliderPos = getCoords(sliderPicker, slider),
|
||||||
|
opacityPos = getCoords(opacityPicker, opacitySlider);
|
||||||
|
|
||||||
|
// Handle colors
|
||||||
|
if( target.is('.minicolors-grid, .minicolors-slider') ) {
|
||||||
|
|
||||||
|
// Determine HSB values
|
||||||
|
switch(settings.control) {
|
||||||
|
|
||||||
|
case 'wheel':
|
||||||
|
// Calculate hue, saturation, and brightness
|
||||||
|
x = (grid.width() / 2) - gridPos.x;
|
||||||
|
y = (grid.height() / 2) - gridPos.y;
|
||||||
|
r = Math.sqrt(x * x + y * y);
|
||||||
|
phi = Math.atan2(y, x);
|
||||||
|
if( phi < 0 ) phi += Math.PI * 2;
|
||||||
|
if( r > 75 ) {
|
||||||
|
r = 75;
|
||||||
|
gridPos.x = 69 - (75 * Math.cos(phi));
|
||||||
|
gridPos.y = 69 - (75 * Math.sin(phi));
|
||||||
|
}
|
||||||
|
saturation = keepWithin(r / 0.75, 0, 100);
|
||||||
|
hue = keepWithin(phi * 180 / Math.PI, 0, 360);
|
||||||
|
brightness = keepWithin(100 - Math.floor(sliderPos.y * (100 / slider.height())), 0, 100);
|
||||||
|
hex = hsb2hex({
|
||||||
|
h: hue,
|
||||||
|
s: saturation,
|
||||||
|
b: brightness
|
||||||
|
});
|
||||||
|
|
||||||
|
// Update UI
|
||||||
|
slider.css('backgroundColor', hsb2hex({ h: hue, s: saturation, b: 100 }));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'saturation':
|
||||||
|
// Calculate hue, saturation, and brightness
|
||||||
|
hue = keepWithin(parseInt(gridPos.x * (360 / grid.width())), 0, 360);
|
||||||
|
saturation = keepWithin(100 - Math.floor(sliderPos.y * (100 / slider.height())), 0, 100);
|
||||||
|
brightness = keepWithin(100 - Math.floor(gridPos.y * (100 / grid.height())), 0, 100);
|
||||||
|
hex = hsb2hex({
|
||||||
|
h: hue,
|
||||||
|
s: saturation,
|
||||||
|
b: brightness
|
||||||
|
});
|
||||||
|
|
||||||
|
// Update UI
|
||||||
|
slider.css('backgroundColor', hsb2hex({ h: hue, s: 100, b: brightness }));
|
||||||
|
minicolors.find('.minicolors-grid-inner').css('opacity', saturation / 100);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'brightness':
|
||||||
|
// Calculate hue, saturation, and brightness
|
||||||
|
hue = keepWithin(parseInt(gridPos.x * (360 / grid.width())), 0, 360);
|
||||||
|
saturation = keepWithin(100 - Math.floor(gridPos.y * (100 / grid.height())), 0, 100);
|
||||||
|
brightness = keepWithin(100 - Math.floor(sliderPos.y * (100 / slider.height())), 0, 100);
|
||||||
|
hex = hsb2hex({
|
||||||
|
h: hue,
|
||||||
|
s: saturation,
|
||||||
|
b: brightness
|
||||||
|
});
|
||||||
|
|
||||||
|
// Update UI
|
||||||
|
slider.css('backgroundColor', hsb2hex({ h: hue, s: saturation, b: 100 }));
|
||||||
|
minicolors.find('.minicolors-grid-inner').css('opacity', 1 - (brightness / 100));
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
// Calculate hue, saturation, and brightness
|
||||||
|
hue = keepWithin(360 - parseInt(sliderPos.y * (360 / slider.height())), 0, 360);
|
||||||
|
saturation = keepWithin(Math.floor(gridPos.x * (100 / grid.width())), 0, 100);
|
||||||
|
brightness = keepWithin(100 - Math.floor(gridPos.y * (100 / grid.height())), 0, 100);
|
||||||
|
hex = hsb2hex({
|
||||||
|
h: hue,
|
||||||
|
s: saturation,
|
||||||
|
b: brightness
|
||||||
|
});
|
||||||
|
|
||||||
|
// Update UI
|
||||||
|
grid.css('backgroundColor', hsb2hex({ h: hue, s: 100, b: 100 }));
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Adjust case
|
||||||
|
input.val( convertCase(hex, settings.letterCase) );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle opacity
|
||||||
|
if( target.is('.minicolors-opacity-slider') ) {
|
||||||
|
if( settings.opacity ) {
|
||||||
|
opacity = parseFloat(1 - (opacityPos.y / opacitySlider.height())).toFixed(2);
|
||||||
|
} else {
|
||||||
|
opacity = 1;
|
||||||
|
}
|
||||||
|
if( settings.opacity ) input.attr('data-opacity', opacity);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set swatch color
|
||||||
|
swatch.find('SPAN').css({
|
||||||
|
backgroundColor: hex,
|
||||||
|
opacity: opacity
|
||||||
|
});
|
||||||
|
|
||||||
|
// Handle change event
|
||||||
|
doChange(input, hex, opacity);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sets the color picker values from the input
|
||||||
|
function updateFromInput(input, preserveInputValue, firstRun) {
|
||||||
|
|
||||||
|
var hex,
|
||||||
|
hsb,
|
||||||
|
opacity,
|
||||||
|
x, y, r, phi,
|
||||||
|
|
||||||
|
// Helpful references
|
||||||
|
minicolors = input.parent(),
|
||||||
|
settings = input.data('minicolors-settings'),
|
||||||
|
swatch = minicolors.find('.minicolors-swatch'),
|
||||||
|
|
||||||
|
// Panel objects
|
||||||
|
grid = minicolors.find('.minicolors-grid'),
|
||||||
|
slider = minicolors.find('.minicolors-slider'),
|
||||||
|
opacitySlider = minicolors.find('.minicolors-opacity-slider'),
|
||||||
|
|
||||||
|
// Picker objects
|
||||||
|
gridPicker = grid.find('[class$=-picker]'),
|
||||||
|
sliderPicker = slider.find('[class$=-picker]'),
|
||||||
|
opacityPicker = opacitySlider.find('[class$=-picker]');
|
||||||
|
|
||||||
|
// Determine hex/HSB values
|
||||||
|
hex = convertCase(parseHex(input.val(), true), settings.letterCase);
|
||||||
|
if( !hex ) hex = convertCase(parseHex(settings.defaultValue, true));
|
||||||
|
hsb = hex2hsb(hex);
|
||||||
|
|
||||||
|
// Update input value
|
||||||
|
if( !preserveInputValue ) input.val(hex);
|
||||||
|
|
||||||
|
// Determine opacity value
|
||||||
|
if( settings.opacity ) {
|
||||||
|
// Get from data-opacity attribute and keep within 0-1 range
|
||||||
|
opacity = input.attr('data-opacity') === '' ? 1 : keepWithin(parseFloat(input.attr('data-opacity')).toFixed(2), 0, 1);
|
||||||
|
if( isNaN(opacity) ) opacity = 1;
|
||||||
|
input.attr('data-opacity', opacity);
|
||||||
|
swatch.find('SPAN').css('opacity', opacity);
|
||||||
|
|
||||||
|
// Set opacity picker position
|
||||||
|
y = keepWithin(opacitySlider.height() - (opacitySlider.height() * opacity), 0, opacitySlider.height());
|
||||||
|
opacityPicker.css('top', y + 'px');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update swatch
|
||||||
|
swatch.find('SPAN').css('backgroundColor', hex);
|
||||||
|
|
||||||
|
// Determine picker locations
|
||||||
|
switch(settings.control) {
|
||||||
|
|
||||||
|
case 'wheel':
|
||||||
|
// Set grid position
|
||||||
|
r = keepWithin(Math.ceil(hsb.s * 0.75), 0, grid.height() / 2);
|
||||||
|
phi = hsb.h * Math.PI / 180;
|
||||||
|
x = keepWithin(75 - Math.cos(phi) * r, 0, grid.width());
|
||||||
|
y = keepWithin(75 - Math.sin(phi) * r, 0, grid.height());
|
||||||
|
gridPicker.css({
|
||||||
|
top: y + 'px',
|
||||||
|
left: x + 'px'
|
||||||
|
});
|
||||||
|
|
||||||
|
// Set slider position
|
||||||
|
y = 150 - (hsb.b / (100 / grid.height()));
|
||||||
|
if( hex === '' ) y = 0;
|
||||||
|
sliderPicker.css('top', y + 'px');
|
||||||
|
|
||||||
|
// Update panel color
|
||||||
|
slider.css('backgroundColor', hsb2hex({ h: hsb.h, s: hsb.s, b: 100 }));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'saturation':
|
||||||
|
// Set grid position
|
||||||
|
x = keepWithin((5 * hsb.h) / 12, 0, 150);
|
||||||
|
y = keepWithin(grid.height() - Math.ceil(hsb.b / (100 / grid.height())), 0, grid.height());
|
||||||
|
gridPicker.css({
|
||||||
|
top: y + 'px',
|
||||||
|
left: x + 'px'
|
||||||
|
});
|
||||||
|
|
||||||
|
// Set slider position
|
||||||
|
y = keepWithin(slider.height() - (hsb.s * (slider.height() / 100)), 0, slider.height());
|
||||||
|
sliderPicker.css('top', y + 'px');
|
||||||
|
|
||||||
|
// Update UI
|
||||||
|
slider.css('backgroundColor', hsb2hex({ h: hsb.h, s: 100, b: hsb.b }));
|
||||||
|
minicolors.find('.minicolors-grid-inner').css('opacity', hsb.s / 100);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'brightness':
|
||||||
|
// Set grid position
|
||||||
|
x = keepWithin((5 * hsb.h) / 12, 0, 150);
|
||||||
|
y = keepWithin(grid.height() - Math.ceil(hsb.s / (100 / grid.height())), 0, grid.height());
|
||||||
|
gridPicker.css({
|
||||||
|
top: y + 'px',
|
||||||
|
left: x + 'px'
|
||||||
|
});
|
||||||
|
|
||||||
|
// Set slider position
|
||||||
|
y = keepWithin(slider.height() - (hsb.b * (slider.height() / 100)), 0, slider.height());
|
||||||
|
sliderPicker.css('top', y + 'px');
|
||||||
|
|
||||||
|
// Update UI
|
||||||
|
slider.css('backgroundColor', hsb2hex({ h: hsb.h, s: hsb.s, b: 100 }));
|
||||||
|
minicolors.find('.minicolors-grid-inner').css('opacity', 1 - (hsb.b / 100));
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
// Set grid position
|
||||||
|
x = keepWithin(Math.ceil(hsb.s / (100 / grid.width())), 0, grid.width());
|
||||||
|
y = keepWithin(grid.height() - Math.ceil(hsb.b / (100 / grid.height())), 0, grid.height());
|
||||||
|
gridPicker.css({
|
||||||
|
top: y + 'px',
|
||||||
|
left: x + 'px'
|
||||||
|
});
|
||||||
|
|
||||||
|
// Set slider position
|
||||||
|
y = keepWithin(slider.height() - (hsb.h / (360 / slider.height())), 0, slider.height());
|
||||||
|
sliderPicker.css('top', y + 'px');
|
||||||
|
|
||||||
|
// Update panel color
|
||||||
|
grid.css('backgroundColor', hsb2hex({ h: hsb.h, s: 100, b: 100 }));
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle change event
|
||||||
|
if( !firstRun ) doChange(input, hex, opacity);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Runs the change and changeDelay callbacks
|
||||||
|
function doChange(input, hex, opacity) {
|
||||||
|
|
||||||
|
var settings = input.data('minicolors-settings');
|
||||||
|
|
||||||
|
// Only run if it actually changed
|
||||||
|
if( hex + opacity !== input.data('minicolors-lastChange') ) {
|
||||||
|
|
||||||
|
// Remember last-changed value
|
||||||
|
input.data('minicolors-lastChange', hex + opacity);
|
||||||
|
|
||||||
|
// Fire change event
|
||||||
|
if( settings.change ) {
|
||||||
|
if( settings.changeDelay ) {
|
||||||
|
// Call after a delay
|
||||||
|
clearTimeout(input.data('minicolors-changeTimeout'));
|
||||||
|
input.data('minicolors-changeTimeout', setTimeout( function() {
|
||||||
|
settings.change.call(input, hex, opacity);
|
||||||
|
}, settings.changeDelay));
|
||||||
|
} else {
|
||||||
|
// Call immediately
|
||||||
|
settings.change.call(input, hex, opacity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generates an RGB(A) object based on the input's value
|
||||||
|
function rgbObject(input) {
|
||||||
|
var hex = parseHex($(input).val(), true),
|
||||||
|
rgb = hex2rgb(hex),
|
||||||
|
opacity = $(input).attr('data-opacity');
|
||||||
|
if( !rgb ) return null;
|
||||||
|
if( opacity !== undefined ) $.extend(rgb, { a: parseFloat(opacity) });
|
||||||
|
return rgb;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Genearates an RGB(A) string based on the input's value
|
||||||
|
function rgbString(input, alpha) {
|
||||||
|
var hex = parseHex($(input).val(), true),
|
||||||
|
rgb = hex2rgb(hex),
|
||||||
|
opacity = $(input).attr('data-opacity');
|
||||||
|
if( !rgb ) return null;
|
||||||
|
if( opacity === undefined ) opacity = 1;
|
||||||
|
if( alpha ) {
|
||||||
|
return 'rgba(' + rgb.r + ', ' + rgb.g + ', ' + rgb.b + ', ' + parseFloat(opacity) + ')';
|
||||||
|
} else {
|
||||||
|
return 'rgb(' + rgb.r + ', ' + rgb.g + ', ' + rgb.b + ')';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Converts to the letter case specified in settings
|
||||||
|
function convertCase(string, letterCase) {
|
||||||
|
return letterCase === 'uppercase' ? string.toUpperCase() : string.toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parses a string and returns a valid hex string when possible
|
||||||
|
function parseHex(string, expand) {
|
||||||
|
string = string.replace(/[^A-F0-9]/ig, '');
|
||||||
|
if( string.length !== 3 && string.length !== 6 ) return '';
|
||||||
|
if( string.length === 3 && expand ) {
|
||||||
|
string = string[0] + string[0] + string[1] + string[1] + string[2] + string[2];
|
||||||
|
}
|
||||||
|
return '#' + string;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keeps value within min and max
|
||||||
|
function keepWithin(value, min, max) {
|
||||||
|
if( value < min ) value = min;
|
||||||
|
if( value > max ) value = max;
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Converts an HSB object to an RGB object
|
||||||
|
function hsb2rgb(hsb) {
|
||||||
|
var rgb = {};
|
||||||
|
var h = Math.round(hsb.h);
|
||||||
|
var s = Math.round(hsb.s * 255 / 100);
|
||||||
|
var v = Math.round(hsb.b * 255 / 100);
|
||||||
|
if(s === 0) {
|
||||||
|
rgb.r = rgb.g = rgb.b = v;
|
||||||
|
} else {
|
||||||
|
var t1 = v;
|
||||||
|
var t2 = (255 - s) * v / 255;
|
||||||
|
var t3 = (t1 - t2) * (h % 60) / 60;
|
||||||
|
if( h === 360 ) h = 0;
|
||||||
|
if( h < 60 ) { rgb.r = t1; rgb.b = t2; rgb.g = t2 + t3; }
|
||||||
|
else if( h < 120 ) {rgb.g = t1; rgb.b = t2; rgb.r = t1 - t3; }
|
||||||
|
else if( h < 180 ) {rgb.g = t1; rgb.r = t2; rgb.b = t2 + t3; }
|
||||||
|
else if( h < 240 ) {rgb.b = t1; rgb.r = t2; rgb.g = t1 - t3; }
|
||||||
|
else if( h < 300 ) {rgb.b = t1; rgb.g = t2; rgb.r = t2 + t3; }
|
||||||
|
else if( h < 360 ) {rgb.r = t1; rgb.g = t2; rgb.b = t1 - t3; }
|
||||||
|
else { rgb.r = 0; rgb.g = 0; rgb.b = 0; }
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
r: Math.round(rgb.r),
|
||||||
|
g: Math.round(rgb.g),
|
||||||
|
b: Math.round(rgb.b)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Converts an RGB object to a hex string
|
||||||
|
function rgb2hex(rgb) {
|
||||||
|
var hex = [
|
||||||
|
rgb.r.toString(16),
|
||||||
|
rgb.g.toString(16),
|
||||||
|
rgb.b.toString(16)
|
||||||
|
];
|
||||||
|
$.each(hex, function(nr, val) {
|
||||||
|
if (val.length === 1) hex[nr] = '0' + val;
|
||||||
|
});
|
||||||
|
return '#' + hex.join('');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Converts an HSB object to a hex string
|
||||||
|
function hsb2hex(hsb) {
|
||||||
|
return rgb2hex(hsb2rgb(hsb));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Converts a hex string to an HSB object
|
||||||
|
function hex2hsb(hex) {
|
||||||
|
var hsb = rgb2hsb(hex2rgb(hex));
|
||||||
|
if( hsb.s === 0 ) hsb.h = 360;
|
||||||
|
return hsb;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Converts an RGB object to an HSB object
|
||||||
|
function rgb2hsb(rgb) {
|
||||||
|
var hsb = { h: 0, s: 0, b: 0 };
|
||||||
|
var min = Math.min(rgb.r, rgb.g, rgb.b);
|
||||||
|
var max = Math.max(rgb.r, rgb.g, rgb.b);
|
||||||
|
var delta = max - min;
|
||||||
|
hsb.b = max;
|
||||||
|
hsb.s = max !== 0 ? 255 * delta / max : 0;
|
||||||
|
if( hsb.s !== 0 ) {
|
||||||
|
if( rgb.r === max ) {
|
||||||
|
hsb.h = (rgb.g - rgb.b) / delta;
|
||||||
|
} else if( rgb.g === max ) {
|
||||||
|
hsb.h = 2 + (rgb.b - rgb.r) / delta;
|
||||||
|
} else {
|
||||||
|
hsb.h = 4 + (rgb.r - rgb.g) / delta;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
hsb.h = -1;
|
||||||
|
}
|
||||||
|
hsb.h *= 60;
|
||||||
|
if( hsb.h < 0 ) {
|
||||||
|
hsb.h += 360;
|
||||||
|
}
|
||||||
|
hsb.s *= 100/255;
|
||||||
|
hsb.b *= 100/255;
|
||||||
|
return hsb;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Converts a hex string to an RGB object
|
||||||
|
function hex2rgb(hex) {
|
||||||
|
hex = parseInt(((hex.indexOf('#') > -1) ? hex.substring(1) : hex), 16);
|
||||||
|
return {
|
||||||
|
r: hex >> 16,
|
||||||
|
g: (hex & 0x00FF00) >> 8,
|
||||||
|
b: (hex & 0x0000FF)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle events
|
||||||
|
$(document)
|
||||||
|
// Hide on clicks outside of the control
|
||||||
|
.on('mousedown.minicolors touchstart.minicolors', function(event) {
|
||||||
|
if( !$(event.target).parents().add(event.target).hasClass('minicolors') ) {
|
||||||
|
hide();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// Start moving
|
||||||
|
.on('mousedown.minicolors touchstart.minicolors', '.minicolors-grid, .minicolors-slider, .minicolors-opacity-slider', function(event) {
|
||||||
|
var target = $(this);
|
||||||
|
event.preventDefault();
|
||||||
|
$(document).data('minicolors-target', target);
|
||||||
|
move(target, event, true);
|
||||||
|
})
|
||||||
|
// Move pickers
|
||||||
|
.on('mousemove.minicolors touchmove.minicolors', function(event) {
|
||||||
|
var target = $(document).data('minicolors-target');
|
||||||
|
if( target ) move(target, event);
|
||||||
|
})
|
||||||
|
// Stop moving
|
||||||
|
.on('mouseup.minicolors touchend.minicolors', function() {
|
||||||
|
$(this).removeData('minicolors-target');
|
||||||
|
})
|
||||||
|
// Toggle panel when swatch is clicked
|
||||||
|
.on('mousedown.minicolors touchstart.minicolors', '.minicolors-swatch', function(event) {
|
||||||
|
var input = $(this).parent().find('.minicolors-input'),
|
||||||
|
minicolors = input.parent();
|
||||||
|
if( minicolors.hasClass('minicolors-focus') ) {
|
||||||
|
hide(input);
|
||||||
|
} else {
|
||||||
|
show(input);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// Show on focus
|
||||||
|
.on('focus.minicolors', '.minicolors-input', function(event) {
|
||||||
|
var input = $(this);
|
||||||
|
if( !input.data('minicolors-initialized') ) return;
|
||||||
|
show(input);
|
||||||
|
})
|
||||||
|
// Fix hex on blur
|
||||||
|
.on('blur.minicolors', '.minicolors-input', function(event) {
|
||||||
|
var input = $(this),
|
||||||
|
settings = input.data('minicolors-settings');
|
||||||
|
if( !input.data('minicolors-initialized') ) return;
|
||||||
|
|
||||||
|
// Parse Hex
|
||||||
|
input.val(parseHex(input.val(), true));
|
||||||
|
|
||||||
|
// Is it blank?
|
||||||
|
if( input.val() === '' ) input.val(parseHex(settings.defaultValue, true));
|
||||||
|
|
||||||
|
// Adjust case
|
||||||
|
input.val( convertCase(input.val(), settings.letterCase) );
|
||||||
|
|
||||||
|
})
|
||||||
|
// Handle keypresses
|
||||||
|
.on('keydown.minicolors', '.minicolors-input', function(event) {
|
||||||
|
var input = $(this);
|
||||||
|
if( !input.data('minicolors-initialized') ) return;
|
||||||
|
switch(event.keyCode) {
|
||||||
|
case 9: // tab
|
||||||
|
hide();
|
||||||
|
break;
|
||||||
|
case 27: // esc
|
||||||
|
hide();
|
||||||
|
input.blur();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// Update on keyup
|
||||||
|
.on('keyup.minicolors', '.minicolors-input', function(event) {
|
||||||
|
var input = $(this);
|
||||||
|
if( !input.data('minicolors-initialized') ) return;
|
||||||
|
updateFromInput(input, true);
|
||||||
|
})
|
||||||
|
// Update on paste
|
||||||
|
.on('paste.minicolors', '.minicolors-input', function(event) {
|
||||||
|
var input = $(this);
|
||||||
|
if( !input.data('minicolors-initialized') ) return;
|
||||||
|
setTimeout( function() {
|
||||||
|
updateFromInput(input, true);
|
||||||
|
}, 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
})(jQuery);
|
BIN
sources/libs/jquery.minicolors.png
Normal file
BIN
sources/libs/jquery.minicolors.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 76 KiB |
150
sources/libs/main.css
Normal file
150
sources/libs/main.css
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
body {
|
||||||
|
padding-top: 20px;
|
||||||
|
padding-bottom: 60px;
|
||||||
|
color: #5a5a5a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.float_right {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
.float_left {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
.clear {
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
.center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Custom container */
|
||||||
|
.container {
|
||||||
|
margin: 0 auto;
|
||||||
|
max-width: 1000px;
|
||||||
|
}
|
||||||
|
.container > hr {
|
||||||
|
margin: 60px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Main marketing message and sign up button */
|
||||||
|
.jumbotron {
|
||||||
|
margin: 80px 0px 40px 0px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.jumbotron h1 {
|
||||||
|
font-size: 100px;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
.jumbotron .lead {
|
||||||
|
font-size: 24px;
|
||||||
|
line-height: 1.25;
|
||||||
|
}
|
||||||
|
.jumbotron .btn {
|
||||||
|
font-size: 21px;
|
||||||
|
padding: 14px 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Customize the navbar links to be fill the entire space of the .navbar */
|
||||||
|
.navbar .navbar-inner {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
.navbar .nav {
|
||||||
|
margin: 0;
|
||||||
|
display: table;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.navbar .nav li {
|
||||||
|
display: table-cell;
|
||||||
|
width: 1%;
|
||||||
|
float: none;
|
||||||
|
}
|
||||||
|
.navbar .nav li a {
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: center;
|
||||||
|
border-left: 1px solid rgba(255,255,255,.75);
|
||||||
|
border-right: 1px solid rgba(0,0,0,.1);
|
||||||
|
}
|
||||||
|
.navbar .nav li:first-child a {
|
||||||
|
border-left: 0;
|
||||||
|
border-radius: 3px 0 0 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar .nav li:last-child a {
|
||||||
|
border-right: 0;
|
||||||
|
border-radius: 0 3px 3px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* MARKETING CONTENT -------------------------------------------------- */
|
||||||
|
|
||||||
|
/* Center align the text within the three columns below the carousel */
|
||||||
|
.marketing .span4 {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.marketing h2 {
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
.marketing .span4 p {
|
||||||
|
margin-left: 10px;
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Featurettes ------------------------- */
|
||||||
|
|
||||||
|
.featurette-divider {
|
||||||
|
margin: 80px 0; /* Space out the Bootstrap <hr> more */
|
||||||
|
}
|
||||||
|
.featurette {
|
||||||
|
/*padding-top: 120px;*/ /* Vertically center images part 1: add padding above and below text. */
|
||||||
|
overflow: hidden; /* Vertically center images part 2: clear their floats. */
|
||||||
|
}
|
||||||
|
.featurette-image {
|
||||||
|
/*margin-top: -120px;*/ /* Vertically center images part 3: negative margin up the image the same amount of the padding to center it. */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Give some space on the sides of the floated elements so text doesn't run right into it. */
|
||||||
|
.featurette-image.pull-left {
|
||||||
|
margin-right: 40px;
|
||||||
|
}
|
||||||
|
.featurette-image.pull-right {
|
||||||
|
margin-left: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Thin out the marketing headings */
|
||||||
|
.featurette-heading {
|
||||||
|
font-size: 50px;
|
||||||
|
font-weight: 300;
|
||||||
|
line-height: 1;
|
||||||
|
letter-spacing: -1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* RESPONSIVE CSS -------------------------------------------------- */
|
||||||
|
|
||||||
|
@media (max-width: 979px) {
|
||||||
|
|
||||||
|
.featurette {
|
||||||
|
height: auto;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
.featurette-image.pull-left,
|
||||||
|
.featurette-image.pull-right {
|
||||||
|
display: block;
|
||||||
|
float: none;
|
||||||
|
max-width: 40%;
|
||||||
|
margin: 0 auto 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
|
||||||
|
.featurette-heading {
|
||||||
|
font-size: 30px;
|
||||||
|
}
|
||||||
|
.featurette .lead {
|
||||||
|
font-size: 18px;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
}
|
30
sources/libs/main.js
Normal file
30
sources/libs/main.js
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
//Navigation menu scroll
|
||||||
|
$(function() {
|
||||||
|
$('.navegable').click(function() {
|
||||||
|
$('#navigation li').removeClass('active');
|
||||||
|
$(this).parent('li').addClass('active');
|
||||||
|
if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
|
||||||
|
var $target = $(this.hash);
|
||||||
|
$target = $target.length && $target || $('[name=' + this.hash.slice(1) +']');
|
||||||
|
if ($target.length) {
|
||||||
|
var targetOffset = $target.offset().top - 80;
|
||||||
|
$('html,body').animate({scrollTop: targetOffset}, 1000);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
function GetSitePath() {
|
||||||
|
var rootPath = window.location.protocol + "//" + window.location.host;
|
||||||
|
var path = window.location.pathname;
|
||||||
|
if (path.lastIndexOf("/") == 0) {
|
||||||
|
path = path.substring(1);
|
||||||
|
}
|
||||||
|
path = path.substr(0,path.lastIndexOf("/"));
|
||||||
|
if (path != "") {
|
||||||
|
rootPath = rootPath + path + '/';
|
||||||
|
}
|
||||||
|
return rootPath;
|
||||||
|
}
|
||||||
|
|
0
sources/libs/plugin.css
Normal file
0
sources/libs/plugin.css
Normal file
169
sources/plugin/jquery.postitall.css
Normal file
169
sources/plugin/jquery.postitall.css
Normal file
|
@ -0,0 +1,169 @@
|
||||||
|
.PIAtitle {
|
||||||
|
font-size: 14px;
|
||||||
|
margin-left: 5px;
|
||||||
|
}
|
||||||
|
.PIAdate {
|
||||||
|
float:left;
|
||||||
|
line-height:10px;
|
||||||
|
font-size: 9px;
|
||||||
|
}
|
||||||
|
.minicolors-panel {
|
||||||
|
border: solid 20px #555;
|
||||||
|
}
|
||||||
|
#chmenu {
|
||||||
|
position: absolute;
|
||||||
|
display: none;
|
||||||
|
z-index: 100000;
|
||||||
|
width: 275px;
|
||||||
|
height: 20px;
|
||||||
|
}
|
||||||
|
#chmenu label{
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
.PIAtoolbar .PIAchopt {
|
||||||
|
background-image: url(data:image/gif;base64,R0lGODlhDQANAMwAAF5eXm5ubktLS29vb0xMTFlZWVxcXFBQUGRkZE5OTqWlpbS0tLa1tU9PT01OTU1NTZSUlJOTk6Sjo6WmpaSkpLOzs2VlZaenp5GSkXBwcO/v7wAAAAAAAAAAAAAAAAAAACH5BAEAABoALAAAAAANAA0AAAU7IPQQZFkm12EAbNsW1pQNdG0zWq7vfM9HBIFwOEwoVK5kAaEYBJ7Q6MJHreYwQSLRIWmski8ExRktV0IAOw==);
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
#chmenu ul {
|
||||||
|
top: 20px;
|
||||||
|
margin: 0;
|
||||||
|
list-style: none;
|
||||||
|
padding: 0;
|
||||||
|
position: absolute;
|
||||||
|
width: 275px;
|
||||||
|
}
|
||||||
|
#chmenu ul li {
|
||||||
|
font: 14px;
|
||||||
|
margin-right: -4px;
|
||||||
|
position: relative;
|
||||||
|
padding: 5px 20px;
|
||||||
|
cursor: pointer;
|
||||||
|
background: #555;
|
||||||
|
display: block;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
#chmenu ul li:hover { background: #666; }
|
||||||
|
.center { text-align: center; }
|
||||||
|
.float-left { float: left; }
|
||||||
|
.float-right { float: right; }
|
||||||
|
.vertical-bottom { vertical-align: bottom; }
|
||||||
|
.vertical-middle { vertical-align: middle; }
|
||||||
|
.vertical-top { vertical-align: top; }
|
||||||
|
.clear { clear: both; }
|
||||||
|
.red { color: red; }
|
||||||
|
.red a { color: red; font-weight: bold; text-decoration: none; }
|
||||||
|
.red a:hover { text-decoration: underline; }
|
||||||
|
|
||||||
|
/* Postit */
|
||||||
|
.PIApostit {
|
||||||
|
/*color: #333;
|
||||||
|
min-width:130px;
|
||||||
|
min-height:150px;*/
|
||||||
|
padding:4px;
|
||||||
|
font-size:85%;
|
||||||
|
position:absolute;
|
||||||
|
display: none;
|
||||||
|
z-index: 9995;
|
||||||
|
|
||||||
|
background: -moz-linear-gradient(top, rgba(255,255,255,0.46) 0%, rgba(255,255,255,0) 100%);
|
||||||
|
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,0.46)), color-stop(100%,rgba(255,255,255,0)));
|
||||||
|
background: -webkit-linear-gradient(top, rgba(255,255,255,0.46) 0%,rgba(255,255,255,0) 100%);
|
||||||
|
background: -o-linear-gradient(top, rgba(255,255,255,0.46) 0%,rgba(255,255,255,0) 100%);
|
||||||
|
background: -ms-linear-gradient(top, rgba(255,255,255,0.46) 0%,rgba(255,255,255,0) 100%);
|
||||||
|
background: linear-gradient(to bottom, rgba(255,255,255,0.46) 0%,rgba(255,255,255,0) 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#75ffffff', endColorstr='#00ffffff',GradientType=0 );
|
||||||
|
|
||||||
|
}
|
||||||
|
.PIAicon {
|
||||||
|
cursor: pointer;
|
||||||
|
float: left;
|
||||||
|
width:20px;
|
||||||
|
height:20px;
|
||||||
|
background-position: center;
|
||||||
|
margin-right: 2px;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
/*background-color: #ffd;
|
||||||
|
-webkit-border-radius: 4px 4px 4px 4px;
|
||||||
|
-moz-border-radius: 4px 4px 4px 4px;
|
||||||
|
border-radius: 4px 4px 4px 4px;
|
||||||
|
border: 1px solid #bbb;*/
|
||||||
|
}
|
||||||
|
.PIApostit div.PIAtoolbar {
|
||||||
|
text-align:left;
|
||||||
|
cursor: move;
|
||||||
|
padding-bottom: 5px;
|
||||||
|
height: 16px;
|
||||||
|
color: #888;
|
||||||
|
}
|
||||||
|
.PIApostit div.PIAeditable {
|
||||||
|
clear: both;
|
||||||
|
cursor:pointer;
|
||||||
|
position:relative;
|
||||||
|
min-height:50px;
|
||||||
|
}
|
||||||
|
/** xxx **/
|
||||||
|
.PIAeditable > input, .PIAeditable > textarea, .PIAeditable[contenteditable="true"], .PIAeditable > select {
|
||||||
|
border: 0px;
|
||||||
|
background-color: transparent;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.PIApostit div.PIAeditable:focus {
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
.PIApostit div.PIAcontent {
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui-resizable-helper { border: 1px dotted gray; }
|
||||||
|
|
||||||
|
/* FLIP-CARD */
|
||||||
|
.panel {
|
||||||
|
float: left;
|
||||||
|
|
||||||
|
border:1px solid gray;
|
||||||
|
-moz-box-shadow:4px 4px 4px #999999;
|
||||||
|
-webkit-box-shadow:4px 4px 4px #999999;
|
||||||
|
box-shadow:4px 4px 4px #999999;
|
||||||
|
|
||||||
|
-webkit-perspective: 600px;
|
||||||
|
-moz-perspective: 600px;
|
||||||
|
|
||||||
|
-webkit-border-radius: 3px;
|
||||||
|
border-radius: 3px;
|
||||||
|
|
||||||
|
}
|
||||||
|
/* -- make sure to declare a default for every property that you want animated -- */
|
||||||
|
/* -- general styles, including Y axis rotation -- */
|
||||||
|
.panel .front {
|
||||||
|
float: none;
|
||||||
|
position: absolute;
|
||||||
|
top: 5px;
|
||||||
|
|
||||||
|
width: 99%;
|
||||||
|
height: 99%;
|
||||||
|
|
||||||
|
-moz-transform: rotateX(0deg) rotateY(0deg); /* FF3.5/3.6 */
|
||||||
|
-o-transform: rotateX(0deg) rotateY(0deg); /* Opera 10.5 */
|
||||||
|
-webkit-transform: rotateX(0deg) rotateY(0deg); /* Saf3.1+ */
|
||||||
|
transform: rotateX(0deg) rotateY(0deg); /* Newer browsers (incl IE9) */
|
||||||
|
/*filter: progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=0.7071067811865476, M12=-0.7071067811865475, M21=0.7071067811865475, M22=0.7071067811865476); /* IE6,IE7 */
|
||||||
|
/*-ms-filter: "progid:DXImageTransform.Microsoft.Matrix(SizingMethod='auto expand', M11=0.7071067811865476, M12=-0.7071067811865475, M21=0.7071067811865475, M22=0.7071067811865476)"; /* IE8 */
|
||||||
|
|
||||||
|
-webkit-transform-style: preserve-3d;
|
||||||
|
-webkit-backface-visibility: hidden;
|
||||||
|
-moz-transform-style: preserve-3d;
|
||||||
|
-moz-backface-visibility: hidden;
|
||||||
|
-o-transform-style: preserve-3d;
|
||||||
|
-o-backface-visibility: hidden;
|
||||||
|
transform-style: preserve-3d;
|
||||||
|
backface-visibility: hidden;
|
||||||
|
|
||||||
|
/* -- transition is the magic sauce for animation -- */
|
||||||
|
-o-transition: all .4s ease-in-out;
|
||||||
|
-ms-transition: all .4s ease-in-out;
|
||||||
|
-moz-transition: all .4s ease-in-out;
|
||||||
|
-webkit-transition: all .4s ease-in-out;
|
||||||
|
transition: all .4s ease-in-out;
|
||||||
|
}
|
||||||
|
|
465
sources/plugin/jquery.postitall.js
Normal file
465
sources/plugin/jquery.postitall.js
Normal file
|
@ -0,0 +1,465 @@
|
||||||
|
/**
|
||||||
|
* jquery.postitall.js specific to ChtickyNotes by chtixof
|
||||||
|
* written on the basis of jquery.postitall.js v0.1 - 2015
|
||||||
|
* Original notice:
|
||||||
|
* jQuery Post It All Plugin - released under MIT License
|
||||||
|
* Author: Javi Filella <txusko@gmail.com>
|
||||||
|
* http://github.com/txusko/PostItAll
|
||||||
|
* Copyright (c) 2013 Javi Filella
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person
|
||||||
|
* obtaining a copy of this software and associated documentation
|
||||||
|
* files (the "Software"), to deal in the Software without
|
||||||
|
* restriction, including without limitation the rights to use,
|
||||||
|
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the
|
||||||
|
* Software is furnished to do so, subject to the following
|
||||||
|
* conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||||
|
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||||
|
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
* OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function ($) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
// Global Vars
|
||||||
|
var options;
|
||||||
|
var nextid = -1;
|
||||||
|
var zindex=9995;
|
||||||
|
var tobesaved=false;
|
||||||
|
var cssidsave="";
|
||||||
|
var actson;
|
||||||
|
|
||||||
|
// for css color settings
|
||||||
|
function rgb2hex(rgb) {
|
||||||
|
if (/^#[0-9A-F]{6}$/i.test(rgb)) return rgb;
|
||||||
|
|
||||||
|
rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
|
||||||
|
function hex(x) {
|
||||||
|
return ("0" + parseInt(x).toString(16)).slice(-2);
|
||||||
|
}
|
||||||
|
return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// actions in case of any change
|
||||||
|
function settobesaved() {
|
||||||
|
tobesaved=true;
|
||||||
|
if(cssidsave!=="") {
|
||||||
|
$(cssidsave).css("display", "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// menu items to select color
|
||||||
|
function selcolor(idli,idinput,label,cssatt,optvar){
|
||||||
|
$(idli).html("");
|
||||||
|
$(idli).append($('<label />',{'for': idinput}).html(label+' '))
|
||||||
|
.append($('<input />', {
|
||||||
|
'class': 'minicolors',
|
||||||
|
'id': idinput,
|
||||||
|
'type': 'text',
|
||||||
|
'value': rgb2hex($(actson).css(cssatt)),
|
||||||
|
'width': '75px'
|
||||||
|
}));
|
||||||
|
$('#'+idinput).minicolors({
|
||||||
|
change: function (hex) {
|
||||||
|
$(actson).css(cssatt, hex);
|
||||||
|
$(actson).data('PIA-options')[optvar]=hex;
|
||||||
|
settobesaved();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// displays option menu
|
||||||
|
function chopt(e) {
|
||||||
|
//right position
|
||||||
|
$('#chmenu').css('left',$(this).offset().left);
|
||||||
|
$('#chmenu').css('top',$(this).offset().top);
|
||||||
|
//what note menu acts on
|
||||||
|
actson = $(this).parent().parent().parent();
|
||||||
|
//set bgcolor
|
||||||
|
selcolor('#chbg', 'minicolors_bg', 'Background-color','background-color','backgroundcolor');
|
||||||
|
//set text color
|
||||||
|
selcolor('#chco', 'minicolors_tx', 'Text-color','color','textcolor');
|
||||||
|
//set hide/show date
|
||||||
|
$('#chda').html(actson.data('PIA-options').showdate ? 'Hide the date' : 'Display the date');
|
||||||
|
//show
|
||||||
|
$('#chmenu').show();
|
||||||
|
}
|
||||||
|
|
||||||
|
// action menu delete
|
||||||
|
function chdelete(e) {
|
||||||
|
$('#chmenu').hide();
|
||||||
|
destroy($(actson));
|
||||||
|
e.preventDefault();
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// action menu clone
|
||||||
|
function chclone(e) {
|
||||||
|
var options = $.extend({},$(actson).data('PIA-options'));
|
||||||
|
$('#chmenu').hide();
|
||||||
|
options.posX=(parseInt(options.posX)+50)+"px";
|
||||||
|
options.posY=(parseInt(options.posY)-50)+"px";
|
||||||
|
delete options.id;
|
||||||
|
delete options.date;
|
||||||
|
$('#addanote_result').postitall(options);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
// action menu display date
|
||||||
|
function chdate(e) {
|
||||||
|
$('#chmenu').hide();
|
||||||
|
actson.data('PIA-options').showdate = !actson.data('PIA-options').showdate ;
|
||||||
|
if (actson.data('PIA-options').showdate) {
|
||||||
|
$(".PIAdate",actson).show();
|
||||||
|
} else {
|
||||||
|
$(".PIAdate",actson).hide();
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Destroy object
|
||||||
|
function destroy(obj) {
|
||||||
|
var id = obj.data('PIA-id');
|
||||||
|
options = obj.data('PIA-options');
|
||||||
|
//Destroy object
|
||||||
|
obj
|
||||||
|
.removeData('PIA-id')
|
||||||
|
.removeData('PIA-settings')
|
||||||
|
.hide("slow", function () {
|
||||||
|
$(this).remove();
|
||||||
|
});
|
||||||
|
settobesaved();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Autoresize postit
|
||||||
|
function autoresize(obj) {
|
||||||
|
var id = obj.data('PIA-id');
|
||||||
|
options = obj.data('PIA-options');
|
||||||
|
if (options.autoheight) {
|
||||||
|
var posY = $('#idPostIt_' + id).parent().css('left'),
|
||||||
|
posX = $('#idPostIt_' + id).parent().css('top'),
|
||||||
|
divWidth = $('#idPostIt_' + id).width(),
|
||||||
|
divHeight = $('#idPostIt_' + id).find('.PIAeditable').height(),
|
||||||
|
minDivHeight = options.minHeight;
|
||||||
|
if (divHeight >= minDivHeight) {
|
||||||
|
divHeight += 50;
|
||||||
|
options.height = divHeight;
|
||||||
|
obj.css('height', divHeight);
|
||||||
|
if ($.ui) {
|
||||||
|
if (options.resizable) {
|
||||||
|
obj.resizable({
|
||||||
|
minHeight: divHeight
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (divHeight < minDivHeight) {
|
||||||
|
options.height = minDivHeight;
|
||||||
|
minDivHeight += 50;
|
||||||
|
obj.css('height', minDivHeight);
|
||||||
|
}
|
||||||
|
options.posY = posY;
|
||||||
|
options.posX = posX;
|
||||||
|
options.width = divWidth;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set options
|
||||||
|
function setOptions(opt, save) {
|
||||||
|
if (typeof opt !== 'object') {
|
||||||
|
opt = {};
|
||||||
|
}
|
||||||
|
if (save === undefined) {
|
||||||
|
save = false;
|
||||||
|
}
|
||||||
|
options = $.extend(options, opt);
|
||||||
|
/*jslint unparam: true*/
|
||||||
|
$.each(['onChange', 'onSelect', 'onRelease', 'onDblClick'], function (i, e) {
|
||||||
|
if (typeof options[e] !== 'function') {
|
||||||
|
options[e] = function () { return undefined; };
|
||||||
|
}
|
||||||
|
});
|
||||||
|
/*jslint unparam: false*/
|
||||||
|
if (save) {
|
||||||
|
settobesaved();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Create a postit
|
||||||
|
function create(obj, options) {
|
||||||
|
|
||||||
|
obj.data('PIA-id', nextid)
|
||||||
|
.data('PIA-options', options);
|
||||||
|
//Postit editable content
|
||||||
|
if (options.description === "") {
|
||||||
|
if (obj.html() !== "") {
|
||||||
|
options.description = obj.html();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Front page: toolbar
|
||||||
|
var barCursor = "cursor: inherit;";
|
||||||
|
if (options.draggable) {
|
||||||
|
barCursor = "cursor: move;";
|
||||||
|
}
|
||||||
|
var toolbar = $('<div />', {
|
||||||
|
'id': 'pia_toolbar_' + nextid.toString(),
|
||||||
|
'class': 'PIAtoolbar',
|
||||||
|
'style': barCursor
|
||||||
|
});
|
||||||
|
//Drag support without jQuery UI
|
||||||
|
if (!$.ui) {
|
||||||
|
if (options.draggable) {
|
||||||
|
toolbar.drags();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
toolbar.html('<span class="PIAdate">'+options.date+'</span><span class="PIAtitle"></span>');
|
||||||
|
|
||||||
|
//Menu icon
|
||||||
|
toolbar.append($('<div />', {'class': 'PIAchopt PIAicon'}).click(chopt));
|
||||||
|
//Front page: content
|
||||||
|
var content = $('<div />', {
|
||||||
|
'id': 'pia_editable_' + nextid.toString(),
|
||||||
|
'class': 'PIAeditable PIAcontent'
|
||||||
|
}).change(function () {
|
||||||
|
options.description = $(this).html();
|
||||||
|
obj.data('PIA-options', options);
|
||||||
|
autoresize(obj);
|
||||||
|
settobesaved();
|
||||||
|
}).attr('contenteditable', true).html(options.description);
|
||||||
|
|
||||||
|
//Create postit
|
||||||
|
var postit = $('<div />', { 'id': 'idPostIt_' + nextid.toString(), 'data-id': nextid })
|
||||||
|
.append(toolbar).append(content);
|
||||||
|
//Convert relative position to prevent height and width in html layout
|
||||||
|
if (options.position === "relative") {
|
||||||
|
options.position = "absolute";
|
||||||
|
options.posX = obj.offset().top + parseInt(options.posX, 10) ;
|
||||||
|
options.posX += "px";
|
||||||
|
options.posY = obj.offset().left + parseInt(options.posY, 10) ;
|
||||||
|
options.posY += "px";
|
||||||
|
}
|
||||||
|
//Modify final Postit Object
|
||||||
|
obj.removeClass()
|
||||||
|
.addClass('block panel PIApostit')
|
||||||
|
.css('z-index', zindex++)
|
||||||
|
.css('position', options.position)
|
||||||
|
.css('left', options.posY)
|
||||||
|
.css('top', options.posX)
|
||||||
|
.css('width', options.width + 'px')
|
||||||
|
.css('height', (options.height + 30) + 'px') //Increase 30 pixels for the toolbar
|
||||||
|
.css('background-color', options.backgroundcolor)
|
||||||
|
.css('color', options.textcolor);
|
||||||
|
obj.html(postit)
|
||||||
|
.on('focus', '[contenteditable]', function () {
|
||||||
|
var objeto = $(this);
|
||||||
|
objeto.data('before', objeto.html());
|
||||||
|
return objeto;
|
||||||
|
}).on('blur keyup paste', '[contenteditable]', function () {
|
||||||
|
var objeto = $(this);
|
||||||
|
if (objeto.data('before') !== objeto.html()) {
|
||||||
|
objeto.data('before', objeto.html());
|
||||||
|
objeto.trigger('change');
|
||||||
|
}
|
||||||
|
return objeto;
|
||||||
|
}).click(function () {
|
||||||
|
$(this).css('z-index', zindex++);
|
||||||
|
settobesaved();
|
||||||
|
}).load(function () {
|
||||||
|
//Autoresize to fit content when content load is done
|
||||||
|
autoresize($(this));
|
||||||
|
});
|
||||||
|
if ($.ui) {
|
||||||
|
if (options.draggable) {
|
||||||
|
obj.draggable({
|
||||||
|
handle: ".PIAtoolbar",
|
||||||
|
scroll: false,
|
||||||
|
start: function () {
|
||||||
|
$(this).css('z-index', zindex++);
|
||||||
|
$(this).draggable('disable');
|
||||||
|
},
|
||||||
|
stop: function () {
|
||||||
|
$(this).draggable('enable');
|
||||||
|
autoresize($(this));
|
||||||
|
settobesaved();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (options.resizable) {
|
||||||
|
obj.resizable({
|
||||||
|
animate: false,
|
||||||
|
helper: 'ui-resizable-helper',
|
||||||
|
minHeight: options.minHeight,
|
||||||
|
minWidth: options.minWidth,
|
||||||
|
stop: function () {
|
||||||
|
autoresize($(this));
|
||||||
|
settobesaved();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
obj.slideDown('slow', function () {
|
||||||
|
});
|
||||||
|
settobesaved();
|
||||||
|
//chaining
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize elements
|
||||||
|
function init(obj, opt) {
|
||||||
|
if (++nextid===0) {
|
||||||
|
obj.append($('<div />', { 'id' : 'chmenu'}).mouseleave(function(){$(this).hide();})
|
||||||
|
.append($('<ul/>')
|
||||||
|
.append($('<li/>',{'id': 'chbg'}))
|
||||||
|
.append($('<li/>',{'id': 'chco'}))
|
||||||
|
.append($('<li/>',{'id': 'chda'}).click(chdate))
|
||||||
|
.append($('<li/>').click(chclone).append('Clone'))
|
||||||
|
.append($('<li/>').click(chdelete).append('Delete'))
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
//Default options
|
||||||
|
options = $.extend({}, $.fn.postitall.defaults);
|
||||||
|
options.id=nextid;
|
||||||
|
options.date= (new Date ()).toLocaleDateString () +'<br>'+ (new Date ()).toLocaleTimeString();
|
||||||
|
|
||||||
|
//Set options
|
||||||
|
if (typeof opt !== 'object') {
|
||||||
|
opt = {};
|
||||||
|
}
|
||||||
|
setOptions(opt);
|
||||||
|
|
||||||
|
var PIAcontent = $('<div />', { 'id' : 'newPostIt_' + nextid });
|
||||||
|
obj.append(PIAcontent);
|
||||||
|
return create(PIAcontent, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
// PLUGIN Public methods
|
||||||
|
$.extend($.fn, {
|
||||||
|
postitall: function (method, data) {
|
||||||
|
//Debugging
|
||||||
|
var debugging = true; // or true
|
||||||
|
if (typeof console === "undefined") {
|
||||||
|
console = {
|
||||||
|
log: function () { return undefined; }
|
||||||
|
};
|
||||||
|
} else if (!debugging || console.log === undefined) {
|
||||||
|
console.log = function () { return undefined; };
|
||||||
|
}
|
||||||
|
switch (method) {
|
||||||
|
// Destroy the control
|
||||||
|
case 'destroy':
|
||||||
|
$(this).each(function () {
|
||||||
|
destroy($(this));
|
||||||
|
});
|
||||||
|
return $(this);
|
||||||
|
// Get/set options on the fly
|
||||||
|
case 'options':
|
||||||
|
if (data === undefined) {
|
||||||
|
return $(this).data('PIA-options');
|
||||||
|
}
|
||||||
|
// Setter
|
||||||
|
$(this).each(function () {
|
||||||
|
options = $(this).data('PIA-options') || {};
|
||||||
|
destroy($(this));
|
||||||
|
$(this).postitall($.extend(true, options, data));
|
||||||
|
});
|
||||||
|
return $(this);
|
||||||
|
case 'isittosave':
|
||||||
|
var answer=tobesaved;
|
||||||
|
tobesaved=false;
|
||||||
|
if (data !== undefined) {
|
||||||
|
cssidsave=data;
|
||||||
|
}
|
||||||
|
return (answer);
|
||||||
|
// Initializes the control
|
||||||
|
default:
|
||||||
|
//case 'create' :
|
||||||
|
if (method !== 'create') {
|
||||||
|
data = method;
|
||||||
|
}
|
||||||
|
$(this).each(function () {
|
||||||
|
init($(this), data);
|
||||||
|
});
|
||||||
|
return $(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Default Plugin Vars
|
||||||
|
$.fn.postitall.defaults = {
|
||||||
|
// Basic Settings
|
||||||
|
showdate : true,
|
||||||
|
backgroundcolor : '#FFFC7F', //Background color
|
||||||
|
textcolor : '#333333', //Text color
|
||||||
|
position : 'absolute', //Position absolute or relative
|
||||||
|
posX : '50px', //top position
|
||||||
|
posY : '15px', //left position
|
||||||
|
height : 180, //height
|
||||||
|
width : 200, //width
|
||||||
|
minHeight : 152, //resizable min-width
|
||||||
|
minWidth : 131, //resizable min-height
|
||||||
|
description : '', //content
|
||||||
|
title : '',
|
||||||
|
autoheight : true, //Set autoheight feature on or off
|
||||||
|
draggable : true, //Set draggable feature on or off
|
||||||
|
resizable : true, //Set resizable feature on or off
|
||||||
|
removable : true, //Set removable feature on or off
|
||||||
|
// Callbacks / Event Handlers
|
||||||
|
onChange: function () { return undefined; },
|
||||||
|
onSelect: function () { return undefined; },
|
||||||
|
onDblClick: function () { return undefined; },
|
||||||
|
onRelease: function () { return undefined; }
|
||||||
|
};
|
||||||
|
|
||||||
|
//Drag postits
|
||||||
|
//used if jQuery UI is not loaded
|
||||||
|
$.fn.drags = function (opt) {
|
||||||
|
|
||||||
|
opt = $.extend({handle: "", cursor: "move"}, opt);
|
||||||
|
|
||||||
|
var $el = this;
|
||||||
|
if (opt.handle !== "") {
|
||||||
|
$el = this.find(opt.handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $el.css('cursor', opt.cursor).on("mousedown", function (e) {
|
||||||
|
var $drag;
|
||||||
|
if (opt.handle === "") {
|
||||||
|
$drag = $(this).parent().parent().parent().addClass('draggable');
|
||||||
|
} else {
|
||||||
|
$drag = $(this).parent().parent().parent().addClass('active-handle').parent().addClass('draggable');
|
||||||
|
}
|
||||||
|
var z_idx = $drag.css('z-index'),
|
||||||
|
drg_h = $drag.outerHeight(),
|
||||||
|
drg_w = $drag.outerWidth(),
|
||||||
|
pos_y = $drag.offset().top + drg_h - e.pageY,
|
||||||
|
pos_x = $drag.offset().left + drg_w - e.pageX;
|
||||||
|
$drag.css('z-index', 1000000).parents().on("mousemove", function (e) {
|
||||||
|
$('.draggable').offset({
|
||||||
|
top: e.pageY + pos_y - drg_h,
|
||||||
|
left: e.pageX + pos_x - drg_w
|
||||||
|
}).on("mouseup", function () {
|
||||||
|
$(this).removeClass('draggable').css('z-index', z_idx);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
e.preventDefault(); // disable selection
|
||||||
|
}).on("mouseup", function () {
|
||||||
|
if (opt.handle === "") {
|
||||||
|
$(this).removeClass('draggable');
|
||||||
|
} else {
|
||||||
|
$(this).removeClass('active-handle').parent().removeClass('draggable');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}(jQuery));
|
Loading…
Add table
Reference in a new issue