1f09e7ad23
1. Add template category 'end' that places content right before final </body> tag 2. Move most Javascript from tpl files into one cacheable file, theme.js 3. Load scripts at end of the HTML document instead of in the header 4. Minify several Javascript files Note that the second and third things were only done for Frost and Frost Mobile. Doing it for every theme means going through every .tpl for every theme and rearranging the Javascript, which is tedious.
194 lines
4.4 KiB
JavaScript
194 lines
4.4 KiB
JavaScript
/**
|
|
* Friendica people autocomplete
|
|
*
|
|
* require jQuery, jquery.textareas
|
|
*/
|
|
|
|
|
|
|
|
function ACPopup(elm,backend_url){
|
|
this.idsel=-1;
|
|
this.element = elm;
|
|
this.searchText="";
|
|
this.ready=true;
|
|
this.kp_timer = false;
|
|
this.url = backend_url;
|
|
|
|
var w = 530;
|
|
var h = 130;
|
|
|
|
|
|
if(typeof elm.editorId == "undefined") {
|
|
style = $j(elm).offset();
|
|
w = $j(elm).width();
|
|
h = $j(elm).height();
|
|
}
|
|
else {
|
|
var container = elm.getContainer();
|
|
if(typeof container != "undefined") {
|
|
style = $j(container).offset();
|
|
w = $j(container).width();
|
|
h = $j(container).height();
|
|
}
|
|
}
|
|
|
|
style.top=style.top+h;
|
|
style.width = w;
|
|
style.position = 'absolute';
|
|
/* style['max-height'] = '150px';
|
|
style.border = '1px solid red';
|
|
style.background = '#cccccc';
|
|
|
|
style.overflow = 'auto';
|
|
style['z-index'] = '100000';
|
|
*/
|
|
style.display = 'none';
|
|
|
|
this.cont = $j("<div class='acpopup'></div>");
|
|
this.cont.css(style);
|
|
|
|
$j("body").append(this.cont);
|
|
}
|
|
ACPopup.prototype.close = function(){
|
|
$j(this.cont).remove();
|
|
this.ready=false;
|
|
}
|
|
ACPopup.prototype.search = function(text){
|
|
var that = this;
|
|
this.searchText=text;
|
|
if (this.kp_timer) clearTimeout(this.kp_timer);
|
|
this.kp_timer = setTimeout( function(){that._search();}, 500);
|
|
}
|
|
ACPopup.prototype._search = function(){
|
|
console.log("_search");
|
|
var that = this;
|
|
var postdata = {
|
|
start:0,
|
|
count:100,
|
|
search:this.searchText,
|
|
type:'c',
|
|
}
|
|
|
|
$j.ajax({
|
|
type:'POST',
|
|
url: this.url,
|
|
data: postdata,
|
|
dataType: 'json',
|
|
success:function(data){
|
|
that.cont.html("");
|
|
if (data.tot>0){
|
|
that.cont.show();
|
|
$j(data.items).each(function(){
|
|
html = "<img src='{0}' height='16px' width='16px'>{1} ({2})".format(this.photo, this.name, this.nick)
|
|
that.add(html, this.nick.replace(' ','') + '+' + this.id + ' - ' + this.link);
|
|
});
|
|
} else {
|
|
that.cont.hide();
|
|
}
|
|
}
|
|
});
|
|
|
|
}
|
|
ACPopup.prototype.add = function(label, value){
|
|
var that=this;
|
|
var elm = $j("<div class='acpopupitem' title='"+value+"'>"+label+"</div>");
|
|
elm.click(function(e){
|
|
t = $j(this).attr('title').replace(new RegExp(' \- .*'),'');
|
|
if(typeof(that.element.container) === "undefined") {
|
|
el=$j(that.element);
|
|
sel = el.getSelection();
|
|
sel.start = sel.start- that.searchText.length;
|
|
el.setSelection(sel.start,sel.end).replaceSelectedText(t+' ').collapseSelection(false);
|
|
that.close();
|
|
}
|
|
else {
|
|
txt = tinyMCE.activeEditor.getContent();
|
|
// alert(that.searchText + ':' + t);
|
|
newtxt = txt.replace(that.searchText,t+' ');
|
|
tinyMCE.activeEditor.setContent(newtxt);
|
|
tinyMCE.activeEditor.focus();
|
|
that.close();
|
|
}
|
|
});
|
|
$j(this.cont).append(elm);
|
|
}
|
|
ACPopup.prototype.onkey = function(event){
|
|
if (event.keyCode == '13') {
|
|
if(this.idsel>-1) {
|
|
this.cont.children()[this.idsel].click();
|
|
event.preventDefault();
|
|
}
|
|
else
|
|
this.close();
|
|
}
|
|
if (event.keyCode == '38') { //cursor up
|
|
cmax = this.cont.children().size()-1;
|
|
this.idsel--;
|
|
if (this.idsel<0) this.idsel=cmax;
|
|
event.preventDefault();
|
|
}
|
|
if (event.keyCode == '40' || event.keyCode == '9') { //cursor down
|
|
cmax = this.cont.children().size()-1;
|
|
this.idsel++;
|
|
if (this.idsel>cmax) this.idsel=0;
|
|
event.preventDefault();
|
|
}
|
|
|
|
if (event.keyCode == '38' || event.keyCode == '40' || event.keyCode == '9') {
|
|
this.cont.children().removeClass('selected');
|
|
$j(this.cont.children()[this.idsel]).addClass('selected');
|
|
}
|
|
|
|
if (event.keyCode == '27') { //ESC
|
|
this.close();
|
|
}
|
|
}
|
|
|
|
function ContactAutocomplete(element,backend_url){
|
|
this.pattern=/@([^ \n]+)$/;
|
|
this.popup=null;
|
|
var that = this;
|
|
|
|
$j(element).unbind('keydown');
|
|
$j(element).unbind('keyup');
|
|
|
|
$j(element).keydown(function(event){
|
|
if (that.popup!==null) that.popup.onkey(event);
|
|
});
|
|
|
|
$j(element).keyup(function(event){
|
|
cpos = $j(this).getSelection();
|
|
if (cpos.start==cpos.end){
|
|
match = $j(this).val().substring(0,cpos.start).match(that.pattern);
|
|
if (match!==null){
|
|
if (that.popup===null){
|
|
that.popup = new ACPopup(this, backend_url);
|
|
}
|
|
if (that.popup.ready && match[1]!==that.popup.searchText) that.popup.search(match[1]);
|
|
if (!that.popup.ready) that.popup=null;
|
|
|
|
} else {
|
|
if (that.popup!==null) {that.popup.close(); that.popup=null;}
|
|
}
|
|
|
|
|
|
}
|
|
});
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
* jQuery plugin 'contact_autocomplete'
|
|
*/
|
|
(function( $ ){
|
|
$j.fn.contact_autocomplete = function(backend_url) {
|
|
this.each(function(){
|
|
new ContactAutocomplete(this, backend_url);
|
|
});
|
|
};
|
|
})( jQuery );
|
|
|
|
|
|
|
|
|