#**
 *  Render a complex document in the results list
 *#

## Load Mime-Type List and Mapping
#parse('mime_type_lists.vm')
## Sets:
## * supportedMimeTypes, AKA supportedtypes
## * mimeExtensionsMap, AKA extMap

## Title
#if($doc.getFieldValue('title'))
  #set($title = $esc.html($doc.getFirstValue('title')))
#else
  #set($title = "["+$doc.getFieldValue('id')+"]")
#end

## URL
#if($doc.getFieldValue('url'))
  #set($url = $doc.getFieldValue('url'))
#elseif($doc.getFieldValue('resourcename'))
  #set($url = "file:///$doc.getFieldValue('resourcename')")
#else
  #set($url = "$doc.getFieldValue('id')")
#end

## Sort out Mime-Type
#set($ct = $list.get($doc.getFirstValue('content_type').split(";"),0))
#set($filename = $doc.getFieldValue('resourcename'))
#set($filetype = false)
#set($filetype = $mimeExtensionsMap.get($ct))

## TODO: falling back to file extension is convenient,
## except when you don't have an icon for that extension
## example "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
## document with a .docx extension.
## It'd be nice to fall back to an "unknown" or the existing "file" type
## We sort of do this below, but only if the filename has no extension
## (anything after the last dot).

#if(!$filetype)
  #set($filetype = $filename.substring($filename.lastIndexOf(".")).substring(1))
#end

## #if(!$filetype)
##   #set($filetype = "file")
## #end
## #if(!$supportedMimeTypes.contains($filetype))
##   #set($filetype = "file")
## #end

## Row 1: Icon and Title and mlt link
<div class="result-title">
  ## Icon
  ## Small file type icons from http://www.splitbrain.org/projects/file_icons (public domain)
  <img src="#{url_root}/img/filetypes/${filetype}.png" align="center">

  ## Title, hyperlinked
  <a href="${url}" target="_blank">
    <b>$title</b></a>

  ## Link for MLT / More Like This / Find Similar
  <span class="mlt">
    #if($params.getBool('mlt', false) == false)
      <a href="#lensNoQ&q=id:%22$docId%22&mlt=true">
        More Like This</a>
    #end
  </span>

</div>

## Row 2?: ID / URL
<div>
  Id: #field('id')
</div>

## Resource Name
<div>
  #if($doc.getFieldValue('resourcename'))
    Resource name: $filename 
  #elseif($url)
    URL: $url
  #end
  #if($ct)
    ($ct)
  #end
</div>

## Author
#if($doc.getFieldValue('author'))
  <div>
    Author: #field('author')
  </div>
#end

## Last_Modified Date
#if($doc.getFieldValue('last_modified'))
  <div>
    last-modified:
    #field('last_modified')
  </div>
#end

## Main content of doc
<div class="result-body">
  #field('content')
</div>

## Display Similar Documents / MLT = More Like This
<div class="mlt">
  #set($mlt = $mltResults.get($docId))
  #set($mltOn = $params.getBool('mlt'))
  #if($mltOn == true)
    <div class="field-name">
      Similar Items
    </div>
  #end
  ## If has MLT enabled An Entries to show
  #if ($mltOn && $mlt && $mlt.size() > 0)
    <ul>
      #foreach($mltHit in $mlt)
        #set($mltId = $mltHit.getFieldValue('id'))
        <li>
          <div>
            <a href="#url_for_home?q=id:$mltId">
              $mltId</a>
          </div>
          <div>
            <span class="field-name">
              Title:
            </span>
            $mltHit.getFieldValue('title')
          </div>
          <div>
            <span class="field-name">
              Author:
            </span>
            $mltHit.getFieldValue('author')
            <span class="field-name">
              Description:
            </span>
            $mltHit.getFieldValue('description')
          </div>
        </li>
      #end    ## end for each mltHit in $mlt
    </ul>
  ## Else MLT Enabled but no mlt results for this query
  #elseif($mltOn && $mlt.size() == 0)
    <div>No Similar Items Found</div>
  #end
</div>  ## div class=mlt

#parse('debug.vm')
