source: main/trunk/greenstone2/macros/style.dm@ 27318

Last change on this file since 27318 was 27318, checked in by ak19, 11 years ago

Authentication at perl level for when setting user-added comments. 1. metadata-server.plnow encrypts the key, so that it can be checked against what's in the key db. 2. gdslCGI.pm now has an encrypt_key subroutine. 3. baseaction.pm's authentication_enabled is turned on and the authenticate_user() subroutine now follows recpt's userdb.cpp::check_key by first checking for a given key when no password is given, and if the key validates and isn't stale, then its timestamp in the key db is updated. The code for checking the group that the user belongs to (which had been commented out since user comments can be set by anyone with a GS account, they don't need to belong to a collection editing group) has been moved to a new function called check_group, with the line calling it commented out. 4. style.dm passes in un and ky cgi args to the gsapi object's constructor. 5. gsajaxapi.js's constructor takes the un and ky parameters and then uses these in the Get and Post methods when making calls to metadata-server.pl.

  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 12.5 KB
Line 
1# this file must be UTF-8 encoded
2#######################################################################
3# PAGE STYLES
4#######################################################################
5
6package Style
7
8# to use this style system output
9# _header_
10# all your page content, then
11# _footer_
12
13# use the page parameter 'style' to choose the appropriate style
14
15# Current values: "html" and "xhtml"
16_compliance_ {html}
17
18# the style system uses
19# _pagetitle_ - what gets displayed at the top of the browser window
20# _pagescriptextra_ - any extra javascript you want included in the header
21# _pagebannerextra_ - anything extra you want displayed in the page banner
22# _pagefooterextra_ - anything extra you want displayed in the footer
23
24# defaults for the above macros
25_pagetitle_ {_collectionname_}
26_pagescriptfileextra_ {}
27_pagescriptextra_ {}
28_pagebannerextra_ {}
29_pagefooterextra_ {}
30
31# collection specific style and script may be set in collection's extra.dm
32# using the following macros
33_collectionspecificstyle_ {}
34_collectionspecificscript_ {}
35
36# it also relies on lots of Globals, the most important of these are:
37# _cookie_ - put in the cgi header
38# _globalscripts_ - javascript stuff
39# _imagecollection_
40# _imagehome_
41# _imagehelp_
42# _imagepref_
43# _imagethispage_ (this is now not an image, but text. should be renamed?)
44# _linkotherversion_
45
46# _httpiconchalk_ - the image down the left of the page - is now done
47# by the style sheet.
48
49_header_ {_cgihead_
50_htmlhead_(class="bgimage")_startspacer__pagebanner_
51}
52
53_header_[v=1] {_cgihead_
54_htmlhead__pagebanner_
55}
56
57# _cgihead_ {Content-type: text/html
58# _cookie_
59#
60# }
61_cgihead_{}
62
63
64# any declarations relating to CSS that should go in the html head part.
65# declarations containing images are done here so the path is correct
66# at runtime.
67
68_csslink_{
69 <link rel="stylesheet" href="_cssfilelink_" type="text/css"
70 title="Greenstone Style" charset="UTF-8" _linktagend_
71 <link rel="alternate stylesheet" href="_httpstyle_/style-print.css"
72 type="text/css" title="Printer" charset="UTF-8" media="print, screen" _linktagend_
73 <link rel="stylesheet" href="_httpstyle_/style-print.css" type="text/css"
74 title="Printer" charset="UTF-8" media="print" _linktagend_
75 _cssfilelinkextra_
76}
77
78_cssheader_ {
79_csslink_
80<style type="text/css">
81body.bgimage \{ background: url("_httpimages_/chalk.gif") scroll repeat-y left top; \}
82div.navbar \{ background-image: url("_httpimages_/bg_green.png"); \}
83div.divbar \{ background-image: url("_httpimages_/bg_green.png"); \}
84a.navlink \{ background-image: url("_httpimages_/bg_off.png"); \}
85a.navlink_sel \{ background-image: url("_httpimages_/bg_green.png"); \}
86a.navlink:hover \{ background-image: url("_httpimages_/bg_on.png"); \}
87p.bannertitle \{background-image: url("_httpimages_/banner_bg.png"); \}
88p.collectiontitle \{background-image: url("_httpimages_/banner_bg.png"); \}
89</style>
90_collectionspecificstyle_
91
92}
93
94# separate macro so it can be easily overridden for customised collections
95_cssfilelink_ {_httpstyle_/style.css}
96
97# separate macro so additional stylesheets (to those included by default) can be specified
98_cssfilelinkextra_ {}
99
100# Languages that should be displayed right-to-left
101_htmlextra_ [l=ar] { dir=rtl }
102_htmlextra_ [l=fa] { dir=rtl }
103_htmlextra_ [l=he] { dir=rtl }
104_htmlextra_ [l=ur] { dir=rtl }
105_htmlextra_ [l=ps] { dir=rtl }
106_htmlextra_ [l=prs] { dir=rtl }
107
108# htmlhead uses:
109# _1_ - extra parameters for the body tag
110# _pagetitle_
111# _globalscripts_
112_htmlhead_ {<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
113"http://www.w3.org/TR/html4/loose.dtd">
114
115<html_htmlextra_>
116<head>
117<title>_pagetitle_</title>
118<meta name="_status:textversion_" content="_versionnum_" _metatagend_
119_globalscripts_
120_cssheader_
121_document:documentheader_
122</head>
123
124<body _1_>
125}
126
127# Link and meta tags must be closed differently for HTML/XHTML validation
128_linktagend_ {_If_("_compliance_" eq "xhtml",/>,>)}
129_metatagend_ {_If_("_compliance_" eq "xhtml",/>,>)}
130
131_spacerwidth_ {65}
132
133# _startspacer_ is a spacer that gives pages a left-hand margin.
134# It must eventually be closed by _endspacer_.
135_startspacer_ {
136<div id="page">
137}
138
139# If you want to move the home/help/pref buttons, override this to be empty
140# and then explicitly include _globallinks_ somewhere else
141# on the page
142_optgloballinks_ {_globallinks_}
143
144# _bannertitle_ is defined in nav_css/ns4.dm, and is either text or
145# a banner image
146_pagebanner_ {
147<!-- page banner (\_style:pagebanner\_) -->
148<div id="banner">
149<div class="pageinfo">
150<p class="bannerlinks">_optgloballinks_</p>
151_bannertitle_
152</div>
153<div class="collectimage">_imagecollection_</div>
154</div>
155<div class="bannerextra">_pagebannerextra_</div>
156<!-- end of page banner -->
157_If_("_activateweb20_" eq "2",
158 _If_("_activatetalkback_" eq "1",_talkback:uploadForm_)
159)
160}
161
162_pagebanner_[v=1] {
163<!-- page banner - text version [v=1] (\_style:pagebanner\_) -->
164<center><h2><b><u>_imagecollection_</u></b></h2></center><p>
165_optgloballinks_
166_pagebannerextra_
167<p>
168<!-- end of page banner -->
169_If_("_activateweb20_" eq "2",
170 _If_("_activatetalkback_" eq "1",_talkback:uploadForm_)
171)
172}
173
174# note we no longer close off one of the startspacer tables here!!
175_footer_ {
176_If_("_cgiargtalkback_" eq "1",_talkback:monitorUpload_)
177<!-- page footer (\_style:footer\_) -->
178_pagefooterextra__endspacer__htmlfooter_
179}
180
181# v=1 footer: not using startspacer in the header, so dont put it in the footer
182_footer_ [v=1]{
183_If_("_cgiargtalkback_" eq "1",_talkback:monitorUpload_)
184<!-- page footer [v=1] (\_style:footer\_) -->
185_pagefooterextra_
186_htmlfooter_
187}
188
189# close off anything opened by startspacer
190_endspacer_ {
191</div> <!-- id=page -->
192}
193
194
195_htmlfooter_ {
196</body>
197</html>
198}
199
200_loginscript_ {
201 function appendUsernameArgs(id,addOn)
202 \{
203 var a=document.getElementById(id);
204 var url = a.getAttribute("href");
205 if (url == "") \{
206 url = document.location.toString();
207 \}
208
209 //alert("url before = " + url);
210
211 // clear out any earlier user name/authentication values
212 url = url.replace(/(&|\\\\?)uan=\\d\{0,1\}/g,"");
213 url = url.replace(/(&|\\\\?)un=[a-z0-9:\\-]*/g,"");
214 url = url.replace(/(&|\\\\?)pw=[a-z0-9:\\-]*/g,"");
215
216 //alert("url after = " + url);
217
218 var gwcgi = "_gwcgi_";
219
220 var tailUrl = url.substr(url.length-gwcgi.length);
221
222 url += (tailUrl == "_gwcgi_") ? "?" : "&";
223 url += addOn;
224
225 //alert("url with add on = " + url);
226
227 a.setAttribute("href",url);
228 \}
229}
230
231
232# imagescript only used in nav_ns4.dm
233_globalscripts_{
234 <script type="text/javascript" src="_httpscript_/gsajaxapi.js"></script>
235
236 <script language="javascript" type="text/javascript">
237 function gsdefined(val)
238 \{
239 return (typeof(val) != "undefined");
240 \}
241
242 var un = "_cgiargun_";
243 var ky = "_cgiargky_";
244 var gsapi = new GSAjaxAPI("_gwcgi_","_cgiargc_","_cgiargun_","_cgiargky_");
245
246 // http://stackoverflow.com/questions/6312993/javascript-seconds-to-time-with-format-hhmmss
247 // Call as: alert(timestamp.printTime());
248 function formatTime(timestamp) \{
249 var int_timestamp = parseInt(timestamp, 10); // don't forget the second param
250 var date = new Date(int_timestamp);
251 return date.toLocaleDateString() + " " + date.toLocaleTimeString();
252 \}
253
254 function loadUserComments() \{
255
256 // don't bother loading comments if we're not on a document page (in which case there's no usercommentdiv)
257 var usercommentdiv = document.getElementById("usercomments");
258 if(usercommentdiv == undefined || usercommentdiv == null) \{
259 return;
260 \}
261
262 // else, if we have a usercommentdiv, we would have a docid. Get toplevel section of the docid
263 var doc_id = "_cgiargd_"; //escape("_cgiargd_");
264 var period = doc_id.indexOf(".");
265 if(period != -1) \{
266 doc_id = doc_id.substring(0, period);
267 \}
268
269 var username_rec = \{
270 metaname: "username",
271 metapos: "all"
272 \};
273
274 var timestamp_rec = \{
275 metaname: "usertimestamp",
276 metapos: "all"
277 \};
278
279 var comment_rec = \{
280 metaname: "usercomment",
281 metapos: "all"
282 \};
283
284 var doc_rec = \{
285 docid: doc_id,
286 metatable: [username_rec, timestamp_rec, comment_rec]
287 \};
288
289 var docArray = [doc_rec];
290 //alert(JSON.stringify(docArray));
291
292 var json_result_str = gsapi.getMetadataArray(docArray, "index");
293// alert(json_result_str);
294 var result = JSON.parse(json_result_str);
295 // result contains only one docrec (result[0]), since we asked for the usercomments of one docid
296 var metatable = result[0].metatable;
297// alert(JSON.stringify(metatable));
298
299 var i = 0;
300 var looping = true;
301 var print_heading = true;
302
303 // metatable[0] = list of usernames, metatable[1] = list of timestamps, metatable[2] = list of comments
304 // the 3 lists/arrays should be of even length. Assuming this, loop as long as there's another username
305 while(looping) \{
306 var metaval_rec = metatable[0].metavals[i];
307 if(metaval_rec == undefined) \{
308 looping = false;
309 \}
310 else \{
311
312 if(print_heading) \{
313 var heading=document.createElement("div");
314 var attr=document.createAttribute("class");
315 attr.nodeValue="usercommentheading";
316 heading.setAttributeNode(attr);
317 var txt=document.createTextNode("_text-usercomments-section_");
318 heading.appendChild(txt);
319 usercommentdiv.appendChild(heading);
320
321 print_heading = false;
322 \}
323
324 var username = metaval_rec.metavalue;
325 var timestamp = metatable[1].metavals[i].metavalue;
326 var comment = metatable[2].metavals[i].metavalue;
327
328 //alert("Comment: " + username + " " + timestamp + " " + comment);
329
330 // No need to sort by time, as the meta are already stored sorted
331 // and hence retrieved in the right order by using the i (metapos) counter
332 // If sorting the array of comment records, which would be by timestamp, see
333 // https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/sort
334
335 // for each usercomment, create a child div with the username, timestamp and comment
336 displayInUserCommentList(usercommentdiv, username, timestamp, comment);
337
338 i++;
339 \}
340 \}
341
342 \}
343
344
345 function displayInUserCommentList(usercommentdiv, username, timestamp, comment) \{
346
347 var divgroup=document.createElement("div");
348 var attr=document.createAttribute("class");
349 attr.nodeValue="usercomment";
350 divgroup.setAttributeNode(attr);
351
352 var divuser=document.createElement("div");
353 var divtime=document.createElement("div");
354 var divcomment=document.createElement("div");
355
356
357 divgroup.appendChild(divuser);
358 var txt=document.createTextNode(username);
359 divuser.appendChild(txt);
360
361 divgroup.appendChild(divtime);
362 txt=document.createTextNode(formatTime(timestamp)); // format timestamp for date/time display
363 divtime.appendChild(txt);
364
365 divgroup.appendChild(divcomment);
366 txt=document.createTextNode(comment);
367 divcomment.appendChild(txt);
368
369 usercommentdiv.appendChild(divgroup);
370
371 \}
372
373 // http://stackoverflow.com/questions/807878/javascript-that-executes-after-page-load
374 // ensure we don't replace any other onLoad() functions, but append the loadUserComments()
375 // function to the existing onLoad handlers
376
377 if(window.onload) {\
378 var curronload = window.onload;
379 var newonload = function() {\
380 curronload();
381 loadUserComments();
382 \};
383 window.onload = newonload;
384 \} else {\
385 window.onload = loadUserComments;
386 \}
387 </script>
388
389_If_("_activatejquery_" eq "1",_jqueryScriptAndStyle_)
390
391_If_("_activateweb20_" eq "2",
392 _If_("_activateseaweed_" eq "1",_seaweedscript_)
393 _If_("_activatetalkback_" eq "1",_talkbackscript_)
394)
395_If_(_pagescriptfileextra_,_pagescriptfileextra_)
396<script language="javascript" type="text/javascript">
397_loginscript_
398_If_(_pagescriptextra_,_pagescriptextra_)
399_collectionspecificscript_
400_imagescript_
401</script>
402}
403
404_globalscripts_ [v=1] {
405
406_If_("_activatejquery_" eq "1",_jqueryScriptAndStyle_)
407
408_If_("_activateweb20_" eq "2",
409 <script type="text/javascript" src="_httpscript_/gsajaxapi.js"></script>
410 _If_("_activateseaweed_" eq "1",_seaweedscript_)
411 _If_("_activatetalkback_" eq "1",_talkbackscript_)
412)
413_If_(_pagescriptfileextra_,_pagescriptfileextra_)
414<script language="javascript" type="text/javascript">
415<!--
416_loginscript_
417_If_(_cgiargx_,_scriptdetach_)
418_If_(_pagescriptextra_,_pagescriptextra_)
419_collectionspecificscript_
420// -->
421</script>
422}
423
424_scriptdetach_ {
425 function close\_detach() \{
426 close();
427 \}
428}
429
430
431_jqueryScriptAndStyle_ {
432<link type="text/css" href="_httpstyle_/max-video/jquery-ui-1.8.4.custom.css" rel="stylesheet" />
433<script type="text/javascript" src="_httpscript_/jquery-1.4.2.min.js"></script>
434<script type="text/javascript" src="_httpscript_/jquery-ui-1.8.4.custom.min.js"></script>
435}
436
Note: See TracBrowser for help on using the repository browser.