mirror of
https://codeberg.org/streams/streams.git
synced 2024-09-20 07:15:13 +00:00
Merge branch 'bootstrap'
This commit is contained in:
commit
031b9b7d77
14 changed files with 9001 additions and 5 deletions
|
@ -1142,6 +1142,8 @@ function status_editor($a,$x,$popup=false) {
|
|||
'$feature_encrypt' => ((feature_enabled($x['profile_uid'],'content_encrypt') && (! $webpage)) ? 'block' : 'none'),
|
||||
'$encrypt' => t('Encrypt text'),
|
||||
'$cipher' => $cipher,
|
||||
'$expiryModalOK' => t('OK'),
|
||||
'$expiryModalCANCEL' => t('Cancel'),
|
||||
));
|
||||
|
||||
|
||||
|
|
275
js/_crypto.js
Normal file
275
js/_crypto.js
Normal file
|
@ -0,0 +1,275 @@
|
|||
|
||||
|
||||
function str_rot13 (str) {
|
||||
// http://kevin.vanzonneveld.net
|
||||
// + original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
|
||||
// + improved by: Ates Goral (http://magnetiq.com)
|
||||
// + bugfixed by: Onno Marsman
|
||||
// + improved by: Rafa? Kukawski (http://blog.kukawski.pl)
|
||||
// * example 1: str_rot13('Kevin van Zonneveld');
|
||||
// * returns 1: 'Xriva ina Mbaariryq'
|
||||
// * example 2: str_rot13('Xriva ina Mbaariryq');
|
||||
// * returns 2: 'Kevin van Zonneveld'
|
||||
// * example 3: str_rot13(33);
|
||||
// * returns 3: '33'
|
||||
return (str + '').replace(/[a-z]/gi, function (s) {
|
||||
return String.fromCharCode(s.charCodeAt(0) + (s.toLowerCase() < 'n' ? 13 : -13));
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
// We probably just want the element where the text is and find it ourself. e.g. if
|
||||
// there is highlighted text use it, otherwise use the entire text.
|
||||
// So the third element may be useless. Fix also in view/tpl/jot.tpl before
|
||||
// adding to all the editor templates and enabling the feature
|
||||
|
||||
// Should probably do some input sanitising and dealing with bbcode, hiding key text, and displaying
|
||||
// results in a lightbox and/or popup form are left as an exercise for the reader.
|
||||
|
||||
|
||||
function red_encrypt(alg, elem,text) {
|
||||
var enc_text = '';
|
||||
var newdiv = '';
|
||||
|
||||
if(typeof tinyMCE !== "undefined")
|
||||
tinyMCE.triggerSave(false,true);
|
||||
|
||||
var text = $(elem).val();
|
||||
|
||||
// key and hint need to be localised
|
||||
|
||||
var enc_key = bootbox.confirm("<form class='bootbox-form' id='encrypt' action=''>\
|
||||
<h4>Passphrase:</h4><input class='bootbox-input bootbox-input-text form-control' type='text' name='first_name'></input><br/>\
|
||||
<h4>Hint:</h4><input class='bootbox-input bootbox-input-text form-control' type='text' name='last_name'></input>\
|
||||
</form>",function(result){if(result)
|
||||
$('#encrypt').submit();});
|
||||
|
||||
// If you don't provide a key you get rot13, which doesn't need a key
|
||||
// but consequently isn't secure.
|
||||
|
||||
if(! enc_key)
|
||||
alg = 'rot13';
|
||||
|
||||
if((alg == 'rot13') || (alg == 'triple-rot13'))
|
||||
newdiv = "[crypt alg='rot13']" + str_rot13(text) + '[/crypt]';
|
||||
|
||||
if(alg == 'aes256') {
|
||||
|
||||
// This is the prompt we're going to use when the receiver tries to open it.
|
||||
// Maybe "Grandma's maiden name" or "our secret place" or something.
|
||||
|
||||
var enc_hint = bootbox.prompt(aStr['passhint'],function(result){return true;});
|
||||
|
||||
enc_text = CryptoJS.AES.encrypt(text,enc_key);
|
||||
|
||||
encrypted = enc_text.toString();
|
||||
|
||||
newdiv = "[crypt alg='aes256' hint='" + enc_hint + "']" + encrypted + '[/crypt]';
|
||||
}
|
||||
if(alg == 'rabbit') {
|
||||
|
||||
// This is the prompt we're going to use when the receiver tries to open it.
|
||||
// Maybe "Grandma's maiden name" or "our secret place" or something.
|
||||
|
||||
var enc_hint = bootbox.prompt(aStr['passhint']);
|
||||
|
||||
enc_text = CryptoJS.Rabbit.encrypt(text,enc_key);
|
||||
encrypted = enc_text.toString();
|
||||
|
||||
newdiv = "[crypt alg='rabbit' hint='" + enc_hint + "']" + encrypted + '[/crypt]';
|
||||
}
|
||||
if(alg == '3des') {
|
||||
|
||||
// This is the prompt we're going to use when the receiver tries to open it.
|
||||
// Maybe "Grandma's maiden name" or "our secret place" or something.
|
||||
|
||||
var enc_hint = bootbox.prompt(aStr['passhint']);
|
||||
|
||||
enc_text = CryptoJS.TripleDES.encrypt(text,enc_key);
|
||||
encrypted = enc_text.toString();
|
||||
|
||||
newdiv = "[crypt alg='3des' hint='" + enc_hint + "']" + encrypted + '[/crypt]';
|
||||
}
|
||||
|
||||
enc_key = '';
|
||||
|
||||
// alert(newdiv);
|
||||
|
||||
// This might be a comment box on a page with a tinymce editor
|
||||
// so check if there is a tinymce editor but also check the display
|
||||
// property of our source element - because a tinymce instance
|
||||
// will have display "none". If a normal textarea such as in a comment
|
||||
// box has display "none" you wouldn't be able to type in it.
|
||||
|
||||
if($(elem).css('display') == 'none' && typeof tinyMCE !== "undefined") {
|
||||
tinyMCE.activeEditor.setContent(newdiv);
|
||||
}
|
||||
else {
|
||||
$(elem).val(newdiv);
|
||||
}
|
||||
|
||||
// textarea = document.getElementById(elem);
|
||||
// if (document.selection) {
|
||||
// textarea.focus();
|
||||
// selected = document.selection.createRange();
|
||||
// selected.text = newdiv;
|
||||
// } else if (textarea.selectionStart || textarea.selectionStart == "0") {
|
||||
// var start = textarea.selectionStart;
|
||||
// var end = textarea.selectionEnd;
|
||||
// textarea.value = textarea.value.substring(0, start) + newdiv + textarea.value.substring(end, textarea.value.length);
|
||||
// }
|
||||
}
|
||||
|
||||
function red_decrypt(alg,hint,text,elem) {
|
||||
|
||||
var enc_text = '';
|
||||
|
||||
if(alg == 'rot13' || alg == 'triple-rot13')
|
||||
enc_text = str_rot13(text);
|
||||
|
||||
if(alg == 'aes256') {
|
||||
var enc_key = prompt((hint.length) ? hint : aStr['passphrase']);
|
||||
enc_text = CryptoJS.AES.decrypt(text,enc_key);
|
||||
}
|
||||
if(alg == 'rabbit') {
|
||||
var enc_key = prompt((hint.length) ? hint : aStr['passphrase']);
|
||||
enc_text = CryptoJS.Rabbit.decrypt(text,enc_key);
|
||||
}
|
||||
if(alg == '3des') {
|
||||
var enc_key = prompt((hint.length) ? hint : aStr['passphrase']);
|
||||
enc_text = CryptoJS.TripleDES.decrypt(text,enc_key);
|
||||
}
|
||||
|
||||
enc_key = '';
|
||||
|
||||
// Not sure whether to drop this back in the conversation display.
|
||||
// It probably needs a lightbox or popup window because any conversation
|
||||
// updates could
|
||||
// wipe out the text and make you re-enter the key if it was in the
|
||||
// conversation. For now we do that so you can read it.
|
||||
|
||||
var enc_result = enc_text.toString(CryptoJS.enc.Utf8);
|
||||
delete enc_text;
|
||||
|
||||
// incorrect decryptions *usually* but don't always have zero length
|
||||
// If the person typo'd let them try again without reloading the page
|
||||
// otherwise they'll have no "padlock" to click to try again.
|
||||
|
||||
if(enc_result.length) {
|
||||
$(elem).html(b2h(enc_result));
|
||||
enc_result = '';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function base64_encode (data) {
|
||||
// http://kevin.vanzonneveld.net
|
||||
// + original by: Tyler Akins (http://rumkin.com)
|
||||
// + improved by: Bayron Guevara
|
||||
// + improved by: Thunder.m
|
||||
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
|
||||
// + bugfixed by: Pellentesque Malesuada
|
||||
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
|
||||
// + improved by: Rafa? Kukawski (http://kukawski.pl)
|
||||
// * example 1: base64_encode('Kevin van Zonneveld');
|
||||
// * returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA=='
|
||||
// mozilla has this native
|
||||
// - but breaks in 2.0.0.12!
|
||||
//if (typeof this.window['btoa'] === 'function') {
|
||||
// return btoa(data);
|
||||
//}
|
||||
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
|
||||
var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
|
||||
ac = 0,
|
||||
enc = "",
|
||||
tmp_arr = [];
|
||||
|
||||
if (!data) {
|
||||
return data;
|
||||
}
|
||||
|
||||
do { // pack three octets into four hexets
|
||||
o1 = data.charCodeAt(i++);
|
||||
o2 = data.charCodeAt(i++);
|
||||
o3 = data.charCodeAt(i++);
|
||||
|
||||
bits = o1 << 16 | o2 << 8 | o3;
|
||||
|
||||
h1 = bits >> 18 & 0x3f;
|
||||
h2 = bits >> 12 & 0x3f;
|
||||
h3 = bits >> 6 & 0x3f;
|
||||
h4 = bits & 0x3f;
|
||||
|
||||
// use hexets to index into b64, and append result to encoded string
|
||||
tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
|
||||
} while (i < data.length);
|
||||
|
||||
enc = tmp_arr.join('');
|
||||
|
||||
var r = data.length % 3;
|
||||
|
||||
return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3);
|
||||
|
||||
}
|
||||
|
||||
|
||||
function base64_decode (data) {
|
||||
// http://kevin.vanzonneveld.net
|
||||
// + original by: Tyler Akins (http://rumkin.com)
|
||||
// + improved by: Thunder.m
|
||||
// + input by: Aman Gupta
|
||||
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
|
||||
// + bugfixed by: Onno Marsman
|
||||
// + bugfixed by: Pellentesque Malesuada
|
||||
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
|
||||
// + input by: Brett Zamir (http://brett-zamir.me)
|
||||
// + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
|
||||
// * example 1: base64_decode('S2V2aW4gdmFuIFpvbm5ldmVsZA==');
|
||||
// * returns 1: 'Kevin van Zonneveld'
|
||||
// mozilla has this native
|
||||
// - but breaks in 2.0.0.12!
|
||||
//if (typeof this.window['atob'] === 'function') {
|
||||
// return atob(data);
|
||||
//}
|
||||
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
|
||||
var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
|
||||
ac = 0,
|
||||
dec = "",
|
||||
tmp_arr = [];
|
||||
|
||||
if (!data) {
|
||||
return data;
|
||||
}
|
||||
|
||||
data += '';
|
||||
|
||||
do { // unpack four hexets into three octets using index points in b64
|
||||
h1 = b64.indexOf(data.charAt(i++));
|
||||
h2 = b64.indexOf(data.charAt(i++));
|
||||
h3 = b64.indexOf(data.charAt(i++));
|
||||
h4 = b64.indexOf(data.charAt(i++));
|
||||
|
||||
bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
|
||||
|
||||
o1 = bits >> 16 & 0xff;
|
||||
o2 = bits >> 8 & 0xff;
|
||||
o3 = bits & 0xff;
|
||||
|
||||
if (h3 == 64) {
|
||||
tmp_arr[ac++] = String.fromCharCode(o1);
|
||||
} else if (h4 == 64) {
|
||||
tmp_arr[ac++] = String.fromCharCode(o1, o2);
|
||||
} else {
|
||||
tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
|
||||
}
|
||||
} while (i < data.length);
|
||||
|
||||
dec = tmp_arr.join('');
|
||||
|
||||
return dec;
|
||||
}
|
||||
|
||||
|
1219
js/_main.js
Normal file
1219
js/_main.js
Normal file
File diff suppressed because it is too large
Load diff
174
library/bootstrap-datetimepicker/css/bootstrap-datetimepicker.css
vendored
Executable file
174
library/bootstrap-datetimepicker/css/bootstrap-datetimepicker.css
vendored
Executable file
|
@ -0,0 +1,174 @@
|
|||
/**
|
||||
* Build file for the dist version of datetimepicker.css
|
||||
*/
|
||||
/*!
|
||||
* Datetimepicker for Bootstrap v3
|
||||
* https://github.com/Eonasdan/bootstrap-datetimepicker/
|
||||
* Copyright 2012 Stefan Petre
|
||||
* Licensed under the Apache License v2.0
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
*/
|
||||
.bootstrap-datetimepicker-widget {
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 250px;
|
||||
padding: 4px;
|
||||
margin-top: 1px;
|
||||
z-index: 9999;
|
||||
border-radius: 4px;
|
||||
/*.dow {
|
||||
border-top: 1px solid #ddd !important;
|
||||
}*/
|
||||
}
|
||||
.bootstrap-datetimepicker-widget .btn {
|
||||
padding: 6px;
|
||||
}
|
||||
.bootstrap-datetimepicker-widget:before {
|
||||
content: '';
|
||||
display: inline-block;
|
||||
border-left: 7px solid transparent;
|
||||
border-right: 7px solid transparent;
|
||||
border-bottom: 7px solid #ccc;
|
||||
border-bottom-color: rgba(0, 0, 0, 0.2);
|
||||
position: absolute;
|
||||
top: -7px;
|
||||
left: 6px;
|
||||
}
|
||||
.bootstrap-datetimepicker-widget:after {
|
||||
content: '';
|
||||
display: inline-block;
|
||||
border-left: 6px solid transparent;
|
||||
border-right: 6px solid transparent;
|
||||
border-bottom: 6px solid white;
|
||||
position: absolute;
|
||||
top: -6px;
|
||||
left: 7px;
|
||||
}
|
||||
.bootstrap-datetimepicker-widget.pull-right:before {
|
||||
left: auto;
|
||||
right: 6px;
|
||||
}
|
||||
.bootstrap-datetimepicker-widget.pull-right:after {
|
||||
left: auto;
|
||||
right: 7px;
|
||||
}
|
||||
.bootstrap-datetimepicker-widget > ul {
|
||||
list-style-type: none;
|
||||
margin: 0;
|
||||
}
|
||||
.bootstrap-datetimepicker-widget .timepicker-hour,
|
||||
.bootstrap-datetimepicker-widget .timepicker-minute,
|
||||
.bootstrap-datetimepicker-widget .timepicker-second {
|
||||
width: 100%;
|
||||
font-weight: bold;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
.bootstrap-datetimepicker-widget table[data-hour-format="12"] .separator {
|
||||
width: 4px;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
.bootstrap-datetimepicker-widget .datepicker > div {
|
||||
display: none;
|
||||
}
|
||||
.bootstrap-datetimepicker-widget .picker-switch {
|
||||
text-align: center;
|
||||
}
|
||||
.bootstrap-datetimepicker-widget table {
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
}
|
||||
.bootstrap-datetimepicker-widget td,
|
||||
.bootstrap-datetimepicker-widget th {
|
||||
text-align: center;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.bootstrap-datetimepicker-widget td.day:hover,
|
||||
.bootstrap-datetimepicker-widget td.hour:hover,
|
||||
.bootstrap-datetimepicker-widget td.minute:hover,
|
||||
.bootstrap-datetimepicker-widget td.second:hover {
|
||||
background: #eeeeee;
|
||||
cursor: pointer;
|
||||
}
|
||||
.bootstrap-datetimepicker-widget td.old,
|
||||
.bootstrap-datetimepicker-widget td.new {
|
||||
color: #999999;
|
||||
}
|
||||
.bootstrap-datetimepicker-widget td.active,
|
||||
.bootstrap-datetimepicker-widget td.active:hover {
|
||||
background-color: #428bca;
|
||||
color: #fff;
|
||||
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
.bootstrap-datetimepicker-widget td.disabled,
|
||||
.bootstrap-datetimepicker-widget td.disabled:hover {
|
||||
background: none;
|
||||
color: #999999;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
.bootstrap-datetimepicker-widget td span {
|
||||
display: block;
|
||||
width: 47px;
|
||||
height: 54px;
|
||||
line-height: 54px;
|
||||
float: left;
|
||||
margin: 2px;
|
||||
cursor: pointer;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.bootstrap-datetimepicker-widget td span:hover {
|
||||
background: #eeeeee;
|
||||
}
|
||||
.bootstrap-datetimepicker-widget td span.active {
|
||||
background-color: #428bca;
|
||||
color: #fff;
|
||||
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
.bootstrap-datetimepicker-widget td span.old {
|
||||
color: #999999;
|
||||
}
|
||||
.bootstrap-datetimepicker-widget td span.disabled,
|
||||
.bootstrap-datetimepicker-widget td span.disabled:hover {
|
||||
background: none;
|
||||
color: #999999;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
.bootstrap-datetimepicker-widget th.switch {
|
||||
width: 145px;
|
||||
}
|
||||
.bootstrap-datetimepicker-widget th.next,
|
||||
.bootstrap-datetimepicker-widget th.prev {
|
||||
font-size: 21px;
|
||||
}
|
||||
.bootstrap-datetimepicker-widget th.disabled,
|
||||
.bootstrap-datetimepicker-widget th.disabled:hover {
|
||||
background: none;
|
||||
color: #999999;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
.bootstrap-datetimepicker-widget thead tr:first-child th {
|
||||
cursor: pointer;
|
||||
}
|
||||
.bootstrap-datetimepicker-widget thead tr:first-child th:hover {
|
||||
background: #eeeeee;
|
||||
}
|
||||
.input-group.date .input-group-addon span {
|
||||
display: block;
|
||||
cursor: pointer;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
.bootstrap-datetimepicker-widget.left-oriented:before {
|
||||
left: auto;
|
||||
right: 6px;
|
||||
}
|
||||
.bootstrap-datetimepicker-widget.left-oriented:after {
|
||||
left: auto;
|
||||
right: 7px;
|
||||
}
|
||||
.bootstrap-datetimepicker-widget ul.list-unstyled li.in div.timepicker div.timepicker-picker table.table-condensed tbody > tr > td {
|
||||
padding: 0px !important;
|
||||
}
|
8
library/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css
vendored
Executable file
8
library/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css
vendored
Executable file
|
@ -0,0 +1,8 @@
|
|||
/*!
|
||||
* Datetimepicker for Bootstrap v3
|
||||
* https://github.com/Eonasdan/bootstrap-datetimepicker/
|
||||
* Copyright 2012 Stefan Petre
|
||||
* Licensed under the Apache License v2.0
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
*/.bootstrap-datetimepicker-widget{top:0;left:0;width:250px;padding:4px;margin-top:1px;z-index:9999;border-radius:4px}.bootstrap-datetimepicker-widget .btn{padding:6px}.bootstrap-datetimepicker-widget:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);position:absolute;top:-7px;left:6px}.bootstrap-datetimepicker-widget:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;top:-6px;left:7px}.bootstrap-datetimepicker-widget.pull-right:before{left:auto;right:6px}.bootstrap-datetimepicker-widget.pull-right:after{left:auto;right:7px}.bootstrap-datetimepicker-widget>ul{list-style-type:none;margin:0}.bootstrap-datetimepicker-widget .timepicker-hour,.bootstrap-datetimepicker-widget .timepicker-minute,.bootstrap-datetimepicker-widget .timepicker-second{width:100%;font-weight:bold;font-size:1.2em}.bootstrap-datetimepicker-widget table[data-hour-format="12"] .separator{width:4px;padding:0;margin:0}.bootstrap-datetimepicker-widget .datepicker>div{display:none}.bootstrap-datetimepicker-widget .picker-switch{text-align:center}.bootstrap-datetimepicker-widget table{width:100%;margin:0}.bootstrap-datetimepicker-widget td,.bootstrap-datetimepicker-widget th{text-align:center;width:20px;height:20px;border-radius:4px}.bootstrap-datetimepicker-widget td.day:hover,.bootstrap-datetimepicker-widget td.hour:hover,.bootstrap-datetimepicker-widget td.minute:hover,.bootstrap-datetimepicker-widget td.second:hover{background:#eee;cursor:pointer}.bootstrap-datetimepicker-widget td.old,.bootstrap-datetimepicker-widget td.new{color:#999}.bootstrap-datetimepicker-widget td.active,.bootstrap-datetimepicker-widget td.active:hover{background-color:#428bca;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.bootstrap-datetimepicker-widget td.disabled,.bootstrap-datetimepicker-widget td.disabled:hover{background:none;color:#999;cursor:not-allowed}.bootstrap-datetimepicker-widget td span{display:block;width:47px;height:54px;line-height:54px;float:left;margin:2px;cursor:pointer;border-radius:4px}.bootstrap-datetimepicker-widget td span:hover{background:#eee}.bootstrap-datetimepicker-widget td span.active{background-color:#428bca;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.bootstrap-datetimepicker-widget td span.old{color:#999}.bootstrap-datetimepicker-widget td span.disabled,.bootstrap-datetimepicker-widget td span.disabled:hover{background:none;color:#999;cursor:not-allowed}.bootstrap-datetimepicker-widget th.switch{width:145px}.bootstrap-datetimepicker-widget th.next,.bootstrap-datetimepicker-widget th.prev{font-size:21px}.bootstrap-datetimepicker-widget th.disabled,.bootstrap-datetimepicker-widget th.disabled:hover{background:none;color:#999;cursor:not-allowed}.bootstrap-datetimepicker-widget thead tr:first-child th{cursor:pointer}.bootstrap-datetimepicker-widget thead tr:first-child th:hover{background:#eee}.input-group.date .input-group-addon span{display:block;cursor:pointer;width:16px;height:16px}.bootstrap-datetimepicker-widget.left-oriented:before{left:auto;right:6px}.bootstrap-datetimepicker-widget.left-oriented:after{left:auto;right:7px}.bootstrap-datetimepicker-widget ul.list-unstyled li.in div.timepicker div.timepicker-picker table.table-condensed tbody>tr>td{padding:0 !important}
|
28
library/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js
vendored
Executable file
28
library/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js
vendored
Executable file
File diff suppressed because one or more lines are too long
7063
library/bootstrap-datetimepicker/js/moment.js
Normal file
7063
library/bootstrap-datetimepicker/js/moment.js
Normal file
File diff suppressed because it is too large
Load diff
|
@ -132,6 +132,8 @@ function editpost_content(&$a) {
|
|||
'$expires' => t('Set expiration date'),
|
||||
'$feature_encrypt' => 'none',
|
||||
'$encrypt' => t('Encrypt text'),
|
||||
'$expiryModalOK' => t('OK'),
|
||||
'$expiryModalCANCEL' => t('Cancel'),
|
||||
));
|
||||
|
||||
return $o;
|
||||
|
|
|
@ -10,10 +10,15 @@ head_add_css('library/jgrowl/jquery.jgrowl.css');
|
|||
head_add_css('library/jslider/css/jslider.css');
|
||||
head_add_css('library/prettyphoto/css/prettyPhoto.css');
|
||||
head_add_css('library/colorbox/colorbox.css');
|
||||
|
||||
// head_add_css('library/font_awesome/css/font-awesome.min.css');
|
||||
head_add_css('view/css/conversation.css');
|
||||
head_add_css('view/css/bootstrap-red.css');
|
||||
head_add_css('view/css/widgets.css');
|
||||
<<<<<<< HEAD
|
||||
head_add_css('library/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css');
|
||||
=======
|
||||
>>>>>>> upstream/master
|
||||
|
||||
head_add_js('js/jquery.js');
|
||||
head_add_js('library/bootstrap/js/bootstrap.min.js');
|
||||
|
@ -43,7 +48,8 @@ head_add_js('library/jslider/bin/jquery.slider.min.js');
|
|||
head_add_js('docready.js');
|
||||
head_add_js('library/prettyphoto/js/jquery.prettyPhoto.js');
|
||||
head_add_js('library/colorbox/jquery.colorbox-min.js');
|
||||
|
||||
head_add_js('library/bootstrap-datetimepicker/js/moment.js');
|
||||
head_add_js('library/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js');
|
||||
/**
|
||||
* Those who require this feature will know what to do with it.
|
||||
* Those who don't, won't.
|
||||
|
|
118
view/tpl/_conv_item.tpl
Executable file
118
view/tpl/_conv_item.tpl
Executable file
|
@ -0,0 +1,118 @@
|
|||
{{if $item.comment_firstcollapsed}}
|
||||
<div class="hide-comments-outer">
|
||||
<span id="hide-comments-total-{{$item.id}}" class="hide-comments-total">{{$item.num_comments}}</span> <span id="hide-comments-{{$item.id}}" class="hide-comments fakelink" onclick="showHideComments({{$item.id}});">{{$item.hide_text}}</span>
|
||||
</div>
|
||||
<div id="collapsed-comments-{{$item.id}}" class="collapsed-comments" style="display: none;">
|
||||
{{/if}}
|
||||
<div id="thread-wrapper-{{$item.id}}" class="thread-wrapper {{$item.toplevel}}">
|
||||
<a name="{{$item.id}}" ></a>
|
||||
<div class="wall-item-outside-wrapper {{$item.indent}}{{$item.previewing}}{{if $item.owner_url}} wallwall{{/if}}" id="wall-item-outside-wrapper-{{$item.id}}" >
|
||||
<div class="wall-item-content-wrapper {{$item.indent}}" id="wall-item-content-wrapper-{{$item.id}}" >
|
||||
<div class="wall-item-info{{if $item.owner_url}} wallwall{{/if}}" id="wall-item-info-{{$item.id}}">
|
||||
{{if $item.owner_url}}
|
||||
<div class="wall-item-photo-wrapper wwto" id="wall-item-ownerphoto-wrapper-{{$item.id}}" >
|
||||
<a href="{{$item.owner_url}}" title="{{$item.olinktitle}}" class="wall-item-photo-link" id="wall-item-ownerphoto-link-{{$item.id}}">
|
||||
<img src="{{$item.owner_photo}}" class="wall-item-photo{{$item.osparkle}}" id="wall-item-ownerphoto-{{$item.id}}" style="height: 80px; width: 80px;" alt="{{$item.owner_name}}" /></a>
|
||||
</div>
|
||||
<div class="wall-item-arrowphoto-wrapper" ><img src="images/larrow.gif" alt="{{$item.wall}}" /></div>
|
||||
{{/if}}
|
||||
<div class="wall-item-photo-wrapper{{if $item.owner_url}} wwfrom{{/if}}" id="wall-item-photo-wrapper-{{$item.id}}"
|
||||
onmouseover="if (typeof t{{$item.id}} != 'undefined') clearTimeout(t{{$item.id}}); openMenu('wall-item-photo-menu-button-{{$item.id}}')"
|
||||
onmouseout="t{{$item.id}}=setTimeout('closeMenu(\'wall-item-photo-menu-button-{{$item.id}}\'); closeMenu(\'wall-item-photo-menu-{{$item.id}}\');',200)">
|
||||
<a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-photo-link" id="wall-item-photo-link-{{$item.id}}">
|
||||
<img src="{{$item.thumb}}" class="wall-item-photo{{$item.sparkle}}" id="wall-item-photo-{{$item.id}}" style="height: 80px; width: 80px;" alt="{{$item.name}}" /></a>
|
||||
<span onclick="openClose('wall-item-photo-menu-{{$item.id}}');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-{{$item.id}}">menu</span>
|
||||
<div class="wall-item-photo-menu" id="wall-item-photo-menu-{{$item.id}}">
|
||||
<ul>
|
||||
{{$item.item_photo_menu}}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="wall-item-photo-end"></div>
|
||||
<div class="wall-item-wrapper" id="wall-item-wrapper-{{$item.id}}" >
|
||||
{{if $item.lock}}<i class="wall-item-lock icon-lock lockview" title="{{$item.lock}}" onclick="lockview(event,{{$item.id}});" ></i>
|
||||
{{else}}<div class="wall-item-lock"></div>{{/if}}
|
||||
<div class="wall-item-location" id="wall-item-location-{{$item.id}}">{{$item.location}}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wall-item-author">
|
||||
<a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-name-link"><span class="wall-item-name{{$item.sparkle}}" id="wall-item-name-{{$item.id}}" >{{$item.name}}</span></a>{{if $item.owner_url}} {{$item.via}} <a href="{{$item.owner_url}}" title="{{$item.olinktitle}}" class="wall-item-name-link"><span class="wall-item-name{{$item.osparkle}}" id="wall-item-ownername-{{$item.id}}">{{$item.owner_name}}</span></a>{{/if}}<br />
|
||||
|
||||
<div class="wall-item-ago" id="wall-item-ago-{{$item.id}}">{{if $item.verified}}<i class="icon-ok" title="{{$item.verified}}"></i> {{/if}}<span class="autotime" title="{{$item.isotime}}">{{$item.localtime}}{{if $item.editedtime}} {{$item.editedtime}}{{/if}}</span>{{if $item.app}}<span class="item.app">{{$item.str_app}}</span>{{/if}}</div>
|
||||
</div>
|
||||
<div class="wall-item-content" id="wall-item-content-{{$item.id}}" >
|
||||
<div class="wall-item-title" id="wall-item-title-{{$item.id}}">{{$item.title}}</div>
|
||||
<div class="wall-item-title-end"></div>
|
||||
<div class="wall-item-body" id="wall-item-body-{{$item.id}}" >{{$item.body}}
|
||||
<div class="body-tag">
|
||||
{{foreach $item.tags as $tag}}
|
||||
<span class='tag'>{{$tag}}</span>
|
||||
{{/foreach}}
|
||||
</div>
|
||||
{{if $item.has_cats}}
|
||||
<div class="categorytags"><span>{{$item.txt_cats}} {{foreach $item.categories as $cat}}{{$cat.name}} <a href="{{$cat.removeurl}}" title="{{$remove}}">[{{$remove}}]</a> {{if $cat.last}}{{else}}, {{/if}}{{/foreach}}
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{if $item.has_folders}}
|
||||
<div class="filesavetags"><span>{{$item.txt_folders}} {{foreach $item.folders as $cat}}{{$cat.name}} <a href="{{$cat.removeurl}}" title="{{$remove}}">[{{$remove}}]</a> {{if $cat.last}}{{else}}, {{/if}}{{/foreach}}
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="wall-item-tools" id="wall-item-tools-{{$item.id}}">
|
||||
{{if $item.like}}
|
||||
<i class="icon-thumbs-up-alt item-tool" title="{{$item.like.0}}" onclick="dolike({{$item.id}},'like'); return false"></i>
|
||||
{{/if}}
|
||||
{{if $item.dislike}}
|
||||
<i class="icon-thumbs-down-alt item-tool" title="{{$item.dislike.0}}" onclick="dolike({{$item.id}},'dislike'); return false"></i>
|
||||
{{/if}}
|
||||
{{if $item.share}}
|
||||
<i class="icon-retweet item-tool" title="{{$item.share.0}}" onclick="jotShare({{$item.id}}); return false"></i>
|
||||
{{/if}}
|
||||
{{if $item.plink}}
|
||||
<i class="icon-external-link item-tool" onclick="window.location.href='{{$item.plink.href}}'; return false;" title="{{$item.plink.title}}"></i>
|
||||
{{/if}}
|
||||
{{if $item.edpost}}
|
||||
<i class="editpost icon-pencil item-tool" onclick="window.location.href='{{$item.edpost.0}}'; return false;" title="{{$item.edpost.1}}"></i>
|
||||
{{/if}}
|
||||
{{if $item.star}}
|
||||
<i id="starred-{{$item.id}}" onclick="dostar({{$item.id}}); return false;" class="star-item item-tool {{$item.star.isstarred}}" title="{{$item.star.toggle}}"></i>
|
||||
{{/if}}
|
||||
{{if $item.tagger}}
|
||||
<i id="tagger-{{$item.id}}" onclick="itemTag({{$item.id}}); return false;" class="tag-item icon-tag item-tool" title="{{$item.tagger.tagit}}"></i>
|
||||
{{/if}}
|
||||
{{if $item.filer}}
|
||||
<i id="filer-{{$item.id}}" onclick="itemFiler({{$item.id}}); return false;" class="filer-item icon-folder-open item-tool" title="{{$item.filer}}"></i>
|
||||
{{/if}}
|
||||
<div id="like-rotator-{{$item.id}}" class="like-rotator"></div>
|
||||
|
||||
<div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-{{$item.id}}" >
|
||||
{{if $item.drop.dropping}}<a class="wall-item-delete-link" id="wall-item-delete-link-{{$item.id}}" href="item/drop/{{$item.id}}" title="{{$item.drop.delete}}" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ><i class="icon-remove drop-icons item-tool"></i></a>{{/if}}
|
||||
</div>
|
||||
{{if $item.drop.pagedrop}}<input type="checkbox" onclick="checkboxhighlight(this);" title="{{$item.drop.select}}" class="item-select" name="itemselected[]" value="{{$item.id}}" />{{/if}}
|
||||
<div class="wall-item-delete-end"></div>
|
||||
<div class="wall-item-like {{$item.indent}}" id="wall-item-like-{{$item.id}}">{{$item.showlike}}</div>
|
||||
<div class="wall-item-dislike {{$item.indent}}" id="wall-item-dislike-{{$item.id}}">{{$item.showdislike}}</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="wall-item-wrapper-end"></div>
|
||||
|
||||
<div class="wall-item-outside-wrapper-end {{$item.indent}}" ></div>
|
||||
</div>
|
||||
{{if $item.toplevel}}
|
||||
{{foreach $item.children as $child}}
|
||||
{{include file="{{$child.template}}" item=$child}}
|
||||
{{/foreach}}
|
||||
{{/if}}
|
||||
|
||||
<div class="wall-item-comment-wrapper" >
|
||||
{{$item.comment}}
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
{{if $item.comment_lastcollapsed}}</div>{{/if}}
|
33
view/tpl/_group_side.tpl
Executable file
33
view/tpl/_group_side.tpl
Executable file
|
@ -0,0 +1,33 @@
|
|||
<div class="panel panel-default" id="group-sidebar">
|
||||
<div class="panel-heading"><h3 class="panel-title">{{$title}}</h3></div>
|
||||
|
||||
<div class="panel-body" id="sidebar-group-list">
|
||||
<ul id="sidebar-group-ul">
|
||||
{{foreach $groups as $group}}
|
||||
<li class="sidebar-group-li">
|
||||
{{if $group.cid}}
|
||||
<input type="checkbox"
|
||||
class="{{if $group.selected}}ticked{{else}}unticked {{/if}} action"
|
||||
onclick="contactgroupChangeMember('{{$group.id}}','{{$group.cid}}');return true;"
|
||||
{{if $group.ismember}}checked="checked"{{/if}}
|
||||
/>
|
||||
{{/if}}
|
||||
{{if $group.edit}}
|
||||
<a class="groupsideedit" href="{{$group.edit.href}}" title="{{$edittext}}"><span id="edit-sidebar-group-element-{{$group.id}}" class="group-edit-icon iconspacer small-pencil"></span></a>
|
||||
{{/if}}
|
||||
<a id="sidebar-group-element-{{$group.id}}" class="sidebar-group-element {{if $group.selected}}group-selected{{/if}}" href="{{$group.href}}">{{$group.text}}</a>
|
||||
</li>
|
||||
{{/foreach}}
|
||||
</ul>
|
||||
<div id="sidebar-new-group">
|
||||
<a href="group/new">{{$createtext}}</a>
|
||||
</div>
|
||||
{{if $ungrouped}}
|
||||
<div id="sidebar-ungrouped">
|
||||
<a href="nogroup">{{$ungrouped}}</a>
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
15
view/tpl/_saved_searches_aside.tpl
Executable file
15
view/tpl/_saved_searches_aside.tpl
Executable file
|
@ -0,0 +1,15 @@
|
|||
<div class="panel panel-default" id="saved-search-list">
|
||||
<div class="panel-heading"> <h3 class="panel-title" id="search">{{$title}}</h3></div>
|
||||
<div class="panel-body">
|
||||
{{$searchbox}}
|
||||
|
||||
<ul id="saved-search-ul">
|
||||
{{foreach $saved as $search}}
|
||||
<li id="search-term-{{$search.id}}" class="saved-search-li clear">
|
||||
<a title="{{$search.delete}}" onclick="return confirmDelete();" id="drop-saved-search-term-{{$search.id}}" href="network/?f=&remove=1&search={{$search.encodedterm}}"><i id="dropicon-saved-search-term-{{$search.id}}" class="icon-remove drop-icons iconspacer savedsearchdrop" ></i></a>
|
||||
<a id="saved-search-term-{{$search.id}}" class="savedsearchterm" href="network/?f=&search={{$search.encodedterm}}">{{$search.displayterm}}</a>
|
||||
</li>
|
||||
{{/foreach}}
|
||||
</ul></div>
|
||||
<div class="clear"></div>
|
||||
</div>
|
|
@ -194,10 +194,17 @@ function enableOnUser(){
|
|||
}
|
||||
|
||||
function jotGetExpiry() {
|
||||
reply = prompt("{{$expirewhen}}", $('#jot-expire').val());
|
||||
if(reply && reply.length) {
|
||||
//reply = prompt("{{$expirewhen}}", $('#jot-expire').val());
|
||||
$('#expiryModal').modal();
|
||||
$('#expiry-modal-OKButton').on('click', function() {
|
||||
reply=$('#expiration-date').val();
|
||||
if(reply && reply.length) {
|
||||
$('#jot-expire').val(reply);
|
||||
$('#expiryModal').modal('hide');
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
}
|
||||
|
||||
function jotShare(id) {
|
||||
|
@ -299,3 +306,16 @@ function enableOnUser(){
|
|||
|
||||
</script>
|
||||
|
||||
<!--
|
||||
<script>
|
||||
$( document ).on( "click", ".wall-item-delete-link", function(e) {
|
||||
var link = $(this).attr("href"); // "get" the intended link in a var
|
||||
e.preventDefault();
|
||||
bootbox.confirm("<h4>Delete item?</h4>", function(result) {
|
||||
if (result) {
|
||||
document.location.href = link;}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
-->
|
||||
|
||||
|
|
|
@ -90,10 +90,43 @@
|
|||
{{$jotnets}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Modal for item expiry-->
|
||||
<div class="modal fade" id="expiryModal" tabindex="-1" role="dialog" aria-labelledby="expiryModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||
<h4 class="modal-title" id="expiryModalLabel">{{$expires}}</h4>
|
||||
</div>
|
||||
<!-- <div class="modal-body"> -->
|
||||
<div class="modal-body form-group" style="width:90%">
|
||||
<div class="input-group input-group-sm date" id="datetimepicker1">
|
||||
<span class="input-group-addon"><span class="glyphicon glyphicon-calendar"></span>
|
||||
</span>
|
||||
<input id="expiration-date" type='text' class="form-control" data-format="YYYY-MM-DD HH:mm" size="20"/>
|
||||
</div>
|
||||
</div>
|
||||
<!-- </div> -->
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">{{$expiryModalCANCEL}}</button>
|
||||
<button id="expiry-modal-OKButton" type="button" class="btn btn-primary">{{$expiryModalOK}}</button>
|
||||
</div>
|
||||
</div><!-- /.modal-content -->
|
||||
</div><!-- /.modal-dialog -->
|
||||
</div><!-- /.modal -->
|
||||
<script type="text/javascript">
|
||||
$(function() {
|
||||
$('#datetimepicker1').datetimepicker({
|
||||
language: 'us'
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div id="profile-jot-end"></div>
|
||||
</form>
|
||||
</div>
|
||||
|
|
Loading…
Reference in a new issue