Project

General

Profile

Download (44.1 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php
2
// $Id$
3

    
4
/**
5
 * Copyright (C) 2007 EDIT
6
 * European Distributed Institute of Taxonomy
7
 * http://www.e-taxonomy.eu
8
 *
9
 * The contents of this file are subject to the Mozilla Public License Version 1.1
10
 * See http://www.mozilla.org/MPL/MPL-1.1.html for the full license terms.
11
 */
12

    
13

    
14
function theme_cdm_feature_nodesTOC($featureNodes){
15

    
16
  $out .= '<ul>';
17

    
18
  foreach($featureNodes as $node){
19

    
20
    if(hasFeatureNodeDescriptionElements($node)){
21

    
22
      $featureRepresentation = isset($node->feature->representation_L10n) ? $node->feature->representation_L10n : 'Feature';
23
      // HACK to implement images for taxa, should be removed
24
      if($node->feature->uuid != UUID_IMAGE){
25
        $out .= '<li>'.l(t(theme('cdm_feature_name', $featureRepresentation)), $_GET['q'], array("class"=>"toc"), NULL, generalizeString($featureRepresentation)).'</li>';
26
      }
27
    }
28
  }
29

    
30
  $out .= '</ul>';
31
  return $out;
32
}
33

    
34
function theme_cdm_feature_name($feature_name){
35
  //TODO replace by using translations ?
36
  switch($feature_name){
37
    default: return t(ucfirst($feature_name));
38
  }
39
}
40

    
41
/**
42
 * Renders the taxon profile. The taxon profile consists of description elements
43
 * which are ordered by the structure defined by specific FeatureTree. The chosen
44
 * FeatureTree is merged with the list of desctiprion elements prior to using this
45
 * method (see function cdm_ws_descriptions_by_featuretree() ).
46
 *
47
 * @param unknown_type $mergedTrees
48
 * @param unknown_type $taxon The taxon whose sprofile to show
49
 */
50
function theme_cdm_featureTrees($mergedTrees, $taxon){
51
  if(!$mergedTrees){
52
    return;
53
  }
54
  foreach($mergedTrees as &$mTree){
55
    //TODO display title and reference in case of multiple $mergedTrees -> theme
56
    $out .= theme('cdm_feature_nodes', $mTree->root->children, $taxon);
57
  }
58
  return $out;
59
}
60

    
61

    
62

    
63
function theme_cdm_featureTreeTOCs($mergedTrees){
64

    
65
  if(!$mergedTrees){
66
    return;
67
  }
68
  //FIXME
69
  $out = '<div id="featureTOC">';
70
  $out .= '<h2>' . t('Content') .'</h2>';
71

    
72
  //TODO diplay title and reference in case of multiple $mergedTrees -> theme
73

    
74
  foreach($mergedTrees as &$mTree){
75
    $out .= theme('cdm_feature_nodesTOC', $mTree->root->children);
76
  }
77

    
78
  $out .= '</div>';
79
  return $out;
80
}
81

    
82

    
83
/**
84
 * Renders the $mergedFeatureNodes for the given $taxon.
85
 * The merged nodes can be obtained by making use of the
86
 * function cdm_ws_descriptions_by_featuretree()
87
 *
88
 * @param unknown_type $featureNodes
89
 * @param unknown_type $taxon
90
 */
91
function theme_cdm_feature_nodes($mergedFeatureNodes, $taxon){
92

    
93
  RenderHints::pushToRenderStack('feature_nodes');
94
  $gallery_settings = getGallerySettings(CDM_DATAPORTAL_DESCRIPTION_GALLERY_NAME);
95

    
96
  foreach($mergedFeatureNodes as $node){
97

    
98
    if(hasFeatureNodeDescriptionElements($node)) {
99

    
100
      $featureRepresentation = isset($node->feature->representation_L10n) ? $node->feature->representation_L10n : 'Feature';
101
      $block->module = 'cdm_dataportal';
102

    
103
      $media_list = array();
104

    
105
      if($node->feature->uuid != UUID_IMAGE) {
106

    
107
        $block->delta = generalizeString($featureRepresentation);
108
        $block->subject = '<span class="'. html_class_atttibute_ref($node->feature) . '">' . theme('cdm_feature_name', $featureRepresentation) . '</span>';
109
        $block->module = "cdm_dataportal-feature";
110
        $block->content = '';
111

    
112
        /*
113
         * Content/DISTRIBUTION
114
         */
115
        if($node->feature->uuid == UUID_DISTRIBUTION){
116

    
117
          if(variable_get(DISTRIBUTION_TEXTDATA_DISPLAY_ON_TOP, 0)){
118
            $distributionTextDataList = array();
119
            $distributionElementsList = array();
120
            foreach($node->descriptionElements as $descriptionElement){
121
              if($descriptionElement->class == "TextData"){
122
                $distributionTextDataList[] = $descriptionElement;
123
              } else {
124
                $distributionElementsList[] = $descriptionElement;
125
              }
126
            }
127
            if(count($distributionTextDataList) > 0){
128
              $node->descriptionElements = $distributionElementsList;
129
              $block->content .= theme('cdm_descriptionElements', $distributionTextDataList, $node->feature->uuid, $taxon->uuid);
130
            }
131
          }
132

    
133
          // Display cdm distribution map TODO this is a HACK to a proper generic implementation?
134
          $block->content .= theme('cdm_distribution_map', $taxon);
135
          $block->content .= theme('cdm_descriptionElements', $node->descriptionElements, $node->feature->uuid, $taxon->uuid);
136
        }
137

    
138
        /*
139
         * Content/COMMON_NAME
140
         */
141
        else if ($node->feature->uuid == UUID_COMMON_NAME){
142
          //TODO why is theme_cdm_descriptionElement_CommonTaxonName not beeing used???
143
          $block->content .= theme('cdm_common_names', $node->descriptionElements);
144
        /*
145
        }else if($node->feature->uuid == UUID_IMAGE_SOURCES) {
146
          $block->content .= theme('cdm_image_sources', $node->descriptionElements);
147
        */
148
        }
149

    
150
        /*
151
         * Content/ALL OTHER FEATURES
152
         */
153
        else {
154
          $block->content .= theme('cdm_descriptionElements', $node->descriptionElements, $node->feature->uuid, $taxon->uuid);
155

    
156
          /*
157
           *  Content/ALL OTHER FEATURES/Subordinate Features
158
           *
159
           *  subordinate features are printed inline in one floating text,
160
           *  it is expected that supordinate features only "contain" TextData elements
161
           */
162
          // TODO move into own theme
163
          if(count($node->children) > 0){
164

    
165
            //TODO support more than one level of childen http://dev.e-taxonomy.eu/trac/ticket/2393
166
            $text = '';
167
            foreach ($node->children as $child){
168

    
169
             if (is_array($child->descriptionElements)){
170
               foreach ($child->descriptionElements as $element) {
171

    
172
                 if(is_array($element->media)){
173
                   // append media of supordinate emelents to list of main feature
174
                   $media_list = array_merge($media_list, $element->media);
175
                 }
176

    
177
                 $description = str_replace("\n", "<br/>", $element->multilanguageText_L10n->text);
178
                //TODO use localized version of feature name, the locale must match the locale of the multilanguage text (http://dev.e-taxonomy.eu/trac/ticket/2394)
179
                 $description = str_replace($element->feature->titleCache, '<em>' . $element->feature->titleCache . '</em>', $description);
180
               }
181
               $text .= " " . $description;
182
               $description = '';
183
             }
184

    
185
            }
186
            $block->content .= $text;
187
          }
188

    
189
        }
190

    
191
        /*
192
         * Media/ALL FEATURES
193
         */
194
        $media_list = array_merge($media_list, cdm_dataportal_media_from_descriptionElements($node->descriptionElements));
195
        $captionElements = array('title', 'rights');
196

    
197
        $gallery = theme('cdm_media_gallerie', $media_list, CDM_DATAPORTAL_DESCRIPTION_GALLERY_NAME.'_'.$node->feature->uuid,
198
              $gallery_settings['cdm_dataportal_media_maxextend'],
199
              $gallery_settings['cdm_dataportal_media_cols'],
200
              $gallery_settings['cdm_dataportal_media_maxRows'],
201
              $captionElements
202
        );
203

    
204
        $block->content .= $gallery;
205
        $block->content .= theme('cdm_footnotes', $node->feature->uuid);
206
        $block->content .= theme('cdm_annotation_footnotes', $node->feature->uuid);
207

    
208
        // add anchor to subject
209
        $block->subject = '<a name="'.$block->delta.'"></a>'.  $block->subject;
210

    
211
        $out .= theme('block', $block);
212
      }
213
    }
214

    
215
  }
216
  RenderHints::popFromRenderStack();
217
  return $out;
218
}
219

    
220
function theme_FeatureTree_hierarchy($FeatureTreeUuid){
221

    
222
  if(!is_uuid($FeatureTreeUuid)){
223
    return;
224
  }
225
  $out = '';
226
  $featureTree = cdm_ws_get(CDM_WS_FEATURETREE, array($FeatureTreeUuid));
227
  if($featureTree && $featureTree->root){
228
    $out = '<ul class="'.$featureTree->class.'">';
229
    $out .= theme('FeatureTree_hierarchy_children', $featureTree->root);
230
    $out .= '</ul>';
231
  }
232
  return $out;
233
}
234

    
235
function theme_FeatureTree_hierarchy_children($node){
236

    
237
  $out = '';
238
  if($node->children){
239

    
240
    foreach($node->children as $childNode){
241
      $out .= '<li>'.check_plain($childNode->feature->representation_L10n);
242
      if($childNode->children && count($childNode->children) > 0){
243
        $out .= '<ul>'.theme('FeatureTree_hierarchy_children', $childNode).'</ul>';
244
      }
245
      $out .= '</li>';
246
    }
247
  }
248
  return $out;
249
}
250

    
251

    
252

    
253
/**
254
 *
255
 * Join the texts in $elementArray and enclose with a HTML tag
256
 * @param unknown_type $elementArray
257
 * @param unknown_type $feature the feature to which the elements given in $elementArray are belonging to
258
 * @param unknown_type $glue defaults to empty string
259
 * @param unknown_type $sortArray whether to sort the $elementArray alphabetically
260
 * @param unknown_type $enclosingHtml
261
 */
262
function theme_cdm_descriptionElementArray($elementArray, $feature, $glue = '', $sortArray = false, $enclosingHtml = 'ul'){
263
  $out = '<'.$enclosingHtml.' class="description" id="'.$feature->representation_L10n.'">';
264

    
265
  if($sortArray) sort($elementArray);
266

    
267
  $out .= join($elementArray, $glue);
268

    
269
  $out .= '</'.$enclosingHtml.'>';
270
  return $out;
271
}
272

    
273

    
274
function theme_cdm_descriptionElement_CommonTaxonName($element){
275
  $out = '<span class="' .  html_class_atttibute_ref($element). '">' . $element->language->representation_L10n . ' (' . $element->area->titleCache . '): ' . $element->name .'</span>';
276
  return $out;
277
}
278

    
279

    
280
/**
281
 * TODO: assign a new name to the function? because it is used for the citations
282
 *       textdata elements and not for all text data description elements
283
 * @param $element The description element which contains the text information
284
 * @param $asListElement A boolean which determines whether the citations should
285
 *                       be renderer as a list or not
286
 * @return unknown_type Html to be renderized in drupal
287
 */
288
function theme_cdm_descriptionElementTextData($element, $asListElement, $feature_uuid = null){
289

    
290
  $description = str_replace("\n", "<br/>", $element->multilanguageText_L10n->text);
291
  $sourceRefs = '';
292
  $result = array();
293
  $out;
294
  $res_author;
295
  $res_date;
296

    
297
  if(is_array($element->sources)){
298
    foreach($element->sources as $source){
299
      $referenceCitation = theme('cdm_DescriptionElementSource', $source);
300
      if($description && strlen($description) > 0 && $referenceCitation ){
301
        $sourceRefs .= ' ('.$referenceCitation.')' ;
302
      }else if ($referenceCitation){
303
        $sourceRefs = $referenceCitation;
304
      }
305

    
306
      if(strlen($sourceRefs) > 0){
307
        $sourceRefs = '<span class="sources">' . $sourceRefs . '</span>';
308
      }
309

    
310
      if ($source->nameUsedInSource->uuid){ //do a link to name page
311
        $name_used_in_source_link_to_show = l($source->nameUsedInSource->titleCache,
312
	        path_to_name($source->nameUsedInSource->uuid),
313
	        array(), NULL, NULL, FALSE ,TRUE);
314
      }else if (strlen($source->nameUsedInSource->originalNameString) > 0){ //show a text without link
315
        $name_used_in_source_link_to_show = $source->nameUsedInSource->originalNameString;
316
      }
317

    
318
      if ($asListElement){
319
        $out = '<li class="descriptionText DescriptionElement">' . $name_used_in_source_link_to_show;
320
        //adding ":" if necesary
321
        if ($name_used_in_source_link_to_show && ($description || $sourceRefs)){
322
          $out .= ': ';
323
        }
324
        $out .= $description . $sourceRefs . theme('cdm_annotations_as_footnotekeys', $element, $feature_uuid) . '</li>';
325
      }else{
326
        if ($name_used_in_source_link_to_show){
327
          $name_used_in_source_link_to_show = ' (name in source: '. $name_used_in_source_link_to_show . ')';
328
        }
329
        $out = '<span class="DescriptionElement DescriptionElement-' . $element->class .'">' . $description . $sourceRefs . $name_used_in_source_link_to_show . '</span>';
330
      }
331
    }
332
  }
333
  //if no sources, print the description
334
  if(!isset($out)) {
335
    $out = $description;
336
  }
337

    
338
  return $out;
339
}
340

    
341

    
342
function theme_cdm_common_names($elements){
343
  $text_data_out = '';
344
  $common_name_out = '';
345
  $separator = ',';
346
  $textData_commonNames = array();
347

    
348

    
349
  if (is_array($elements)){
350
    foreach ($elements as $element){
351
      if ($element->class == 'CommonTaxonName'){
352
        //$key = '<b>' . $element->language->representation_L10n . '</b> (' . $element->area->titleCache . ')';
353
        if ($element->language->representation_L10n){
354
          $key = '<b>' . $element->language->representation_L10n . '</b>';
355
          $key .= (strlen($element->area->titleCache)>0) ? ' (' . $element->area->titleCache . ')' : '';
356
        }
357
        $common_names[$key][] = $element;
358
      }else if ($element->class == 'TextData'){
359
     //else if ($element->class == 'TextData' && $element->feature->uuid == UUID_COMMON_NAME){
360
        $textData_commonNames[] = $element;
361
      }
362
    }
363
  }
364
  //handling common names
365

    
366
  if (count($common_names) > 0){
367
    //sorting the a-array based on the area (key)
368
    ksort($common_names);
369
    //creating the output to be render by drupal
370
    foreach ($common_names as $key => $elements){
371
      $rendered_element_list = '';
372
      foreach($elements as $element){
373
        $sourcesFootnoteKeyList = '';
374
        // adding footnotes sources
375
        foreach($element->sources as $source){
376
          if(_is_original_source_type($source)){
377
            $_fkey = FootnoteManager::addNewFootnote(UUID_COMMON_NAME, theme('cdm_DescriptionElementSource', $source, false));
378
            $sourcesFootnoteKeyList .= theme('cdm_footnote_key', $_fkey, ($sourcesFootnoteKeyList ? $separator : ''));
379
          }
380
        }
381
        if($element->name){
382
          $rendered_element_list .= '<span class="' .  html_class_atttibute_ref($element). '">' . (strlen($rendered_element_list) > 0 ? ', ': '') . $element->name . $sourcesFootnoteKeyList . '</span>';
383
        }
384
      }
385
      if ($key){
386
       $common_name_out .= (strlen($common_name_out) > 0 ? '; ': '') . $key . ': ' . $rendered_element_list;
387
      }else{
388
        $common_name_out .= (strlen($common_name_out) > 0 ? '; ': '') . $rendered_element_list;
389
      }
390
    }
391
  }
392
  //handling commons names as text data
393
  foreach($textData_commonNames as $text_data_element){
394
    $text_data_out .= theme('cdm_descriptionElementTextData', $text_data_element, true, $text_data_element->feature->uuid);
395
  }
396

    
397
  $common_name_out = "<div class=common_names_as_common_names> $common_name_out </div>";
398
    $out_array[] = $text_data_out;
399
  $common_name_out_text_data = '<div class=common_names_as_text_data>' . theme('cdm_descriptionElementArray', $out_array, $element->feature) . '</div>';
400

    
401
  return $common_name_out . $common_name_out_text_data;
402
  //return $common_name_out . theme('cdm_descriptionElementArray', $out_array, $element->feature);
403
  //return "<div class=common_names> $common_name_out $common_name_out_text_data";
404
}
405

    
406
/**
407
 * Theme a list of description elements, usually of a specific feature type
408
 * @param $descriptionElements
409
 * @return unknown_type
410
 */
411
function theme_cdm_descriptionElements($descriptionElements, $featureUuid, $taxon_uuid){
412

    
413
  $outArray = array();
414

    
415
/*
416
  $userDefined = mixed_variable_get(LAYOUT_SETTING_PREFIX . $featureUuid, FEATURE_TREE_LAYOUT_DEFAULTS);
417
  if(variable_get('distribution_sort', 'NO_SORT')  != 'NO_SORT'){
418
    $glue = '';
419
    $enclosingTag = 'dl';
420
    $entryEnclosingTag = null;
421
  } else if($userDefined && $userDefined['enabled']){
422
      $glue = $userDefined['glue'];
423
      $enclosingTag = $userDefined['enclosingTag'];
424
      $entryEnclosingTag = $userDefined['entryEnclosingTag'];
425
  } else {
426
    // TODO remove once LAYOUT_SETTING_PREFIX-{uuid} seeting are confired to work for all portals (selenium test still missing!!!)
427
    $glue = '';
428
    $enclosingTag = 'ul';
429
    $entryEnclosingTag = null ;
430
  }
431
*/
432

    
433
	if(variable_get('distribution_sort', 'NO_SORT')  != 'NO_SORT'){
434
		$glue = '';
435
		$enclosingTag = 'dl';
436
	} else {
437
		$glue = '';
438
		$enclosingTag = 'ul';
439
	}
440

    
441
  $sortOutArray = false;
442
  $distributionElements = array();
443

    
444
  RenderHints::pushToRenderStack('cdm_descriptionElements');
445

    
446
  if(is_array($descriptionElements)){//avoiding warning box in drupal for flora malesiana
447
    foreach($descriptionElements as $descriptionElement) {
448

    
449
      // --- DISTRIBUTION ---- //
450
      if($descriptionElement->feature->uuid == UUID_DISTRIBUTION){
451
        if($descriptionElement->class == 'Distribution'){
452
          $sortKey = $descriptionElement->area->representation_L10n;
453
          $distributionElements[$sortKey]= $descriptionElement;
454
        } else if($descriptionElement->class == 'TextData'){
455
          $asListElement = false;
456
          $repr = theme ('cdm_descriptionElementTextData', $descriptionElement, $asListElement, $descriptionElement->feature->uuid);
457

    
458
          if( !array_search($repr, $outArray)){
459
          	$outArray[] = $repr;
460
            //TODO HINT: sorting in theme_cdm_descriptionElementArray will not work since this array contains html attributes with uuids !!!!
461
            $sortOutArray = true;
462
            $glue = '<br/> ';
463
            $enclosingTag = 'p';
464
          }
465
        }
466
      }
467

    
468
       // --- IMAGE_SOURCES --- //
469
      else if($descriptionElement->feature->uuid == UUID_IMAGE_SOURCES){
470
        $image_sources[] = $descriptionElement;
471
      }
472

    
473
      // ---- class == TextData ---- //
474
      else if($descriptionElement->class == 'TextData'){
475
        $asListElement = true;
476
        $outArray[] = theme('cdm_descriptionElementTextData', $descriptionElement, $asListElement, $descriptionElement->feature->uuid);
477
      }else if ($descriptionElement->class == 'CommonTaxonName') {
478
        $outArray[] = theme('cdm_descriptionElement_CommonTaxonName', $descriptionElement);
479
      }else {
480
        $outArray[] = '<li>No method for rendering unknown description class: '.$descriptionElement->classType.'</li>';
481
      }
482
    }
483
  }
484

    
485
  //if feature = NAME USAGE sort the list of sources
486
  //this is ONLY for FLORA MALESIANA and FLORE d'AFRIQUE CENTRALE
487
  if($descriptionElement->feature->uuid == UUID_NAME_USAGE){
488
    sort($outArray);
489
  }
490

    
491

    
492
  if($image_sources){
493
      $outArray[] = theme('cdm_description_element_image_source', $image_sources, true);
494

    
495
  }
496

    
497
  if(variable_get('distribution_sort', 'NO_SORT') != 'NO_SORT'){
498
    $outArray[] = theme('cdm_description_ordered_distributions', $taxon_uuid, $distributionElements);
499
  }else{
500
    ksort($distributionElements);
501
    $outArray[] = theme('cdm_descriptionElementDistribution', $distributionElements); // TODO , $entryEnclosingTag);
502
  }
503

    
504
  // take the feature of the last $descriptionElement
505
  $feature = $descriptionElement->feature;
506
  $out = theme('cdm_descriptionElementArray', $outArray, $feature, $glue, $sortOutArray, $enclosingTag);
507

    
508
  RenderHints::popFromRenderStack();
509
  return $out;
510
}
511

    
512
/**
513
 *
514
 * Enter description here ...
515
 * @param unknown_type $a
516
 * @param unknown_type $b
517
 */
518
function compare_image_sources($a, $b){
519
    if($a->multilanguageText_L10n->text == $b->multilanguageText_L10n->text){
520
      return 0;
521
    }
522
    return ($a->multilanguageText_L10n->text < $b->multilanguageText_L10n->text) ? -1 : 1;
523
}
524

    
525
/**
526
 *
527
 */
528
function theme_cdm_description_element_image_source($image_sources, $asListElement) {
529
    $out = '';
530
    $separator = ',';
531
    RenderHints::pushToRenderStack('descriptionElementImageSource');
532
    RenderHints::setFootnoteListKey(UUID_IMAGE_SOURCES);
533

    
534
    //sorting the image sources
535
    usort($image_sources, "compare_image_sources");
536
    //generate the footnotes
537
    foreach($image_sources as $image_source){
538
        $footNoteKeys = cdm_annotations_as_footnotekeys($image_source);
539
        foreach($image_source->sources as $source){
540
            if(_is_original_source_type($source)){
541
                $fn_key = FootnoteManager::addNewFootnote(RenderHints::getFootnoteListKey(), theme('cdm_DescriptionElementSource', $source, false));
542
                cdm_add_footnote_to_array($footNoteKeys, $fn_key);// ensure uniqueness of the footnote keys
543
            }
544
        }
545
        //sort and render footnote keys
546
        $footnoteKeyListStr = '';
547
        asort($footNoteKeys);
548
        foreach($footNoteKeys as $footNoteKey){
549
            $footnoteKeyListStr .= theme('cdm_footnote_key', $footNoteKey, ($footnoteKeyListStr ? $separator : ''));
550
        }
551
        //return value!
552
        $out .= '<span class="descriptionElement descriptionElement-'.$image_source->uuid.'">'.$image_source->multilanguageText_L10n->text . $footnoteKeyListStr . '; </span>';
553

    
554
    }
555

    
556
    RenderHints::popFromRenderStack();
557
    return $out;
558
}
559

    
560
/**
561
 *
562
 * @param unknown_type $descriptionElements
563
 * @param String $enclosingTag
564
 */
565
function theme_cdm_descriptionElementDistribution($descriptionElements, $enclosingTag = "span"){
566

    
567

    
568
	if(!$enclosingTag){
569
		$enclosingTag = "span";
570
	}
571

    
572
  $out = '';
573
  $separator = ',';
574
  RenderHints::pushToRenderStack('descriptionElementDistribution');
575
  RenderHints::setFootnoteListKey(UUID_DISTRIBUTION);
576

    
577
  foreach($descriptionElements as $descriptionElement){
578

    
579
    // annotations as footnotes
580
    $footNoteKeys = cdm_annotations_as_footnotekeys($descriptionElement);
581
    // source references as footnotes
582
    foreach($descriptionElement->sources as $source){
583
      if(_is_original_source_type($source)){
584
        $fn_key = FootnoteManager::addNewFootnote(RenderHints::getFootnoteListKey(), theme('cdm_DescriptionElementSource', $source, false));
585
        cdm_add_footnote_to_array($footNoteKeys, $fn_key);// ensure uniqueness of the footnote keys
586
      }
587
    }
588
    // sort and render footnote keys
589
    $footnoteKeyListStr = '';
590
    asort($footNoteKeys);
591
    foreach($footNoteKeys as $footNoteKey){
592
      $footnoteKeyListStr .= theme('cdm_footnote_key', $footNoteKey, ($footnoteKeyListStr ? $separator : ''));
593
    }
594

    
595
    $out .= '<'. $enclosingTag .' class="descriptionElement descriptionElement-'.$descriptionElement->uuid.'">'
596
      . $descriptionElement->area->representation_L10n . $footnoteKeyListStr . ' </'. $enclosingTag .'>';
597
  }
598

    
599
  RenderHints::popFromRenderStack();
600
  return $out;
601
}
602

    
603
/**
604
 * Function target is to compare two different foootnotes objects.
605
 * The comparation is based on the footnote key. The one which is
606
 * displayed as footnote number.
607
 *
608
 * @param footnote object $a
609
 * @param footnote object $b
610
 */
611
function footnotes_key_compare($a, $b){
612
  $res = 0;
613
  if ($a->keyStr < $b->keyStr){
614
    $res = -1;
615
  }elseif ($a->keyStr > $b->keyStr){
616
    $res = 1;
617
  }
618
  return $res;
619
}
620

    
621
function theme_cdm_description_ordered_distributions($taxon_uuid, $descriptionElements){
622
  //returning null if no description elements
623
  if ($descriptionElements == null){
624
    return '';
625
  }
626
  //initialization some variables
627
  $out = '';
628
  $separator = ',';
629
  RenderHints::pushToRenderStack('descriptionElementDistribution');
630
  RenderHints::setFootnoteListKey(UUID_DISTRIBUTION);
631
  //getting all the taxon description for a given taxon
632
  $taxonDescriptions = cdm_ws_get(CDM_WS_PORTAL_TAXON_DESCRIPTIONS, $taxon_uuid);
633
  foreach ($taxonDescriptions as $description){
634
    $descriptions_uuids[] = $description->uuid;
635
  }
636
  //getting the sortered distributions (omiting level ??)
637
  $request_params = array();
638
  $request_params['omitLevels'] = UUID_NAMEDAREALEVEL_TDWGLEVEL_2;
639
  $ordered_areas = cdm_ws_get(CDM_WS_PORTAL_DESCRIPTION_DISTRIBUTION_TREE, join(',',$descriptions_uuids), queryString($request_params));
640
  $ordered_areas = $ordered_areas->rootElement->children;
641

    
642
  //printing the distributions
643
  foreach ($ordered_areas as $element_level1){
644
    //level1
645
    if ($element_level1->data){
646
      $out .= '<dt>' . $element_level1->data->area->representation_L10n . ':</dt> ';
647
    }
648
    $out .= '<dd>';
649

    
650
    //level3
651
    foreach ($element_level1->children as $element_level3){
652
      if ($element_level3->data){
653
        $text_l3 = $element_level3->data->area->representation_L10n;
654
      }
655
      $fnKeysLevel3Str = '';
656
      $fnKeysLevel3 = cdm_annotations_as_footnotekeys($element_level3->data);
657
      foreach($element_level3->data->sources as $source){
658
        if(_is_original_source_type($source)){
659
          $fn_key3 = FootnoteManager::addNewFootnote(RenderHints::getFootnoteListKey(), theme('cdm_DescriptionElementSource', $source, false));
660
          cdm_add_footnote_to_array($fnKeysLevel3, $fn_key3);
661
        }
662
      }
663
      //level4
664
      $l4_regions = array();
665
      foreach ($element_level3->children as $element_level4){
666
        if ($element_level4->data){
667
          $text_l4 = $element_level4->data->area->representation_L10n;
668
          $l4_regions[$element_level3->data->area->representation_L10n] = '';
669
          $fnKeysLevel4Str = '';
670
          $fnKeysLevel4 = cdm_annotations_as_footnotekeys($element_level4->data);
671
          foreach($element_level4->data->sources as $source){
672
            if(_is_original_source_type($source)){
673
              $fn_key4 = FootnoteManager::addNewFootnote(RenderHints::getFootnoteListKey(), theme('cdm_DescriptionElementSource', $source, false));
674
              cdm_add_footnote_to_array($fnKeysLevel4, $fn_key4);
675
            }
676
          }
677
          usort($fnKeysLevel4, "footnotes_key_compare");
678
          $l4_regions[$text_l4] = $fnKeysLevel4;
679
        }
680
      }//level4
681
      //managing level3 and level4 for generating the right output
682
      usort($fnKeysLevel3, "footnotes_key_compare");
683
      foreach ($fnKeysLevel3 as $key3){
684
        foreach ($l4_regions as $key4 => $value4){
685
          cdm_add_footnote_to_array($l4_regions[$key4], $key3);
686
        }
687
      }
688
      if ($element_level3->numberOfChildren == 1 &&
689
       $text_l3 == $element_level3->children[0]->data->area->representation_L10n){
690
        //var_dump($element_level3->children[0]->data->area->representation_L10n);
691
        $fnStr = '';
692
        $region = array_pop($l4_regions);
693
        foreach($region as $key){
694
          $fnStr .= theme('cdm_footnote_key', $key, ($fnStr ? $separator : ''));
695
        }
696
        $out .= "$text_l3 $fnStr; ";
697
              //removing whitespaces when &fnStr is empty
698
        if(substr($out, -3) == ' ; '){
699
          $out = substr($out, 0, -3) . '; ';
700
        }
701
      }else{
702
        $fnKeysLevel3Str = '';
703
        foreach($fnKeysLevel3 as $key){
704
          $fnKeysLevel3Str .= theme('cdm_footnote_key', $key, ($fnKeysLevel3Str ? $separator : ''));
705
        }
706
        $text_l4_aux = '';
707
        foreach ($l4_regions as $key => $value){
708
          $fnKeysLevel4Str = '';
709
          if (is_array($l4_regions[$key])) {
710
            foreach ($l4_regions[$key] as $fnkey){//warning why?
711
              $fnKeysLevel4Str .= theme('cdm_footnote_key', $fnkey, ($fnKeysLevel4Str ? $separator : ''));
712
            }
713
          }
714
          //if ($key != $text_l3 || sizeof($l4_regions > 1)){
715
          if ($key != $text_l3){
716
            $text_l4_aux .= "$key $fnKeysLevel4Str, ";
717
          }
718
        }
719
        $text_l4_aux = substr($text_l4_aux, 0, -2);
720

    
721
        if (strlen($text_l4_aux) > 0){
722
          $out .= "$text_l3 $fnKeysLevel3Str ($text_l4_aux); ";
723
        }else{
724
          $out .= "$text_l3 $fnKeysLevel3Str; ";
725
        }
726

    
727
      }
728
    }//level3
729
    $out = substr($out, 0, -2);
730
    $out .= '.</dd>';
731
  }//level1
732

    
733
  RenderHints::popFromRenderStack();
734
  return $out;
735
}
736

    
737
function theme_cdm_DescriptionElementSource($descriptionElementSource, $doLink = TRUE){
738

    
739
  if(isset($descriptionElementSource->citation)){
740
    $out = theme('cdm_reference', $descriptionElementSource->citation, $descriptionElementSource->citationMicroReference, $doLink);
741
  }
742
  return $out;
743
}
744

    
745
function theme_cdm_IdentifieableSource($source, $doLink = TRUE){
746

    
747
  if(isset($source->citation)){
748
    $out = theme('cdm_reference', $source->citation, $source->citationMicroReference, $doLink);
749
  }
750
  return $out;
751
}
752

    
753

    
754

    
755

    
756

    
757
/*
758
 function theme_cdm_descriptionElementDistribution($descriptionElements){
759

    
760
 $out = '';
761
 $separator = ',';
762
 RenderHints::pushToRenderStack('descriptionElementDistribution');
763
 RenderHints::setFootnoteListKey(UUID_DISTRIBUTION);
764
 foreach($descriptionElements as $descriptionElement){
765
 // annotations as footnotes
766
 $annotationFootnoteKeys = theme('cdm_annotations_as_footnotekeys', $descriptionElement);
767
 // source references as footnotes
768
 $sourcesFootnoteKeyList = '';
769
 foreach($descriptionElement->sources as $source){
770
 if(_is_original_source_type($source)){
771
 $_fkey = FootnoteManager::addNewFootnote(UUID_DISTRIBUTION, theme('cdm_DescriptionElementSource', $source, false));
772
 $sourcesFootnoteKeyList .= theme('cdm_footnote_key', $_fkey, UUID_DISTRIBUTION, ($sourcesFootnoteKeyList ? $separator : ''));
773
 }
774
 }
775
 if($annotationFootnoteKeys && $sourcesFootnoteKeyList){
776
 $annotationFootnoteKeys .= $separator;
777
 }
778
 $out .= $descriptionElement->area->representation_L10n . $annotationFootnoteKeys . $sourcesFootnoteKeyList . ' ';
779
 }
780

    
781
 $out = substr($out, 0, strlen($out)-strlen($separator) );
782

    
783
 RenderHints::popFromRenderStack();
784
 return $out;
785

    
786
 }
787
 */
788

    
789

    
790
/**
791
 * TODO
792
 * Quick-and-dirty solution to show distribution service to exemplar groups
793
 *
794
 * @param unknown_type $featureTo
795
 * @return unknown
796
 */
797
function theme_cdm_distribution_map($taxon){
798

    
799
  $server = getEDITMapServiceURI();
800

    
801
  if(!$server){
802
    //warning message
803
    drupal_set_message('No \'Geoservice Access Point\' has been set so far. '
804
    . 'Please configure the variable \'Geoservice Access Point\' here '
805
    . l('CDM Dataportal Settings', 'admin/settings/cdm_dataportal/geo'), 'warning');
806
    //message to render
807
    return "<p>No geoservice specified</p>";
808
  }else{
809
    $fontStyles = array(0 => "plane", 1 => "italic");
810

    
811
    // query cdm server for map service uri parameters
812
    $map_data_parameters = cdm_ws_get(CDM_WS_GEOSERVICE_DISTRIBUTIONMAP, $taxon->uuid);
813
    $out .= "<!-- map_data_parameters:". print_r($map_data_parameters, true) . " -->";
814
    $query_string = $map_data_parameters->String;
815
    if(!$query_string){
816
      // the $query_string is empty if there are no distribution areas defined
817
      return ;
818
    }
819

    
820
    // some cleaning of the URI paramters, TODO is this still needed?
821
    $query_string = str_replace('%3A', ":", $query_string);
822

    
823
    // additional query parameters as set in the data portal admin section
824
    $display_width = variable_get('cdm_dataportal_geoservice_display_width', false);
825
    $bounding_box = variable_get('cdm_dataportal_geoservice_bounding_box', false);
826
    $labels_on = variable_get('cdm_dataportal_geoservice_labels_on', 0);
827

    
828
    $query_string .= ($display_width ? '&ms=' . $display_width: '').
829
    ($bounding_box ? '&bbox=' .  $bounding_box : '')
830
    . ($labels_on ? '&label=' .  $labels_on : '');
831

    
832
    /* ------ choose the display mode, either openlayers or static image ------ */
833

    
834
    if(variable_get('cdm_dataportal_map_openlayers', 1)){
835

    
836
      $query_string .= '&img=false';
837

    
838
      /* =========== display distributions using the openlayers map viewer =========== */
839

    
840
      $legend_url_font_size = variable_get('cdm_dataportal_geoservice_legend_font_size', 10);
841
      $legend_url_font_style = variable_get('cdm_dataportal_geoservice_legend_font_style', 1);
842
      $legend_url_font_style = $fontStyles[$legend_url_font_style];
843
      $legend_url_icon_width  = variable_get('cdm_dataportal_geoservice_legend_icon_width', 35);
844
      $legend_url_icon_height = variable_get('cdm_dataportal_geoservice_legend_icon_height', 15);
845

    
846
      $legendFormatQueryStr  = "format=image".urlencode('/')."png&TRANSPARENT=TRUE";
847
      $legendFormatQueryStr .= "&WIDTH=".$legend_url_icon_width."&HEIGHT=".$legend_url_icon_height."&";
848
      //TODO why is the layer=topp:tdwg_level_4 parameter neede at all here??
849
      $legendFormatQueryStr .="layer=topp".urlencode(':')."tdwg_level_4&LEGEND_OPTIONS=forceLabels".urlencode(':')."on;fontStyle".urlencode(':').$legend_url_font_style.";fontSize".urlencode(':').$legend_url_font_size."&SLD=".urlencode($sldLegend);
850

    
851
      $out .= get_openlayers_map(
852
        $display_width,
853
        null,
854
        $query_string,
855
        $legendFormatQueryStr,
856
        variable_get('cdm_dataportal_geoservice_map_caption', '')
857
      );
858

    
859
    } else {
860

    
861
      // simple image
862
      $mapStaticCaption = '&mc_s=Georgia,15,blue&mc=' . variable_get('cdm_dataportal_geoservice_map_caption', '');
863

    
864
      $query_string .= '&img=true';
865
      $query_string .= '&legend=1&mlp=3' . $mapStaticCaption . '&recalculate=false';
866

    
867
      $map_service_script_name = "areas.php";
868

    
869
      // apply Plain Image map settings
870
      if (getEDITMapServiceVersionNumber() >= 1.1){
871
        /*
872
         * example : title=a:Naturalized++non-invasive
873
         * &ad=cyprusdivs:bdcode:a:5&as=a:ff9900,,0.1,&l=tdwg4
874
         * &ms=500&bbox=32,34,35,36&img=true&legend=1&mlp=3
875
         * &mc_s=Georgia,15,blue&mc=&recalculate=false
876
         *
877
         * http://edit.br.fgov.be/edit_wp5/v1/rest_gen.php?
878
         * l=background_gis:b,cyprusdivs&ad=cyprusdivs%3Abdcode%3Aa%3A8%2C4
879
         * &as=a%3A339966%2C%2C0.1%2C|b:0000ff,,
880
         * &bbox=32%2C34%2C35%2C36&img=true&legend=1&mc=&mc_s=Georgia%2C15%2Cblue
881
         * &mlp=3&ms=500&recalculate=false&title=a%3Aindigenous
882
         */
883

    
884
        $map_service_script_name = "rest_gen.php";
885

    
886
        $bgcolor_areaStyleId= "y";
887
        $baselayer_areaStyleId= "z";
888
        $bgcolor_layer='';
889
        $additional_area_styles = array();
890

    
891
        // background color:
892
        if(variable_get('map_bg_color', '')){
893
          $bgcolor_layer = "background_gis:".$bgcolor_areaStyleId;
894
          $additional_area_styles[] = $bgcolor_areaStyleId . ":" . variable_get('map_bg_color', '') . ",,";
895
        }
896

    
897
        //TODO HACK to replace the default base layer which currently is tdwg4 !!!
898
        if(strpos($query_string, "?l=") !== FALSE){
899
          $layer_param_token = "?l=";
900
        } else {
901
          $layer_param_token = "&l=";
902
        }
903
        if(strpos($query_string, "?as=") !== FALSE){
904
          $areystyle_param_token = "?as=";
905
        } else {
906
          $areystyle_param_token = "&as=";
907
        }
908

    
909
        if(variable_get('map_base_layer', '')){
910
          $query_string = str_replace($layer_param_token."tdwg4", "$layer_param_token".variable_get('map_base_layer', ''). ":" . $baselayer_areaStyleId, $query_string);
911
        } else {
912
          $query_string = str_replace($layer_param_token."tdwg4", $layer_param_token."tdwg4:".$baselayer_areaStyleId . ",", $query_string);
913
        }
914

    
915
        if($bgcolor_layer){
916
          $query_string = str_replace($layer_param_token, $layer_param_token . $bgcolor_layer . ",", $query_string);
917
        }
918

    
919
        if(variable_get('map_base_layer_style', '')){
920
          $additional_area_styles[] = $baselayer_areaStyleId . ":" . variable_get('map_base_layer_style', '');
921
        }
922

    
923
        foreach ($additional_area_styles as $as) {
924
          $query_string = str_replace($areystyle_param_token, $areystyle_param_token . $as . "|", $query_string);
925
        }
926

    
927
      }
928

    
929
      $mapUri = url("$server/$map_service_script_name?$query_string");
930
      $out .= '<img class="distribution_map" src="' . $mapUri . '" alt="Distribution Map" />';
931
    }
932
    return $out;
933
  }
934
}
935

    
936
/**
937
 * Returns a list of a specific type of IdentificationKeys, the list can be restricteded by a taxon.
938
 * @param $type The simple name of the cdm class implementing the interface IIdentificationKey,
939
 *          valid values are : PolytomousKey, MediaKey, MultiAccessKey
940
 * @param $taxonUuid if given this parameter restrict the listed keys to
941
 *          those which have the taxon identified be this uuid in scope.
942
 */
943
function _list_IdentificationKeys($type, $taxonUuid = null, $pageSize = null, $pageNumber = null){
944

    
945
  if(!$type){
946
    drupal_set_message("Type parameter is missing", "error");
947
    return;
948
  }
949
  $cdm_ws_pasepath = null;
950
  switch($type){
951
    case "PolytomousKey" : $cdm_ws_pasepath = CDM_WS_POLYTOMOUSKEY; break;
952
    case "MediaKey" : $cdm_ws_pasepath = CDM_WS_MEDIAKEY; break;
953
    case "MultiAccessKey" : $cdm_ws_pasepath = CDM_WS_MULTIACCESSKEY; break;
954
  }
955

    
956
  if(!$cdm_ws_pasepath){
957
    drupal_set_message("Type parameter is not valid: ".$type, "error");
958
  }
959

    
960
  $queryParameters  = '';
961
  if(is_numeric($pageSize)){
962
    $queryParameters  = "pageSize=".$pageSize;
963
  } else {
964
    $queryParameters  = "pageSize=0";
965
  }
966

    
967
  if(is_numeric($pageNumber)){
968
    $queryParameters  = "pageNumber=".$pageNumber;
969
  } else {
970
    $queryParameters  = "pageNumber=0";
971
  }
972
  $queryParameters  = null;
973
  if($taxonUuid){
974
    $queryParameters = "findByTaxonomicScope=$taxonUuid";
975
  }
976
  $pager = cdm_ws_get($cdm_ws_pasepath, null, $queryParameters);
977

    
978
  if(!$pager || $pager->count == 0){
979
      return array();
980
  }
981
  return $pager->records;
982
}
983

    
984
function theme_cdm_IdentificationKey($identificationKey, $doLinkToKeyPage = true, $showIdentificationKeyTitle = true){
985

    
986
   $parentRenderPath = RenderHints::getRenderPath();
987
   RenderHints::pushToRenderStack("IdentificationKey");
988

    
989
   if($showIdentificationKeyTitle){
990
     if($doLinkToKeyPage) {
991
       $out = l($identificationKey->titleCache, path_to_key($identificationKey->class, $identificationKey->uuid));
992
     } else {
993
       $out = $identificationKey->titleCache;
994
     }
995
   }
996
   if(is_array($identificationKey->sources)){
997
     // display sources
998
     $i = 0;
999
     $out .= '<div>';
1000
     foreach($identificationKey->sources as $source){
1001
      $out .= ($i++ > 0 ? ', ' : '' ) . theme("cdm_IdentifieableSource", $source);
1002
     }
1003
     $out .= '</div>';
1004
   }
1005
     // display annotations
1006
   $out .= theme('cdm_annotations', cdm_ws_getAnnotationsFor($identificationKey), 'div');
1007
   RenderHints::popFromRenderStack();
1008
   return $out;
1009
}
1010

    
1011
function theme_cdm_polytomousKey(&$polytomousKey){
1012

    
1013
  $keyStyle = "linkedStyle"; // TODO settings needed
1014

    
1015
  RenderHints::pushToRenderStack("polytomousKey");
1016
  // key nodes in linked style
1017
  $out = '<table class="polytomousKey polytomousKey_'.$keyStyle.'">';
1018
  $out .= theme('cdm_polytomousKey_'.$keyStyle.'_subgraph', $polytomousKey->root);
1019
  $out .= '</table>';
1020
  RenderHints::popFromRenderStack();
1021
  return $out;
1022
}
1023

    
1024
function theme_cdm_polytomousKey_linkedStyle_subgraph(&$polytomousKeyNode){
1025

    
1026
  static $statementCountCharacter = '\'';
1027

    
1028
  $out = "";
1029

    
1030
  if(is_array($polytomousKeyNode->children)){
1031

    
1032
    $childIndex = 0;
1033

    
1034
    // render edges of the current node
1035
    foreach($polytomousKeyNode->children as &$child){
1036

    
1037
      if(!isset($child->statement)){
1038
        // skip node with empty statements (see below for explanation: "Special case")
1039
        continue;
1040
      }
1041

    
1042
      /*
1043
       * Special case:
1044
       * Child nodes with empty statements but taxa as leaf are to
1045
       * treated as if all those taxa where direct children of the source node.
1046
       */
1047
      $islinkToManyTaxa = !isset($child->children[0]->statement) && isset($child->children[0]->taxon->uuid);
1048
      $islinkToTaxon = isset($child->taxon->uuid);
1049
      $islinkToSubKey = isset($child->subkey->uuid);
1050
      $islinkToOtherNode = isset($child->otherNode);
1051
      $islinkToNode = $child->nodeNumber && !$islinkToManyTaxa && !$islinkToOtherNode; // either null or 0
1052
      $hasQuestion = isset($polytomousKeyNode->question->label_l10n);
1053
      $hasFeature = isset($polytomousKeyNode->feature);
1054

    
1055
      //$indentEdge = $hasQuestion && $childIndex > 0;
1056

    
1057
      // Question
1058
      if($hasQuestion && $childIndex == 0){
1059
          // place question, as extra table row
1060
          $out .= '<tr class="question new_section">';
1061
          $out .= '<td class="nodeNumber">'. uuid_anchor($polytomousKeyNode->uuid, $polytomousKeyNode->nodeNumber) . "</td>";
1062
          $out .= '<td class="question">' . $polytomousKeyNode->question->label_l10n . '</td>';
1063
          $out .= '</tr>';
1064
      }
1065

    
1066
      $out .= '<tr class="childCount_' . $childIndex . (!$hasQuestion && $childIndex == 0 ? ' new_section':''). '">';
1067

    
1068
      if($hasQuestion){
1069
        $out .= '<td class="nodeNumber"></td>';
1070
      } else {
1071
        $out .= '<td class="nodeNumber">'. uuid_anchor($polytomousKeyNode->uuid, $polytomousKeyNode->nodeNumber . str_pad("", $childIndex , $statementCountCharacter)) . "</td>";
1072
      }
1073

    
1074
      $out .= '<td ' . RenderHints::getHtmlElementID($child) . '  class="edge'.($hasQuestion? ' edge-indent': '').'">';
1075

    
1076
      // Feature
1077
      if($hasFeature){
1078
        $out .= $polytomousKeyNode->feature->representation_L10n . " ";
1079
      }
1080

    
1081
      // Statement
1082
      $out .=  $child->statement->label_l10n;
1083

    
1084
      // --- links to nodes taxa and subkeys
1085
      $out .= '<div class="nodeLink">';
1086

    
1087
     // link to a PolytomousKeyNode
1088
      if($islinkToNode){
1089
        $out .= '<div class="nodeLinkToNode">';
1090
        if(is_object($child->modifyingText)){
1091
            $out .= theme('cdm_poytomousKeyNode_modifyingText', $child->modifyingText);
1092
        }
1093
        $out .= l($child->nodeNumber, $_REQUEST["q"], null, null, $child->uuid) . '</div>';
1094
      }
1095

    
1096
      // link to a PolytomousKeyNode
1097
      if($islinkToOtherNode){
1098
        $out .= '<div class="nodeLinkToOtherNode">';
1099
        if(is_object($child->modifyingText)){
1100
            $out .= theme('cdm_poytomousKeyNode_modifyingText', $child->modifyingText);
1101
        }
1102
        $out .= l($child->otherNode->nodeNumber, $_REQUEST["q"], null, null, $child->otherNode->uuid) . '</div>';
1103
      }
1104

    
1105
      // link to one or many taxa
1106
      if($islinkToTaxon || $islinkToManyTaxa){
1107

    
1108
        if($islinkToManyTaxa){
1109
          $taxonChildren = $child->children;
1110
        } else {
1111
          $taxonChildren = array($child);
1112
        }
1113

    
1114
        foreach($taxonChildren as $taxonChild){
1115
          // TODO many taxa $child->children->taxon
1116
          $out .= '<div class="nodeLinkToTaxon">';
1117
          if(is_object($taxonChild->modifyingText)){
1118
            $out .= theme('cdm_poytomousKeyNode_modifyingText', $taxonChild->modifyingText);
1119
          }
1120
          $out .=  theme("cdm_taxonName", $taxonChild->taxon->name, url(path_to_taxon($taxonChild->taxon->uuid)));
1121
          $out .=  '</div>';
1122
        }
1123

    
1124
        // link to a subkey
1125
        if($islinkToSubKey){
1126
          $out .= '<div class="nodeLinkToSubkey">' . theme('cdm_IdentificationKey', $child->subkey) . '</div>';
1127
        }
1128

    
1129
      }
1130

    
1131
      $out .= '</div>'; // end node link
1132
      $out .= '</td>'; // end edge
1133
      $out .= '</tr>';
1134

    
1135
      $childIndex++;
1136
    }
1137

    
1138
    // recurse into child nodes
1139
    foreach($polytomousKeyNode->children as &$child){
1140
      $out .= theme('cdm_polytomousKey_linkedStyle_subgraph', $child);
1141
    }
1142

    
1143
  }
1144

    
1145
  return $out;
1146
}
1147

    
1148
function theme_cdm_poytomousKeyNode_modifyingText($modifyingText){
1149
  if(is_object($modifyingText)){
1150
    $i = 0;
1151
    foreach(get_object_vars($modifyingText) as $language=>$languageString){
1152
      $out .= ($i++ > 0 ? ', ' : '') . '<span class="modifyingText">'. $languageString->text . '</span> ';
1153
    }
1154
  }
1155
  return $out;
1156
}
1157

    
1158
/**
1159
 * Renders a list of a specific type of IdentificationKeys, the list can be restricteded by a taxon.
1160
 * @param $type The simple name of the cdm class implementing the interface IIdentificationKey,
1161
 *          valid values are : PolytomousKey, MediaKey, MultiAccessKey
1162
 * @param $taxonUuid if given this parameter restrict the listed keys to
1163
 *          those which have the taxon identified be this uuid in scope.
1164
 */
1165
function theme_cdm_list_IdentificationKeys($type, $taxonUuid = null, $pageSize, $pageNumber){
1166

    
1167
  $keyList = _list_IdentificationKeys($type, $taxonUuid);
1168
  if(!$keyList || count ($keyList) == 0){
1169
    return;
1170
  }
1171

    
1172
  RenderHints::pushToRenderStack('list_IdentificationKeys');
1173
  $out = '<ul>';
1174
  foreach ($keyList as $key){
1175
    $out .= '<li>';
1176
    $out .= theme('cdm_IdentificationKey', $key);
1177
    $out .= '</li>';
1178
  }
1179
  $out .= '</ul>';
1180
  $out .= theme("cdm_annotation_footnotes", RenderHints::getRenderPath());
1181
  RenderHints::popFromRenderStack();
1182

    
1183
  return $out;
1184
}
1185

    
1186
function theme_cdm_block_IdentificationKeys($taxonUuid = null, $pageSize = null){
1187

    
1188
  static $types = array("PolytomousKey"=>"Polytomous", "MediaKey"=>"Media", "MultiAccessKey"=>"Multiaccess");
1189
  RenderHints::pushToRenderStack('block_IdentificationKeys');
1190
  $out = '';
1191
  foreach($types as $type=>$label){
1192
    $keylist = theme('cdm_list_IdentificationKeys', $type, $taxonUuid, $pageSize, $pageNumber);
1193
    if(!$keylist){
1194
      continue;
1195
    }
1196
    $out .= '<div class="'.$type.'">';
1197
    $out .= '<h3>'.t($label)."</h3>";
1198
    $out .= $keylist;
1199
    $out .= '</div>';
1200
  }
1201
  RenderHints::popFromRenderStack();
1202
  return $out;
1203
}
(2-2/8)