0
|
1 <%
|
|
2 package nabble.view.web.embed;
|
|
3
|
|
4 import fschmidt.util.java.HtmlUtils;
|
|
5 import fschmidt.util.servlet.JtpContext;
|
|
6 import nabble.model.ModelHome;
|
|
7 import nabble.model.Node;
|
|
8 import nabble.model.Site;
|
|
9 import nabble.view.lib.Jtp;
|
|
10 import org.slf4j.Logger;
|
|
11 import org.slf4j.LoggerFactory;
|
|
12
|
|
13 import javax.servlet.ServletException;
|
|
14 import javax.servlet.http.HttpServlet;
|
|
15 import javax.servlet.http.HttpServletRequest;
|
|
16 import javax.servlet.http.HttpServletResponse;
|
|
17 import java.io.IOException;
|
|
18 import java.io.PrintWriter;
|
|
19 import java.util.ArrayList;
|
|
20 import java.util.List;
|
|
21
|
|
22
|
|
23 public final class JsEmbed extends HttpServlet {
|
|
24
|
|
25 private static final Logger logger = LoggerFactory.getLogger(JsEmbed.class);
|
|
26
|
|
27 protected void service(HttpServletRequest request, HttpServletResponse response)
|
|
28 throws ServletException, IOException
|
|
29 {
|
|
30 response.setHeader("Content-Type","application/x-javascript");
|
|
31 PrintWriter out = response.getWriter();
|
|
32
|
|
33 long siteId = Jtp.getLong(request, "site");
|
|
34 Site site = ModelHome.getSite(siteId);
|
|
35 if (site == null) {
|
|
36 response.sendError(HttpServletResponse.SC_NOT_FOUND, "Site not found");
|
|
37 return;
|
|
38 }
|
|
39
|
|
40 long nodeId = Jtp.getLong(request, "node");
|
|
41 Node node = site.getNode(nodeId);
|
|
42
|
|
43 // cache the page
|
|
44 List<String> events = new ArrayList<String>();
|
|
45 Jtp.addBreadCrumbEvents( events, site.getRootNode() );
|
|
46 JtpContext jtpContext = (JtpContext)getServletContext().getAttribute(JtpContext.attrName);
|
|
47 jtpContext.setEtag(request,response, events.toArray( new String[events.size()] ) );
|
|
48
|
|
49 String baseUrl = Jtp.getBaseUrl(request);
|
|
50
|
|
51 String embedUrl = request.getParameter("url");
|
|
52 logger.info("URL=" + embedUrl);
|
|
53
|
|
54 embedUrl = HtmlUtils.urlDecode(embedUrl);
|
|
55 int pos = embedUrl.indexOf("#nabble-");
|
|
56 String defaultUrl = node == null ? null : baseUrl+Jtp.path(node);
|
|
57 if (pos > 0) {
|
|
58 String sufix = embedUrl.substring(pos+7);
|
|
59 // if sufix contains #a (with post id)
|
|
60 int posHash = sufix.indexOf('|');
|
|
61 if (posHash > 0) {
|
|
62 sufix = sufix.substring(0, posHash);
|
|
63 }
|
|
64 defaultUrl = baseUrl + '/' + sufix + ".html";
|
|
65 }
|
|
66 %>
|
|
67 var Nabble = new Object();
|
|
68 Nabble.defaultHeight = 700;
|
|
69 Nabble.currentHeight = 0;
|
|
70 Nabble.counter = 0;
|
|
71 Nabble.title = document.title == ""? "" : document.title + " - ";
|
|
72 Nabble.resizeTimeoutID;
|
|
73 Nabble.context = '<%=baseUrl%>';
|
|
74 Nabble.defaultUrl = '<%=defaultUrl%>';
|
|
75
|
|
76 Nabble.get = function(id) { return document.getElementById(id); };
|
|
77
|
|
78 Nabble.resizeTimeout = function() {
|
|
79 Nabble.resizeTimeoutID = setTimeout(Nabble.showMoreLink, 6000);
|
|
80 };
|
|
81
|
|
82 Nabble.cancelTimeout = function() {
|
|
83 if (Nabble.resizeTimeoutID) {
|
|
84 clearInterval(Nabble.resizeTimeoutID);
|
|
85 Nabble.get('nabblemore').style.display = 'none';
|
|
86 Nabble.resizeTimeoutID = null;
|
|
87 }
|
|
88 };
|
|
89
|
|
90 Nabble.showMoreLink = function() {
|
|
91 if (Nabble.resizeTimeoutID) {
|
|
92 Nabble.get('nabblemore').style.display = 'block';
|
|
93 }
|
|
94 };
|
|
95
|
|
96 Nabble.showMore = function() {
|
|
97 if (Nabble.currentHeight == 0)
|
|
98 Nabble.currentHeight = Nabble.defaultHeight;
|
|
99 Nabble.currentHeight += 300;
|
|
100 Nabble.get('nabbleiframe').style.height = Nabble.currentHeight + 'px';
|
|
101 };
|
|
102
|
|
103 Nabble.escape = function(value) {
|
|
104 if (typeof value == 'string') {
|
|
105 var hasSpace = value.indexOf(' ') >= 0;
|
|
106 var hasQuote = value.indexOf('"') >= 0;
|
|
107
|
|
108 value = value.replace(/\;/g, '%3B');
|
|
109 value = value.replace(/"/g, '\\"');
|
|
110
|
|
111 if (hasSpace || hasQuote)
|
|
112 value = '"' + value + '"';
|
|
113 }
|
|
114 return value;
|
|
115 };
|
|
116
|
|
117 Nabble.unescape = function(value) {
|
|
118 if (value.charAt(0) == '"' && value.charAt(value.length-1) == '"')
|
|
119 value = value.substring(1, value.length-1);
|
|
120
|
|
121 value = value.replace(/\\"/g, '"');
|
|
122 value = value.replace(/%3B/g, ';');
|
|
123 return value;
|
|
124 };
|
|
125
|
|
126 Nabble.setCookie = function(name, value) {
|
|
127 name = name+'<%=siteId%>';
|
|
128 document.cookie = name + "=" + Nabble.escape(value) + "; path=/";
|
|
129 };
|
|
130
|
|
131 Nabble.getCookie = function(name) {
|
|
132 name = name+'<%=siteId%>';
|
|
133 var dc = document.cookie;
|
|
134 var prefix = name + "=";
|
|
135 var begin = dc.indexOf("; " + prefix);
|
|
136 if (begin == -1) {
|
|
137 begin = dc.indexOf(prefix);
|
|
138 if (begin != 0) return null;
|
|
139 } else
|
|
140 begin += 2;
|
|
141 var end = document.cookie.indexOf(";", begin);
|
|
142 if (end == -1)
|
|
143 end = dc.length;
|
|
144 return Nabble.unescape(dc.substring(begin + prefix.length, end));
|
|
145 };
|
|
146
|
|
147 Nabble.setPersistentCookie = function(name, value) {
|
|
148 name = name+'<%=siteId%>';
|
|
149 var expires = new Date();
|
|
150 expires.setFullYear(expires.getFullYear()+10);
|
|
151 var curCookie = name + "=" + Nabble.escape(value) + "; expires=" + expires.toGMTString() + "; path=/";
|
|
152 document.cookie = curCookie;
|
|
153 };
|
|
154
|
|
155 Nabble.deleteCookie = function(name) {
|
|
156 name = name+'<%=siteId%>';
|
|
157 document.cookie = name + "=" +
|
|
158 "; path=/" +
|
|
159 "; expires=Thu, 01-Jan-1970 00:00:01 GMT";
|
|
160 };
|
|
161
|
|
162 Nabble.noHash = function(url) {
|
|
163 var pos = url.indexOf('#');
|
|
164 return (pos>-1)?url.substring(0, pos):url;
|
|
165 };
|
|
166
|
|
167 Nabble.debug = function(s) {
|
|
168 if (Nabble.debugElement == 0)
|
|
169 return;
|
|
170 if (!Nabble.debugElement) {
|
|
171 Nabble.debugElement = Nabble.get('debug');
|
|
172 if (!Nabble.debugElement) {
|
|
173 Nabble.debugElement = 0;
|
|
174 return;
|
|
175 }
|
|
176 }
|
|
177 Nabble.debugElement.innerHTML = Nabble.debugElement.innerHTML+s+'<br/>';
|
|
178 };
|
|
179
|
|
180 Nabble.loadScript = function(url) {
|
|
181 Nabble.debug('Loading script: ' + url);
|
|
182 var e = document.createElement("script");
|
|
183 e.src = url;
|
|
184 e.type="text/javascript";
|
|
185 document.getElementsByTagName("head")[0].appendChild(e);
|
|
186 };
|
|
187
|
|
188 Nabble.getJs = function(keys) {
|
|
189 if (!window.clientID)
|
|
190 return;
|
|
191 var p = '';
|
|
192 for (var i=0;i<keys.length;i++) {
|
|
193 p += '&key=' + keys[i];
|
|
194 }
|
|
195 var url = Nabble.context+"/util/SessionService.jtp?action=get" + p + "&cid=" + window.clientID + "&_=" + new Date().getTime();
|
|
196 Nabble.loadScript(url);
|
|
197 };
|
|
198
|
|
199 Nabble.scroll = function(y) {
|
|
200 Nabble.debug('[scroll] y=' + y);
|
|
201 if (y == 1 && window.nabble_scroll_top) {
|
|
202 scrollTo(0, 0);
|
|
203 } else if (y > 0 && !window.nabble_ignore_scroll) {
|
|
204 var obj = Nabble.get('nabbleiframe');
|
|
205 do {
|
|
206 y += obj.offsetTop;
|
|
207 } while (obj = obj.offsetParent);
|
|
208 scrollTo(0, y);
|
|
209 }
|
|
210 };
|
|
211
|
|
212 Nabble.resizeFrames = function(height,title,validHeight) {
|
|
213 if (document.title != title && !window.nabble_ignore_title)
|
|
214 document.title = title;
|
|
215 Nabble.debug('[resizeFrames] Counter = ' + (Nabble.counter++) + ' Height = ' + height + ' Title=[' + title + '] History=' + history.length + ' -- cid=' + window.clientID);
|
|
216
|
|
217 if (height != Nabble.currentHeight) {
|
|
218 Nabble.currentHeight = height;
|
|
219 var f = Nabble.get('nabbleiframe');
|
|
220 if (f) {
|
|
221 f.scrolling = validHeight? 'no' : 'auto';
|
|
222 Nabble.debug('Scrolling=' + f.scrolling);
|
|
223 f.style.height = height + 'px';
|
|
224 Nabble.cancelTimeout();
|
|
225 }
|
|
226 }
|
|
227 };
|
|
228
|
|
229 Nabble.getCurrentUrl = function() {
|
|
230 var currentUrl = Nabble.defaultUrl;
|
|
231 if (Nabble.hash.indexOf('#nabble+') == 0) {
|
|
232 var path = Nabble.hash.substring(8);
|
|
233 path = decodeURIComponent(path);
|
|
234 path = path
|
|
235 .replace(/</g,'%3C')
|
|
236 .replace(/>/g,'%3E')
|
|
237 .replace(/"/g,'%22')
|
|
238 .replace(/'/g,'%27');
|
|
239 currentUrl = Nabble.context+"/" + path;
|
|
240 }
|
|
241 currentUrl += Nabble.realHash == ''? '' : '#' + Nabble.realHash;
|
|
242 return currentUrl;
|
|
243 };
|
|
244
|
|
245 Nabble.getClientID = function() {
|
|
246 var clientID = Nabble.getCookie('clientID');
|
|
247 if (!clientID) {
|
|
248 clientID = new Date().getTime() + '-' + Math.ceil(Math.random() * 1000);
|
|
249 Nabble.setCookie('clientID', clientID);
|
|
250 }
|
|
251 return clientID;
|
|
252 };
|
|
253
|
|
254 Nabble.restart = function(nodeId, baseUrl) {
|
|
255 Nabble.debug('Restart -- baseUrl=' + baseUrl);
|
|
256 Nabble.context = baseUrl;
|
|
257 Nabble.defaultUrl = baseUrl+'/';
|
|
258 Nabble.start();
|
|
259 };
|
|
260
|
|
261 Nabble.getConf = function() {
|
|
262 return window.nabble_ignore_scroll? 'noscroll;':'';
|
|
263 };
|
|
264
|
|
265 Nabble.start = function() {
|
|
266 Nabble.infoLoaded = false;
|
|
267 window.clientID = Nabble.getClientID();
|
|
268
|
|
269 <% /* Hash processing */ %>
|
|
270 var hash = location.hash;
|
|
271 var pipe = hash.indexOf('|');
|
|
272 var realHash = '';
|
|
273 if (pipe > 0) {
|
|
274 <%/*
|
|
275 If there is a pipe in the hash, the value after it is the
|
|
276 hash of the original URL, which must be restored.
|
|
277 For Example:
|
|
278 #nabble-t100|a123
|
|
279 */%>
|
|
280 realHash = hash.substring(pipe);
|
|
281 hash = hash.replace(realHash, '');
|
|
282 realHash = realHash.substring(1);
|
|
283 }
|
|
284 <%/* save the hash and realHash variables because the getCurrentUrl() method will need them.. */%>
|
|
285 Nabble.hash = hash;
|
|
286 Nabble.realHash = realHash;
|
|
287 Nabble.infoUrl = Nabble.context+"/embed/EmbedInfo.jtp?node=<%=nodeId%>&cid=" + window.clientID + "&hash=" + realHash + '&conf=' + Nabble.getConf() + "&_=" + new Date().getTime() + "#" + Nabble.noHash(location.href);
|
|
288 var emptyUrl = Nabble.context+"/util/Empty.jtp";
|
|
289 var html = "<div id='nabblemain'><div style='height:700px'><img src='<%=baseUrl%>/images/loading.png' width=94 height=33 alt='Loading...'></div></div>";
|
|
290 html += "<div id='nabblemore' style='display:none'><a href=\"javascript: void Nabble.showMore()\">view more</a></div>";
|
|
291 html += "<iframe name='nabbleinfo' id='nabbleinfo' width='1' height='1' style='display:none' src=''></iframe>";
|
|
292 html += "<iframe name='nabbleresize' onload='Nabble.getJs([\"resizejs\", \"scrolljs\", \"others\"])' width='1' height='1' style='display:none' src='" + emptyUrl + "'></iframe>";
|
|
293 html += "<iframe name='nabbleready' onload='Nabble.loadMain()' width='1' height='1' style='display:none' src='" + emptyUrl + "'></iframe>";
|
|
294 var div = Nabble.get('nabbleforum');
|
|
295 div.innerHTML = html;
|
|
296 };
|
|
297
|
|
298 <%/*
|
|
299 1 - Loads the main page as the last page in order to allow the
|
|
300 embedding code to run before it.
|
|
301 2 - We must load the iframe using a string because IE (and some
|
|
302 other browsers) have problems to load an iframe through the DOM.
|
|
303 3 - The loadMain() function is called when the 'nabbleready' iframe is loaded.
|
|
304 Note that this iframe doesn't have an initial URL. The first URL is provided in EmbedInfo.jtp.
|
|
305 */%>
|
|
306 Nabble.loadMain = function() {
|
|
307 Nabble.debug('Loading main page...infoLoaded='+Nabble.infoLoaded);
|
|
308 if (!Nabble.infoLoaded) {
|
|
309 Nabble.debug('InfoUrl='+Nabble.infoUrl);
|
|
310 Nabble.get('nabbleinfo').setAttribute('src',Nabble.infoUrl);
|
|
311 Nabble.infoLoaded = true;
|
|
312 return;
|
|
313 }
|
|
314 var width = window.nabble_width? window.nabble_width : '100%';
|
|
315 var currentUrl = Nabble.getCurrentUrl();
|
|
316 Nabble.debug('CurrentUrl='+currentUrl);
|
|
317 var m = '<iframe name="nabbleiframe" id="nabbleiframe" src="' + currentUrl + '" width="' + width + '" height="' + Nabble.defaultHeight + '" frameBorder="0" scrolling="no" allowtransparency="true"></iframe>';
|
|
318 Nabble.get('nabblemain').innerHTML = m;
|
|
319 Nabble.resizeTimeout();
|
|
320 }
|
|
321
|
|
322 Nabble.start();
|
|
323 <%
|
|
324 }
|
|
325 }
|
|
326 %>
|