1 function resizeIframe(obj) {
6 function _resizeIframe(obj, desth) {
7 var h = obj.style.height;
8 var ch = obj.contentWindow.document.body.scrollHeight + 'px';
12 console.log("_resizeIframe", obj, desth, ch);
14 setTimeout(_resizeIframe, 500, obj, ch);
16 obj.style.height = ch;
17 setTimeout(_resizeIframe, 1000, obj, ch);
21 function openClose(theID) {
22 if(document.getElementById(theID).style.display == "block") {
23 document.getElementById(theID).style.display = "none"
26 document.getElementById(theID).style.display = "block"
30 function openMenu(theID) {
31 document.getElementById(theID).style.display = "block"
34 function closeMenu(theID) {
35 document.getElementById(theID).style.display = "none"
43 var force_update = false;
45 var totStopped = false;
49 var in_progress = false;
50 var langSelect = false;
51 var commentBusy = false;
52 var last_popup_menu = null;
53 var last_popup_button = null;
56 $.ajaxSetup({cache: false});
58 /* setup tooltips *//*
59 $("a,.tt").each(function(){
62 if (e.hasClass("tttop")) pos="top";
63 if (e.hasClass("ttbottom")) pos="bottom";
64 if (e.hasClass("ttleft")) pos="left";
65 if (e.hasClass("ttright")) pos="right";
66 e.tipTip({defaultPosition: pos, edgeOffset: 8});
69 /* setup comment textarea buttons */
70 /* comment textarea buttons needs some "data-*" attributes to work:
71 * data-role="insert-formatting" : to mark the element as a formatting button
72 * data-comment="<string>" : string for "Comment", used by insertFormatting() function
73 * data-bbcode="<string>" : name of the bbcode element to insert. insertFormatting() will insert it as "[name][/name]"
74 * data-id="<string>" : id of the comment, used to find other comment-related element, like the textarea
76 $('body').on('click','[data-role="insert-formatting"]', function(e) {
79 var comment = o.data('comment');
80 var bbcode = o.data('bbcode');
81 var id = o.data('id');
83 Dialog.doImageBrowser("comment", id);
86 insertFormatting(comment, bbcode, id);
89 /* event from comment textarea button popups */
90 /* insert returned bbcode at cursor position or replace selected text */
91 $("body").on("fbrowser.image.comment", function(e, filename, bbcode, id) {
92 console.log("on", id);
94 var textarea = document.getElementById("comment-edit-text-" +id);
95 var start = textarea.selectionStart;
96 var end = textarea.selectionEnd;
97 textarea.value = textarea.value.substring(0, start) + bbcode + textarea.value.substring(end, textarea.value.length);
102 /* setup onoff widgets */
103 $(".onoff input").each(function(){
105 id = $(this).attr("id");
106 $("#"+id+"_onoff ."+ (val==0?"on":"off")).addClass("hidden");
109 $(".onoff > a").click(function(event){
110 event.preventDefault();
111 var input = $(this).siblings("input");
112 var val = 1-input.val();
113 var id = input.attr("id");
114 $("#"+id+"_onoff ."+ (val==0?"on":"off")).addClass("hidden");
115 $("#"+id+"_onoff ."+ (val==1?"on":"off")).removeClass("hidden");
120 /* setup field_richtext */
121 setupFieldRichtext();
124 function close_last_popup_menu() {
125 if(last_popup_menu) {
126 last_popup_menu.hide();
127 last_popup_button.removeClass("selected");
128 last_popup_menu = null;
129 last_popup_button = null;
132 $('a[rel^=#]').click(function(e){
134 var parent = $(this).parent();
135 var isSelected = (last_popup_button && parent.attr('id') == last_popup_button.attr('id'));
136 close_last_popup_menu();
137 if(isSelected) return false;
138 menu = $( $(this).attr('rel') );
141 if (menu.attr('popup')=="false") return false;
142 parent.toggleClass("selected");
144 if (menu.css("display") == "none") {
145 last_popup_menu = null;
146 last_popup_button = null;
148 last_popup_menu = menu;
149 last_popup_button = parent;
153 $('html').click(function() {
154 close_last_popup_menu();
158 $("a.popupbox").colorbox({
160 'transition' : 'elastic'
164 /* notifications template */
165 var notifications_tpl= unescape($("#nav-notifications-template[rel=template]").html());
166 var notifications_all = unescape($('<div>').append( $("#nav-notifications-see-all").clone() ).html()); //outerHtml hack
167 var notifications_mark = unescape($('<div>').append( $("#nav-notifications-mark-all").clone() ).html()); //outerHtml hack
168 var notifications_empty = unescape($("#nav-notifications-menu").html());
170 /* nav update event */
171 $('nav').bind('nav-update', function(e,data){
172 var invalid = $(data).find('invalid').text();
173 if(invalid == 1) { window.location.href=window.location.href }
175 var net = $(data).find('net').text();
176 if(net == 0) { net = ''; $('#net-update').removeClass('show') } else { $('#net-update').addClass('show') }
177 $('#net-update').html(net);
179 var home = $(data).find('home').text();
180 if(home == 0) { home = ''; $('#home-update').removeClass('show') } else { $('#home-update').addClass('show') }
181 $('#home-update').html(home);
183 var intro = $(data).find('intro').text();
184 if(intro == 0) { intro = ''; $('#intro-update').removeClass('show') } else { $('#intro-update').addClass('show') }
185 $('#intro-update').html(intro);
187 var mail = $(data).find('mail').text();
188 if(mail == 0) { mail = ''; $('#mail-update').removeClass('show') } else { $('#mail-update').addClass('show') }
189 $('#mail-update').html(mail);
191 var intro = $(data).find('intro').text();
192 if(intro == 0) { intro = ''; $('#intro-update-li').removeClass('show') } else { $('#intro-update-li').addClass('show') }
193 $('#intro-update-li').html(intro);
195 var mail = $(data).find('mail').text();
196 if(mail == 0) { mail = ''; $('#mail-update-li').removeClass('show') } else { $('#mail-update-li').addClass('show') }
197 $('#mail-update-li').html(mail);
200 var allevents = $(data).find('all-events').text();
201 if(allevents == 0) { allevents = ''; $('#allevents-update').removeClass('show') } else { $('#allevents-update').addClass('show') }
202 $('#allevents-update').html(allevents);
204 var alleventstoday = $(data).find('all-events-today').text();
205 if(alleventstoday == 0) { $('#allevents-update').removeClass('notif-allevents-today') } else { $('#allevents-update').addClass('notif-allevents-today') }
207 var events = $(data).find('events').text();
208 if(events == 0) { events = ''; $('#events-update').removeClass('show') } else { $('#events-update').addClass('show') }
209 $('#events-update').html(events);
211 var eventstoday = $(data).find('events-today').text();
212 if(eventstoday == 0) { $('#events-update').removeClass('notif-events-today') } else { $('#events-update').addClass('notif-events-today') }
214 var birthdays = $(data).find('birthdays').text();
215 if(birthdays == 0) {birthdays = ''; $('#birthdays-update').removeClass('show') } else { $('#birthdays-update').addClass('show') }
216 $('#birthdays-update').html(birthdays);
218 var birthdaystoday = $(data).find('birthdays-today').text();
219 if(birthdaystoday == 0) { $('#birthdays-update').removeClass('notif-birthdays-today') } else { $('#birthdays-update').addClass('notif-birthdays-today') }
221 $(".sidebar-group-li .notify").removeClass("show");
222 $(data).find("group").each(function() {
224 var gcount = this.innerHTML;
225 $(".group-"+gid+" .notify").addClass("show").text(gcount);
228 $(".forum-widget-entry .notify").removeClass("show");
229 $(data).find("forum").each(function() {
231 var fcount = this.innerHTML;
232 $(".forum-"+fid+" .notify").addClass("show").text(fcount);
236 var eNotif = $(data).find('notif')
238 if (eNotif.children("note").length==0){
239 $("#nav-notifications-menu").html(notifications_empty);
241 nnm = $("#nav-notifications-menu");
242 nnm.html(notifications_all + notifications_mark);
243 //nnm.attr('popup','true');
245 var notification_lastitem = parseInt(localStorage.getItem("notification-lastitem"));
246 var notification_id = 0;
247 eNotif.children("note").each(function(){
249 var text = e.text().format("<span class='contactname'>"+e.attr('name')+"</span>");
250 var contact = ("<a href="+e.attr('url')+"><span class='contactname'>"+e.attr('name')+"</span></a>");
251 var seenclass = (e.attr('seen')==1)?"notify-seen":"notify-unseen";
252 var html = notifications_tpl.format(
253 e.attr('href'), // {0} // link to the source
254 e.attr('photo'), // {1} // photo of the contact
255 text, // {2} // preformatet text (autor + text)
256 e.attr('date'), // {3} // date of notification (time ago)
257 seenclass, // {4} // vistiting status of the notification
258 new Date(e.attr('timestamp')*1000), // {5} //date of notification
259 e.attr('url'), // {6} // profile url of the contact
260 e.text().format(""), // {7} // clean status text
261 contact // {8} //preformatat author (name + profile url)
265 $(eNotif.children("note").get().reverse()).each(function(){
267 notification_id = parseInt(e.attr('timestamp'));
268 if (notification_lastitem!== null && notification_id > notification_lastitem) {
269 if (getNotificationPermission()==="granted") {
270 var notification = new Notification(document.title, {
271 body: e.text().replace('→ ','').format(e.attr('name')),
272 icon: e.attr('photo'),
274 notification['url'] = e.attr('href');
275 notification.addEventListener("click", function(ev){
276 window.location = ev.target.url;
282 notification_lastitem = notification_id;
283 localStorage.setItem("notification-lastitem", notification_lastitem)
285 $("img[data-src]", nnm).each(function(i, el){
286 // Add src attribute for images with a data-src attribute
287 // However, don't bother if the data-src attribute is empty, because
288 // an empty "src" tag for an image will cause some browsers
289 // to prefetch the root page of the Friendica hub, which will
290 // unnecessarily load an entire profile/ or network/ page
291 if($(el).data("src") != '') $(el).attr('src', $(el).data("src"));
295 notif = eNotif.attr('count');
297 $("#nav-notifications-linkmenu").addClass("on");
299 $("#nav-notifications-linkmenu").removeClass("on");
301 if(notif == 0) { notif = ''; $('#notify-update').removeClass('show') } else { $('#notify-update').addClass('show') }
302 $('#notify-update').html(notif);
304 var eSysmsg = $(data).find('sysmsgs');
305 eSysmsg.children("notice").each(function(){
306 text = $(this).text();
307 $.jGrowl(text, { sticky: true, theme: 'notice' });
309 eSysmsg.children("info").each(function(){
310 text = $(this).text();
311 $.jGrowl(text, { sticky: false, theme: 'info', life: 5000 });
317 // Allow folks to stop the ajax page updates with the pause/break key
318 $(document).keydown(function(event) {
319 if(event.keyCode == '8') {
320 var target = event.target || event.srcElement;
321 if (!/input|textarea/i.test(target.nodeName)) {
325 if(event.keyCode == '19' || (event.ctrlKey && event.which == '32')) {
326 event.preventDefault();
327 if(stopped == false) {
332 $('#pause').html('<img src="images/pause.gif" alt="pause" style="border: 1px solid black;" />');
346 function NavUpdate() {
349 var pingCmd = 'ping' + ((localUser != 0) ? '?f=&uid=' + localUser : '');
350 $.get(pingCmd,function(data) {
351 $(data).find('result').each(function() {
352 // send nav-update event
353 $('nav').trigger('nav-update', this);
358 if($('#live-network').length) { src = 'network'; liveUpdate(); }
359 if($('#live-profile').length) { src = 'profile'; liveUpdate(); }
360 if($('#live-community').length) { src = 'community'; liveUpdate(); }
361 if($('#live-notes').length) { src = 'notes'; liveUpdate(); }
362 if($('#live-display').length) { src = 'display'; liveUpdate(); }
363 /* if($('#live-display').length) {
366 window.location.href=window.location.href
369 if($('#live-photos').length) {
372 window.location.href=window.location.href
382 timer = setTimeout(NavUpdate,updateInterval);
385 function liveUpdate() {
386 if((src == null) || (stopped) || (! profile_uid)) { $('.like-rotator').hide(); return; }
387 if(($('.comment-edit-text-full').length) || (in_progress)) {
389 clearTimeout(livetime);
391 livetime = setTimeout(liveUpdate, 5000);
397 prev = 'live-' + src;
401 if ($(document).scrollTop() == 0)
404 var udargs = ((netargs.length) ? '/' + netargs : '');
405 var update_url = 'update_' + src + udargs + '&p=' + profile_uid + '&page=' + profile_page + '&force=' + ((force_update) ? 1 : 0);
407 $.get(update_url,function(data) {
409 force_update = false;
410 // $('.collapsed-comments',data).each(function() {
411 // var ident = $(this).attr('id');
412 // var is_hidden = $('#' + ident).is(':hidden');
413 // if($('#' + ident).length) {
414 // $('#' + ident).replaceWith($(this));
416 // $('#' + ident).hide();
421 $('.toplevel_item',data).each(function() {
422 var ident = $(this).attr('id');
424 if($('#' + ident).length == 0 && profile_page == 1) {
425 $('img',this).each(function() {
426 $(this).attr('src',$(this).attr('dst'));
428 $('#' + prev).after($(this));
431 // Find out if the hidden comments are open, so we can keep it that way
432 // if a new comment has been posted
433 var id = $('.hide-comments-total', this).attr('id');
434 if(typeof id != 'undefined') {
435 id = id.split('-')[3];
436 var commentsOpen = $("#collapsed-comments-" + id).is(":visible");
439 $('img',this).each(function() {
440 $(this).attr('src',$(this).attr('dst'));
442 //vScroll = $(document).scrollTop();
443 $('html').height($('html').height());
444 $('#' + ident).replaceWith($(this));
446 if(typeof id != 'undefined') {
447 if(commentsOpen) showHideComments(id);
449 $('html').height('auto');
450 //$(document).scrollTop(vScroll);
455 // reset vars for inserting individual items
457 /* prev = 'live-' + src;
459 $('.wall-item-outside-wrapper',data).each(function() {
460 var ident = $(this).attr('id');
462 if($('#' + ident).length == 0 && prev != 'live-' + src) {
463 $('img',this).each(function() {
464 $(this).attr('src',$(this).attr('dst'));
466 $('#' + prev).after($(this));
469 $('#' + ident + ' ' + '.wall-item-ago').replaceWith($(this).find('.wall-item-ago'));
470 if($('#' + ident + ' ' + '.comment-edit-text-empty').length)
471 $('#' + ident + ' ' + '.wall-item-comment-wrapper').replaceWith($(this).find('.wall-item-comment-wrapper'));
472 $('#' + ident + ' ' + '.hide-comments-total').replaceWith($(this).find('.hide-comments-total'));
473 $('#' + ident + ' ' + '.wall-item-like').replaceWith($(this).find('.wall-item-like'));
474 $('#' + ident + ' ' + '.wall-item-dislike').replaceWith($(this).find('.wall-item-dislike'));
475 $('#' + ident + ' ' + '.my-comment-photo').each(function() {
476 $(this).attr('src',$(this).attr('dst'));
482 $('.like-rotator').hide();
485 $('body').css('cursor', 'auto');
487 /* autocomplete @nicknames */
488 $(".comment-edit-form textarea").contact_autocomplete(baseurl+"/acl");
490 // setup videos, since VideoJS won't take care of any loaded via AJAX
491 if(typeof videojs != 'undefined') videojs.autoSetup();
495 function imgbright(node) {
496 $(node).removeClass("drophide").addClass("drop");
499 function imgdull(node) {
500 $(node).removeClass("drop").addClass("drophide");
503 // Since our ajax calls are asynchronous, we will give a few
504 // seconds for the first ajax call (setting like/dislike), then
505 // run the updater to pick up any changes and display on the page.
506 // The updater will turn any rotators off when it's done.
507 // This function will have returned long before any of these
508 // events have completed and therefore there won't be any
509 // visible feedback that anything changed without all this
510 // trickery. This still could cause confusion if the "like" ajax call
511 // is delayed and NavUpdate runs before it completes.
513 function dolike(ident,verb) {
515 $('#like-rotator-' + ident.toString()).show();
516 $.get('like/' + ident.toString() + '?verb=' + verb, NavUpdate );
521 function dosubthread(ident) {
523 $('#like-rotator-' + ident.toString()).show();
524 $.get('subthread/' + ident.toString(), NavUpdate );
529 function dostar(ident) {
530 ident = ident.toString();
531 $('#like-rotator-' + ident).show();
532 $.get('starred/' + ident, function(data) {
533 if(data.match(/1/)) {
534 $('#starred-' + ident).addClass('starred');
535 $('#starred-' + ident).removeClass('unstarred');
536 $('#star-' + ident).addClass('hidden');
537 $('#unstar-' + ident).removeClass('hidden');
540 $('#starred-' + ident).addClass('unstarred');
541 $('#starred-' + ident).removeClass('starred');
542 $('#star-' + ident).removeClass('hidden');
543 $('#unstar-' + ident).addClass('hidden');
545 $('#like-rotator-' + ident).hide();
549 function doignore(ident) {
550 ident = ident.toString();
551 $('#like-rotator-' + ident).show();
552 $.get('ignored/' + ident, function(data) {
553 if(data.match(/1/)) {
554 $('#ignored-' + ident).addClass('ignored');
555 $('#ignored-' + ident).removeClass('unignored');
556 $('#ignore-' + ident).addClass('hidden');
557 $('#unignore-' + ident).removeClass('hidden');
560 $('#ignored-' + ident).addClass('unignored');
561 $('#ignored-' + ident).removeClass('ignored');
562 $('#ignore-' + ident).removeClass('hidden');
563 $('#unignore-' + ident).addClass('hidden');
565 $('#like-rotator-' + ident).hide();
569 function getPosition(e) {
570 var cursor = {x:0, y:0};
571 if ( e.pageX || e.pageY ) {
576 if( e.clientX || e.clientY ) {
577 cursor.x = e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft) - document.documentElement.clientLeft;
578 cursor.y = e.clientY + (document.documentElement.scrollTop || document.body.scrollTop) - document.documentElement.clientTop;
590 var lockvisible = false;
592 function lockview(event,id) {
593 event = event || window.event;
594 cursor = getPosition(event);
600 $.get('lockview/' + id, function(data) {
601 $('#panel').html(data);
602 $('#panel').css({ 'left': cursor.x + 5 , 'top': cursor.y + 5});
608 function lockviewhide() {
613 function post_comment(id) {
616 $('body').css('cursor', 'wait');
617 $("#comment-preview-inp-" + id).val("0");
620 $("#comment-edit-form-" + id).serialize(),
623 $("#comment-edit-wrapper-" + id).hide();
624 $("#comment-edit-text-" + id).val('');
625 var tarea = document.getElementById("comment-edit-text-" + id);
627 commentClose(tarea,id);
628 if(timer) clearTimeout(timer);
629 timer = setTimeout(NavUpdate,10);
633 window.location.href=data.reload;
642 function preview_comment(id) {
643 $("#comment-preview-inp-" + id).val("1");
644 $("#comment-edit-preview-" + id).show();
647 $("#comment-edit-form-" + id).serialize(),
650 $("#comment-edit-preview-" + id).html(data.preview);
651 $("#comment-edit-preview-" + id + " a").click(function() { return false; });
661 function showHideComments(id) {
662 if( $("#collapsed-comments-" + id).is(":visible")) {
663 $("#collapsed-comments-" + id).hide();
664 $("#hide-comments-" + id).html(window.showMore);
667 $("#collapsed-comments-" + id).show();
668 $("#hide-comments-" + id).html(window.showFewer);
674 function preview_post() {
675 $("#jot-preview").val("1");
676 $("#jot-preview-content").show();
677 tinyMCE.triggerSave();
680 $("#profile-jot-form").serialize(),
683 $("#jot-preview-content").html(data.preview);
684 $("#jot-preview-content" + " a").click(function() { return false; });
689 $("#jot-preview").val("0");
695 // unpause auto reloads if they are currently stopped
698 $('#pause').html('');
703 // Converts the binary representation of data to hex
706 // discuss at: http://phpjs.org/functions/bin2hex
707 // + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
708 // + bugfixed by: Onno Marsman
709 // + bugfixed by: Linuxworld
710 // * example 1: bin2hex('Kev');
711 // * returns 1: '4b6576'
712 // * example 2: bin2hex(String.fromCharCode(0x00));
714 var v,i, f = 0, a = [];
718 for (i = 0; i<f; i++) {
719 a[i] = s.charCodeAt(i).toString(16).replace(/^([\da-f])$/,"0$1");
725 function groupChangeMember(gid, cid, sec_token) {
726 $('body .fakelink').css('cursor', 'wait');
727 $.get('group/' + gid + '/' + cid + "?t=" + sec_token, function(data) {
728 $('#group-update-wrapper').html(data);
729 $('body .fakelink').css('cursor', 'auto');
733 function profChangeMember(gid,cid) {
734 $('body .fakelink').css('cursor', 'wait');
735 $.get('profperm/' + gid + '/' + cid, function(data) {
736 $('#prof-update-wrapper').html(data);
737 $('body .fakelink').css('cursor', 'auto');
741 function contactgroupChangeMember(gid,cid) {
742 $('body').css('cursor', 'wait');
743 $.get('contactgroup/' + gid + '/' + cid, function(data) {
744 $('body').css('cursor', 'auto');
749 function checkboxhighlight(box) {
750 if($(box).is(':checked')) {
751 $(box).addClass('checkeditem');
754 $(box).removeClass('checkeditem');
758 function notifyMarkAll() {
759 $.get('notify/mark/all', function(data) {
760 if(timer) clearTimeout(timer);
761 timer = setTimeout(NavUpdate,1000);
767 // code from http://www.tinymce.com/wiki.php/How-to_implement_a_custom_file_browser
768 function fcFileBrowser (field_name, url, type, win) {
769 /* TODO: If you work with sessions in PHP and your client doesn't accept cookies you might need to carry
770 the session name and session ID in the request string (can look like this: "?PHPSESSID=88p0n70s9dsknra96qhuk6etm5").
771 These lines of code extract the necessary parameters and add them back to the filebrowser URL again. */
774 var cmsURL = baseurl+"/fbrowser/"+type+"/";
776 tinyMCE.activeEditor.windowManager.open({
778 title : 'File Browser',
779 width : 420, // Your dimensions may differ - toy around with them!
782 inline : "yes", // This parameter only has an effect if you use the inlinepopups plugin!
783 close_previous : "no"
791 function setupFieldRichtext(){
794 mode : "specific_textareas",
795 editor_selector: "fieldRichtext",
796 plugins : "bbcode,paste, inlinepopups",
797 theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor,formatselect,code",
798 theme_advanced_buttons2 : "",
799 theme_advanced_buttons3 : "",
800 theme_advanced_toolbar_location : "top",
801 theme_advanced_toolbar_align : "center",
802 theme_advanced_blockformats : "blockquote,code",
803 theme_advanced_resizing : true,
804 paste_text_sticky : true,
805 entity_encoding : "raw",
806 add_unload_trigger : false,
807 remove_linebreaks : false,
808 //force_p_newlines : false,
809 //force_br_newlines : true,
810 forced_root_block : 'div',
812 content_css: baseurl+"/view/custom_tinymce.css",
813 theme_advanced_path : false,
814 file_browser_callback : "fcFileBrowser",
820 * sprintf in javascript
821 * "{0} and {1}".format('zero','uno');
823 String.prototype.format = function() {
824 var formatted = this;
825 for (var i = 0; i < arguments.length; i++) {
826 var regexp = new RegExp('\\{'+i+'\\}', 'gi');
827 formatted = formatted.replace(regexp, arguments[i]);
832 Array.prototype.remove = function(item) {
833 to=undefined; from=this.indexOf(item);
834 var rest = this.slice((to || from) + 1 || this.length);
835 this.length = from < 0 ? this.length + from : from;
836 return this.push.apply(this, rest);
839 function previewTheme(elm) {
840 theme = $(elm).val();
841 $.getJSON('pretheme?f=&theme=' + theme,function(data) {
842 $('#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>');
847 // notification permission settings in localstorage
848 // set by settings page
849 function getNotificationPermission() {
850 if (window["Notification"] === undefined) {
853 if (Notification.permission === 'granted') {
854 var val = localStorage.getItem('notification-permissions');
855 if (val === null) return 'denied';
858 return Notification.permission;
863 * Show a dialog loaded from an url
864 * By defaults this load the url in an iframe in colorbox
865 * Themes can overwrite `show()` function to personalize it
872 * @return object colorbox
874 show : function (url) {
875 var size = Dialog._get_size();
876 return $.colorbox({href: url, iframe:true,innerWidth: size.width+'px',innerHeight: size.height+'px'})
880 * Show the Image browser dialog
883 * @param string id (optional)
886 * The name will be used to build the event name
887 * fired by image browser dialog when the user select
888 * an image. The optional id will be passed as argument
889 * to the event handler
891 doImageBrowser : function (name, id) {
892 var url = Dialog._get_url("image",name,id);
893 return Dialog.show(url);
897 * Show the File browser dialog
900 * @param string id (optional)
903 * The name will be used to build the event name
904 * fired by file browser dialog when the user select
905 * a file. The optional id will be passed as argument
906 * to the event handler
908 doFileBrowser : function (name, id) {
909 var url = Dialog._get_url("file",name,id);
910 return Dialog.show(url);
913 _get_url : function(type, name, id) {
915 if (id !== undefined) hash = hash + "-" + id;
916 return baseurl + "/fbrowser/"+type+"/?mode=minimal#"+hash;
919 _get_size: function() {
921 width: window.innerWidth-50,
922 height: window.innerHeight-100