view src/nabble/view/web/embed/JsEmbed.jtp @ 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 source

<%
package nabble.view.web.embed;

import fschmidt.util.java.HtmlUtils;
import fschmidt.util.servlet.JtpContext;
import nabble.model.ModelHome;
import nabble.model.Node;
import nabble.model.Site;
import nabble.view.lib.Jtp;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;


public final class JsEmbed extends HttpServlet {

	private static final Logger logger = LoggerFactory.getLogger(JsEmbed.class);

	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException
	{
		response.setHeader("Content-Type","application/x-javascript");
		PrintWriter out = response.getWriter();

		long siteId = Jtp.getLong(request, "site");
		Site site = ModelHome.getSite(siteId);
		if (site == null) {
			response.sendError(HttpServletResponse.SC_NOT_FOUND, "Site not found");
			return;
		}

		long nodeId = Jtp.getLong(request, "node");
		Node node = site.getNode(nodeId);

		// cache the page
		List<String> events = new ArrayList<String>();
		Jtp.addBreadCrumbEvents( events, site.getRootNode() );
		JtpContext jtpContext = (JtpContext)getServletContext().getAttribute(JtpContext.attrName);
		jtpContext.setEtag(request,response, events.toArray( new String[events.size()] ) );

		String baseUrl = Jtp.getBaseUrl(request);

		String embedUrl = request.getParameter("url");
		logger.info("URL=" + embedUrl);

		embedUrl = HtmlUtils.urlDecode(embedUrl);
		int pos = embedUrl.indexOf("#nabble-");
		String defaultUrl = node == null ? null : baseUrl+Jtp.path(node);
		if (pos > 0) {
			String sufix = embedUrl.substring(pos+7);
			// if sufix contains #a (with post id)
			int posHash = sufix.indexOf('|');
			if (posHash > 0) {
				sufix = sufix.substring(0, posHash);
			}
			defaultUrl = baseUrl + '/' + sufix + ".html";
		}
		%>
		var Nabble = new Object();
		Nabble.defaultHeight = 700;
		Nabble.currentHeight = 0;
		Nabble.counter = 0;
		Nabble.title = document.title == ""? "" : document.title + " - ";
		Nabble.resizeTimeoutID;
		Nabble.context = '<%=baseUrl%>';
		Nabble.defaultUrl = '<%=defaultUrl%>';

		Nabble.get = function(id) { return document.getElementById(id); };

		Nabble.resizeTimeout = function() {
			Nabble.resizeTimeoutID = setTimeout(Nabble.showMoreLink, 6000);
		};

		Nabble.cancelTimeout = function() {
			if (Nabble.resizeTimeoutID) {
				clearInterval(Nabble.resizeTimeoutID);
				Nabble.get('nabblemore').style.display = 'none';
				Nabble.resizeTimeoutID = null;
			}
		};

		Nabble.showMoreLink = function() {
			if (Nabble.resizeTimeoutID) {
				Nabble.get('nabblemore').style.display = 'block';
			}
		};

        Nabble.showMore = function() {
			if (Nabble.currentHeight == 0)
				Nabble.currentHeight = Nabble.defaultHeight;
			Nabble.currentHeight += 300;
			Nabble.get('nabbleiframe').style.height = Nabble.currentHeight + 'px';
		};

		Nabble.escape = function(value) {
			if (typeof value == 'string') {
				var hasSpace = value.indexOf(' ') >= 0;
				var hasQuote = value.indexOf('"') >= 0;

				value = value.replace(/\;/g, '%3B');
				value = value.replace(/"/g, '\\"');

				if (hasSpace || hasQuote)
					value = '"' + value + '"';
			}
			return value;
		};

		Nabble.unescape = function(value) {
			if (value.charAt(0) == '"' && value.charAt(value.length-1) == '"')
				value = value.substring(1, value.length-1);

			value = value.replace(/\\"/g, '"');
			value = value.replace(/%3B/g, ';');
			return value;
		};

        Nabble.setCookie = function(name, value) {
			name = name+'<%=siteId%>';
			document.cookie = name + "=" + Nabble.escape(value) + "; path=/";
		};

		Nabble.getCookie = function(name) {
			name = name+'<%=siteId%>';
			var dc = document.cookie;
			var prefix = name + "=";
			var begin = dc.indexOf("; " + prefix);
			if (begin == -1) {
				begin = dc.indexOf(prefix);
				if (begin != 0) return null;
			} else
				begin += 2;
			var end = document.cookie.indexOf(";", begin);
			if (end == -1)
				end = dc.length;
			return Nabble.unescape(dc.substring(begin + prefix.length, end));
		};

		Nabble.setPersistentCookie = function(name, value) {
			name = name+'<%=siteId%>';
			var expires = new Date();
			expires.setFullYear(expires.getFullYear()+10);
			var curCookie = name + "=" + Nabble.escape(value) + "; expires=" + expires.toGMTString() + "; path=/";
			document.cookie = curCookie;
		};

        Nabble.deleteCookie = function(name) {
			name = name+'<%=siteId%>';
			document.cookie = name + "=" +
			"; path=/"  +
			"; expires=Thu, 01-Jan-1970 00:00:01 GMT";
		};

		Nabble.noHash = function(url) {
			var pos = url.indexOf('#');
			return (pos>-1)?url.substring(0, pos):url;
		};

		Nabble.debug = function(s) {
			if (Nabble.debugElement == 0)
				return;
			if (!Nabble.debugElement) {
				Nabble.debugElement = Nabble.get('debug');
				if (!Nabble.debugElement) {
					Nabble.debugElement = 0;
					return;
				}
			}
			Nabble.debugElement.innerHTML = Nabble.debugElement.innerHTML+s+'<br/>';
		};

		Nabble.loadScript = function(url) {
			Nabble.debug('Loading script: ' + url);
			var e = document.createElement("script");
			e.src = url;
			e.type="text/javascript";
			document.getElementsByTagName("head")[0].appendChild(e);
		};

		Nabble.getJs = function(keys) {
			if (!window.clientID)
				return;
			var p = '';
			for (var i=0;i<keys.length;i++) {
				p += '&key=' + keys[i];
			}
			var url = Nabble.context+"/util/SessionService.jtp?action=get" + p + "&cid=" + window.clientID + "&_=" + new Date().getTime();
			Nabble.loadScript(url);
		};

		Nabble.scroll = function(y) {
			Nabble.debug('[scroll] y=' + y);
			if (y == 1 && window.nabble_scroll_top) {
				scrollTo(0, 0);
			} else if (y > 0 && !window.nabble_ignore_scroll) {
				var obj = Nabble.get('nabbleiframe');
				do {
					y += obj.offsetTop;
				} while (obj = obj.offsetParent);
				scrollTo(0, y);
			}
		};

		Nabble.resizeFrames = function(height,title,validHeight) {
			if (document.title != title && !window.nabble_ignore_title)
				document.title = title;
			Nabble.debug('[resizeFrames] Counter = ' + (Nabble.counter++) + ' Height = ' + height + ' Title=[' + title + '] History=' + history.length + ' -- cid=' + window.clientID);

			if (height != Nabble.currentHeight) {
				Nabble.currentHeight = height;
       			var f = Nabble.get('nabbleiframe');
				if (f) {
					f.scrolling = validHeight? 'no' : 'auto';
					Nabble.debug('Scrolling=' + f.scrolling);
					f.style.height = height + 'px';
					Nabble.cancelTimeout();
				}
			}
		};

		Nabble.getCurrentUrl = function() {
			var currentUrl = Nabble.defaultUrl;
			if (Nabble.hash.indexOf('#nabble+') == 0) {
				var path = Nabble.hash.substring(8);
				path = decodeURIComponent(path);
				path = path
					.replace(/</g,'%3C')
					.replace(/>/g,'%3E')
					.replace(/"/g,'%22')
					.replace(/'/g,'%27');
				currentUrl = Nabble.context+"/" + path;
			}
			currentUrl += Nabble.realHash == ''? '' : '#' + Nabble.realHash;
			return currentUrl;
		};

		Nabble.getClientID = function() {
			var clientID = Nabble.getCookie('clientID');
			if (!clientID) {
            	clientID = new Date().getTime() + '-' + Math.ceil(Math.random() * 1000);
				Nabble.setCookie('clientID', clientID);
			}
			return clientID;
		};

		Nabble.restart = function(nodeId, baseUrl) {
			Nabble.debug('Restart -- baseUrl=' + baseUrl);
			Nabble.context = baseUrl;
			Nabble.defaultUrl = baseUrl+'/';
			Nabble.start();
		};

		Nabble.getConf = function() {
			return window.nabble_ignore_scroll? 'noscroll;':'';
		};

		Nabble.start = function() {
			Nabble.infoLoaded = false;
			window.clientID = Nabble.getClientID();

			<% /* Hash processing */ %>
			var hash = location.hash;
			var pipe = hash.indexOf('|');
			var realHash = '';
			if (pipe > 0) {
				<%/*
					If there is a pipe in the hash, the value after it is the
					hash of the original URL, which must be restored.
					For Example:
					#nabble-t100|a123
				*/%>
				realHash = hash.substring(pipe);
				hash = hash.replace(realHash, '');
				realHash = realHash.substring(1);
			}
			<%/* save the hash and realHash variables because the getCurrentUrl() method will need them.. */%>
			Nabble.hash = hash;
			Nabble.realHash = realHash;
			Nabble.infoUrl = Nabble.context+"/embed/EmbedInfo.jtp?node=<%=nodeId%>&cid=" + window.clientID + "&hash=" + realHash + '&conf=' + Nabble.getConf() + "&_=" + new Date().getTime() + "#" + Nabble.noHash(location.href);
			var emptyUrl = Nabble.context+"/util/Empty.jtp";
			var html = "<div id='nabblemain'><div style='height:700px'><img src='<%=baseUrl%>/images/loading.png' width=94 height=33 alt='Loading...'></div></div>";
			html += "<div id='nabblemore' style='display:none'><a href=\"javascript: void Nabble.showMore()\">view more</a></div>";
			html += "<iframe name='nabbleinfo' id='nabbleinfo' width='1' height='1' style='display:none' src=''></iframe>";
			html += "<iframe name='nabbleresize' onload='Nabble.getJs([\"resizejs\", \"scrolljs\", \"others\"])' width='1' height='1' style='display:none' src='" + emptyUrl + "'></iframe>";
			html += "<iframe name='nabbleready' onload='Nabble.loadMain()' width='1' height='1' style='display:none' src='" + emptyUrl + "'></iframe>";
			var div = Nabble.get('nabbleforum');
			div.innerHTML = html;
		};

		<%/*
			1 - Loads the main page as the last page in order to allow the
				embedding code to run before it.
			2 - We must load the iframe using a string because IE (and some
				other browsers) have problems to load an iframe through the DOM.
			3 - The loadMain() function is called when the 'nabbleready' iframe is loaded.
				Note that this iframe doesn't have an initial URL. The first URL is provided in EmbedInfo.jtp.
		*/%>
		Nabble.loadMain = function() {
			Nabble.debug('Loading main page...infoLoaded='+Nabble.infoLoaded);
			if (!Nabble.infoLoaded) {
				Nabble.debug('InfoUrl='+Nabble.infoUrl);
				Nabble.get('nabbleinfo').setAttribute('src',Nabble.infoUrl);
				Nabble.infoLoaded = true;
				return;
			}
			var width = window.nabble_width? window.nabble_width : '100%';
			var currentUrl = Nabble.getCurrentUrl();
			Nabble.debug('CurrentUrl='+currentUrl);
			var m = '<iframe name="nabbleiframe" id="nabbleiframe" src="' + currentUrl + '" width="' + width + '" height="' + Nabble.defaultHeight + '" frameBorder="0" scrolling="no" allowtransparency="true"></iframe>';
			Nabble.get('nabblemain').innerHTML = m;
			Nabble.resizeTimeout();
		}

		Nabble.start();
		<%
	}
}
%>