]> git.mxchange.org Git - friendica.git/blob - js/main.js
Merge remote branch 'upstream/master'
[friendica.git] / js / main.js
1
2   function openClose(theID) {
3     if(document.getElementById(theID).style.display == "block") { 
4       document.getElementById(theID).style.display = "none" 
5     }
6     else { 
7       document.getElementById(theID).style.display = "block" 
8     } 
9   }
10
11   function openMenu(theID) {
12       document.getElementById(theID).style.display = "block" 
13   }
14
15   function closeMenu(theID) {
16       document.getElementById(theID).style.display = "none" 
17   }
18
19
20
21         var src = null;
22         var prev = null;
23         var livetime = null;
24         var msie = false;
25         var stopped = false;
26         var totStopped = false;
27         var timer = null;
28         var pr = 0;
29         var liking = 0;
30         var in_progress = false;
31         var langSelect = false;
32         var commentBusy = false;
33         var last_popup_menu = null;
34         var last_popup_button = null;
35
36         $(function() {
37                 $.ajaxSetup({cache: false});
38
39                 msie = $.browser.msie ;
40                 
41                 /* setup tooltips *//*
42                 $("a,.tt").each(function(){
43                         var e = $(this);
44                         var pos="bottom";
45                         if (e.hasClass("tttop")) pos="top";
46                         if (e.hasClass("ttbottom")) pos="bottom";
47                         if (e.hasClass("ttleft")) pos="left";
48                         if (e.hasClass("ttright")) pos="right";
49                         e.tipTip({defaultPosition: pos, edgeOffset: 8});
50                 });*/
51                 
52                 
53                 
54                 /* setup onoff widgets */
55                 $(".onoff input").each(function(){
56                         val = $(this).val();
57                         id = $(this).attr("id");
58                         $("#"+id+"_onoff ."+ (val==0?"on":"off")).addClass("hidden");
59                         
60                 });
61                 $(".onoff > a").click(function(event){
62                         event.preventDefault(); 
63                         var input = $(this).siblings("input");
64                         var val = 1-input.val();
65                         var id = input.attr("id");
66                         $("#"+id+"_onoff ."+ (val==0?"on":"off")).addClass("hidden");
67                         $("#"+id+"_onoff ."+ (val==1?"on":"off")).removeClass("hidden");
68                         input.val(val);
69                         //console.log(id);
70                 });
71                 
72                 /* setup field_richtext */
73                 setupFieldRichtext();
74
75                 /* popup menus */
76         function close_last_popup_menu() {
77                 if(last_popup_menu) {
78                 last_popup_menu.hide();
79                 last_popup_button.removeClass("selected");
80                 last_popup_menu = null;
81                 last_popup_button = null;
82                 }
83                 }
84                 $('a[rel^=#]').click(function(e){
85                         close_last_popup_menu();
86                         menu = $( $(this).attr('rel') );
87                         e.preventDefault();
88                         e.stopPropagation();
89                         if (menu.attr('popup')=="false") return false;
90                         $(this).parent().toggleClass("selected");
91                         menu.toggle();
92                         if (menu.css("display") == "none") {
93                                 last_popup_menu = null;
94                                 last_popup_button = null;
95                         } else {
96                                 last_popup_menu = menu;
97                                 last_popup_button = $(this).parent();
98                         }
99                         return false;
100                 });
101                 $('html').click(function() {
102                                                 close_last_popup_menu();
103                 });
104                 
105                 // fancyboxes
106                 $("a.popupbox").fancybox({
107                         'transitionIn' : 'elastic',
108                         'transitionOut' : 'elastic'
109                 });
110                 
111
112                 /* notifications template */
113                 var notifications_tpl= unescape($("#nav-notifications-template[rel=template]").html());
114                 var notifications_all = unescape($('<div>').append( $("#nav-notifications-see-all").clone() ).html()); //outerHtml hack
115                 var notifications_mark = unescape($('<div>').append( $("#nav-notifications-mark-all").clone() ).html()); //outerHtml hack
116                 var notifications_empty = unescape($("#nav-notifications-menu").html());
117                 
118                 /* nav update event  */
119                 $('nav').bind('nav-update', function(e,data){;
120                         var invalid = $(data).find('invalid').text();
121                         if(invalid == 1) { window.location.href=window.location.href }
122
123                         var net = $(data).find('net').text();
124                         if(net == 0) { net = ''; $('#net-update').removeClass('show') } else { $('#net-update').addClass('show') }
125                         $('#net-update').html(net);
126
127                         var home = $(data).find('home').text();
128                         if(home == 0) { home = '';  $('#home-update').removeClass('show') } else { $('#home-update').addClass('show') }
129                         $('#home-update').html(home);
130                         
131                         var intro = $(data).find('intro').text();
132                         if(intro == 0) { intro = '';  $('#intro-update').removeClass('show') } else { $('#intro-update').addClass('show') }
133                         $('#intro-update').html(intro);
134
135                         var mail = $(data).find('mail').text();
136                         if(mail == 0) { mail = '';  $('#mail-update').removeClass('show') } else { $('#mail-update').addClass('show') }
137                         $('#mail-update').html(mail);
138                         
139                         var intro = $(data).find('intro').text();
140                         if(intro == 0) { intro = '';  $('#intro-update-li').removeClass('show') } else { $('#intro-update-li').addClass('show') }
141                         $('#intro-update-li').html(intro);
142
143                         var mail = $(data).find('mail').text();
144                         if(mail == 0) { mail = '';  $('#mail-update-li').removeClass('show') } else { $('#mail-update-li').addClass('show') }
145                         $('#mail-update-li').html(mail);
146
147
148                         var allevents = $(data).find('all-events').text();
149                         if(allevents == 0) { allevents = ''; $('#allevents-update').removeClass('show') } else { $('#allevents-update').addClass('show') }
150                         $('#allevents-update').html(allevents);
151
152                         var alleventstoday = $(data).find('all-events-today').text();
153                         if(alleventstoday == 0) { $('#allevents-update').removeClass('notif-allevents-today') } else { $('#allevents-update').addClass('notif-allevents-today') }
154
155                         var events = $(data).find('events').text();
156                         if(events == 0) { events = ''; $('#events-update').removeClass('show') } else { $('#events-update').addClass('show') }
157                         $('#events-update').html(events);
158
159                         var eventstoday = $(data).find('events-today').text();
160                         if(eventstoday == 0) { $('#events-update').removeClass('notif-events-today') } else { $('#events-update').addClass('notif-events-today') }
161
162                         var birthdays = $(data).find('birthdays').text();
163                         if(birthdays == 0) {birthdays = ''; $('#birthdays-update').removeClass('show') } else { $('#birthdays-update').addClass('show') }
164                         $('#birthdays-update').html(birthdays);
165
166                         var birthdaystoday = $(data).find('birthdays-today').text();
167                         if(birthdaystoday == 0) { $('#birthdays-update').removeClass('notif-birthdays-today') } else { $('#birthdays-update').addClass('notif-birthdays-today') }
168
169
170                         var eNotif = $(data).find('notif')
171                         
172                         if (eNotif.children("note").length==0){
173                                 $("#nav-notifications-menu").html(notifications_empty);
174                         } else {
175                                 nnm = $("#nav-notifications-menu");
176                                 nnm.html(notifications_all + notifications_mark);
177                                 //nnm.attr('popup','true');
178                                 eNotif.children("note").each(function(){
179                                         e = $(this);
180                                         text = e.text().format("<span class='contactname'>"+e.attr('name')+"</span>");
181                                         html = notifications_tpl.format(e.attr('href'),e.attr('photo'), text, e.attr('date'), e.attr('seen'));
182                                         nnm.append(html);
183                                 });
184                         }
185                         notif = eNotif.attr('count');
186                         if (notif>0){
187                                 $("#nav-notifications-linkmenu").addClass("on");
188                         } else {
189                                 $("#nav-notifications-linkmenu").removeClass("on");
190                         }
191                         if(notif == 0) { notif = ''; $('#notify-update').removeClass('show') } else { $('#notify-update').addClass('show') }
192                         $('#notify-update').html(notif);
193                         
194                         var eSysmsg = $(data).find('sysmsgs');
195                         eSysmsg.children("notice").each(function(){
196                                 text = $(this).text();
197                                 $.jGrowl(text, { sticky: true, theme: 'notice' });
198                         });
199                         eSysmsg.children("info").each(function(){
200                                 text = $(this).text();
201                                 $.jGrowl(text, { sticky: false, theme: 'info', life: 10000 });
202                         });
203                         
204                 });
205                 
206                 
207                 NavUpdate(); 
208                 // Allow folks to stop the ajax page updates with the pause/break key
209                 $(document).keydown(function(event) {
210                         if(event.keyCode == '8') {
211                                 var target = event.target || event.srcElement;
212                                 if (!/input|textarea/i.test(target.nodeName)) {
213                                         return false;
214                                 }
215                         }
216                         if(event.keyCode == '19' || (event.ctrlKey && event.which == '32')) {
217                                 event.preventDefault();
218                                 if(stopped == false) {
219                                         stopped = true;
220                                         if (event.ctrlKey) {
221                                                 totStopped = true;
222                                         }
223                                         $('#pause').html('<img src="images/pause.gif" alt="pause" style="border: 1px solid black;" />');
224                                 } else {
225                                         unpause();
226                                 }
227                         } else {
228                                 if (!totStopped) {
229                                         unpause();
230                                 }
231                         }
232                 });
233                 
234                 
235         });
236
237         function NavUpdate() {
238
239                 if(! stopped) {
240                         var pingCmd = 'ping' + ((localUser != 0) ? '?f=&uid=' + localUser : '');
241                         $.get(pingCmd,function(data) {
242                                 $(data).find('result').each(function() {
243                                         // send nav-update event
244                                         $('nav').trigger('nav-update', this);
245                                         
246                                         
247                                         // start live update
248
249                                         if($('#live-network').length)   { src = 'network'; liveUpdate(); }
250                                         if($('#live-profile').length)   { src = 'profile'; liveUpdate(); }
251                                         if($('#live-community').length) { src = 'community'; liveUpdate(); }
252                                         if($('#live-notes').length)     { src = 'notes'; liveUpdate(); }
253                                         if($('#live-display').length) {
254                                                 if(liking) {
255                                                         liking = 0;
256                                                         window.location.href=window.location.href 
257                                                 }
258                                         }
259                                         if($('#live-photos').length) { 
260                                                 if(liking) {
261                                                         liking = 0;
262                                                         window.location.href=window.location.href 
263                                                 }
264                                         }
265
266                                         
267                                         
268                                         
269                                 });
270                         }) ;
271                 }
272                 timer = setTimeout(NavUpdate,updateInterval);
273         }
274
275         function liveUpdate() {
276                 if((src == null) || (stopped) || (! profile_uid)) { $('.like-rotator').hide(); return; }
277                 if(($('.comment-edit-text-full').length) || (in_progress)) {
278                         if(livetime) {
279                                 clearTimeout(livetime);
280                         }
281                         livetime = setTimeout(liveUpdate, 10000);
282                         return;
283                 }
284                 if(livetime != null)
285                         livetime = null;
286
287                 prev = 'live-' + src;
288
289                 in_progress = true;
290                 var udargs = ((netargs.length) ? '/' + netargs : '');
291                 var update_url = 'update_' + src + udargs + '&p=' + profile_uid + '&page=' + profile_page + '&msie=' + ((msie) ? 1 : 0);
292
293                 $.get(update_url,function(data) {
294                         in_progress = false;
295                         //                      $('.collapsed-comments',data).each(function() {
296                         //      var ident = $(this).attr('id');
297                         //      var is_hidden = $('#' + ident).is(':hidden');
298                         //      if($('#' + ident).length) {
299                         //              $('#' + ident).replaceWith($(this));
300                         //              if(is_hidden)
301                         //                      $('#' + ident).hide();
302                         //      }
303                         //});
304
305                         // add a new thread
306                         $('.toplevel_item',data).each(function() {
307                                 var ident = $(this).attr('id');
308
309                                 if($('#' + ident).length == 0 && profile_page == 1) {
310                                         $('img',this).each(function() {
311                                                 $(this).attr('src',$(this).attr('dst'));
312                                         });
313                                         $('#' + prev).after($(this));
314                                 }
315                                 else {
316                                         $('img',this).each(function() {
317                                                 $(this).attr('src',$(this).attr('dst'));
318                                         });
319                                         $('#' + ident).replaceWith($(this));
320                                 }
321                                 prev = ident;
322                         });
323
324                         // reset vars for inserting individual items
325
326                         /*                      prev = 'live-' + src;
327
328                         $('.wall-item-outside-wrapper',data).each(function() {
329                                 var ident = $(this).attr('id');
330
331                                 if($('#' + ident).length == 0 && prev != 'live-' + src) {
332                                                 $('img',this).each(function() {
333                                                         $(this).attr('src',$(this).attr('dst'));
334                                                 });
335                                                 $('#' + prev).after($(this));
336                                 }
337                                 else { 
338                                         $('#' + ident + ' ' + '.wall-item-ago').replaceWith($(this).find('.wall-item-ago')); 
339                                         if($('#' + ident + ' ' + '.comment-edit-text-empty').length)
340                                                 $('#' + ident + ' ' + '.wall-item-comment-wrapper').replaceWith($(this).find('.wall-item-comment-wrapper'));
341                                         $('#' + ident + ' ' + '.hide-comments-total').replaceWith($(this).find('.hide-comments-total'));
342                                         $('#' + ident + ' ' + '.wall-item-like').replaceWith($(this).find('.wall-item-like'));
343                                         $('#' + ident + ' ' + '.wall-item-dislike').replaceWith($(this).find('.wall-item-dislike'));
344                                         $('#' + ident + ' ' + '.my-comment-photo').each(function() {
345                                                 $(this).attr('src',$(this).attr('dst'));
346                                         });
347                                 }
348                                 prev = ident; 
349                         });
350                         */
351                         $('.like-rotator').hide();
352                         if(commentBusy) {
353                                 commentBusy = false;
354                                 $('body').css('cursor', 'auto');
355                         }
356                         /* autocomplete @nicknames */
357                         $(".comment-edit-form  textarea").contact_autocomplete(baseurl+"/acl");
358                 });
359         }
360
361         function imgbright(node) {
362                 $(node).removeClass("drophide").addClass("drop");
363         }
364
365         function imgdull(node) {
366                 $(node).removeClass("drop").addClass("drophide");
367         }
368
369         // Since our ajax calls are asynchronous, we will give a few 
370         // seconds for the first ajax call (setting like/dislike), then 
371         // run the updater to pick up any changes and display on the page.
372         // The updater will turn any rotators off when it's done. 
373         // This function will have returned long before any of these
374         // events have completed and therefore there won't be any
375         // visible feedback that anything changed without all this
376         // trickery. This still could cause confusion if the "like" ajax call
377         // is delayed and NavUpdate runs before it completes.
378
379         function dolike(ident,verb) {
380                 unpause();
381                 $('#like-rotator-' + ident.toString()).show();
382                 $.get('like/' + ident.toString() + '?verb=' + verb, NavUpdate );
383 //              if(timer) clearTimeout(timer);
384 //              timer = setTimeout(NavUpdate,3000);
385                 liking = 1;
386         }
387
388         function dostar(ident) {
389                 ident = ident.toString();
390                 $('#like-rotator-' + ident).show();
391                 $.get('starred/' + ident, function(data) {
392                         if(data.match(/1/)) {
393                                 $('#starred-' + ident).addClass('starred');
394                                 $('#starred-' + ident).removeClass('unstarred');
395                                 $('#star-' + ident).addClass('hidden');
396                                 $('#unstar-' + ident).removeClass('hidden');
397                         }
398                         else {                  
399                                 $('#starred-' + ident).addClass('unstarred');
400                                 $('#starred-' + ident).removeClass('starred');
401                                 $('#star-' + ident).removeClass('hidden');
402                                 $('#unstar-' + ident).addClass('hidden');
403                         }
404                         $('#like-rotator-' + ident).hide();     
405                 });
406         }
407
408         function getPosition(e) {
409                 var cursor = {x:0, y:0};
410                 if ( e.pageX || e.pageY  ) {
411                         cursor.x = e.pageX;
412                         cursor.y = e.pageY;
413                 }
414                 else {
415                         if( e.clientX || e.clientY ) {
416                                 cursor.x = e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft) - document.documentElement.clientLeft;
417                                 cursor.y = e.clientY + (document.documentElement.scrollTop  || document.body.scrollTop)  - document.documentElement.clientTop;
418                         }
419                         else {
420                                 if( e.x || e.y ) {
421                                         cursor.x = e.x;
422                                         cursor.y = e.y;
423                                 }
424                         }
425                 }
426                 return cursor;
427         }
428
429         var lockvisible = false;
430
431         function lockview(event,id) {
432                 event = event || window.event;
433                 cursor = getPosition(event);
434                 if(lockvisible) {
435                         lockviewhide();
436                 }
437                 else {
438                         lockvisible = true;
439                         $.get('lockview/' + id, function(data) {
440                                 $('#panel').html(data);
441                                 $('#panel').css({ 'left': cursor.x + 5 , 'top': cursor.y + 5});
442                                 $('#panel').show();
443                         });
444                 }
445         }
446
447         function lockviewhide() {
448                 lockvisible = false;
449                 $('#panel').hide();
450         }
451
452         function post_comment(id) {
453                 unpause();
454                 commentBusy = true;
455                 $('body').css('cursor', 'wait');
456                 $("#comment-preview-inp-" + id).val("0");
457                 $.post(  
458              "item",  
459              $("#comment-edit-form-" + id).serialize(),
460                         function(data) {
461                                 if(data.success) {
462                                         $("#comment-edit-wrapper-" + id).hide();
463                                         $("#comment-edit-text-" + id).val('');
464                                 var tarea = document.getElementById("comment-edit-text-" + id);
465                                         if(tarea)
466                                                 commentClose(tarea,id);
467                                         if(timer) clearTimeout(timer);
468                                         timer = setTimeout(NavUpdate,10);
469                                 }
470                                 if(data.reload) {
471                                         window.location.href=data.reload;
472                                 }
473                         },
474                         "json"  
475          );  
476          return false;  
477         }
478
479
480         function preview_comment(id) {
481                 $("#comment-preview-inp-" + id).val("1");
482                 $("#comment-edit-preview-" + id).show();
483                 $.post(  
484              "item",  
485              $("#comment-edit-form-" + id).serialize(),
486                         function(data) {
487                                 if(data.preview) {
488                                                 
489                                         $("#comment-edit-preview-" + id).html(data.preview);
490                                         $("#comment-edit-preview-" + id + " a").click(function() { return false; });
491                                 }
492                         },
493                         "json"  
494          );  
495          return true;  
496         }
497
498
499
500         function preview_post() {
501                 $("#jot-preview").val("1");
502                 $("#jot-preview-content").show();
503                 tinyMCE.triggerSave();
504                 $.post(  
505                         "item",  
506                         $("#profile-jot-form").serialize(),
507                         function(data) {
508                                 if(data.preview) {                      
509                                         $("#jot-preview-content").html(data.preview);
510                                         $("#jot-preview-content" + " a").click(function() { return false; });
511                                 }
512                         },
513                         "json"  
514                 );  
515                 $("#jot-preview").val("0");
516                 return true;  
517         }
518
519
520         function unpause() {
521                 // unpause auto reloads if they are currently stopped
522                 totStopped = false;
523                 stopped = false;
524             $('#pause').html('');
525         }
526                 
527
528     function bin2hex(s){  
529         // Converts the binary representation of data to hex    
530         //   
531         // version: 812.316  
532         // discuss at: http://phpjs.org/functions/bin2hex  
533         // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)  
534         // +   bugfixed by: Onno Marsman  
535         // +   bugfixed by: Linuxworld  
536         // *     example 1: bin2hex('Kev');  
537         // *     returns 1: '4b6576'  
538         // *     example 2: bin2hex(String.fromCharCode(0x00));  
539         // *     returns 2: '00'  
540         var v,i, f = 0, a = [];  
541         s += '';  
542         f = s.length;  
543           
544         for (i = 0; i<f; i++) {  
545             a[i] = s.charCodeAt(i).toString(16).replace(/^([\da-f])$/,"0$1");  
546         }  
547           
548         return a.join('');  
549     }  
550
551         function groupChangeMember(gid, cid, sec_token) {
552                 $('body .fakelink').css('cursor', 'wait');
553                 $.get('group/' + gid + '/' + cid + "?t=" + sec_token, function(data) {
554                                 $('#group-update-wrapper').html(data);
555                                 $('body .fakelink').css('cursor', 'auto');                              
556                 });
557         }
558
559         function profChangeMember(gid,cid) {
560                 $('body .fakelink').css('cursor', 'wait');
561                 $.get('profperm/' + gid + '/' + cid, function(data) {
562                                 $('#prof-update-wrapper').html(data);
563                                 $('body .fakelink').css('cursor', 'auto');                              
564                 });
565         }
566
567         function contactgroupChangeMember(gid,cid) {
568                 $('body').css('cursor', 'wait');
569                 $.get('contactgroup/' + gid + '/' + cid, function(data) {
570                                 $('body').css('cursor', 'auto');
571                 });
572         }
573
574
575 function checkboxhighlight(box) {
576   if($(box).is(':checked')) {
577         $(box).addClass('checkeditem');
578   }
579   else {
580         $(box).removeClass('checkeditem');
581   }
582 }
583
584 function notifyMarkAll() {
585         $.get('notify/mark/all', function(data) {
586                 if(timer) clearTimeout(timer);
587                 timer = setTimeout(NavUpdate,1000);
588         });
589 }
590
591
592 // code from http://www.tinymce.com/wiki.php/How-to_implement_a_custom_file_browser
593 function fcFileBrowser (field_name, url, type, win) {
594     /* TODO: If you work with sessions in PHP and your client doesn't accept cookies you might need to carry
595        the session name and session ID in the request string (can look like this: "?PHPSESSID=88p0n70s9dsknra96qhuk6etm5").
596        These lines of code extract the necessary parameters and add them back to the filebrowser URL again. */
597
598
599     var cmsURL = baseurl+"/fbrowser/"+type+"/";
600
601     tinyMCE.activeEditor.windowManager.open({
602         file : cmsURL,
603         title : 'File Browser',
604         width : 420,  // Your dimensions may differ - toy around with them!
605         height : 400,
606         resizable : "yes",
607         inline : "yes",  // This parameter only has an effect if you use the inlinepopups plugin!
608         close_previous : "no"
609     }, {
610         window : win,
611         input : field_name
612     });
613     return false;
614   }
615
616 function setupFieldRichtext(){
617         tinyMCE.init({
618                 theme : "advanced",
619                 mode : "specific_textareas",
620                 editor_selector: "fieldRichtext",
621                 plugins : "bbcode,paste, inlinepopups",
622                 theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor,formatselect,code",
623                 theme_advanced_buttons2 : "",
624                 theme_advanced_buttons3 : "",
625                 theme_advanced_toolbar_location : "top",
626                 theme_advanced_toolbar_align : "center",
627                 theme_advanced_blockformats : "blockquote,code",
628                 paste_text_sticky : true,
629                 entity_encoding : "raw",
630                 add_unload_trigger : false,
631                 remove_linebreaks : false,
632                 force_p_newlines : false,
633                 force_br_newlines : true,
634                 forced_root_block : '',
635                 convert_urls: false,
636                 content_css: baseurl+"/view/custom_tinymce.css",
637                 theme_advanced_path : false,
638                 file_browser_callback : "fcFileBrowser",
639         });
640 }
641
642
643 /** 
644  * sprintf in javascript 
645  *      "{0} and {1}".format('zero','uno'); 
646  **/
647 String.prototype.format = function() {
648     var formatted = this;
649     for (var i = 0; i < arguments.length; i++) {
650         var regexp = new RegExp('\\{'+i+'\\}', 'gi');
651         formatted = formatted.replace(regexp, arguments[i]);
652     }
653     return formatted;
654 };
655 // Array Remove
656 Array.prototype.remove = function(item) {
657   to=undefined; from=this.indexOf(item);
658   var rest = this.slice((to || from) + 1 || this.length);
659   this.length = from < 0 ? this.length + from : from;
660   return this.push.apply(this, rest);
661 };
662
663 function previewTheme(elm) {
664         theme = $(elm).val();
665         $.getJSON('pretheme?f=&theme=' + theme,function(data) {
666                         $('#theme-preview').html('<div id="theme-desc">' + data.desc + '</div><div id="theme-version">' + data.version + '</div><div id="theme-credits">' + data.credits + '</div><a href="' + data.img + '"><img src="' + data.img + '" width="320" height="240" alt="' + theme + '" /></a>');
667         });
668
669 }