Files
Phraseanet/lib/classes/answer.class.php
2011-02-16 16:09:48 +01:00

1206 lines
40 KiB
PHP

<?php
class answer
{
public static function renew_token($base_id,$record_id)
{
$preview = self::get_preview($base_id,$record_id, false);
$ret = false;
if(isset($preview['flashcontent']))
$ret = $preview['flashcontent']['flv'];
return $ret;
}
public static function get_preview_rollover($base_id,$record_id,$ses,$canprev,$usr,$sd,$docType)
{
$cache_preview = cache_preview::getInstance();
$sbas_id = phrasea::sbasFromBas($base_id);
$isVideo = $isAudio = $isImage = $isDocument = false;
$isVideo = $docType == 'video' ? true:false;
$isAudio = $docType == 'audio' ? true:false;
$isImage = $docType == 'image' ? true:false;
$isFlash = $docType == 'flash' ? true:false;
$isDocument = $docType == 'document' ? true:false;
if((!$isVideo || !GV_h264_streaming) && ($tmp = $cache_preview->get($sbas_id,$record_id,$canprev)) !== false)
return $tmp;
$session = session::getInstance();
$JS_roll ="";
$url_ext = '';
if($isImage || $isFlash)
{
if(isset($sd['preview']['credate']) && isset($sd['preview']['moddate']))
{
if($sd['preview']['credate'] != $sd['preview']['moddate'])
{
$modtime = new DateTime($sd['preview']['moddate']);
$nowtime = new DateTime('-4 days');
if($modtime>$nowtime)
$url_ext = '&'.mt_rand();
}
}
if(isset($sd["preview"]["width"]) && $canprev && file_exists(p4string::addEndSlash($sd['preview']['path']).$sd['preview']['file']))
{
$prev = "/include/directprev.php?bas=".$base_id."&rec=".$record_id.$url_ext;
$JS_roll = "<img class=\"imgTips\" src=\"".$prev."\" border=\"0\" style=\"z-index:99; xvisibility:hidden;width:".$sd["preview"]["width"]."px;height:".$sd["preview"]["height"]."px\">";
}
elseif(isset($sd["thumbnail"]) && file_exists(p4string::addEndSlash($sd['thumbnail']['path']).$sd['thumbnail']['file']))
{
$sd["preview"] = $sd["thumbnail"];
$prev = '/'.p4string::addEndSlash($sd["thumbnail"]["baseurl"]).$sd["thumbnail"]["file"];
$JS_roll = "<img class=\"imgTips\" src=\"".$prev."\" style=\"z-index:99; width:".round($sd["preview"]["width"]*1)."px;height:".round($sd["preview"]["height"]*1)."px\">";
}
}
elseif($isVideo)
{
if(isset($sd["preview"]["width"]) && $canprev)
{
$fileName = p4string::addEndSlash($sd["preview"]['path']).$sd["preview"]['file'];
$preview = p4file::apache_tokenize($fileName);
if(!$preview)
$preview = '/include/directprev.php%3F'."bas%3D".$base_id."%26rec%3D".$record_id;
$JS_roll = '<div class="imgTips" style="z-index:99;width:'.((int)$sd["preview"]["width"]+10).'px;height:'.((int)$sd["preview"]["height"]+10).'px" id="rolloverpreview"></div>
<script type="text/javascript">flowplayer("rolloverpreview", {src:"/include/flowplayer/flowplayer-3.2.2.swf", wmode: "transparent"}, {clip:{url:"'.$preview.'",autoPlay: true,autoBuffering:true,provider: "h264streaming",scaling:"fit"}, onError:function(code,message){getNewVideoToken('.$base_id.', '.$record_id.', this);},plugins: {h264streaming: {url: "/include/flowplayer/flowplayer.pseudostreaming-3.2.2.swf"}}});</script>';
}
}
elseif($isDocument)
{
if(isset($sd["preview"]["width"]) && $canprev)
{
$token = md5(time().mt_rand(100000,999999));
$width = $height = 500;
$preview = '/include/directprev.php%3F'."bas%3D".$base_id."%26rec%3D".$record_id;
$JS_roll = '<div class="imgTips"
style="z-index:99;width:'.($width).'px;
height:'.($height).'px">
<div id="rollover'.$base_id.'_'.$record_id.'_'.$token.'"></div>
</div>
<script type="text/javascript">swfobject.embedSWF("/include/FlexPaper_flash/FlexPaperViewer.swf", "rollover'.$base_id.'_'.$record_id.'_'.$token.'", "100%", "100%", "9.0.0", false, false, {menu: "false",flashvars: "SwfFile='.$preview.'&Scale=0.6&ZoomTransition=easeOut&ZoomTime=0.5&ZoomInterval=0.1&FitPageOnLoad=true&FitWidthOnLoad=true&PrintEnabled=true&FullScreenAsMaxWindow=false&localeChain='.$session->locale.'", movie: "/include/FlexPaper_flash/FlexPaperViewer.swf", allowFullScreen :"true",wmode: "transparent"}, false);</script>';
}
}
elseif($isAudio)
{
if(isset($sd["preview"]["width"]) && $canprev)
{
$prev = "/include/directprev.php%3Fbas%3D".$base_id."%26rec%3D".$record_id;
$JS_roll = "<object class=\"audioTips\" style=\"z-index:2;left:0;height:24px;\" width=\"290\" height=\"24\" id=\"audioplayer1\" data=\"/include/audio-player/player.swf\" type=\"application/x-shockwave-flash\">
<param value=\"/include/audio-player/player.swf\" name=\"movie\"/>
<param value=\"playerID=1&autostart=yes&noinfo=yes&animation=no&remaining=yes&soundFile&soundFile=".$prev."\" name=\"FlashVars\"/>
<param value=\"high\" name=\"quality\"/>
<param value=\"false\" name=\"menu\"/>
<param value=\"transparent\" name=\"wmode\"/>
</object>";
}
}
$cache_preview->set($sbas_id,$record_id,$canprev,$JS_roll);
return $JS_roll;
}
public static function get_preview($base_id, $record_id, $isFullyPublic)
{
$session = session::getInstance();
$flashcontent = $preview = $url = false;
$width = $height = $html_view = false;
$sdMain = phrasea_subdefs($session->ses_id,$base_id,$record_id);
$user = user::getInstance($session->usr_id);
$doctype = 'unknown';
$typedoc = null;
if(isset($sdMain["preview"]) && $sdMain["preview"])
{
$key = $base_id.'_'.$record_id;
if(($isFullyPublic)
|| (isset($user->_rights_bas[$base_id]) && $user->_rights_bas[$base_id]['canpreview'] == true)
|| array_key_exists($key, $user->_rights_records))
{
$typedoc = 'preview';
}
elseif(isset($sdMain['thumbnail']))
{
$typedoc = 'thumbnail';
}
}
$needSubstit = false;
// if($typedoc == null && isset($canHD[$bas]) && $canHD[$bas] && isset($sdMain[$typedoc]))
// {
// $typedoc = 'document';
// if(!in_array($sdMain[$typedoc]['mime'],array('image/jpeg','image/gif','video/x-flv','audio/x-wav','audio/wav','audio/mpeg')))
// $needSubstit = true;
//
// }
if($typedoc == null && isset($sdMain['thumbnail']))
{
$typedoc = 'thumbnail';
}
$gviewer_docs = array(
'application/vnd.oasis.opendocument.text',
'application/pdf',
'application/vnd.oasis.opendocument.presentation',
'application/vnd.oasis.opendocument.speadsheet',
'application/msword',
'application/mspowerpoint',
'application/x-shockwave-flash',
'application/msexcel',
'application/vnd.ms-powerpoint'
);
if($typedoc == null && isset($sdMain['document']))
{
// if(!in_array($sdMain['document']['mime'],$gviewer_docs))
$needSubstit = true;
$typedoc = 'document';
}
if($typedoc != null && isset($sdMain[$typedoc]))
{
if($needSubstit || !in_array($sdMain[$typedoc]['mime'],array_merge($gviewer_docs,array('application/x-shockwave-flash','image/jpeg','image/gif','video/x-flv','video/mp4','audio/x-wav','audio/wav','audio/mpeg'))))
{
$url = '/skins/icons/substitution/' . str_replace('/', '_', $sdMain[$typedoc]['mime']) . '.png';
$preview = '<img class="PREVIEW_PIC" src="'.$url.'"/>';
$needSubstit = true;
$width = '128';
$height = '128';
}
elseif(isset($sdMain[$typedoc]["width"]) && isset($sdMain[$typedoc]["height"]))
{
$width = $sdMain[$typedoc]["width"];
$height = $sdMain[$typedoc]["height"];
}
if(!$needSubstit)
{
if($sdMain[$typedoc]["baseurl"]!=null && $sdMain[$typedoc]["baseurl"]!="" )
{
$url = $preview = '/'.p4string::addEndSlash($sdMain[$typedoc]["baseurl"]).$sdMain[$typedoc]["file"]."?mt=".mt_rand();
$doctype = 'image';
}
else
{
if(in_array($sdMain[$typedoc]['mime'],array('image/jpeg','image/gif')))
{
$url = $preview = "/include/directprev.php?bas=".$base_id."&rec=".$record_id;
$doctype = 'image';
if(isset($sdMain['document']['credate']) && isset($sdMain['document']['moddate']))
{
if($sdMain['document']['credate'] != $sdMain['document']['moddate'])
{
$modtime = new DateTime($sdMain['document']['moddate']);
$nowtime = new DateTime('-4 days');
if($modtime>$nowtime)
{
$url .= '&t='.mt_rand();
$preview .= '&t='.mt_rand();
}
}
}
}
elseif(in_array($sdMain[$typedoc]['mime'],$gviewer_docs))
{
$url = $preview = '/include/directprev.php%3F'."bas%3D".$base_id."%26rec%3D".$record_id;
$doctype = 'flash';
}
elseif(in_array($sdMain[$typedoc]['mime'],array('video/x-flv','video/mp4')))
{
$fileName = p4string::addEndSlash($sdMain[$typedoc]['path']).$sdMain[$typedoc]['file'];
$url = $preview = p4file::apache_tokenize($fileName);
if(!$preview)
$url = $preview = '/include/directprev.php%3F'."bas%3D".$base_id."%26rec%3D".$record_id;
$doctype = 'video';
}
elseif(in_array($sdMain[$typedoc]['mime'],array('audio/x-wav','audio/wav','audio/mpeg')))
{
$url = $preview = '/include/directprev.php%3F'."bas%3D".$base_id."%26rec%3D".$record_id;
$doctype = 'audio';
}
}
if(in_array($sdMain[$typedoc]['mime'],array('image/jpeg','image/gif')))
{
$html_view = '<img class="record record_image" style="width:'.$width.'px;height:'.$height.'px;" src="'.$preview.'">
<input type="hidden" name="width" value="'.$width.'"/>
<input type="hidden" name="height" value="'.$height.'"/>';
$preview = '<img oncontextMenu="return(false);" class="PREVIEW_PIC zoomable" src="'.$preview.'">';
}
elseif(in_array($sdMain[$typedoc]['mime'],array('video/x-flv','video/mp4')))
{
$flashcontent = array("height"=>$height,"width"=>$width,'flv'=>$preview);
$token = md5(time().mt_rand(100000,999999));
$html_view = '<div class="record record_video" style="width:'.$width.'px;height:'.$height.'px;">
<div id="preview_'.$base_id.'_'.$record_id.'_'.$token.'" class="PNB" style=""></div>
<input type="hidden" name="width" value="'.$width.'"/>
<input type="hidden" name="height" value="'.$height.'"/>
</div><script type="text/javascript">flowplayer("preview_'.$base_id.'_'.$record_id.'_'.$token.'",{src:"/include/flowplayer/flowplayer-3.2.2.swf", wmode: "transparent"},{clip:{url:"'.$preview.'",autoPlay: true,autoBuffering:true,provider: "h264streaming",scaling:"fit"},onError:function(code,message){getNewVideoToken('.$base_id.', '.$record_id.', this);},plugins: {h264streaming: {url: "/include/flowplayer/flowplayer.pseudostreaming-3.2.2.swf"}}});</script>';
$preview = '<div id="FLASHPREVIEW" class="PREVIEW_PIC" style="margin:0 auto;width: 600px; height: 300px;" ></div>';
// $width = $height = '200';
}
elseif(in_array($sdMain[$typedoc]['mime'],$gviewer_docs))
{
$width = $height = '500';
$token = md5(time().mt_rand(100000,999999));
$flashcontent = array("height"=>$height,"width"=>$width,"url"=>'/include/FlexPaper_flash/FlexPaperViewer.swf',
"flashVars"=>'SwfFile='.$preview.'&Scale=0.6&ZoomTransition=easeOut&ZoomTime=0.5&ZoomInterval=0.1&FitPageOnLoad=true&FitWidthOnLoad=true&PrintEnabled=true&FullScreenAsMaxWindow=false&localeChain='.$session->locale);
$html_view = '<div class="record record_document" style="width:'.$width.'px;height:'.$height.'px;">
<div id="preview_'.$base_id.'_'.$record_id.'_'.$token.'" class="PNB" style=""></div>
<input type="hidden" name="width" value="'.$width.'"/>
<input type="hidden" name="height" value="'.$height.'"/>
</div><script type="text/javascript">swfobject.embedSWF("/include/FlexPaper_flash/FlexPaperViewer.swf", "preview_'.$base_id.'_'.$record_id.'_'.$token.'", "100%", "100%", "9.0.0", false, false, {menu: "false",flashvars: "SwfFile='.$preview.'&Scale=0.6&ZoomTransition=easeOut&ZoomTime=0.5&ZoomInterval=0.1&FitPageOnLoad=true&FitWidthOnLoad=true&PrintEnabled=true&FullScreenAsMaxWindow=false&localeChain='.$session->locale.'", movie: "/include/FlexPaper_flash/FlexPaperViewer.swf", allowFullScreen :"true",wmode: "transparent"}, false);</script>';
$preview = '<object class="PREVIEW_PIC" type="application/x-shockwave-flash" data="">' .
'<param name="movie" value="/include/FlexPaperViewer.swf" />' .
'<param name="allowFullScreen" value="true" />' .
'<param name="wmode" value="transparent" />' .
'<param name="FlashVars" value="" />' .
'</object>';
$preview = '<div id="FLASHPREVIEW" class="PREVIEW_PIC"></div>';
}
elseif(in_array($sdMain[$typedoc]['mime'],array('audio/x-wav','audio/wav','audio/mpeg')))
{
$preimage = '';
$token = md5(time().mt_rand(100000,999999));
$width = $sdMain['thumbnail']["width"];
$height = $sdMain['thumbnail']["height"];
if($typedoc != 'thumbnail' && isset($sdMain['thumbnail']) && isset($sdMain['thumbnail']['width']) && $sdMain['thumbnail']["file"] != 'audio.jpg')
{
if($sdMain['thumbnail']["baseurl"]!=null && $sdMain['thumbnail']["baseurl"]!="" )
$preurl = 'include/'.p4string::addEndSlash($sdMain['thumbnail']["baseurl"]).$sdMain['thumbnail']["file"]."?mt=".mt_rand();
if($preurl != '')
$preimage = '<div><img src="'.$preurl.'" onload="setVisible(this)" class="PREVIEW_PIC" style="width:'.$sdMain['thumbnail']['width'].'px;height:'.$sdMain['thumbnail']['height'].'px;" ></div>';
}
$flashcontent = array('height'=>26,"width"=>290,"url"=>"/include/audio-player/player.swf",
"flashVars"=>"playerID=2&autostart=yes&noinfo=yes&animation=no&remaining=yes&soundFile=".$preview);
$html_view = '<div class="record record_audio" style="width:290px;height:26px;">
<div id="preview_'.$base_id.'_'.$record_id.'_'.$token.'" class="PNB" style=""></div>
<input type="hidden" name="width" value="290"/>
<input type="hidden" name="height" value="26"/>
</div><script type="text/javascript">swfobject.embedSWF("/include/audio-player/player.swf", "preview_'.$base_id.'_'.$record_id.'_'.$token.'", "290", "26", "9.0.0", false, false, {menu: "false",flashvars: "playerID=2&autostart=yes&noinfo=yes&animation=no&remaining=yes&soundFile=/'.$preview.'", movie: "/include/audio-player/player.swf", allowFullScreen :"true",wmode: "transparent"}, false);</script>';
$preview = '<div style="margin:20px 0;position:relative;top:20px;height:24px;text-align:center;">
<div id="FLASHPREVIEW" class="PREVIEW_PIC" ></div>
</div>'.$preimage.'';
}
}
}
return array(
'preview' => $preview,
'flashcontent' => $flashcontent,
'width' => $width,
'height' => $height,
'doctype' => $doctype,
'html' => $html_view,
'url' => $url
);
}
public static function get_duration($xml)
{
$duration = 0;
if($infoXml = simplexml_load_string($xml))
{
foreach($infoXml->doc->Attributes() as $k=>$v)
{
if($k == 'duration')
$duration = (int)$v;
}
}
return self::format_duration($duration);
}
public static function format_duration($d)
{
$durations = $durationm = $durationh = 0;
$durations = fmod($d,60);
$durations = $durations<=9?'0'.$durations:$durations;
$durationm = fmod(floor($d/60),60);
$durationm = ($durationm<=9?'0'.$durationm:$durationm).':';
$durationh = floor($d/3600);
$durationh = $durationh==0?'':(($durationh<=9?'0'.$durationh:$durationh).':');
$d = $durationh.$durationm.$durations;
return $d;
}
public static function format_infos($xml,$sbas_id,$record_id,$docType)
{
if(trim($xml) == '')
return '';
$session = session::getInstance();
$locale = $session->locale;
$cache_record = cache_record::getInstance();
if(($tmp = $cache_record->get($sbas_id,$record_id,'infos_'.$locale)) != false)
return $tmp;
$exifinfos = '';
$xml = preg_replace(array("/>\s*/", "/\n/"), array(">", "[[br/]]"), $xml);
$dom_doc = new DOMDocument();
$basesettings = phrasea::load_settings($locale);
if($dom_doc->loadXML($xml))
{
if($basesettings["xsltinfo"] != '')
{
$dom_doc_xsl = new DOMDocument;
$dom_doc_xsl->loadXML($basesettings["xsltinfo"]);
$xslt = new XSLTProcessor();
$xslt->importStylesheet($dom_doc_xsl);
$xslt->setParameter('', 'record_id', $record_id);
switch($docType)
{
case 'video':
$duration = answer::get_duration($xml);
$xslt->setParameter('', 'duration', $duration);
break;
case 'audio':
$duration = answer::get_duration($xml);
$xslt->setParameter('', 'duration', $duration);
break;
}
$xslt->setParameter('', 'docutype', $docType);
$exifinfos = trim($xslt->transformToXML($dom_doc));
$exifinfos = str_replace(array("\r\n","\r","\n"," "),array("","",""," "),$exifinfos);
}
}
$cache_record->set($sbas_id,$record_id,'infos_'.$locale,$exifinfos);
return $exifinfos;
}
function splitTermAndContext($word)
{
$term = trim($word);
$context = "";
if(($po = strpos($term, "(")) !== false)
{
if(($pc = strpos($term, ")", $po)) !== false)
{
$context = trim(substr($term, $po+1, $pc-$po-1));
$term = trim(substr($term, 0, $po));
}
}
return(array($term, $context));
}
public static function format_caption($base_id, $record_id, $xml, $with_bounce = false, $template=false)
{
$session = session::getInstance();
if(trim($xml) == '')
return _('reponses::record::Pas de description');
$locale = $session->locale;
require_once( GV_RootPath . 'lib/unicode/lownodiacritics_utf8.php' );
$cache_record = cache_record::getInstance();
$sbas_id = phrasea::sbasFromBas($base_id);
$md5 = md5($xml);
$cache_key = 'caption'.$md5.'_'.$locale.'_'.($with_bounce ? '1' : '0').'_'.$template;
if(($tmp = $cache_record->get($sbas_id,$record_id,$cache_key)) != false)
return $tmp;
$xml = preg_replace(array("/>\s*/", "/\n/"), array(">", "[[br/]]"), $xml);
$dom_doc = new DOMDocument();
$basesettings = phrasea::load_settings($locale);
$captions = _('reponses::record::Pas de description');
$xsl = '';
if(isset($basesettings["colls"][$base_id]))
{
if(function_exists("phrasea_isgrp") && isset($session->ses_id) && phrasea_isgrp($session->ses_id, $base_id, $record_id) != false)
$xsl = $basesettings["colls"][$base_id]["xsltRollOverGrp"];
elseif($template == 'homelink' && isset($basesettings["colls"][$base_id]["xslthomelink"]))
$xsl = $basesettings["colls"][$base_id]["xslthomelink"];
else
$xsl = $basesettings["colls"][$base_id]["xsltRollOver"];
}
if($dom_doc->loadXML($xml))
{
$XPATH_thesaurus = databox::get_xpath_thesaurus($sbas_id);
$XPATH_struct = databox::get_xpath_structure($sbas_id);
$DOM_thFields = array();
if($XPATH_struct)
$DOM_thFields = $XPATH_struct->query("/record/description/*[@tbranch!='']");
$XPATH_caption = new DOMXPath( $dom_doc );
foreach($DOM_thFields as $DOM_thField)
{
$tbranch = $DOM_thField->getAttribute("tbranch");
$DOM_branchs = $XPATH_thesaurus->query($tbranch);
$DOM_fields = $XPATH_caption->query("/record/description/" . $DOM_thField->nodeName);
foreach($DOM_fields as $DOM_field)
{
$fvalue = $DOM_field->nodeValue;
// le terme n'est cliquable que s'il est dans le thesaurus
$cleanvalue = str_replace(array("<em>", "</em>", "'"), array("", "", "&apos;"), $fvalue);
list($term_noacc, $context_noacc) = self::splitTermAndContext($cleanvalue);
$term_noacc = noaccent_utf8($term_noacc, PARSED);
$context_noacc = noaccent_utf8($context_noacc, PARSED);
if($context_noacc)
{
$q = "($tbranch)//sy[@w='".$term_noacc."' and @k='".$context_noacc."']";
}
else
{
$q = "($tbranch)//sy[@w='".$term_noacc."' and not(@k)]";
}
$t = "";
foreach($DOM_branchs as $DOM_branch)
{
$nodes = $XPATH_thesaurus->query($q, $DOM_branch);
if($nodes->length > 0)
{
$lngfound = false;
foreach($nodes as $node)
{
if($node->getAttribute("lng") == $session->usr_i18n)
{
// le terme est dans la bonne langue, on le rend cliquable
list($term, $context) = self::splitTermAndContext($fvalue);
$term = str_replace(array("<em>", "</em>"), array("", ""), $term);
$context = str_replace(array("<em>", "</em>"), array("", ""), $context);
$qjs = $term;
if($context)
{
$qjs .= " [".$context."]";
}
$t = "[[a class=\"bounce\" onclick=\"bounce('".$sbas_id."','";
$t .= p4string::MakeString($qjs, "js");
$t .= "', '";
$t .= p4string::MakeString($DOM_field->nodeName, "js");
$t .= "');return(false);\"]]";
$t .= $fvalue;
$t .= "[[/a]]";
$lngfound = true;
break;
}
$synonyms = $XPATH_thesaurus->query("sy[@lng='" . $session->usr_i18 . "']", $node->parentNode);
foreach($synonyms as $synonym)
{
$k = $synonym->getAttribute("k");
if($synonym->getAttribute("w") != $term_noacc || $k != $context_noacc)
{
$link = $qjs = $synonym->getAttribute("v");
if($k)
{
$link .= " (".$k.")";
$qjs .= " [".$k."]";
}
$t = "[[a class=\"bounce\" onclick=\"bounce('";
$t .= p4string::MakeString($qjs, "js");
$t .= "', '";
$t .= p4string::MakeString($DOM_field->nodeName, "js");
$t .= "');return(false);\"]]";
$t .= $link;
$t .= "[[/a]]";
$lngfound = true;
break;
}
}
}
if(!$lngfound)
{
list($term, $context) = self::splitTermAndContext($fvalue);
$term = str_replace(array("<em>", "</em>"), array("", ""), $term);
$context = str_replace(array("<em>", "</em>"), array("", ""), $context);
$qjs = $term;
if($context)
{
$qjs .= " [".$context."]";
}
$t = "[[a class=\"bounce\" onclick=\"bounce('".$sbas_id."','";
$t .= p4string::MakeString($qjs, "js");
$t .= "', '";
$t .= trim(p4string::MakeString($DOM_field->nodeName, "js"));
$t .= "');return(false);\"]]";
$t .= $fvalue;
$t .= "[[/a]]";
}
}
}
if($t)
$DOM_field->nodeValue = htmlspecialchars($t);
}
}
if($xsl != '')
{
$xslt_proc = new XSLTProcessor();
$dom_doc_roll = new DOMDocument();
$dom_doc_roll->loadXML($xsl);
$xslt_proc->importStylesheet($dom_doc_roll);
$rollDesc = $xslt_proc->transformToXML($dom_doc);
if($rollDesc != "")
{
$captions = $rollDesc;
}
}
}
// preg_match_all("((https?|ftp|gopher|file):((//)|(\\\\))[\w\d:#%/;$()~_?\-=\\\.&]*)",$captions,$matches);
//
// $urls = array_unique($matches[0]);
//var_dump($urls);
// foreach($urls as $url)
// {
// $captions = str_replace($url,'<a href="'.$url.'" target="_blank">'.$url.'</a>',$captions);
// }
$captions = (p4string::entitydecode($captions));
$captions = preg_replace("(([^']{1})((https?|file):((/{2,4})|(\\{2,4}))[\w:#%/;$()~_?/\-=\\\.&]*)([^']{1}))",'$1 $2 <a title="'._('Open the URL in a new window').'" class="ui-icon ui-icon-extlink" href="$2" style="display:inline;padding:2px 5px;margin:0 4px 0 2px;" target="_blank"> &nbsp;</a>$7',$captions);
// var_dump($captions);
$cache_record->set($sbas_id,$record_id,$cache_key,$captions);
return $captions;
}
public static function format_title($sbas_id, $record_id, $xml)
{
if(trim($xml) == '')
return _('reponses::document sans titre');
$session = session::getInstance();
$cache_record = cache_record::getInstance();
$locale = $session->locale;
$md5 = md5($xml);
if(($tmp = $cache_record->get($sbas_id,$record_id,'title'.$md5.'_'.$locale)) != false)
return $tmp;
$xml = preg_replace(array("/>\s*/", "/\n/"), array(">", "[[br/]]"), $xml);
$dom_doc = new DOMDocument();
$basesettings = phrasea::load_settings($locale);
$title = '';
if($dom_doc->loadXML($xml))
{
if($basesettings["bases"][$sbas_id]["xsl_title"])
{
$xslt_proc = new XsltProcessor();
$dom_doc_title = new DOMDocument();
if($dom_doc_title->loadXML($basesettings["bases"][$sbas_id]["xsl_title"]))
{
$xslt_proc->importStylesheet( $dom_doc_title );
$xslt_proc->setParameter(null, "field", "Titre");
$title = trim($xslt_proc->transformToXML($dom_doc));
if($basesettings["bases"][$sbas_id]["defaultxml"])
{
$title = basename($title);
}
$l = mb_strlen($title);
if($l>120)
$title = p4string::cutDesc($title,120,"[[em]]","[[/em]]");
}
}
}
$title = p4string::entitydecode($title != "" ? $title : "<i>"._('reponses::document sans titre')."</i>");
$cache_record->set($sbas_id,$record_id,'title'.$md5.'_'.$locale,$title);
return $title;
}
public static function getThumbnail($ses, $bid, $rid,$getPrev=false)
{
static $substitutionfiles;
$sbas_id = phrasea::sbasFromBas($bid);
$cache_thumb = cache_thumbnail::getInstance();
if(($tmp = $cache_thumb->get($sbas_id, $rid, $getPrev)))
{
return $tmp;
}
$w = $h = $rollover_width = $rollover_height = 64;
$sd = phrasea_subdefs($ses, $bid, $rid);
$thumbnail = $rollover = null;
$find = $sha = FALSE ;
$mime = $extcur = '';
$docType = 'unknown';
$bitly = null;
$url_ext = '';
$deleted = false;
$orientation = 'portrait';
if($sd)
{
if(isset($sd['thumbnail']) && $sd['thumbnail'])
{
$thumbnail = '/'.p4string::addEndSlash($sd['thumbnail']['baseurl']).$sd['thumbnail']['file'];
$w = $sd['thumbnail']['width'];
$h = $sd['thumbnail']['height'];
$imgclass = ($sd['thumbnail']['width'] > $sd['thumbnail']['height']) ? 'hthbimg' : 'vthbimg';
$orientation = ($sd['thumbnail']['width'] > $sd['thumbnail']['height']) ? 'landscape' : 'portrait';
$bitly = $sd['thumbnail']['bitly'];
if( file_exists($sd['thumbnail']['path'].$sd['thumbnail']['file']) )
$find = TRUE ;
else
$thumbnail = null;
}
if(isset($sd['thumbnailGIF']) && $sd['thumbnailGIF'])
{
if( file_exists($sd['thumbnailGIF']['path'].$sd['thumbnailGIF']['file']) )
{
$rollover = '/'.p4string::addEndSlash($sd['thumbnailGIF']['baseurl']).$sd['thumbnailGIF']['file'];
$rollover_width = $sd['thumbnailGIF']['width'];
$rollover_height = $sd['thumbnailGIF']['height'];
}
}
if(isset($sd['document']))
{
if(isset($sd['document']['file']))
{
$mime = isset($sd['document']['mime'])?$sd['document']['mime']:'application/octet-stream';
$extcur = pathinfo($sd["document"]["file"]);
$extcur = isset($extcur["extension"])?$extcur["extension"]:'';
$sha = isset($sd['document']['sha256'])?$sd['document']['sha256']:false;
$bitly = $sd['document']['bitly'];
}
if(isset($sd['document']['credate']) && isset($sd['document']['moddate']))
{
if($sd['document']['credate'] != $sd['document']['moddate'])
{
$modtime = new DateTime($sd['document']['moddate']);
$nowtime = new DateTime('-4 days');
if($modtime>$nowtime)
$url_ext = '?'.mt_rand();
}
}
}
if(isset($sd['document']['type']))
$docType = $sd['document']['type'];
if(!$find)
{
// pas de thmbnail : substitution selon mime
if(isset($sd['document']) && $sd['document'])
{
if(isset($sd['document']['mime']))
$mime = str_replace('/', '_', $sd['document']['mime']);
else
$mime = 'application_octet-stream';
$mime = trim($mime)!=''?$mime:'application_octet-stream';
// on verifie que l'image de substitution est connue
if(!isset($substitutionfiles[$mime]))
{
// non : on la cherche
$thumbnail = '/skins/icons/substitution/' . $mime . '.png';
$thumbnail = str_replace('+', '%20', $thumbnail);
if(file_exists(GV_RootPath . 'www/' . $thumbnail) )
{
$substitutionfiles[$mime] = $thumbnail;
}
else
{
$substitutionfiles[$mime] = '/skins/icons/substitution.png';
}
}
$w = $h = 256;
$thumbnail = $substitutionfiles[$mime];
$imgclass = 'vthbimg';
$orientation = 'portrait';
}
}
}
if(!$thumbnail) // pas de subdefs du tout
{
$thumbnail = '/skins/icons/deleted.png';
$imgclass = 'vthbimg';
$w = '128';
$h = '128';
$deleted = true;
}
$ret = array(
'rollover'=>$rollover,
'rollover_width'=>$rollover_width,
'rollover_height'=>$rollover_height,
'thumbnail'=>$thumbnail.$url_ext,
'deleted'=>$deleted ,
'imgclass'=>$imgclass,
'orientation'=>$orientation,
'w'=>$w,
'h'=>$h,
'mime'=>$mime,
'extension'=>$extcur,
'type'=>$docType,
'bitly'=>$bitly,
'sha256'=>$sha
);
if($getPrev)
$ret['preview'] = $sd;
$cache_thumb->set($sbas_id, $rid, $getPrev,$ret);
return $ret;
}
public static function getXslRollOver2($preff , $name = '' , $skinsLNG = '',$prev = false )
{
$priority = 0;
# Taux de precision du xsl trouve
# 1 : xml sans non , sans langue
# 2 : xml sans nom , bonne langue
# 3 : xml bon nom , sans langue
# 4 : xml bon nom , bonne langue
$myxsl = null;
$mystruct = simplexml_load_string($preff) ;
if($mystruct)
foreach ($mystruct->layout as $layout)
{
if(strtoupper((string)$layout['doctype'])!=strtoupper("grouping") && strtoupper((string)$layout['name'])==strtoupper($name) && strtoupper((string)$layout['skin'])==strtoupper($skinsLNG))
{
$priority = 4;
foreach ($layout->children("http://www.w3.org/1999/XSL/Transform") as $second_gen)
{
$myxsl = $second_gen->asXML();
break;
}
}
elseif(strtoupper((string)$layout['doctype'])!=strtoupper("grouping") && $priority<3 && strtoupper((string)$layout['name'])==strtoupper($name) && (string)$layout['skin']=='')
{
$priority=3;
foreach ($layout->children("http://www.w3.org/1999/XSL/Transform") as $second_gen)
{
$myxsl = $second_gen->asXML();
}
}
elseif(strtoupper((string)$layout['doctype'])!=strtoupper("grouping") && !$prev && $priority<2 && (string)$layout['name']=='' && strtoupper((string)$layout['skin'])==strtoupper($skinsLNG))
{
$priority=2;
foreach ($layout->children("http://www.w3.org/1999/XSL/Transform") as $second_gen)
{
$myxsl = $second_gen->asXML();
}
}
elseif(strtoupper((string)$layout['doctype'])!=strtoupper("grouping") && !$prev && $priority<1 && (string)$layout['name']=='' && (string)$layout['skin']=='')
{
$priority=1;
foreach ($layout->children("http://www.w3.org/1999/XSL/Transform") as $second_gen)
{
$myxsl = $second_gen->asXML();
}
}
}
return $myxsl;
}
public static function getXslRollOver2Grp($preff , $name = '' , $skinsLNG = '',$prev = false )
{
$priority = 0;
# Taux de precision du xsl trouve
# 1 : xml sans non , sans langue
# 2 : xml sans nom , bonne langue
# 3 : xml bon nom , sans langue
# 4 : xml bon nom , bonne langue
$myxsl = null;
$mystruct = simplexml_load_string($preff) ;
if($mystruct)
foreach ($mystruct->layout as $layout)
{
if(strtoupper((string)$layout['doctype'])==strtoupper("grouping") && strtoupper((string)$layout['name'])==strtoupper($name) && strtoupper((string)$layout['skin'])==strtoupper($skinsLNG))
{
$priority = 4;
foreach ($layout->children("http://www.w3.org/1999/XSL/Transform") as $second_gen)
{
$myxsl = $second_gen->asXML();
break;
}
}
elseif(strtoupper((string)$layout['doctype'])==strtoupper("grouping") && $priority<3 && strtoupper((string)$layout['name'])==strtoupper($name) && (string)$layout['skin']=='')
{
$priority=3;
foreach ($layout->children("http://www.w3.org/1999/XSL/Transform") as $second_gen)
{
$myxsl = $second_gen->asXML();
}
}
elseif(strtoupper((string)$layout['doctype'])==strtoupper("grouping") && !$prev && $priority<2 && (string)$layout['name']=='' && strtoupper((string)$layout['skin'])==strtoupper($skinsLNG))
{
$priority=2;
foreach ($layout->children("http://www.w3.org/1999/XSL/Transform") as $second_gen)
{
$myxsl = $second_gen->asXML();
}
}
elseif(strtoupper((string)$layout['doctype'])==strtoupper("grouping") && !$prev && $priority<1 && (string)$layout['name']=='' && (string)$layout['skin']=='')
{
$priority=1;
foreach ($layout->children("http://www.w3.org/1999/XSL/Transform") as $second_gen)
{
$myxsl = $second_gen->asXML();
}
}
}
return $myxsl;
}
public static function getOriginalName(&$unXml)
{
$originalname="";
if($sxe = simplexml_load_string($unXml))
{
$z = $sxe->xpath('/record/doc');
if($z && is_array($z))
foreach($z[0]->attributes() as $a => $b)
if($a=="originalname")
$originalname = basename((string)$b);
}
$before = array("\\","/","*",":","?","<",">","|","\"");
$after = array("_" ,"_","_","_","_","_","_","_","_" );
$originalname = str_replace($before, $after, $originalname);
return $originalname;
}
public static function getContainerBaskets($base_id, $record_id, $ssel_id)
{
$conn = connection::getInstance();
$session = session::getInstance();
$baskets = array();
$sql = 'SELECT s.ssel_id, name, descript, c.ord FROM ssel s, sselcont c
WHERE s.ssel_id = c.ssel_id AND c.base_id="'.$conn->escape_string($base_id).'"
AND record_id="'.$conn->escape_string($record_id).'" AND usr_id="'.$conn->escape_string($session->usr_id).'"
AND c.ssel_id!="'.$conn->escape_string($ssel_id).'" AND temporaryType="0"';
if($rs = $conn->query($sql))
{
while($row = $conn->fetch_assoc($rs))
{
$baskets[$row['ssel_id']] = array('name' => $row['name'], 'description' => $row['descript'], 'ord' => $row['ord']);
}
}
return $baskets;
}
public static function correctScreenSubs($bas,$rec,$url,$prev,$w,$h,$reloadTemp)
{
if($url == '')
$url = false;
$out = '<script language="javascript" type="text/javascript">';
$JS = '';
if(!$prev)
{
$JS .= '' .
'if(parent.$("#IMGT_'.$bas.'_'.$rec.'"))' .
'{'.
'o = parent.$("#IMGT_'.$bas.'_'.$rec.'");';
if($url)
$JS .= 'o.src = "'.$url.'";';
$JS .= 'o.removeClass("hthbimg").removeClass("vthbimg").addClass("'.(($w>$h)?"hthbimg":"vthbimg").'");' .
'}' .
'if(parent.$("#CHIM_'.$bas.'_'.$rec.'").length>0)' .
'{o = parent.$("#CHIM_'.$bas.'_'.$rec.'");';
if($url)
$JS .= 'o.attr("src","'.$url.'");';
$JS .= 'o.width('.$w.').height('.$h.');' .
'}';
}
else
{
$JS .= 'if(parent.$("#PREV_'.$bas.'_'.$rec.'").length>0)' .
'{'.
'parent.$("#PREV_'.$bas.'_'.$rec.'").attr("src","'.$url.'");' .
'}';
}
if($reloadTemp)
{
$JS .= 'parent.refreshBaskets(\'current\');';
}
$JS .= 'parent.refreshItem("'.$bas.'_'.$rec.'");';
$out .= $JS.'</script>';
return $out;
}
public static function logEvent($sbas_id,$record_id,$action,$final,$comm='')
{
$session = session::getInstance();
if(!isset($session->usr_id) || !isset($session->ses_id))
return;
$conn = connection::getInstance();
$ses_id = $session->ses_id;
$usr_id = $session->usr_id;
if(!$conn)
die();
$sql = 'SELECT dist_logid FROM cache WHERE session_id="'.$conn->escape_string($ses_id).'"';
$log_id = array();
if($rs = $conn->query($sql))
{
if($row = $conn->fetch_assoc($rs))
{
$log_id = unserialize($row['dist_logid']);
}
$conn->free_result($rs);
}
if(isset($log_id[$sbas_id]))
{
$log_id = $log_id[$sbas_id];
// $sql = 'SELECT * FROM sbas WHERE sbas_id = "'.$conn->escape_string($sbas_id).'"';
//
// if($rs = $conn->query($sql))
// {
// if($row = $conn->fetch_assoc($rs))
// {
$connBas = connection::getInstance($sbas_id);
if($connBas)
{
$sql = 'INSERT INTO log_docs (id, log_id, date, record_id, action, final, comment) VALUES (null, "'.$connBas->escape_string($log_id).'", NOW(), "'.$connBas->escape_string($record_id).'", "'.$connBas->escape_string($action).'", "'.$connBas->escape_string($final).'", "'.$connBas->escape_string($comm).'")';
$connBas->query($sql);
}
// }
// $conn->free_result($rs);
// }
}
}
public static function writeIPTC( $sbas_id , $xml , $filesArray , $resetAllFields=false )
{
$cwd = getcwd();
$debug = false;
$arrayDesc = null;
$mdesc = DOMDocument::loadXML( $xml );
$xp_mdesc = new DOMXPath( $mdesc );
$recmdesc = $xp_mdesc->query("/record/description");
$desc = $recmdesc->item(0);
for($fdesc = $desc->firstChild; $fdesc; $fdesc = $fdesc->nextSibling)
{
if($fdesc->nodeType != XML_ELEMENT_NODE)
continue;
$arrayDesc[$fdesc->nodeName][] = $fdesc->nodeValue ;
}
$arrayStruct = null;
$xp_struct = databox::get_xpath_structure($sbas_id);
$recmstruct = $xp_struct->query("/record/description");
$stru = $recmstruct->item(0);
for($fstru = $stru->firstChild; $fstru; $fstru = $fstru->nextSibling)
{
if($fstru->nodeType != XML_ELEMENT_NODE)
continue;
foreach($fstru->attributes as $a)
{
if(!isset($arrayStruct[$fstru->nodeName]))
$arrayStruct[$fstru->nodeName] = array();
$arrayStruct[$fstru->nodeName][$a->name] = $a->value;
}
}
$t_iptc = null;
foreach( $arrayStruct as $tag=>$fieldpref )
{
if(isset($fieldpref["src"]) && (substr($fieldpref["src"],0,3)=="ip-" || true))
{
if($resetAllFields)
$t_iptc[$fieldpref["src"]] = "";
if( isset($arrayDesc[$tag]) )
{
$t_iptc[$fieldpref["src"]] = $arrayDesc[$tag];
if($fieldpref["src"]=="ip-date")
{
$fieldpref["type"] = "date";
foreach($t_iptc[$fieldpref["src"]] as $k=>$v)
{
$isodate = answer::getFieldValue($fieldpref, $v);
$t_iptc[$fieldpref["src"]][$k] = substr($isodate, 0, 4) . "/" . substr($isodate, 4, 2) . "/" . substr($isodate, 6, 2);
}
}
}
}
}
if($debug)
var_dump($t_iptc);
if( $filesArray!=null )
{
$cmd_removeiptc = "";
$cmd_removeiptcET = "";
$cmd_setiptc = "";
$cmd_setiptcET = "";
if($t_iptc)
{
foreach($t_iptc as $src => $values)
{
if($src == "ip-keyword" || $src == "ip-suppcat")
$cmd_removeiptc .= ($cmd_removeiptc == ""?"":", ") . $src;
if(true)
{
if($src == "Keywords" || $src == "Contact")
$cmd_removeiptcET .= "-" . $src . "= ";
}
foreach($values as $value)
{
if($debug)
printf("src=%s value=%s\n", $src, $value);
if($src=="ip-date")
{
}
$f = $value;
$f = str_replace(array("\n", "\r", "'", "\""), array("\\n" , "", "\\'", "\\\""), $f);
$cmd_setiptc .= ($cmd_setiptc == ""?"":", ") . "" . $src . "='" . $f . "'";
if(true)
{
$cmd_setiptcET .= "-" . $src . "='" . $f . "' ";
}
}
}
}
foreach($filesArray as $doc)
{
if($cmd_removeiptc != "" || $cmd_removeiptcET != "")
{
$cmd = GV_exiftool ." \"" . $cmd_removeiptcET . "\" \"" . $doc . "\"" ;
passthru($cmd);
}
if($cmd_setiptc != "" || $cmd_setiptcET != "")
{
$cmd = GV_exiftool ." \"" . $cmd_setiptcET . "\" \"" . $doc . "\"" ;
passthru($cmd);
}
}
}
chdir($cwd);
}
public static function getFieldValue(&$sxStructField, $val)
{
$value = NULL;
switch((string)$sxStructField["type"])
{
case "text":
$value = $val;
if(GV_debug)
printf("getFieldValue('%s', '%s') = '%s'\n", (string)$sxStructField["type"], $val, $value===NULL ? "NULL" : $value);
break;
case "number":
$value = "" . (0.0 + $val);
if(GV_debug)
printf("getFieldValue('%s', '%s') = '%s'\n", (string)$sxStructField["type"], $val, $value===NULL ? "NULL" : $value);
break;
case "date":
$value = trim(str_replace(array("-", ":", "/", ".", " "), array("", "", "", "", ""), $val)); // jy 20060802 : le contenu (val) est deja en iso delimite
if(GV_debug)
printf("getFieldValue('%s', '%s') = '%s'\n", (string)$sxStructField["type"], $val, $value===NULL ? "NULL" : $value);
break;
default:
break;
}
return($value);
}
}