comparison client/digitallibrary/jquery/jquery.digilib.regions.js @ 823:8af71d9d830b jquery

fixed automatic region links and region content
author hertzhaft
date Wed, 23 Feb 2011 02:06:41 +0100
parents eff74cfaaf97
children f0a5e4d2cba7
comparison
equal deleted inserted replaced
822:637e8b601763 823:8af71d9d830b
54 'showRegionNumbers' : false, 54 'showRegionNumbers' : false,
55 // is region info shown? 55 // is region info shown?
56 'showRegionInfo' : false, 56 'showRegionInfo' : false,
57 // should digilib look for region content in the page? 57 // should digilib look for region content in the page?
58 'includeRegionContent' : false, 58 'includeRegionContent' : false,
59 // class name for content divs 59 // turn any region into a clickable link to its detail view
60 'autoRegionLinks' : false,
61 // class name for content divs (must additionally be marked with class "keep")
60 'regionContentSelector' : 'div.regioncontent', 62 'regionContentSelector' : 'div.regioncontent',
61 // buttonset of this plugin 63 // buttonset of this plugin
62 'regionSet' : ['regions', 'addregion', 'delregion', 'regioninfo', 'lessoptions'], 64 'regionSet' : ['regions', 'addregion', 'delregion', 'regioninfo', 'lessoptions'],
63 // url param for regions 65 // url param for regions
64 'rg' : null, 66 'rg' : null,
80 var pt1, pt2; 82 var pt1, pt2;
81 // overlay prevents other elements from reacting to mouse events 83 // overlay prevents other elements from reacting to mouse events
82 var $overlay = $('<div class="digilib-overlay"/>'); 84 var $overlay = $('<div class="digilib-overlay"/>');
83 $body.append($overlay); 85 $body.append($overlay);
84 bodyRect.adjustDiv($overlay); 86 bodyRect.adjustDiv($overlay);
85 // we count regions from 1 87 var $regionDiv = addRegionDiv(data, data.regions.length);
86 var $regionDiv = addRegionDiv(data, data.regions.length + 1);
87 88
88 // mousedown handler: start sizing 89 // mousedown handler: start sizing
89 var regionStart = function (evt) { 90 var regionStart = function (evt) {
90 pt1 = geom.position(evt); 91 pt1 = geom.position(evt);
91 // setup and show zoom div 92 // setup and show zoom div
179 regions.push(regionRect); 180 regions.push(regionRect);
180 console.debug("regions", data.regions, "regionRect", regionRect); 181 console.debug("regions", data.regions, "regionRect", regionRect);
181 }; 182 };
182 183
183 // add a region to data.$elem 184 // add a region to data.$elem
184 var addRegionDiv = function (data, nr) { 185 var addRegionDiv = function (data, index) {
186 var nr = index + 1; // we count regions from 1
187 // create a digilib URL for this detail
188 var regionUrl = getRegionUrl(data, index);
185 var $regionDiv = $('<div class="region overlay" style="display:none"/>'); 189 var $regionDiv = $('<div class="region overlay" style="display:none"/>');
186 $regionDiv.attr("id", ID_PREFIX + nr); 190 $regionDiv.attr("id", ID_PREFIX + nr);
187 data.$elem.append($regionDiv); 191 data.$elem.append($regionDiv);
188 if (data.settings.showRegionNumbers) { 192 if (data.settings.showRegionNumbers) {
189 var $regionNr = $('<div class="regionnumber" />'); 193 var $regionNr = $('<div class="regionnumber"/>');
190 $regionNr.text(nr); 194 var $regionLink = $('<a/>');
195 $regionLink.attr('href', regionUrl);
196 $regionLink.text(nr);
197 $regionNr.append($regionLink);
191 $regionDiv.append($regionNr); 198 $regionDiv.append($regionNr);
199 }
200 if (data.settings.autoRegionLinks) {
201 $regionDiv.bind('click.dlRegion', function() {
202 window.location = regionUrl;
203 })
192 } 204 }
193 return $regionDiv; 205 return $regionDiv;
194 }; 206 };
195 207
196 // add region info 208 // add region info
208 } 220 }
209 221
210 // create a region div from the data.regions collection 222 // create a region div from the data.regions collection
211 var createRegionDiv = function (regions, index) { 223 var createRegionDiv = function (regions, index) {
212 var region = regions[index]; 224 var region = regions[index];
213 var $regionDiv = addRegionDiv(data, index + 1); // we count regions from 1 225 var $regionDiv = addRegionDiv(data, index);
214 region.$div = $regionDiv; 226 region.$div = $regionDiv;
215 addRegionInfo(region); 227 addRegionInfo(region);
216 return $regionDiv; 228 return $regionDiv;
217 }; 229 };
218 230
224 } 236 }
225 }; 237 };
226 238
227 // create regions from HTML 239 // create regions from HTML
228 var createRegionsFromHTML = function (data) { 240 var createRegionsFromHTML = function (data) {
241 var regions = data.regions;
229 var selector = data.settings.regionContentSelector; 242 var selector = data.settings.regionContentSelector;
230 // TODO: has digilib div already been emptied here?
231 var $content = data.$elem.find(selector); 243 var $content = data.$elem.find(selector);
232 console.debug("createRegionsFromHTML", $content); 244 console.debug("createRegionsFromHTML", $content);
233 $content.each(function(index, $div) { 245 $content.each(function(index, elem) {
246 var $div = $(elem);
234 var r = $div.attr('title'); 247 var r = $div.attr('title');
235 var pos = r.split("/", 4); 248 var pos = r.split("/", 4);
236 var rect = geom.rectangle(pos[0], pos[1], pos[2], pos[3]); 249 var rect = geom.rectangle(pos[0], pos[1], pos[2], pos[3]);
237 regions.push(rect); 250 regions.push(rect);
238 var $regionDiv = createRegionDiv(regions, index); 251 var $regionDiv = createRegionDiv(regions, index);
239 $regionDiv.append($div); 252 $regionDiv.append($div);
253 $div.show();
240 }); 254 });
241 }; 255 };
242 256
243 // show a region on top of the scaler image 257 // show a region on top of the scaler image
244 var showRegionDiv = function (data, index, anim) { 258 var showRegionDiv = function (data, index, anim) {
325 packRegions(data); 339 packRegions(data);
326 } 340 }
327 fn.redisplay(data); 341 fn.redisplay(data);
328 }; 342 };
329 343
330 // TODO: turn region numbers or region divs into links to zoomed details 344 // for turning region numbers/region divs into links to zoomed details
331 var getDigilibUrl = function (data) { 345 var getRegionUrl = function (data, index) {
332 packParams(data); 346 var region = data.regions[index];
333 var settings = data.settings; 347 var settings = data.settings;
334 var queryString = getParamString(settings, settings.digilibParamNames, defaults); 348 var params = {
349 "fn" : settings.fn,
350 "pn" : settings.pn
351 };
352 fn.packArea(params, region);
353 fn.packMarks(params, data.marks);
354 fn.packScalerFlags(params, data.scalerFlags);
355 var paramNames = digilib.defaults.digilibParamNames;
356 // build our own digilib URL without storing anything
357 var queryString = fn.getParamString(params, paramNames, digilib.defaults);
335 return settings.digilibBaseUrl + '?' + queryString; 358 return settings.digilibBaseUrl + '?' + queryString;
336 }; 359 };
337 360
338 // event handler, reads region parameter and creates region divs 361 // event handler, reads region parameter and creates region divs
339 var handleSetup = function (evt) { 362 var handleSetup = function (evt) {
340 data = this; 363 data = this;
341 console.debug("regions: handleSetup", data.settings.rg); 364 console.debug("regions: handleSetup", data.settings.rg);
342 // content is given in HTML divs 365 // regions with content are given in HTML divs
343 if (data.settings.includeRegionContent) { 366 if (data.settings.includeRegionContent) {
344 createRegionsFromHTML(data); 367 createRegionsFromHTML(data);
368 // regions are defined in the URL
345 } else { 369 } else {
346 unpackRegions(data); 370 unpackRegions(data);
347 createRegionDivs(data); 371 createRegionDivs(data);
348 } 372 }
349 }; 373 };
386 410
387 // plugin initialization 411 // plugin initialization
388 var init = function (data) { 412 var init = function (data) {
389 console.debug('initialising regions plugin. data:', data); 413 console.debug('initialising regions plugin. data:', data);
390 var $data = $(data); 414 var $data = $(data);
391 var buttonSettings = data.settings.buttonSettings.fullscreen; 415 // regions array
392 // configure buttons through digilib "regionSet" option 416 data.regions = [];
393 var buttonSet = data.settings.regionSet || regionSet; 417 // no URL-defined regions, no buttons when regions are predefined in HTML
394 // set regionSet to [] or '' for no buttons (when showing regions only) 418 if (!data.settings.includeRegionContent) {
395 if (buttonSet.length && buttonSet.length > 0) { 419 // add "rg" to digilibParamNames
396 buttonSettings['regionSet'] = buttonSet; 420 data.settings.digilibParamNames.push('rg');
397 buttonSettings.buttonSets.push('regionSet'); 421 // additional buttons
422 var buttonSettings = data.settings.buttonSettings.fullscreen;
423 // configure buttons through digilib "regionSet" option
424 var buttonSet = data.settings.regionSet || regionSet;
425 // set regionSet to [] or '' for no buttons (when showing regions only)
426 if (buttonSet.length && buttonSet.length > 0) {
427 buttonSettings['regionSet'] = buttonSet;
428 buttonSettings.buttonSets.push('regionSet');
429 }
398 } 430 }
399 // install event handler 431 // install event handler
400 $data.bind('setup', handleSetup); 432 $data.bind('setup', handleSetup);
401 $data.bind('update', handleUpdate); 433 $data.bind('update', handleUpdate);
402 $data.bind('redisplay', handleRedisplay); 434 $data.bind('redisplay', handleRedisplay);
403 $data.bind('dragZoom', handleDragZoom); 435 $data.bind('dragZoom', handleDragZoom);
404 // regions array
405 data.regions = [];
406 // add "rg" to digilibParamNames
407 data.settings.digilibParamNames.push('rg');
408 }; 436 };
409 437
410 // plugin object with name and install/init methods 438 // plugin object with name and install/init methods
411 // shared objects filled by digilib on registration 439 // shared objects filled by digilib on registration
412 var pluginProperties = { 440 var pluginProperties = {