Project

General

Profile

Download (19.7 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php
2
/**
3
 * @file
4
 * Page theming functions.
5
 *
6
 * @copyright
7
 *   (C) 2007-2012 EDIT
8
 *   European Distributed Institute of Taxonomy
9
 *   http://www.e-taxonomy.eu
10
 *
11
 *   The contents of this module are subject to the Mozilla
12
 *   Public License Version 1.1.
13
 * @see http://www.mozilla.org/MPL/MPL-1.1.html
14
 */
15

    
16
/**
17
 * Returns HTML for the default title of a taxon page.
18
 *  * The returned title is a formatted taxon name.
19
 *
20
 * @param array $variables
21
 *   An associative array containing:
22
 *   - taxon: The taxon name being formatted for the title.
23
 *   - uuid: UUID for the taxon.
24
 *
25
 * @ingroup themeable
26
 */
27
function theme_cdm_taxon_page_title($variables) {
28
  $taxon = $variables['taxon'];
29
  RenderHints::pushToRenderStack('taxon_page_title');
30
  $referenceUri = '';
31
  $out = '';
32
  if (isset($taxon->name->nomenclaturalReference)) {
33
    $referenceUri = url(path_to_reference($taxon->name->nomenclaturalReference->uuid));
34
  }
35

    
36
  $out .= render_taxon_or_name($taxon, NULL, $referenceUri, FALSE);
37
  RenderHints::popFromRenderStack();
38

    
39
  return '<span class="' . $taxon->class . '">' . $out . '</span>';
40
}
41

    
42
/**
43
 * Returns HTML for the default title of a specimen page.
44
 *  * The returned title is a the identifier of the specimen.
45
 *
46
 * @param array $variables
47
 *   An associative array containing:
48
 *   - specimen: The specimen being formatted for the title.
49
 *
50
 * @ingroup themeable
51
 */
52
function theme_cdm_specimen_page_title($variables) {
53
    $specimen = $variables['specimen'];
54
    RenderHints::pushToRenderStack('specimen_page_title');
55
    $referenceUri = '';
56
    $out = '';
57

    
58
    $title = "";
59
    if($specimen->accessionNumber){
60
        $title = $specimen->accessionNumber;
61
    }
62
    elseif($specimen->barcode){
63
        $title = $specimen->barcode;
64
    }
65
    elseif($specimen->catalogNumber) {
66
        $title = $specimen->catalogNumber;
67
    }
68

    
69

    
70
  $out .= $title;
71
  RenderHints::popFromRenderStack();
72

    
73
  return '<span class="' . $specimen->class . '">' . $out . '</span>';
74
}
75

    
76
/**
77
 * Returns HTML for the default title for a name page.
78
 *
79
 * The returned title is a formatted name.
80
 *
81
 * @param array $variables
82
 *   An associative array containing:
83
 *   - taxon_name: The taxon name object.
84
 *
85
 * @ingroup themeable
86
 */
87
function theme_cdm_name_page_title($variables) {
88
  $taxon_name = $variables['taxon_name'];
89
  RenderHints::pushToRenderStack('taxon_page_title');
90
  if (isset($taxon_name->nomenclaturalReference)) {
91
    $referenceUri = url(path_to_reference($taxon_name->nomenclaturalReference->uuid));
92
  }
93

    
94
  $out = '<span class="' . $taxon_name->class . '">'
95
    . render_taxon_or_name($taxon_name, NULL, $referenceUri, FALSE)
96
    . '</span>';
97
  RenderHints::popFromRenderStack();
98
  return $out;
99
}
100

    
101

    
102

    
103

    
104

    
105
/**
106
 * Returns HTML containing the synonymy for the accepted taxon.
107
 *
108
 * Shows the whole synonymy for the accepted taxon.
109
 * The synonymy list is headed by the complete scientific name
110
 * of the accepted taxon with nomenclatural reference.
111
 *
112
 * @param array $variables
113
 *   An associative array containing:
114
 *   - taxon
115
 *   - addAcceptedTaxon
116
 *
117
 * @ingroup themeable
118
 */
119
function theme_cdm_taxon_page_synonymy($variables) {
120
  $taxon = $variables['taxon'];
121
  $addAcceptedTaxon = $variables['addAcceptedTaxon'];
122

    
123
  RenderHints::pushToRenderStack('taxon_page_synonymy');
124

    
125
  // footnote key for the homotypic group and accepted taxon,
126
  // both should have the same footnote key
127
  RenderHints::setFootnoteListKey(RenderHints::getRenderPath());
128

    
129
  $synomymie = cdm_ws_get(CDM_WS_PORTAL_TAXON_SYNONYMY, $taxon->uuid);
130
  $skip = array(
131
    UUID_BASIONYM,
132
  );
133
  $out = '';
134

    
135
  // Render accepted taxon.
136
  //
137
  // foonotes of the accepted taxon will be rendered in the homotypic group section
138
  // even if there are not synonyms in the homotypic group
139
  // homotypic group and accepted taxon should have the same footnote key
140
  $referenceUri = '';
141
  if ($addAcceptedTaxon) {
142
    // remember the last part of the render path
143
    $synonymy_render_path = RenderHints::getRenderPath();
144
    // set new render path for the accepted taxon so
145
    // it can be styled differently via the name render part definitions
146
    RenderHints::pushToRenderStack('accepted_taxon');
147
    if (isset($taxon->name->nomenclaturalReference)) {
148
      $referenceUri = url(path_to_reference($taxon->name->nomenclaturalReference->uuid));
149
    }
150

    
151
    $accepted_name = '<div class="accepted-name">';
152
    $accepted_name .= render_taxon_or_name($taxon, NULL, $referenceUri);
153

    
154
    $name_relationships = cdm_name_relationships_of($taxon);
155
    // Render relationships of accepted name.
156
    if($name_relationships){
157

    
158
      $accepted_name .= ' <span class="name_relationships">' . $name_relationships . '</span>';
159
    }
160

    
161
      // handle annotations of the name and taxon
162
    $special_annotations_array = array();
163
    $special_annotations_array[] = $taxon->name;
164
    $special_annotations_array[] = $taxon;
165
    $accepted_name .= theme('cdm_annotations_as_footnotekeys', array(
166
        'cdmBase_list' => $special_annotations_array,
167
        'footnote_list_key' => $synonymy_render_path . '-annotations')
168
      );
169
    $accepted_name .= '</div>';
170
    RenderHints::popFromRenderStack();
171
  }
172

    
173
  // --- Render homotypic synonymy group
174
  if (!empty($accepted_name)) {
175
    $out .= $accepted_name;
176
  }
177

    
178
  // Render the homotypicSynonymyGroup including the type information.
179
  $out .= theme(
180
      'cdm_homotypicSynonymyGroup',
181
      array(
182
          'synonymList' => $synomymie->homotypicSynonymsByHomotypicGroup,
183
          'accepted_taxon_name_uuid' => $taxon->name->uuid
184
      )
185
    );
186

    
187

    
188
  // Render accepted taxon heterotypic synonymy groups.
189
  if ($synomymie->heterotypicSynonymyGroups) {
190
    foreach ($synomymie->heterotypicSynonymyGroups as $homotypicalGroup) {
191
      $out .= theme('cdm_heterotypicSynonymyGroup', array('homotypicalGroup' => $homotypicalGroup));
192
    }
193
  }
194
  // Render taxon relationships.
195
  if (variable_get(CDM_DATAPORTAL_DISPLAY_TAXON_RELATIONSHIPS, CDM_DATAPORTAL_DISPLAY_TAXON_RELATIONSHIPS_DEFAULT)) {
196
    $taxonRelationships = cdm_ws_get(CDM_WS_PORTAL_TAXON_RELATIONS, $taxon->uuid);
197
    $out .= theme('cdm_taxonRelationships', array('taxonRelationships' => $taxonRelationships, 'focusedTaxon' => $taxon));
198
  }
199

    
200
  RenderHints::popFromRenderStack();
201

    
202
  return $out;
203
}
204

    
205

    
206
/**
207
 * Returns HTML for the given result page including a pager.
208
 *
209
 * @param array $variables
210
 *   An associative array containing:
211
 *   - pager: The cdmlib pager object containing the result set of cdm base
212
 *     objects (currently this function can only handle taxon instances =>
213
 *     TODO)
214
 *   - path: The target path for the pager links, this will usually point to
215
 *     'cdm_dataportal/search/results/taxon'
216
 *
217
 * @ingroup themeable
218
 */
219
function theme_cdm_search_results($variables)
220
{
221
  $pager = $variables['pager'];
222
  $path = $variables['path'];
223

    
224
  $freetextSearchResults = array();
225

    
226
  // If the pager contains records of SearchResults, extract the taxa and use
227
  // them as records instead.
228
  if (isset($pager->records[0]) && $pager->records[0]->class == "SearchResult") {
229
    $freetextSearchResults = $pager->records;
230
    $taxa = array();
231
    // $highlightedFragments = array();
232
    foreach ($pager->records as $searchResult) {
233
      $taxa[] = &$searchResult->entity;
234
      /*
235
       if(!isset($searchResult->fieldHighlightMap)){
236
      $searchResult->fieldHighlightMap = NULL;
237
      }
238
      $fragmentHighlighting[] = $searchResult->fieldHighlightMap;
239
      */
240
    }
241
    $pager->records = $taxa;
242
  }
243

    
244

    
245
  // Add thumbnails checkbox and refine search link.
246
  $out = '<div class="page_options">';
247
  if (isset($_REQUEST['ws'])) {
248
    if (cdm_dataportal_search_form_path_for_ws($_REQUEST['ws'])) {
249
      $out .= '<div id="backButton">' . l(t('Modify search'), cdm_dataportal_search_form_path_for_ws($_REQUEST['ws'])) . '</div>';
250
    }
251
  }
252
  if (variable_get(SEARCH_RESULTS_SHOW_THUMBNAIL_CHECKBOX, SEARCH_RESULTS_SHOW_THUMBNAIL_CHECKBOX_DEFAULT)) {
253
    $out .= '<form name="pageoptions"><div id="showThumbnails"><input class="showThumbnails" type="checkbox" name="showThumbnails" ' . (do_showThumbnails() == 1 ? 'checked="checked"' : '') . '> ' . t('Display Image Thumbnails') . '</div></form>';
254
  }
255
  $out .= '</div>';
256

    
257
  $classification = cdm_dataportal_searched_in_classification();
258

    
259

    
260
  if (  count(cdm_ws_fetch_all(CDM_WS_PORTAL_TAXONOMY)) > 1 ) { // FIXME use a count REST method for this!!!
261
    $out .= '<div id="search-summary">' . t('results for') . ' ';
262
    if ($classification != NULL) {
263
      $out .=  $classification->titleCache ;
264
    } else {
265
     $out .= t('any classification');
266
    }
267
    $out .= ':</div>';
268
  }
269

    
270
  // List results.
271
  if (isset($pager->records) && count($pager->records) > 0) {
272
    $out .= '<div id="search_results">';
273
    $out .= theme('cdm_list_of_taxa',
274
        array(
275
          'records' => $pager->records,
276
          'freetextSearchResults' => $freetextSearchResults,
277
          'show_classification' => $classification === NULL
278
        )
279
      );
280
    $out .= '</div>';
281
    $out .= theme('cdm_pager', array(
282
        'pager' => $pager,
283
        'path' => $path,
284
        'parameters' => $_REQUEST,
285
    ));
286
  } else {
287
    $out .= '<h4 class="error">Sorry, no matching entries found.</h4>';
288
  }
289
  return $out;
290
}
291

    
292

    
293
/**
294
 * TODO Implementation of Hook taxon_image_gallery()
295
 *
296
 * @param unknown_type $taxon
297
 * @param unknown_type $media
298
 *
299
 * @return unknown_type
300
 */
301
function taxon_image_gallery_default($taxon, $media) {
302
  $hasImages = isset($media[0]);
303

    
304
  if ($hasImages) {
305

    
306
    $maxExtend = 150;
307
    $cols = 3;
308
    $maxRows = FALSE;
309
    $alternativeMediaUri = NULL;
310
    /* Comment @WA: was in D5:
311
    $captionElements = array(
312
      'title',
313
      'rights',
314
      '#uri' => t('open Image'),
315
    );
316
    */
317
    $captionElements = array(
318
      'title',
319
      'description',
320
      'artist',
321
      'location',
322
      'rights',
323
      '#uri' => t('open Image'),
324
    );
325
    $gallery_name = $taxon->uuid;
326
    $mediaLinkType = 'LIGHTBOX';
327

    
328
    // $gallery_settings = getGallerySettings(CDM_DATAPORTAL_MEDIA_GALLERY_NAME);
329

    
330
    $gallery_settings = getGallerySettings(CDM_DATAPORTAL_TAXON_MEDIA_GALLERY_NAME_TAB);
331

    
332
    $out = '<div class="image-gallerie">';
333
    $out .= theme('cdm_media_gallerie', array(
334
      'mediaList' => $media,
335
      'galleryName' => $gallery_name,
336
      'maxExtend' => $gallery_settings['cdm_dataportal_media_maxextend'],
337
      'cols' => $gallery_settings['cdm_dataportal_media_cols'],
338
      'maxRows' => 0, // Ignore maxrows settings.
339
      'captionElements' => $captionElements,
340
      'mediaLinkType' => $mediaLinkType,
341
      'alternativeMediaUri' => NULL,
342
      'galleryLinkUri' => NULL,
343
      'showCaption' => $gallery_settings['cdm_dataportal_show_thumbnail_captions'],
344
    ));
345
    $out .= '</div>';
346
  }
347
  else {
348
    $out = 'No images available.';
349
  }
350
  return $out;
351
}
352

    
353
/**
354
 * TODO Implementation of Hook taxon_image_gallery()
355
 *
356
 * @param unknown_type $taxon
357
 * @param unknown_type $media
358
 *
359
 * @return unknown_type
360
 */
361
function taxon_image_gallery_fsi($taxon, $media) {
362
  $flashLink = isset($media[0]);
363

    
364
  if ($flashLink) {
365

    
366
    if (module_exists("fsi_gallery")) {
367
      $out = theme("fsi_gallery", array('taxon' => $taxon, 'media' => $media));
368
    }
369
    else {
370
      $message = t('In order to use the FSI gallery you must enable the according ') . l(t("module"), "admin/modules");
371
      drupal_set_message($message, "error");
372
      $out = '<h3>' . $message . '</h3>';
373
    }
374
  }
375
  else {
376
    $out = 'No images available.';
377
  }
378
  return $out;
379
}
380

    
381
/**
382
 * Returns HTML for a single reference page.
383
 *
384
 * Renders a page with all data on a single reference.
385
 *
386
 * @param array $variables
387
 *   An associative array containing:
388
 *   - reference: Object.
389
 *
390
 * @ingroup themeable
391
 */
392
function theme_cdm_reference_page($variables) {
393
  $reference = $variables['reference'];
394

    
395
  $out = '';
396

    
397
  if (isset($reference->titleCache)) {
398
    drupal_set_title($reference->titleCache, PASS_THROUGH);
399
  }
400

    
401
  $field_order = array(
402
    "title",
403
    // "titleCache",
404
    // "citation",
405
    "authorship",
406
    "editor",
407
    "publisher",
408
    "placePublished",
409
    "datePublished",
410
    "year",
411
    "edition",// Class Book.
412
    "volume",// Class Article.
413
    "seriesPart",
414
    "inReference",
415
    "nomRefBase", // Class BookSection, Book, Article.
416
    "pages",// Class Article.
417
    "series",// Class Article, PrintSeries.
418
    "school",// Class Thesis.
419
    "institution",// Class Report.
420
    "organization",// Class Proceedings.
421
    "nextVersion",
422
    "previousVersion",
423
    "isbn",// Class Book.
424
    "issn",// Class Journal.
425
    "uri",
426
  );
427

    
428
  $header = array(
429
    t('Field'),
430
    t('Value'),
431
  );
432
  $table_rows = array();
433

    
434
  if (!isset($reference->authorship)) {
435
    $authorship = cdm_ws_get(CDM_WS_REFERENCE_AUTHORTEAM, $reference->uuid);
436
    $reference->authorship = isset($authorship->titleCache) ? $authorship->titleCache : '';
437
  }
438

    
439
  if (!isset($reference->inReference)) {
440
    $reference->inReference = cdm_ws_get(CDM_WS_REFERENCE, array(
441
      $reference->uuid,
442
      "inReference",
443
    ));
444
  }
445

    
446
  foreach ($field_order as $fieldname) {
447

    
448
    if (isset($reference->$fieldname)) {
449

    
450
      if ($fieldname == "datePublished") {
451
        $period = $reference->$fieldname;
452
        $datePublished = timePeriodToString($period);
453
        if (isset($datePublished) && $datePublished != '') {
454
          $table_rows[] = array(
455
            t(ucfirst(strtolower($fieldname))),
456
            $datePublished,
457
          );
458
        }
459
        // $datePublished = array(t(ucfirst(strtolower($fieldname))),
460
        // $datePublished);
461
      }
462
      elseif (is_object($reference->$fieldname)) {
463
        if ($fieldname == "authorship") {
464
          $dump = $reference->$fieldname;
465
          $teammembers = "teamMembers";
466
          $team = $dump->$teammembers;
467
          $nameArray = array();
468

    
469
          foreach ($team as $member) {
470
            if (strlen($member->lastname) > 0) {
471
              $nname = $member->lastname;
472
              $name = $nname;
473
              if (strlen($member->firstname) > 0) {
474
                $vname = $member->firstname;
475
                $name = $vname . " " . $nname;
476
              }
477
              $nameArray[] = $name;
478
            }
479
            else {
480
              if (strlen($member->titleCache) > 0) {
481
                $nameArray[] = $member->titleCache;
482
              }
483
            }
484
          }
485
          $value = join($nameArray, ", ");
486
        }
487
        elseif ($fieldname == "inReference") {
488
          $type = $reference->$fieldname->type;
489
          $value = l($reference->$fieldname->titleCache, path_to_reference($reference->$fieldname->uuid));
490
          switch ($type) {
491
            case "Book":
492
              $fieldname = "in book";
493
              break;
494
            case "Journal":
495
              $fieldname = "in journal";
496
              break;
497
            case "Proceedings":
498
              $fieldname = "in proceedings";
499
              break;
500
          }
501
        }
502
        else {
503
          $value = $reference->$fieldname->titleCache;
504
        }
505
        if (isset($value) && $value != '') {
506
          $table_rows[] = array(
507
            t(ucfirst(strtolower($fieldname))),
508
            $value,
509
          );
510
        }
511
      }
512
      else {
513
        if (isset($reference->$fieldname) && $reference->$fieldname != '') {
514
          $table_rows[] = array(
515
            t(ucfirst(strtolower($fieldname))),
516
            $reference->$fieldname,
517
          );
518
        }
519
      }
520
    }
521
  }
522

    
523
  $out = theme_table(array(
524
      'header' => array(),
525
      'rows' => $table_rows,
526
      'attributes' => array(),
527
      'caption' => NULL,
528
      'colgroups' => NULL,
529
      'sticky' => NULL,
530
     'empty' => NULL,
531
  ));
532

    
533
  // Annotations below the table.
534
  $annotations = cdm_ws_getAnnotationsFor($reference);
535
  $out .= theme("cdm_annotations", array('annotations' => $annotations));
536

    
537
  return $out;
538
}
539

    
540
/**
541
 * @todo Please document this function.
542
 * @see http://drupal.org/node/1354
543
 */
544
function theme_cdm_media_page($variables) {
545
  $media = $variables['media'];
546
  $mediarepresentation_uuid = $variables['mediarepresentation_uuid'];
547
  $partId = $variables['partId'];
548
  $out = '';
549
  // Determine which representation and which part to show.
550
  $representationIdx = 0;
551
  if ($mediarepresentation_uuid) {
552
    $i = 0;
553
    foreach ($media->representations as $representation) {
554
      if ($representation->uuid == $mediarepresentation_uuid) {
555
        $representationIdx = $i;
556
      }
557
      $i++;
558
    }
559
  }
560
  else {
561
    $mediarepresentation_uuid = $media->representations[0]->uuid;
562
  }
563

    
564
  $partIdx = 0;
565
  if (!is_numeric($partId)) {
566
    // Assuming it is an uuid.
567
    $i = 0;
568
    foreach ($media->representations[$representationIdx]->parts as $part) {
569
      if ($part->uuid == $partId) {
570
        $partIdx = $i;
571
      }
572
      $i++;
573
    }
574
  }
575
  else {
576
    // Assuming it is an index.
577
    $partIdx = $partId;
578
  }
579

    
580
  $media_metadata = read_media_metadata($media);
581
  // $title = $media->titleCache;
582
  $title = $media_metadata['title'];
583

    
584
  $imageMaxExtend = variable_get('image-page-maxextend', 400);
585

    
586
  if (!$title) {
587
    $title = 'Media ' . $media->uuid . '';
588
  }
589

    
590
  drupal_set_title($title, PASS_THROUGH);
591

    
592
  $out .= '<div class="media cdm_media_viewer_image">';
593

    
594
  $out .= theme('cdm_back_to_image_gallery_button', array());
595
  $out .= '<div class="viewer">';
596
  $out .= theme('cdm_openlayers_image', array('mediaRepresentationPart' => $media->representations[$representationIdx]->parts[$partIdx], 'maxExtend' => $imageMaxExtend));
597
  $out .= '</div>';
598

    
599
  // General media metadata.
600
  /*
601
  $media_metadata = cdm_ws_get(CDM_WS_MEDIA_METADATA, array($media->uuid));
602
  vardump("PRINTING MEDIA METADATA");
603
  vardump($media_metadata);
604
  vardump("PRINTING MEDIA");
605
  vardump($media);
606
  */
607
  $metadataToPrint = theme('cdm_media_caption', array('media' => $media));
608
  $out .= $metadataToPrint;
609

    
610
  // Tabs for the different representations.
611
  // ul.secondary
612
  $out .= '<ul class="primary">';
613
  foreach ($media->representations as $representation) {
614
    $out .= '<li>' . l($media->representations[$representationIdx]->mimeType, path_to_media($media->uuid, $mediarepresentation_uuid, $partIdx)) . '</li>';
615
  }
616
  $out .= '</ul>';
617

    
618
  // Representation(-part) specific metadata.
619
  $thumbnailMaxExtend = 100;
620
  $out .= '<table>';
621
  $i = 0;
622
  foreach ($media->representations[$representationIdx]->parts as $part) {
623
    $out .= '<tr><th>' . t('Part') . ' ' . ($i + 1) . '</th><td>';
624
    switch ($part->class) {
625
      case 'ImageFile':
626
        $out .= $part->width . ' x ' . $part->height . ' - ' . $part->size . 'k';
627
        break;
628
      case 'AudioFile':
629
      case 'MovieFile':
630
        $out .= t('Duration') . ': ' . $part->duration . 's - ' . $part->size . 'k';
631
        break;
632
      default:
633
        $out .= $part->size . 'k';
634
    }
635

    
636
    $out .= '</td><td><a href="' . url(path_to_media($media->uuid, $mediarepresentation_uuid, $i)) . '">' . theme('cdm_media_gallerie_image', array('mediaRepresentationPart' => $part, 'maxExtend' => $thumbnailMaxExtend, 'addPassePartout' => TRUE));
637
    $i++;
638
  }
639
  $out .= '</table>';
640
  $out .= '</div>';
641

    
642
  return $out;
643
}
644

    
645
/**
646
 * @todo Please document this function.
647
 * @see http://drupal.org/node/1354
648
 */
649
function theme_cdm_polytomousKey_page($variables) {
650
  $polytomousKey = $variables['polytomousKey'];
651
  drupal_set_title($polytomousKey->titleCache, PASS_THROUGH);
652

    
653
  $out = theme("cdm_IdentificationKey", array(
654
    'identificationKey' => $polytomousKey,
655
    'doLinkToKeyPage' => FALSE,
656
    'showIdentificationKeyTitle' => FALSE,
657
    ));
658

    
659
  // Key nodes in linked style.
660
  $out .= theme('cdm_polytomousKey', array('polytomousKey' => $polytomousKey));
661
  /*
662
   * FIXME implement node type for keys !!!
663
   * (wrapping the content in the cdm_dataportal.node becomes obsolete then).
664
   */
665
  return '<div id="identificationKey">' . $out . '</div>';
666
}
667

    
668
/**
669
 * Returns HTML for taxon page tabs.
670
 *
671
 * Allows theming of the taxon page tabs.
672
 *
673
 * @param array $variables
674
 *   An associative array containing:
675
 *   - tabname
676
 *
677
 * @ingroup themeable
678
 */
679
function theme_cdm_taxonpage_tab($variables) {
680
  $tabname = $variables['tabname'];
681
  // TODO replace by using translations or theme the menue tabs itself instead?
682
  switch ($tabname) {
683
    default:
684
      return t($tabname);
685
  }
686
}
(6-6/9)