Mercurial Hosting > nabble
diff src/nabble/view/naml/javascript_library.naml @ 0:7ecd1a4ef557
add content
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 21 Mar 2019 19:15:52 -0600 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/nabble/view/naml/javascript_library.naml Thu Mar 21 19:15:52 2019 -0600 @@ -0,0 +1,517 @@ +<macro name="javascript_library" requires="servlet"> + <n.uncache_for/> + <n.javascript_response/> + <n.js_basic_nabble_functions/> + <n.js_basic_embedding_code/> + <n.js_basic_site_functions/> + <n.js_date_functions/> + <n.js_header_functions/> + <n.js_delete_functions/> + <n.js_topic_and_post_functions/> + <n.js_search_functions/> +</macro> + +<macro name="javascript_library_path"> + <n.encode_url.> + /template/NamlServlet.jtp?macro=javascript_library&v=<n.javascript_version/> + </n.encode_url.> +</macro> + +<macro name="js_basic_embedding_code"> + var host = "<n.get_request_header name="host"/>"; + <![CDATA[ + Nabble.embeddingUrl = null; + Nabble.embedForumID = 0; + Nabble.isEmbedded = false; + + try { + var info = Nabble.getParent().nabbleinfo.location.search.substring(6); + info = decodeURIComponent(info); + var pos = info.indexOf('&'); + Nabble.embedForumID = info.substring(0, pos); + var hash = Nabble.getParent().nabbleinfo.location.hash.substring(1).split('|'); + Nabble.embeddingUrl = hash[0]; + Nabble.isEmbedded = true; + } catch(err) {} + + Nabble.getClientID = function(c) { + return ''; + }; + + Nabble.embeddedTarget = function(defaultTarget) { + return Nabble.isEmbedded? ' target="nabbleiframe" ' : ' target="' + defaultTarget + '" '; + }; + + Nabble.height = function() { + if( typeof( window.innerHeight ) == 'number' ) { + return window.innerHeight; + } else if( document.documentElement && document.documentElement.clientHeight ) { + return document.documentElement.clientHeight; + } else if( document.body && document.body.clientHeight ) { + return document.body.clientHeight; + } + }; + + Nabble.knowsHeight = navigator.userAgent.toLowerCase().indexOf('safari') == -1; + + Nabble.canScroll = function() { + try{ + return Nabble.getParent().nabbleinfo.canScroll(); + } catch(er) {} + return true; + }; + + Nabble.hash = function() { + var _hash = location.hash; + if (Nabble.getParent().nabbleinfo && Nabble.getParent().nabbleinfo.hash) { + if (!_hash) + _hash = '#' + Nabble.getParent().nabbleinfo.hash; + Nabble.getParent().nabbleinfo.hash = null; + } + return _hash; + }; + + Nabble.setTop = function(url) { + if (Nabble.isEmbedded) Nabble.getParent().nabbleiframe.location=url; + else top.location=url; + }; + + Nabble.getMyHeight = function() { + try { + return $(document.body).outerHeight(); + } catch(err) {} + return 500; + }; + + Nabble.evalInTop = function(key, js) { + var p = ''; + for (var i = 0; i < js.length; i++) { + p += 'v=' + key[i] + '|' + encodeURIComponent(js[i]) + '&'; + } + if (p.length > 0) { + var url = "/util/SessionService.jtp?action=set&" + p + "cid=" + Nabble.getParent().nabbleinfo.clientID + "&_=" + new Date().getTime(); + $.get(url, function() { + Nabble.getParent().nabbleresize.location = "/util/Empty.jtp"; + }); + } + }; + + Nabble.quote = function(s) { + return '"' + s.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/"/g,'\\"') + '"'; + }; + + Nabble.heightLimit = 32767; + Nabble.resizeCount = 0; + + Nabble.isValidHeight = function(height) { + var isBadBrowser = $.browser.mozilla || $.browser.opera; + var exceeded = height > Nabble.heightLimit && isBadBrowser; + return !exceeded; + }; + + Nabble.resizeFrames = function(h, scroll) { + if (Nabble.getParent().nabbleresize) { + var height = h && typeof h == 'number'? h : Math.max(Nabble.getMyHeight() + 25, 600); + var validHeight = Nabble.isValidHeight(height); + height = validHeight? height : Nabble.heightLimit; + var js = [], key = []; + if (scroll) { + js.push("Nabble.scroll(" + scroll + ");"); + key.push("scrolljs"); + } + if (height != $(window).height() || Nabble.resizeCount++ == 0) { + js.push("Nabble.resizeFrames(" + height + "," + Nabble.quote(document.title) + "," + validHeight + ");"); + key.push("resizejs"); + } + if (js.length > 0) + Nabble.evalInTop(key, js); + } + }; + + Nabble.restartEmbedding = function(nodeId, baseUrl) { + if (Nabble.getParent().nabbleresize) { + var js = ['Nabble.restart(' + nodeId + ',"' + baseUrl + '");']; + Nabble.evalInTop(['others'], js); + } + }; + + $(document).ready(function(){ + if (Nabble.isEmbedded) { + Nabble.resizeFrames('', 1); + $(window).resize(Nabble.resizeFrames); + $(window).load(function() { + Nabble.resizeFrames(); + }); + } + }); + ]]> +</macro> + +<macro name="js_basic_site_functions" requires="servlet"> + <![CDATA[ + Nabble.online = function(id) { + $('img.online'+id).show(); + }; + + Nabble.openMsg = function(id) { + return Nabble.getCookie(id) == null; + }; + + Nabble.toggleMsg = function(id, hide) { + if (hide) + Nabble.setPersistentCookie(id, 'closed'); + else + Nabble.deleteCookie(id); + }; + ]]> +</macro> + +<macro name="js_date_functions" requires="servlet"> + Nabble.months = ["<t>Jan</t>","<t>Feb</t>","<t>Mar</t>","<t>Apr</t>","<t>May</t>","<t>Jun</t>","<t>Jul</t>","<t>Aug</t>","<t>Sep</t>","<t>Oct</t>","<t>Nov</t>","<t>Dec</t>"]; + <![CDATA[ + Nabble.now = new Date(); + Nabble.fmt2 = function(i) { return i <= 9? '0'+i:i; }; + + Nabble.isToday = function(date) { + return date.toDateString() == this.now.toDateString(); + }; + + Nabble.isThisYear = function(date) { + return date.getYear() == this.now.getYear(); + }; + + Nabble.dateFormatters = { + us: new (function(){ + this.formatTime = function(date) { + var hours = date.getHours(); + if (hours < 12) { + var xm = "am"; + if (hours==0) + hours = 12; + } else { + var xm = "pm"; + if (hours > 12) + hours -= 12; + } + return hours + ":" + Nabble.fmt2(date.getMinutes()) + xm; + }; + this.formatDateOnly = function(date) { + return Nabble.months[date.getMonth()] + " " + Nabble.fmt2(date.getDate()) + ", " + date.getFullYear(); + }; + this.formatDateLong = function(date) { + return this.formatDateOnly(date) + "; " + this.formatTime(date); + }; + this.formatDateShort = function(date) { + if( Nabble.isToday(date) ) + return this.formatTime(date); + if( Nabble.isThisYear(date) ) + return Nabble.months[date.getMonth()] + " " + Nabble.fmt2(date.getDate()); + return this.formatDateOnly(date); + }; + })() + , + euro: new (function(){ + this.formatTime = function(date) { + return Nabble.fmt2(date.getHours()) + ":" + Nabble.fmt2(date.getMinutes()); + }; + this.formatDateOnly = function(date) { + return Nabble.fmt2(date.getDate()) + "." + Nabble.months[date.getMonth()] + "." + date.getFullYear(); + }; + this.formatDateLong = function(date) { + return this.formatTime(date) + ", " + this.formatDateOnly(date); + }; + this.formatDateShort = function(date) { + if( Nabble.isToday(date) ) + return this.formatTime(date); + if( Nabble.isThisYear(date) ) + return Nabble.fmt2(date.getDate()) + "." + Nabble.months[date.getMonth()]; + return this.formatDateOnly(date); + }; + })() + , + tech: new (function(){ + this.formatTime = function(date) { + return Nabble.fmt2(date.getHours()) + ":" + Nabble.fmt2(date.getMinutes()); + }; + this.formatDateOnly = function(date) { + return "" + date.getFullYear() + "-" + Nabble.fmt2(date.getMonth()+1) + "-" + Nabble.fmt2(date.getDate()) + }; + this.formatDateLong = function(date) { + return this.formatDateOnly(date) + " " + this.formatTime(date); + }; + this.formatDateShort = function(date) { + if( Nabble.isToday(date) ) + return this.formatTime(date); + if( Nabble.isThisYear(date) ) + return Nabble.fmt2(date.getMonth()+1) + "-" + Nabble.fmt2(date.getDate()); + return this.formatDateOnly(date); + }; + })() + }; + + Nabble.getDateFmt = function() { + var dateFmt = Nabble.getCookie("date_fmt"); + return dateFmt==null ? "us" : dateFmt; + }; + + Nabble.formatDateOnly = function(date) { + return Nabble.dateFormatters[Nabble.getDateFmt()].formatDateOnly(date); + }; + + Nabble.formatTimeOnly = function(date) { + return Nabble.dateFormatters[Nabble.getDateFmt()].formatTime(date); + }; + + Nabble.formatDateLong = function(date) { + return Nabble.dateFormatters[Nabble.getDateFmt()].formatDateLong(date); + }; + + Nabble.formatDateShort = function(date) { + var fmt = Nabble.dateFormatters[Nabble.getDateFmt()]; + return '<span title="' + fmt.formatDateLong(date) + '">' + + fmt.formatDateShort(date) + '</span>'; + }; + ]]> +</macro> + +<macro name="js_topic_and_post_functions" requires="servlet"> + <![CDATA[ + Nabble.messageTextWidth = function() { + var maxWidth = Nabble.getCookie("max_width"); + if( maxWidth==null ) + return; + document.write("<style type='text/css'>.nabble .message-text {max-width: "+maxWidth+";}</style>"); + }; + + Nabble.setFontSize = function() { + var fontSize = Nabble.getCookie("font_size"); + if (fontSize) + document.write("<style type='text/css'>body, table .nabble {font-size: "+fontSize+";}</style>"); + }; + + Nabble.hideQuotes = function(context) { + $('div.shrinkable-quote,blockquote',context).each(function() { + var $this = $(this); + if ($this.outerHeight() > 300) { + $this.after("<div class='shrink-quote'><span></span> [<a href='javascript:void(0)'></a>]</div>"); + } + }); + $('div.shrink-quote a', context) + .click(function(){ + var $this = $(this); + var v = parseInt($this.attr('collapsed') || 1) % 2; + if (v == 0) { + $this.prev().html( "« " ); + $this.html( "hide part of quote" ); + var $text = $this.parent().prev(); + $text.css( 'height', 'auto' ); + $text.css( 'overflowY', 'auto' ); + } else { + $this.prev().html( "..." ); + $this.html( "show rest of quote" ); + var $text = $this.parent().prev(); + $text.css('height', '300px'); + $text.css('overflowY', 'hidden' ); + } + $this.attr('collapsed', v+1); + Nabble.resizeFrames(); + }) + .click() + ; + }; + ]]> +</macro> + +<macro name="js_header_functions" requires="servlet"> + var t_login = "<t>Login</t>"; + var t_register = "<t>Register</t>"; + var t_logout = "<t>Log out</t>"; + var t_my_posts = "<t>My posts</t>"; + var t_account_settings = "<t>Account settings</t>"; + var t_show_nabble_notice = "<t>Show Nabble notice</t>"; + var t_permalink = "<t>Permalink</t>"; + var t_refresh = "<t>Refresh</t>"; + var login_path = "<n.login_path/>"; + var logout_path = "<n.logout_path/>"; + var register_path = "<n.register_path/>"; + var user_profile_path = "<n.user_profile_path/>"; + <![CDATA[ + Nabble.userId = Nabble.getCookie("userId"); + var encodedUsername = Nabble.getCookie("username"); + if (encodedUsername) { + Nabble.username = decodeURIComponent(encodedUsername) + .replace(new RegExp('\\+','g'),' '); + } + + if (!Nabble.userId) { + Nabble.anonymousId = Nabble.getCookie("anonymousId"); + var encodedName = Nabble.getCookie("anonymousName"); + if (encodedName) { + Nabble.anonymousName = decodeURIComponent(encodedName) + .replace(new RegExp('\\+','g'),' ') + .replace(new RegExp('<','g'),'<') + .replace(new RegExp('>','g'),'>'); + } + } + + Nabble.getPermalink = function() { + return Nabble.getParent().nabbleiframe.location.href; + }; + + Nabble.permalinkLabel = function() { + if (!Nabble.isEmbedded) + return ''; + var p = "<script>function openPermalink() { prompt('Copy this:', Nabble.getPermalink()); };</script>"; + p += "<a href='javascript: void openPermalink();'>"+t_permalink+"</a> "; + return p; + }; + + Nabble.refreshLabel = function() { + if (Nabble.isEmbedded) + return "<a href='javascript: location.reload(true);'>"+t_refresh+"</a> "; + return ''; + }; + + Nabble.siteHeader = function() { + var s = Nabble.refreshLabel(); + s += Nabble.permalinkLabel(); + if (!Nabble.userId) { + var nextUrl = typeof loginNextUrl == 'undefined'? window.location.href : loginNextUrl; + s += '<a href="'+login_path+'&nextUrl='+encodeURIComponent(nextUrl)+'">'+t_login+'</a>'; + s += ' '; + s += '<a href="'+register_path+'&nextUrl='+encodeURIComponent(nextUrl)+'">'+t_register+'</a>'; + if (Nabble.anonymousId && Nabble.anonymousName) { + s += ' '; + s += '<a href="/template/NamlServlet.jtp?macro=user_nodes&user=' + Nabble.anonymousId + '~' + Nabble.anonymousName + '">'; + s += Nabble.anonymousName; + s += '</a>'; + } + } else + s += '<span id="user-dd"></span>'; + return s; + }; + + Nabble.userDropdown = function() { + var $t = $('#user-dd'); + if ($t.size() == 0) + return; + $t.empty(); + var dropdown = new NabbleDropdown('usrdd', Nabble.escapeHTML(Nabble.username)); + dropdown.add('myPosts','<a href="/template/NamlServlet.jtp?macro=user_nodes&user='+Nabble.userId + '">'+t_my_posts+'</a>'); + dropdown.add('personalSettings','<a href="'+user_profile_path+'">'+t_account_settings+'</a>'); + dropdown.add('adminNotice','<a href="javascript: void Nabble.showAdminNotice()">'+t_show_nabble_notice+'</a>','display:none'); + dropdown.add('logout','<a href="javascript: void Nabble.logout()">'+t_logout+'</a>'); + $t.html(dropdown.getHtml()); + dropdownInit('usrdd'); + }; + + Nabble.addUserHeaderListener(function() { + Nabble.userDropdown(); + }); + + Nabble.showAdminNotice = function() { + Nabble.deleteCookie('admin-notice'); + window.location.reload(); + }; + + Nabble.logout = function() { + window.location = '/template/NamlServlet.jtp?macro=logout_page'; + }; + ]]> +</macro> + +<macro name="js_delete_functions" requires="servlet"> + var t_confirm_delete_post = "<t>Do you really want to delete this post?</t>"; + var t_confirm_delete_post_recursively = "<t>Do you really want to permanently delete this message and all replies?</t>"; + var t_caution_cannot_revert = "<t>CAUTION: this action cannot be reverted.</t>"; + <![CDATA[ + Nabble.deletePost = function(postId) { + if (!confirm(t_confirm_delete_post)) + return; + var newLocation = "/template/NamlServlet.jtp?macro=delete_post&node="+postId; + Nabble.setTop(newLocation); + }; + + Nabble.deleteFromSite = function(nodeId) { + if( !confirm(t_confirm_delete_post_recursively+"\n\n"+t_caution_cannot_revert) ) + return; + var newLocation = "/template/NamlServlet.jtp?macro=delete_from_site&node="+nodeId; + Nabble.setTop(newLocation); + }; + ]]> +</macro> + +<macro name="js_search_functions" requires="servlet"> + <![CDATA[ + Nabble.highlightSearchTerms = function(searchterms, elem) { + if (elem.childNodes && elem.childNodes.length > 0) { + for (var i=0; i<elem.childNodes.length; i++) { + this.highlightSearchTerms(searchterms, elem.childNodes[i]); + } + } else if (elem.nodeType) { + if (elem.nodeType == document.TEXT_NODE || elem.nodeType == 3) { + var txt = elem.nodeValue; + var rgx = new RegExp("\\b("+searchterms+")\\w*\\b", "gi"); + var result; + var start = 0; + var newFragment = document.createElement("span"); + while ((result = rgx.exec(txt)) != null) { + var end = result.index; + var textNode = document.createTextNode(txt.slice(start, end)); + newFragment.appendChild(textNode); + var hlNode = document.createElement("span"); + hlNode.className = "bold highlight search-highlight"; + hlNode.appendChild(document.createTextNode(result[0])); + newFragment.appendChild(hlNode); + start = end + result[0].length; + Nabble.hasHighlightedTerms = true; + } + newFragment.appendChild(document.createTextNode(txt.slice(start))); + elem.parentNode.replaceChild(newFragment, elem); + } + } + }; + + Nabble.getSearchTerms = function() { + var searchterms = this.getCookie("searchterms"); + if (document.referrer) { + var result = Nabble.getSearchTerms2(document.referrer); + if (result!=null) { + var query = decodeURIComponent(result); + searchterms = query.replace(/\W+/g,"|").replace(/^\|/,"").replace(/\|$/,""); + this.setCookie("searchterms", searchterms); + Nabble.gquery = query.replace(/\+/g," "); + } + } + return searchterms; + }; + + /* Logic from _uOrg() in urchin.js */ + Nabble.getSearchTerms2 = function(referrer) { + if (typeof(_uOsr)=="undefined" || typeof(_uOkw)=="undefined") + return null; + var searchEngines = _uOsr; /* from urchin */ + var searchQueries = _uOkw; /* from urchin */ + var i; + if (referrer==null || (i=referrer.indexOf("://")) < 0) + return null; + var h = referrer.substring(i+3); + var p = h.indexOf("/"); + if (p > -1) + h = h.substring(0,p); + for (var j=0; j<searchEngines.length; j++) { + var engine = searchEngines[j]; + var query = searchQueries[j]; + if (h.toLowerCase().indexOf(engine.toLowerCase()) > -1) { + if ((i=referrer.indexOf("?"+query+"=")) > -1 || (i=referrer.indexOf("&"+query+"=")) > -1) { + var k = referrer.substring(i+query.length+2,referrer.length); + if ((i=k.indexOf("&")) > -1) + k = k.substring(0,i); + return k; + } + } + } + return null; + }; + ]]> +</macro>