]> 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                 liking = 1;
384         }
385
386         function dosubthread(ident) {
387                 unpause();
388                 $('#like-rotator-' + ident.toString()).show();
389                 $.get('subthread/' + ident.toString(), NavUpdate );
390                 liking = 1;
391         }
392
393
394         function dostar(ident) {
395                 ident = ident.toString();
396                 $('#like-rotator-' + ident).show();
397                 $.get('starred/' + ident, function(data) {
398                         if(data.match(/1/)) {
399                                 $('#starred-' + ident).addClass('starred');
400                                 $('#starred-' + ident).removeClass('unstarred');
401                                 $('#star-' + ident).addClass('hidden');
402                                 $('#unstar-' + ident).removeClass('hidden');
403                         }
404                         else {                  
405                                 $('#starred-' + ident).addClass('unstarred');
406                                 $('#starred-' + ident).removeClass('starred');
407                                 $('#star-' + ident).removeClass('hidden');
408                                 $('#unstar-' + ident).addClass('hidden');
409                         }
410                         $('#like-rotator-' + ident).hide();     
411                 });
412         }
413
414         function getPosition(e) {
415                 var cursor = {x:0, y:0};
416                 if ( e.pageX || e.pageY  ) {
417                         cursor.x = e.pageX;
418                         cursor.y = e.pageY;
419                 }
420                 else {
421                         if( e.clientX || e.clientY ) {
422                                 cursor.x = e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft) - document.documentElement.clientLeft;
423                                 cursor.y = e.clientY + (document.documentElement.scrollTop  || document.body.scrollTop)  - document.documentElement.clientTop;
424                         }
425                         else {
426                                 if( e.x || e.y ) {
427                                         cursor.x = e.x;
428                                         cursor.y = e.y;
429                                 }
430                         }
431                 }
432                 return cursor;
433         }
434
435         var lockvisible = false;
436
437         function lockview(event,id) {
438                 event = event || window.event;
439                 cursor = getPosition(event);
440                 if(lockvisible) {
441                         lockviewhide();
442                 }
443                 else {
444                         lockvisible = true;
445                         $.get('lockview/' + id, function(data) {
446                                 $('#panel').html(data);
447                                 $('#panel').css({ 'left': cursor.x + 5 , 'top': cursor.y + 5});
448                                 $('#panel').show();
449                         });
450                 }
451         }
452
453         function lockviewhide() {
454                 lockvisible = false;
455                 $('#panel').hide();
456         }
457
458         function post_comment(id) {
459                 unpause();
460                 commentBusy = true;
461                 $('body').css('cursor', 'wait');
462                 $("#comment-preview-inp-" + id).val("0");
463                 $.post(  
464              "item",  
465              $("#comment-edit-form-" + id).serialize(),
466                         function(data) {
467                                 if(data.success) {
468                                         $("#comment-edit-wrapper-" + id).hide();
469                                         $("#comment-edit-text-" + id).val('');
470                                 var tarea = document.getElementById("comment-edit-text-" + id);
471                                         if(tarea)
472                                                 commentClose(tarea,id);
473                                         if(timer) clearTimeout(timer);
474                                         timer = setTimeout(NavUpdate,10);
475                                 }
476                                 if(data.reload) {
477                                         window.location.href=data.reload;
478                                 }
479                         },
480                         "json"  
481          );  
482          return false;  
483         }
484
485
486         function preview_comment(id) {
487                 $("#comment-preview-inp-" + id).val("1");
488                 $("#comment-edit-preview-" + id).show();
489                 $.post(  
490              "item",  
491              $("#comment-edit-form-" + id).serialize(),
492                         function(data) {
493                                 if(data.preview) {
494                                                 
495                                         $("#comment-edit-preview-" + id).html(data.preview);
496                                         $("#comment-edit-preview-" + id + " a").click(function() { return false; });
497                                 }
498                         },
499                         "json"  
500          );  
501          return true;  
502         }
503
504
505
506         function preview_post() {
507                 $("#jot-preview").val("1");
508                 $("#jot-preview-content").show();
509                 tinyMCE.triggerSave();
510                 $.post(  
511                         "item",  
512                         $("#profile-jot-form").serialize(),
513                         function(data) {
514                                 if(data.preview) {                      
515                                         $("#jot-preview-content").html(data.preview);
516                                         $("#jot-preview-content" + " a").click(function() { return false; });
517                                 }
518                         },
519                         "json"  
520                 );  
521                 $("#jot-preview").val("0");
522                 return true;  
523         }
524
525
526         function unpause() {
527                 // unpause auto reloads if they are currently stopped
528                 totStopped = false;
529                 stopped = false;
530             $('#pause').html('');
531         }
532                 
533
534     function bin2hex(s){  
535         // Converts the binary representation of data to hex    
536         //   
537         // version: 812.316  
538         // discuss at: http://phpjs.org/functions/bin2hex  
539         // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)  
540         // +   bugfixed by: Onno Marsman  
541         // +   bugfixed by: Linuxworld  
542         // *     example 1: bin2hex('Kev');  
543         // *     returns 1: '4b6576'  
544         // *     example 2: bin2hex(String.fromCharCode(0x00));  
545         // *     returns 2: '00'  
546         var v,i, f = 0, a = [];  
547         s += '';  
548         f = s.length;  
549           
550         for (i = 0; i<f; i++) {  
551             a[i] = s.charCodeAt(i).toString(16).replace(/^([\da-f])$/,"0$1");  
552         }  
553           
554         return a.join('');  
555     }  
556
557         function groupChangeMember(gid, cid, sec_token) {
558                 $('body .fakelink').css('cursor', 'wait');
559                 $.get('group/' + gid + '/' + cid + "?t=" + sec_token, function(data) {
560                                 $('#group-update-wrapper').html(data);
561                                 $('body .fakelink').css('cursor', 'auto');                              
562                 });
563         }
564
565         function profChangeMember(gid,cid) {
566                 $('body .fakelink').css('cursor', 'wait');
567                 $.get('profperm/' + gid + '/' + cid, function(data) {
568                                 $('#prof-update-wrapper').html(data);
569                                 $('body .fakelink').css('cursor', 'auto');                              
570                 });
571         }
572
573         function contactgroupChangeMember(gid,cid) {
574                 $('body').css('cursor', 'wait');
575                 $.get('contactgroup/' + gid + '/' + cid, function(data) {
576                                 $('body').css('cursor', 'auto');
577                 });
578         }
579
580
581 function checkboxhighlight(box) {
582   if($(box).is(':checked')) {
583         $(box).addClass('checkeditem');
584   }
585   else {
586         $(box).removeClass('checkeditem');
587   }
588 }
589
590 function notifyMarkAll() {
591         $.get('notify/mark/all', function(data) {
592                 if(timer) clearTimeout(timer);
593                 timer = setTimeout(NavUpdate,1000);
594         });
595 }
596
597
598 // code from http://www.tinymce.com/wiki.php/How-to_implement_a_custom_file_browser
599 function fcFileBrowser (field_name, url, type, win) {
600     /* TODO: If you work with sessions in PHP and your client doesn't accept cookies you might need to carry
601        the session name and session ID in the request string (can look like this: "?PHPSESSID=88p0n70s9dsknra96qhuk6etm5").
602        These lines of code extract the necessary parameters and add them back to the filebrowser URL again. */
603
604
605     var cmsURL = baseurl+"/fbrowser/"+type+"/";
606
607     tinyMCE.activeEditor.windowManager.open({
608         file : cmsURL,
609         title : 'File Browser',
610         width : 420,  // Your dimensions may differ - toy around with them!
611         height : 400,
612         resizable : "yes",
613         inline : "yes",  // This parameter only has an effect if you use the inlinepopups plugin!
614         close_previous : "no"
615     }, {
616         window : win,
617         input : field_name
618     });
619     return false;
620   }
621
622 function setupFieldRichtext(){
623         tinyMCE.init({
624                 theme : "advanced",
625                 mode : "specific_textareas",
626                 editor_selector: "fieldRichtext",
627                 plugins : "bbcode,paste, inlinepopups",
628                 theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor,formatselect,code",
629                 theme_advanced_buttons2 : "",
630                 theme_advanced_buttons3 : "",
631                 theme_advanced_toolbar_location : "top",
632                 theme_advanced_toolbar_align : "center",
633                 theme_advanced_blockformats : "blockquote,code",
634                 paste_text_sticky : true,
635                 entity_encoding : "raw",
636                 add_unload_trigger : false,
637                 remove_linebreaks : false,
638                 force_p_newlines : false,
639                 force_br_newlines : true,
640                 forced_root_block : '',
641                 convert_urls: false,
642                 content_css: baseurl+"/view/custom_tinymce.css",
643                 theme_advanced_path : false,
644                 file_browser_callback : "fcFileBrowser",
645         });
646 }
647
648
649 /** 
650  * sprintf in javascript 
651  *      "{0} and {1}".format('zero','uno'); 
652  **/
653 String.prototype.format = function() {
654     var formatted = this;
655     for (var i = 0; i < arguments.length; i++) {
656         var regexp = new RegExp('\\{'+i+'\\}', 'gi');
657         formatted = formatted.replace(regexp, arguments[i]);
658     }
659     return formatted;
660 };
661 // Array Remove
662 Array.prototype.remove = function(item) {
663   to=undefined; from=this.indexOf(item);
664   var rest = this.slice((to || from) + 1 || this.length);
665   this.length = from < 0 ? this.length + from : from;
666   return this.push.apply(this, rest);
667 };
668
669 function previewTheme(elm) {
670         theme = $(elm).val();
671         $.getJSON('pretheme?f=&theme=' + theme,function(data) {
672                         $('#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>');
673         });
674
675 }