diff --git a/clean_bdd.php b/clean_bdd.php index 19bc1ca..82970ba 100644 --- a/clean_bdd.php +++ b/clean_bdd.php @@ -1,3 +1,9 @@ + @@ -5,31 +11,20 @@ - <?php gettext('Clean photos in Sqlite base'); ?> + <?php echo gettext('Clean photos in Sqlite base'); ?> - - - + + + - - - + -

+


' . gettext('Clean folder img...') . ''; +echo '

' . gettext('Clean folder img...') . '

'; $originals = array_map('basename', glob('photos/img/*.{jpg,jpeg,JPG,JPEG,heic,HEIC,webp,WEBP}', GLOB_BRACE)); $thumbs = array_map('basename', glob('photos/thumb/*.{jpg,jpeg,JPG,JPEG,heic,HEIC,webp,WEBP}', GLOB_BRACE)); +// On recherche les vignettes manquantes + $missing_thumbs = array_diff($originals, $thumbs); $a = count($missing_thumbs); -echo '

' . gettext('Missing thumbs: ') . $a . '

'; +echo '

' . gettext('Missing thumbs: ') . $a . '

'; + + +// On crée les vignettes manquantes if ($a > 0) { echo '

' . gettext('Create missing thumbs...') . '

'; @@ -64,10 +64,15 @@ if ($a > 0) { } +// On recherche les vignettes en trop + $extra_thumbs = array_diff($thumbs, $originals); $b = count($extra_thumbs); -echo '

' . gettext('Extra thumbs: ') . $b . '

'; -//_pr($extra_thumbs); +echo '

' . gettext('Extra thumbs: ') . $b . '

'; + + +// On efface les vignettes en trop + if ($b > 0) { echo '

' . gettext('Delete extra thumbs...') . '

'; @@ -82,7 +87,9 @@ if ($b > 0) { } -echo '

' . gettext('Compare folder img and database...') . '

'; +// On compare le dossier 'img' et la base + +echo '

' . gettext('Compare folder img and database...') . '

'; try { $conn = new PDO("sqlite:db_photo.sqlite3"); @@ -108,15 +115,17 @@ foreach($result as $file) { $bdd[] = $file->filename; } - $base = array_map('basename', $bdd); -echo count($base) . " entries in database". "
"; -echo count($originals) . " files on disk" . "
"; +echo '

' . count($base) . " entries in database". "

"; +echo '

' . count($originals) . " files on disk" . "

"; $extra_in_bdd= array_diff($base, $originals); $c = count($extra_in_bdd); -echo '

' . gettext('Extra images in database: ') . $c . '

'; +echo '

' . gettext('Extra images in database: ') . $c . '

'; + + +// On supprime les images en trop dans la base if ($c > 0) { echo '

' . gettext('Delete extra images in database...') . '

'; @@ -137,10 +146,13 @@ if ($c > 0) { $missing_in_bdd = array_diff($originals, $base); $d = count($missing_in_bdd); -echo '

' . gettext('Missing images in database: ') . $d . '

'; - +echo '

' . gettext('Missing images in database: ') . $d . '

'; + + +// On ajoute les images manquantes dans la base + if ($d > 0) { - echo '

' . gettext('Adding missing images in database...') . '

'; + echo '

' . gettext('Adding missing images in database...') . '

'; $i = 1; $photos = array(); @@ -150,16 +162,34 @@ if ($d > 0) { $query4 = "INSERT INTO photos WHERE filename=:filename"; if ($exif = @exif_read_data($file, 0, true )) { - - $mod = isset($exif['IFD0']['Model']) ? $exif['IFD0']['Model'] : ''; - - # YYYY-MM-DD HH:MM:SS.SSS - 2019:10:01 14:03:12 - $da = isset($exif['EXIF']['DateTimeOriginal']) ? $exif['EXIF']['DateTimeOriginal'] : ''; - - if (isset($exif['EXIF']['UndefinedTag:0xA434'])) { - $w = $exif['EXIF']['UndefinedTag:0xA434']; + + //_pr($exif); - $arr = array("100.0 mm" => "EF100mm f/2.8 Macro USM", "100.0-400.0 mm" => "EF100-400mm f/4.5-5.6L IS USM", "140.0-560.0 mm" => "EF100-400mm f/4.5-5.6L IS USM +1.4x II", "17.0-40.0 mm" => "EF17-40mm f/4L USM", "24-70mm" => "SIGMA 24-70mm F2.8 EX DG", "70.0-200.0 mm" => "EF70-200mm f/4L USM", "10.0-22.0 mm" => "EF-S10-22mm f/3.5-4.5 USM", "500.0 mm" => "Sigma 500mm f/4.5 EX HSM ", "500mm" => "Sigma 500mm f/4.5 EX HSM "); + unset($fla); + unset($flash); + + // filename + //echo "File: " . $file . "
"; + + // filesize + $fs = isset($exif['FILE']['FileSize']) ? $exif['FILE']['FileSize'] : ''; + $fsize = formatBytes($fs, $precision = 0); + + // dateoriginal + # YYYY-MM-DD HH:MM:SS.SSS - 2019:10:01 14:03:12 + $da = isset($exif['EXIF']['DateTimeOriginal']) ? $exif['EXIF']['DateTimeOriginal'] : ''; + if (isset($exif['EXIF']['DateTimeOriginal'])) { + $d = explode(' ', $exif['EXIF']['DateTimeOriginal']); + $da = str_replace(':', '-', $d[0]) . " " . $d[1] . ".000"; + } else { + $d = ''; + } + + // lens + if (isset($exif['EXIF']['UndefinedTag:0xA434'])) { + $w = trim($exif['EXIF']['UndefinedTag:0xA434']); + + $arr = array("600" => "EF600mm f/4L IS III USM", "100.0 mm" => "EF100mm f/2.8 Macro USM", "100.0-400.0 mm" => "EF100-400mm f/4.5-5.6L IS USM", "140.0-560.0 mm" => "EF100-400mm f/4.5-5.6L IS USM +1.4x II", "17.0-40.0 mm" => "EF17-40mm f/4L USM", "24-70mm" => "SIGMA 24-70mm F2.8 EX DG", "70.0-200.0 mm" => "EF70-200mm f/4L USM", "10.0-22.0 mm" => "EF-S10-22mm f/3.5-4.5 USM", "500.0 mm" => "SIGMA 500mm f/4.5 EX HSM", "500mm" => "SIGMA 500mm f/4.5 EX HSM"); if (array_key_exists($w, $arr)) $obj= $arr[$w]; else $obj = $w; @@ -168,15 +198,47 @@ if ($d > 0) { $obj = ''; } + // speed if (isset($exif['EXIF']['ExposureTime'])) { $q = explode('/', $exif['EXIF']['ExposureTime']); $sp = ($q[0] > 1) ? ($q[0] / $q[1]) . "s" : $exif['EXIF']['ExposureTime']; } else { $sp = ''; } + + // aperture + $ap = isset($exif['COMPUTED']['ApertureFNumber']) ? $exif['COMPUTED']['ApertureFNumber'] : ''; + // correctexpo + //$ev = isset($exif['EXIF']['ExposureBiasValue']) ? $exif['EXIF']['ExposureBiasValue'] : ''; + + if (isset($exif['EXIF']['ExposureBiasValue'])) { + $ev = $exif['EXIF']['ExposureBiasValue']; + $div = explode( "/", $ev); + $dividende = $div[0]; + $diviseur = $div[1]; + + if (str_starts_with($ev, '0')) { + $ev = '0'; + } + elseif ($dividende === $diviseur) { + $ev = '0'; + } + if ((! str_starts_with($ev, '0')) && (! str_starts_with($ev, '-'))) { + $ev = "+" . $ev; + } + } else { + $ev = ''; + } + + + // iso $iso = isset($exif['EXIF']['ISOSpeedRatings']) ? $exif['EXIF']['ISOSpeedRatings'] : ''; + // model + $mod = isset($exif['IFD0']['Model']) ? $exif['IFD0']['Model'] : ''; + + // metering if (isset($exif['EXIF']['MeteringMode'])) { $mm = $exif['EXIF']['MeteringMode']; @@ -207,33 +269,70 @@ if ($d > 0) { $mm = ''; } + // flash + // https://stackoverflow.com/questions/7076958/read-exif-and-determine-if-the-flash-has-fired + if (isset($exif['EXIF']['Flash'])) { $fla = $exif['EXIF']['Flash']; - + + $flash = $fla; + //$flashfired = ($fla & 1) != 0; + //echo "flashfired: " . $flashfired . "
"; + + // 12_2018.jpg No Flash 0 + // 5_2013.jpg Off, Did not fire 16 + // folder flash 9 + switch ($fla) { - case 0: $fla = gettext("Off"); + case 0: $fla = gettext("No Flash"); break; - case 1: $fla = gettext("Auto"); + case 9: $fla = gettext("On, Fired"); break; - case 2: $fla = gettext("On"); - break; - case 3: $fla = gettext("Red Eye Reduction"); - break; - case 4: $fla = gettext("Slow Synchro"); - break; - case 5: $fla = gettext("Auto + Red Eye Reduction"); - break; - case 6: $fla = gettext("On + Red Eye Reduction"); - break; - case 16: $fla = gettext("External Flash"); + case 16: $fla = gettext("Off, Did not fire"); break; default: $fla = gettext("Unknown"); } - + + /* + Exiftool: + [Flash] => On, Fired + [Flash Compensation] => -1 + */ + /* + 0x0 = No Flash + 0x1 = Fired + 0x5 = Fired, Return not detected + 0x7 = Fired, Return detected + 0x8 = On, Did not fire + 0x9 = On, Fired + 0xd = On, Return not detected + 0xf = On, Return detected + 0x10 = Off, Did not fire + 0x14 = Off, Did not fire, Return not detected + 0x18 = Auto, Did not fire + 0x19 = Auto, Fired + 0x1d = Auto, Fired, Return not detected + 0x1f = Auto, Fired, Return detected + 0x20 = No flash function + 0x30 = Off, No flash function + 0x41 = Fired, Red-eye reduction + 0x45 = Fired, Red-eye reduction, Return not detected + 0x47 = Fired, Red-eye reduction, Return detected + 0x49 = On, Red-eye reduction + 0x4d = On, Red-eye reduction, Return not detected + 0x4f = On, Red-eye reduction, Return detected + 0x50 = Off, Red-eye reduction + 0x58 = Auto, Did not fire, Red-eye reduction + 0x59 = Auto, Fired, Red-eye reduction + 0x5d = Auto, Fired, Red-eye reduction, Return not detected + 0x5f = Auto, Fired, Red-eye reduction, Return detected + */ + } else { $fla = ''; } + // focal if (isset($exif['EXIF']['FocalLength'])) { $k = explode('/', $exif['EXIF']['FocalLength']); $fl = $k[0] . " mm"; @@ -241,7 +340,48 @@ if ($d > 0) { $fl = ''; } - + // program + if (isset($exif['EXIF']['ExposureMode'])) { + $em = $exif['EXIF']['ExposureMode']; + //$em = hexdec(intel2Moto($exif['EXIF']['ExposureMode'])); + //echo $em; + + switch ($em) { + case 0: $em = gettext("OFF"); + break; + case 1: $em = gettext("ON"); + break; + default: $em = gettext("Unknown"); + } + + /* + switch ($ep) { + case 1: $ep = gettext('Manual'); + break; + case 2: $ep = gettext('Program'); + break; + case 3: $ep = gettext('Aperture Priority'); + break; + case 4: $ep = gettext('Shutter Priority'); + break; + case 5: $ep = gettext('Program Creative'); + break; + case 6: $ep = gettext('Program Action'); + break; + case 7: $ep = gettext('Portrait'); + break; + case 8: $ep = gettext('Landscape'); + break; + default: $ep = gettext('Unknown') . ': ' . $ep; + break; + } + */ + + } else { + $em = ''; + } + + // wb if (isset($exif['EXIF']['WhiteBalance'])) { $wb = $exif['EXIF']['WhiteBalance']; @@ -273,6 +413,7 @@ if ($d > 0) { $wb = ''; } + // mode if (isset($exif['EXIF']['ExposureProgram'])) { $ep = $exif['EXIF']['ExposureProgram']; @@ -301,76 +442,137 @@ if ($d > 0) { $ep = ''; } + // width $wi = isset($exif['COMPUTED']['Width']) ? $exif['COMPUTED']['Width'] : ''; + + // height $he = isset($exif['COMPUTED']['Height']) ? $exif['COMPUTED']['Height'] : ''; + + // html $ht = isset($exif['COMPUTED']['html']) ? $exif['COMPUTED']['html'] : ''; - $ap = isset($exif['COMPUTED']['ApertureFNumber']) ? $exif['COMPUTED']['ApertureFNumber'] : ''; - + + // software + $soft = isset($exif['IFD0']['Software']) ? $exif['IFD0']['Software'] : ''; + + // lat, long, alt $gps = get_gps($exif); + + // usercomment + $uc = isset($exif['COMPUTED']['UserComment']) ? $exif['COMPUTED']['UserComment'] : ''; + + // comment + $comment = isset($exif['COMMENT']['0']) ? $exif['COMMENT']['0'] : ''; + $photos[$i] = array( 'filename' => $file, - - 'date' => $da, + 'filesize' => $fsize, + 'dateoriginal' => $da, + 'lens' => $obj, 'speed' => $sp, + 'aperture' => $ap, + 'correctexpo' => $ev, //// 'iso' => $iso, - + + 'model' => $mod, + 'metering' => $mm, + 'flash' => $fla, + 'focal' => $fl, + 'program' => $em, + 'wb' => $wb, + 'mode' => $ep, + 'width' => $wi, 'height' => $he, 'html' => $ht, - 'aperture' => $ap, - - 'model' => $mod, + 'software' => $soft, 'lat' => $gps['latitude'], 'long' => $gps['longitude'], 'alt' => $gps['altitude'], - 'metering' => $mm, - 'flash' => $fla, - 'focal' => $fl, - 'wb' => $wb, - 'program' => $ep + 'usercomment' => $uc, + 'comment' => $comment, ); } + /********/ + /* IPTC */ + /********/ + if ($iptc = @getimagesize($file, $info)) { //_pr($iptc); + if (isset($info["APP13"])) { $mots = ""; - $iptc = iptcparse ($info["APP13"]); - $legende = (isset($iptc["2#120"][0])) ? $iptc["2#120"][0] : ''; - $copyright = (isset($iptc["2#116"][0])) ? $iptc["2#116"][0] : ''; - $title = (isset($iptc["2#105"][0])) ? $iptc["2#105"][0] : ''; - $creator = (isset($iptc["2#080"][0])) ? $iptc["2#080"][0] : ''; - $mots_cles = (isset($iptc["2#025"])) ? $iptc["2#025"] : ''; + $iptc = iptcparse ($info["APP13"]); + + // keywords + $mots_cles = (isset($iptc["2#025"])) ? $iptc["2#025"] : ''; if (!empty($mots_cles)) { foreach ($mots_cles as $key => $val) { $mots .= $val . ","; } $mots = substr($mots, 0, -1); } - - $photos[$i]['legende'] = $legende; - $photos[$i]['copyright'] = $copyright; - $photos[$i]['title'] = $title; - $photos[$i]['creator'] = $creator; - $photos[$i]['mots_cles'] = $mots; + + // titre + $title = (isset($iptc["2#105"][0])) ? $iptc["2#105"][0] : ''; + + // creator + $creator = (isset($iptc["2#080"][0])) ? $iptc["2#080"][0] : ''; + + // ville + $ville = (isset($iptc["2#090"][0])) ? $iptc["2#090"][0] : ''; + + // departement + $departement = (isset($iptc["2#095"][0])) ? $iptc["2#095"][0] : ''; + + // code + $code = (isset($iptc["2#100"][0])) ? $iptc["2#100"][0] : ''; + + // pays + $pays = (isset($iptc["2#101"][0])) ? $iptc["2#101"][0] : ''; + + // copyright + $copyright = (isset($iptc["2#116"][0])) ? $iptc["2#116"][0] : ''; + + // legende + $legende = (isset($iptc["2#120"][0])) ? $iptc["2#120"][0] : ''; + + + $photos[$i]['keywords'] = $mots; + $photos[$i]['title'] = $title; + $photos[$i]['creator'] = $creator; + + $photos[$i]['city'] = $ville; + $photos[$i]['department'] = $departement; + $photos[$i]['code'] = $code; + $photos[$i]['country'] = $pays; + + $photos[$i]['copyright'] = $copyright; + $photos[$i]['legende'] = $legende; + } else { - $photos[$i]['legende'] = ''; - $photos[$i]['copyright'] = ''; + $photos[$i]['keywords'] = ''; $photos[$i]['title'] = ''; $photos[$i]['creator'] = ''; - $photos[$i]['mots_cles'] = ''; + $photos[$i]['city'] = ''; + $photos[$i]['department'] = ''; + $photos[$i]['code'] = ''; + $photos[$i]['country'] = ''; + $photos[$i]['copyright'] = ''; + $photos[$i]['legende'] = ''; } } $i++; } + //_pr($photos); $query5 = "SELECT MAX(id) FROM photos"; $stmt = $conn->prepare($query5); @@ -382,63 +584,83 @@ if ($d > 0) { try { - $query2 = "INSERT OR IGNORE INTO photos (filename, date, lens, speed, iso, width, height, html, aperture, model, lat, long, alt, legende, copyright, title, creator, keywords, metering, flash, focal, wb, program) VALUES (:filename, :date, :lens, :speed, :iso, :width, :height, :html, :aperture, :model, :lat, :long, :alt, :legende, :copyright, :title, :creator, :keywords, :metering, :flash, :focal, :wb, :program)"; + $query2 = "INSERT OR IGNORE INTO photos (filename, filesize, dateoriginal, lens, speed, aperture, correctexpo, iso, model, metering, flash, focal, program, wb, mode, width, height, html, software, lat, long, alt, usercomment, comment, keywords, title, creator, city, department, code, country, copyright, legende) VALUES (:filename, :filesize, :dateoriginal, :lens, :speed, :aperture, :correctexpo, :iso, :model, :metering, :flash, :focal, :program, :wb, :mode, :width, :height, :html, :software, :lat, :long, :alt, :usercomment, :comment, :keywords, :title, :creator, :city, :department, :code, :country, :copyright, :legende)"; $stmt = $conn->prepare($query2); + + /* EXIF */ $stmt->bindParam(':filename', $file); - $stmt->bindParam(':date', $da); + $stmt->bindParam(':filesize', $fsize); + $stmt->bindParam(':dateoriginal', $da); $stmt->bindParam(':lens', $obj); $stmt->bindParam(':speed', $sp); - $stmt->bindParam(':iso', $iso); - $stmt->bindParam(':width', $wi); - $stmt->bindParam(':height', $he); - $stmt->bindParam(':html', $ht); $stmt->bindParam(':aperture', $ap); + $stmt->bindParam(':correctexpo', $ev); + $stmt->bindParam(':iso', $iso); $stmt->bindParam(':model', $mod); - $stmt->bindParam(':lat', $gps['latitude']); - $stmt->bindParam(':long', $gps['longitude']); - $stmt->bindParam(':alt', $gps['altitude']); - - $stmt->bindParam(':legende', $leg); - $stmt->bindParam(':copyright', $cop); - $stmt->bindParam(':title', $tit); - $stmt->bindParam(':creator', $crea); - $stmt->bindParam(':keywords', $mot); - $stmt->bindParam(':metering', $mm); $stmt->bindParam(':flash', $fla); $stmt->bindParam(':focal', $fl); + $stmt->bindParam(':program', $em); $stmt->bindParam(':wb', $wb); - $stmt->bindParam(':program', $ep); + $stmt->bindParam(':mode', $ep); + $stmt->bindParam(':width', $wi); + $stmt->bindParam(':height', $he); + $stmt->bindParam(':html', $ht); + $stmt->bindParam(':software', $soft); + $stmt->bindParam(':lat', $gps['latitude']); + $stmt->bindParam(':long', $gps['longitude']); + $stmt->bindParam(':alt', $gps['altitude']); + $stmt->bindParam(':usercomment', $uc); + $stmt->bindParam(':comment', $com); + /* IPTC */ + $stmt->bindParam(':keywords', $mot); + $stmt->bindParam(':title', $tit); + $stmt->bindParam(':creator', $crea); + $stmt->bindParam(':city', $ci); + $stmt->bindParam(':department', $dep); + $stmt->bindParam(':code', $cp); + $stmt->bindParam(':country', $pa); + $stmt->bindParam(':copyright', $cop); + $stmt->bindParam(':legende', $leg); + if (isset($photos)) { foreach ($photos as $item) { $file = $item['filename']; - $da = $item['date']; + $fsize = $item['filesize']; + $da = $item['dateoriginal']; $obj = $item['lens']; $sp = $item['speed']; - $iso = $item['iso']; - $wi = $item['width']; - $he = $item['height']; - $ht = $item['html']; $ap = $item['aperture']; + $ev = $item['correctexpo']; + $iso = $item['iso']; $mod = $item['model']; - $gps['latitude'] = $item['lat']; - $gps['longitude'] = $item['long']; - $gps['altitude'] = $item['alt']; - - $leg = $item['legende']; - $cop = $item['copyright']; - $tit = $item['title']; - $crea = $item['creator']; - $mot = $item['mots_cles']; - $mm = $item['metering']; $fla = $item['flash']; $fl = $item['focal']; + $em = $item['program']; $wb = $item['wb']; - $ep = $item['program']; + $ep = $item['mode']; + $wi = $item['width']; + $he = $item['height']; + $ht = $item['html']; + $soft = $item['software']; + $gps['latitude'] = $item['lat']; + $gps['longitude'] = $item['long']; + $gps['altitude'] = $item['alt']; + $mot = $item['keywords']; + $tit = $item['title']; + $crea = $item['creator']; + $ci = $item['city']; + $dep = $item['department']; + $cp = $item['code']; + $pa = $item['country']; + $cop = $item['copyright']; + $leg = $item['legende']; + $uc = $item['usercomment']; + $com = $item['comment']; create_thumb($th_w, $th_h, $file); @@ -451,8 +673,13 @@ if ($d > 0) { } + /***********************/ + /* Display new entries */ + /***********************/ + try { - $query4 = "SELECT filename, date, lens, speed, iso, width, height, html, aperture, model, lat, long, alt, legende, copyright, title, creator, keywords, metering, flash, focal, wb, program FROM photos WHERE id > ? ORDER BY date DESC"; + + $query4 = "SELECT filename, filesize, dateoriginal, lens, speed, aperture, correctexpo, iso, model, metering, flash, focal, program, wb, mode, width, height, html, software, lat, long, alt, usercomment, comment, keywords, title, creator, city, department, code, country, copyright, legende FROM photos WHERE id > ? ORDER BY dateoriginal DESC"; $stmt = $conn->prepare($query4); $stmt->bindValue(1, $nb_avant, SQLITE3_INTEGER); // (1,3...) 1=1ere valeur 3=valeur @@ -462,16 +689,16 @@ if ($d > 0) { echo '
'; echo ''; echo ''; - echo ''; - echo ''; - echo ''; + echo ''; + echo ''; + echo ''; echo ''; echo ''; while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $thumbnail = host() . str_replace("photos/img", "photos/thumb", $row['filename']); $full = host() . $row['filename']; - echo ''; + echo ''; } echo '
' . gettext('Thumb') . '' . gettext('Filename') . '' . gettext('Date') . '' . gettext('Lens') . '' . gettext('Speed') . '' . gettext('Iso') . '' . gettext('Width') . '' . gettext('Height') . '' . gettext('Html') . '' . gettext('Aperture') . '' . gettext('Model') . '' . gettext('Latitude') . '' . gettext('Longitude') . '' . gettext('Alttitude') . '' . gettext('Legende') . '' . gettext('Copyright') . '' . gettext('Title') . '' . gettext('Creator') . '' . gettext('Keywords') . '' . gettext('Metering') . '' . gettext('Flash') . '' . gettext('Focal') . '' . gettext('Wb') . '' . gettext('Program') . '' . gettext('Thumb') . '' . gettext('Filename') . '' . gettext('File size') . '' . gettext('Date') . '' . gettext('Lens') . '' . gettext('Speed') . '' . gettext('Aperture') . '' . gettext('Exposure Corr.') . '' . gettext('Iso') . '' . gettext('Model') . '' . gettext('Metering') . '' . gettext('Flash') . '' . gettext('Focal') . '' . gettext('Program') . '' . gettext('White Balance') . '' . gettext('Mode') . '' . gettext('Software') . '' . gettext('Latitude') . '' . gettext('Longitude') . '' . gettext('Alttitude') . '' . gettext('Keywords') . '' . gettext('Title') . '' . gettext('Creator') . '' . gettext('City') . '' . gettext('Department') . '' . gettext('CP') . '' . gettext('Country') . '' . gettext('Copyright') . '' . gettext('Legende') . '
' . '' . '' . $row['filename'] . '' . $row['date'] . '' . $row['lens'] . '' . $row['speed'] . '' . $row['iso'] . '' . $row['width'] . '' . $row['height'] . '' . $row['html'] . '' . $row['aperture'] . '' . $row['model'] . '' . $row['lat'] . '' . $row['long'] . '' . $row['alt'] . '' . $row['legende'] . '' . $row['copyright'] . '' . $row['title'] . '' . $row['creator'] . '' . $row['keywords'] . '' . $row['metering'] . '' . $row['flash'] . '' . $row['focal'] . '' . $row['wb'] . '' . $row['program'] . '
' . '' . '' . $row['filename'] . '' . $row['filesize'] . '' . $row['dateoriginal'] . '' . $row['lens'] . '' . $row['speed'] . '' . $row['aperture'] . '' . $row['correctexpo'] . '' . $row['iso'] . '' . $row['model'] . '' . $row['metering'] . '' . $row['flash'] . '' . $row['focal'] . '' . $row['program'] . '' . $row['wb'] . '' . $row['mode'] . '' . $row['software'] . '' . $row['lat'] . '' . $row['long'] . '' . $row['alt'] . '' . $row['keywords'] . '' . $row['title'] . '' . $row['creator'] . '' . $row['city'] . '' . $row['department'] . '' . $row['code'] . '' . $row['country'] . '' . $row['copyright'] . '' . $row['legende'] . '
'; echo '
'; @@ -491,12 +718,12 @@ if ($d > 0) { ?> - + -

© 2013- sur-le-sentier.fr

+

© 2013- sur-le-sentier.fr

- - + + diff --git a/css/minimal.css b/css/minimal.css index 972e3d9..e27b35d 100644 --- a/css/minimal.css +++ b/css/minimal.css @@ -158,12 +158,18 @@ .lcl_minimal #lcl_txt * { font-family: Arial,​ 'sans-serif'; color: #ddd; + color: rgba(255, 255, 255, 0.5); /* add */ + mix-blend-mode: difference; /* add */ } .lcl_minimal #lcl_title { - color: #eee; + color: #eee; + color: rgba(238, 238, 238, 0.7); /* add */ + mix-blend-mode: difference; /* add */ } .lcl_minimal #lcl_author { - color: #bfbfbf; + color: #bfbfbf; + color: rgba(191, 191, 191, 0.7); /* add */ + mix-blend-mode: difference; /* add */ } .lcl_minimal .lcl_txt_border { border-bottom: 1px dotted #666 !important; diff --git a/css/sls.css b/css/sls.css index d9eae3e..ccc15bb 100644 --- a/css/sls.css +++ b/css/sls.css @@ -12,6 +12,16 @@ h1 { h2, h3, h4 { font-family: sans-serif; } +h3 { + font-weight: 300; + text-align: center; + margin-bottom: 2em; +} +h4 { + font-weight: 200; + text-align: center; + /*margin-bottom: 2em;*/ +} p { text-align: center; @@ -40,12 +50,15 @@ pre { line-height: 1.6; margin-bottom: 1.6em; max-width: 100%; - overflow: auto; + overflow: auto; padding: 1em 1.5em; display: block; word-wrap: break-word; } +.lcl_minimal #lcl_txt * { + color: rgba(255, 255, 255, 0.5); +} /* The grid itself needs only 4 CSS declarations: */ @@ -418,3 +431,90 @@ select:-moz-focusring { text-align: center; } +/* Liste admin.php */ +/**/ + +.base { + font-family: sans-serif; + font-weight: 400; + font-size: 24px; + text-align: center; +} +/* +h3 { + font-weight: 400; + text-align: center; +} +*/ + +.center-flex { + display: flex; + justify-content: center; + align-items: center; + min-height: 50vh; + flex-direction: column; +} + +ul { + list-style: none; + padding: 0; +} + +li { + margin: 5px 0; +} + +nav a, button a { + font-size: 18px; + text-decoration: none; + padding: 8px 12px; + margin-right: 12px; + border: 1px solid rgb(154, 149, 73); + border-radius: 5px; + transition: all 0.3s ease; + /*background-color: rgb(177, 172, 115);*/ + color: white !important; +} + +/* styles links while mouse is hovered over */ +nav a:hover, button a:hover { + background-color: orange; + border: 1px solid rgb(208, 134, 0); + border-radius: 5px; +} + +/* styles links while being clicked */ +nav a:active, button a:active { + color: blue; +} + +/* +.green { + background-color: rgb(7, 141, 35); +} +*/ +h3.redstyle { + color: red; +} +h3.greenstyle { + color: rgb(7, 141, 35); +} +.red { + background-color: rgb(219, 127, 101); +} +.kaki { + background-color: rgb(177, 172, 115); +} +.center { + text-align: center; +} +.font10 { + font-size: 10px; +} + + +input[type="text"], textarea { + + background-color : #eeeeee; + +} \ No newline at end of file diff --git a/db_photo.sqlite3 b/db_photo.sqlite3 index 2b797cc..e265ab2 100644 Binary files a/db_photo.sqlite3 and b/db_photo.sqlite3 differ diff --git a/edit_bdd.php b/edit_bdd.php index b68198c..d0a0825 100644 --- a/edit_bdd.php +++ b/edit_bdd.php @@ -1,3 +1,44 @@ + $value) { + $r = "id = '" . $value . "' OR "; + $rr .= $r; + } + + $req = substr($rr, 0, -4); + $req_edit = "SELECT * FROM photos WHERE " . $req . " ORDER BY id"; + + } + else { + $url = "view_bdd.php?message=" . urlencode(gettext("No images select !")); + header("location: $url"); + } + } + else { + $url = "view_bdd.php?message=" . urlencode(gettext("No images select !")); + header("location: $url"); + } + } + else { + $url = "admin.php?message=" . urlencode(gettext("Please log in !")); + header("location: $url"); + } + +?> @@ -5,119 +46,77 @@ - <?php gettext('View photos in Sqlite base'); ?> + <?php echo gettext('View photos in Sqlite base'); ?> - - - + + + - "; -_pr($_SESSION); -//echo $_SESSION['query']; - - $domain = 'sentier'; - localize($domain); - - - if (!empty($_POST)) { - /* - $_SESSION['query'] = $_POST; - echo "post query non vide"; - echo gettype($_POST); - echo gettype($_SESSION['query']); - */ - #$liste = $_POST; - - $liste = array_filter($_POST, function($key) { - return strpos($key, 'coche') === 0; - }, ARRAY_FILTER_USE_KEY); - - if (count($liste) == 0) { - echo gettext('No image selected !'); - header("location:view_bdd.php"); - } - - $r = ""; - foreach ($liste as $key => $value) { - $r .= "filename LIKE '%" . $value . "' OR "; - } - $req = "WHERE " . substr($r, 0, -4); - } - ?> - - -

+ + ' . gettext('Edit database') . ': ' . $base . '
'; + + echo '

' . $msg . '

'; - echo " close session
"; - - - $query = "SELECT * FROM photos " . $req . " ORDER BY id"; - echo $query; try { $conn = new PDO('sqlite:db_photo.sqlite3'); - $stmt = $conn->prepare($query); - $stmt->execute(); - - #$result = $stmt->fetchAll(PDO::FETCH_ASSOC); - #$rowcount = count($result); - - - - #_pr($result); + $stmt = $conn->prepare($req_edit); + $stmt->execute(); ?> - - '; echo ''; echo ''; - echo ''; - echo ''; - echo ''; + echo ''; + echo ''; + + echo ''; echo ''; echo ''; - - // lens legende copyright title creator keywords + + $nRows = 0; while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $thumbnail = host() . str_replace("photos/img", "photos/thumb", $row['filename']); $full = host() . $row['filename']; echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + //echo ''; + echo ""; + echo ''; + echo ''; - + echo ''; + echo ''; + echo ''; + echo ''; + + echo ''; + echo ''; + + echo ''; + $nRows++; } @@ -133,12 +132,12 @@ _pr($_SESSION); } ?> - - -

© 2013- sur-le-sentier.fr

+ - - +

© 2013- sur-le-sentier.fr

+ + + diff --git a/exifs.xlsx b/exifs.xlsx new file mode 100644 index 0000000..c56bac1 Binary files /dev/null and b/exifs.xlsx differ diff --git a/exifs2.xlsx b/exifs2.xlsx new file mode 100644 index 0000000..a961d69 Binary files /dev/null and b/exifs2.xlsx differ diff --git a/functions.php b/functions.php index bfad229..93eb884 100644 --- a/functions.php +++ b/functions.php @@ -1,10 +1,92 @@ "; + echo '' . debug_backtrace()[0]['file'] . ' ' . debug_backtrace()[0]['line'] . ''; + echo ""; + echo '
';
+	if(is_array($d)) {
+		print_r($d);
+		} else if(is_object($d)) {
+		var_dump($d);
+		}
+	echo '
'; + } + +/** + * Simple helper to debug to the console + * + * @param Array, Object, String $data + * @return String +*/ +function debug_to_console( $data ) { + $output = ''; + + if ( is_array( $data ) ) { + $output .= ""; + } else if ( is_object( $data ) ) { + $data = var_export( $data, TRUE ); + $data = explode( "\n", $data ); + foreach( $data as $line ) { + if ( trim( $line ) ) { + $line = addslashes( $line ); + $output .= "console.log( '{$line}' );"; + } + } + $output = ""; + } else { + $output .= ""; + } + + echo $output; +} + + /* Fonction month(): convertit le mois (nb) en mois (texte) francais photo-du-mois.php */ +function convert_bytes($val , $type_val , $type_wanted){ + $tab_val = array("o", "ko", "Mo", "Go", "To", "Po", "Eo"); + if (!(in_array($type_val, $tab_val) && in_array($type_wanted, $tab_val))) + return 0; + $tab = array_flip($tab_val); + $diff = $tab[$type_val] - $tab[$type_wanted]; + if ($diff > 0) + return ($val * pow(1024, $diff)); + if ($diff < 0) + return ($val / pow(1024, -$diff)); + return ($val); + } + +function taille_fichier($octets) { + $resultat = $octets; + for ($i=0; $i < 8 && $resultat >= 1024; $i++) { + $resultat = $resultat / 1024; + } + if ($i > 0) { + return preg_replace('/,00$/', '', number_format($resultat, 2, ',', '')) + . ' ' . substr('KMGTPEZY',$i-1,1) . 'o'; + } else { + return $resultat . ' o'; + } + } + +function formatBytes($bytes, $precision = 2) { + $units = array('o', 'Ko', 'Mo', 'Go', 'To'); + + $bytes = max($bytes, 0); + $pow = floor(($bytes ? log($bytes) : 0) / log(1024)); + $pow = min($pow, count($units) - 1); + + // Uncomment one of the following alternatives + // $bytes /= pow(1024, $pow); + $bytes /= (1 << (10 * $pow)); + + return round($bytes, $precision) . " " .$units[$pow]; + } + function month($w) { $m = date('m', strtotime($w)); // month $y = date('Y', strtotime($w)); // year @@ -77,10 +159,12 @@ function get_gps($exif) { $GPSLongitude = isset($exif['GPS']['GPSLongitude']) ? $exif['GPS']['GPSLongitude'] : ''; $GPSAltitude = isset($exif['GPS']['GPSAltitude']) ? $exif['GPS']['GPSAltitude'] : ''; + /* echo $GPSLatitude; echo $GPSLongitude; echo $GPSAltitude; - + */ + $lat_degrees = count($GPSLatitude) > 0 ? gps2Num($GPSLatitude[0]) : 0; $lat_minutes = count($GPSLatitude) > 1 ? gps2Num($GPSLatitude[1]) : 0; $lat_seconds = count($GPSLatitude) > 2 ? gps2Num($GPSLatitude[2]) : 0; @@ -115,29 +199,29 @@ function get_gps($exif) { insert_bdd.php */ + function create_thumb($thumb_w, $thumb_h, $image) { - list($origin_w, $origin_h) = getimagesize($image); - $origin_ratio = round($origin_w / $origin_h, 1); - $outFile = str_replace("photos/img", "photos/thumb", $image); +list($origin_w, $origin_h) = getimagesize($image); +$origin_ratio = round($origin_w / $origin_h, 1); +$outFile = str_replace("photos/img", "photos/thumb", $image); - if ($origin_w != null && $origin_h != null) { - if ($thumb_w / $thumb_h > $origin_ratio) { - $thumb_w = $thumb_h * $origin_ratio; - } else { - $thumb_h = $thumb_w / $origin_ratio; - } +if ($origin_w != null && $origin_h != null) { + if ($thumb_w / $thumb_h > $origin_ratio) { + $thumb_w = $thumb_h * $origin_ratio; + } else { + $thumb_h = $thumb_w / $origin_ratio; + } - if ($origin_w >= 400 && $origin_h >= 400) { - $image = new Imagick($image); // !!! - $image->thumbnailImage($thumb_w, $thumb_h); - $image->writeImage($outFile); - $image->destroy(); - } + if ($origin_w >= 400 && $origin_h >= 400) { + $image = new Imagick($image); // !!! + $image->thumbnailImage($thumb_w, $thumb_h); + $image->writeImage($outFile); + $image->destroy(); } } +} - /* Fonction in_bdd(): test si la photo est déjà dans la bdd insert_bdd.php @@ -166,23 +250,6 @@ function in_bdd($image) { } -// - -function _pr($d) { - echo "
"; - echo '' . debug_backtrace()[0]['file'] . ' ' . debug_backtrace()[0]['line'] . ''; - echo "
"; - echo '
';
-    if(is_array($d)) {
-    	print_r($d);
-    	} else if(is_object($d)) {
-    	var_dump($d);
-    	}
-    echo '
'; - } - - - /* return geo exif in a nice form */ @@ -227,8 +294,9 @@ function host() { if ($_SERVER['HTTP_HOST'] == "sur-le-sentier.fr") { $host = $pv_URIprotocol . $_SERVER['HTTP_HOST'] . "/"; } - elseif ($_SERVER['HTTP_HOST'] == "airbook.local") { - $host = $pv_URIprotocol . $_SERVER['HTTP_HOST'] . "/sls/"; + elseif ($_SERVER['HTTP_HOST'] == "sur-le-sentier.airbook.local") { + //$host = $pv_URIprotocol . $_SERVER['HTTP_HOST'] . "/sls/"; + $host = $pv_URIprotocol . $_SERVER['HTTP_HOST'] . "/"; } return $host; } @@ -279,8 +347,34 @@ function clean_keywords($keywords) { return $v; } +function conv_date($dateoriginal, $format) { + $locale = getenv('LC_ALL='); + + if ($format == 1) { + $formatter = new IntlDateFormatter($locale, IntlDateFormatter::FULL, IntlDateFormatter::SHORT, "Europe/Paris"); + // vendredi 16 septembre 2022 à 19:17 + } + elseif ($format == 2) { + $formatter = new IntlDateFormatter($locale, IntlDateFormatter::LONG, IntlDateFormatter::LONG, "Europe/Paris"); + // 16 septembre 2022 à 19:17:22 UTC+2 + } + elseif ($format == 3) { + $formatter = new IntlDateFormatter($locale, IntlDateFormatter::MEDIUM, IntlDateFormatter::MEDIUM, "Europe/Paris"); + // 16 sept. 2022, 19:17:22 + } + elseif ($format == 4) { + $formatter = new IntlDateFormatter($locale, IntlDateFormatter::MEDIUM, IntlDateFormatter::SHORT, "Europe/Paris"); + // 16 sept. 2022, 19:17 + } + + $date = new DateTime($dateoriginal); + return $formatter->format($date); +} + function data_for_lightbox($data) { + //$query4 = "INSERT OR IGNORE INTO photos (filename, filesize, dateoriginal, lens, speed, correctexpo, iso, usercomment, comment, model, metering, flash, focal, program, wb, mode, width, height, html, aperture, software, lat, long, alt, keywords, title, creator, city, department, code, country, copyright, legende); + $filename = $data['filename']; $title_thumb = pathinfo($filename, PATHINFO_FILENAME); @@ -291,17 +385,25 @@ function data_for_lightbox($data) { $iso = $data['iso']; $exif = $model . " \u{30FB} " . $objectif . " \u{30FB} " . $speed . " \u{30FB} " . $aperture . " \u{30FB} " . $iso . "ISO"; + $correctexpo = $data['correctexpo']; + $metering = $data['metering']; + $program = $data['program']; + $wb = $data['wb']; + $software = $data['software']; + $dateoriginal = conv_date($data['dateoriginal'], 4); + + $focal = $data['focal']; + $flash = $data['flash']; + $latitude = $data['lat']; $longitude = $data['long']; $altitude = $data['alt']; - $da = isset($exif['EXIF']['DateTimeOriginal']) ? $exif['EXIF']['DateTimeOriginal'] : ''; - $gps = (!empty($longitude) && !empty($latitude)) ? $latitude . "," . $longitude : ""; - //$gps = $longitude . "," . $latitude; $title = $data['title']; + $legende = $data['legende']; $file = basename($filename); if (!empty($title)) { @@ -316,6 +418,13 @@ function data_for_lightbox($data) { $x = $file; $y = ""; } + + if (!empty($gps)) { + $map = '' . " \u{30FB} \u{2693} " . ''; + } + else { + $map = ''; + } $creator = $data['creator']; @@ -323,6 +432,45 @@ function data_for_lightbox($data) { $thumb = host() . str_replace("photos/img", "photos/thumb", $data['filename']); $keywords = str_replace(',', " \u{30FB} ", clean_keywords($data['keywords'])); + $copyright = $data['copyright']; + + $city = $data['city']; + $department = $data['department']; + $code = $data['code']; + $country = $data['country']; + + $comment = $data['comment']; + $usercomment = $data['usercomment']; + + $description = "
' . gettext('Id') . '' . gettext('Thumb') . '' . gettext('Filename') . '' . gettext('Date') . ' ' . gettext('Lens') . '' . gettext('Speed') . '' . gettext('Aperture') . '' . gettext('Iso') . '' . gettext('Width') . '' . gettext('Height') . '' . gettext('Model') . '' . gettext('Latitude') . '' . gettext('Longitude') . '' . gettext('Alttitude') . '' . gettext('Legende') . '' . gettext('Copyright') . '' . gettext('Title') . '' . gettext('Creator') . '' . gettext('Keywords') . '' . gettext('Metering') . '' . gettext('Flash') . '' . gettext('Focal') . '' . gettext('Wb') . '' . gettext('Program') . '' . gettext('Html') . '' . gettext('Id') . '' . gettext('Thumb') . '' . gettext('Filename') . '' . gettext('Date') . ' ' . gettext('Speed') . '' . gettext('Iso') . '' . gettext('Aperture') . '' . gettext('Expo. correct') . '' . gettext('Model') . '' . gettext('Lens') . '' . gettext('Focal') . '' . gettext('Metering') . '' . gettext('Program') . '' . gettext('Wb') . '' . gettext('Flash') . '' . gettext('Software') . '' . gettext('Keywords') . '' . gettext('Title') . '' . gettext('Creator') . '' . gettext('City') . '' . gettext('Department') . '' . gettext('Code') . '' . gettext('Country') . '' . gettext('Copyright') . '' . gettext('Legende') . '
' . $row['id'] . '' . '' . '' . $row['filename'] . '' . $row['dateoriginal'] . '' . $row['speed'] . '' . $row['aperture'] . '' . $row['iso'] . '' . $row['width'] . '' . $row['height'] . '' . $row['model'] . '' . $row['lat'] . '' . $row['long'] . '' . $row['alt'] . '' . $row['metering'] . '' . $row['flash'] . '' . $row['focal'] . '' . $row['wb'] . '' . $row['program'] . '' . $row['html'] . '
' . $row['filename'] . '' . $row['dateoriginal'] . '' . $row['speed'] . '' . $row['iso'] . '' . $row['aperture'] . '' . $row['correctexpo'] . '' . $row['model'] . '' . $row['focal'] . '' . $row['metering'] . '' . $row['program'] . '' . $row['wb'] . '' . $row['flash'] . '' . $row['software'] . '
"; + $description .= ""; + $description .= ""; + $description .= ""; + $description .= ""; + $description .= ""; + $description .= ""; + $description .= ""; + $description .= ""; + $description .= ""; + $description .= ""; + $description .= ""; + + if (! strcasecmp($flash, "Off") == 0) { + $description .= ""; + } + $description .= ""; + $description .= ""; + (!empty($copyright)) && $description .= ""; + + (!empty($city)) && $description .= ""; + (!empty($department)) && $description .= ""; + $code = (!empty($code)) ? " (" . $code . ")" : ""; + (!empty($country)) && $description .= ""; + (!empty($map)) && $description .= ""; + ((!empty($comment)) || (!empty($usercomment))) && $description .= ""; + (!empty($comment)) && $description .= ""; + (!empty($usercomment)) && $description .= ""; + $description .= "
" . gettext("Date") . "" . $dateoriginal . "
" . gettext("Speed") . "" . $speed . "
" . gettext("Aperture") . "" . $aperture . "
" . gettext("Iso") . "" . $iso . "
" . gettext("Model") . "". $model . "
" . gettext("Lens") . "" . $objectif . "
" . gettext("Focal") . "" . $focal . "
" . gettext("Exposure Correction") . "" . $correctexpo . "
" . gettext("Metering") . "". $metering . "
" . gettext("Program") . "" . $program . "
" . gettext("White balance") . "" . $wb . "
" . gettext("Flash") . "" . $flash . "
" . gettext("Software") . "" . $software . "
" . gettext("Keywords") . "" . $keywords . "
" . gettext("Copyright") . "" . $copyright . "
" . gettext("City") . "" . $city . "
" . gettext("Department") . "" . $department . "
" . gettext("Country") . "" . $country . $code . "
GPS" . $map . "
  
" . gettext("Comment") . "" . $comment . "
" . gettext("User comment") . "" . $usercomment . "
"; $lightbox = array(); $lightbox['title_thumb'] = $title_thumb; @@ -334,6 +482,7 @@ function data_for_lightbox($data) { $lightbox['keywords'] = $keywords; $lightbox['creator'] = $creator; $lightbox['gps'] = $gps; + $lightbox['description'] = $description; /* Array @@ -346,240 +495,10 @@ function data_for_lightbox($data) { [big] => https://airbook.local/sls/photos/img/12_2021.jpg [keywords] => Carduelis carduelis ・ chardonneret élégant [creator] => @Bruno Pesenti + [description] => ...
) */ return $lightbox; } -/* ---------------------------------------------------- - - Localization: - - -list_dir($dir) : liste le dossier des locales (Locale) - -locale_language_from_browser($languages) : Identify language from the Accept-language HTTP header - -localize() : fonction à ajouter sur chaque page - ------------------------------------------------------*/ - -function list_dir($dir) { - if ($handle = opendir($dir)) { - $files = array(); - while(false!==($file = readdir($handle))) { - if (is_dir($dir . '/' . $file)) { - $files[] = $file; - } - } - closedir($handle); - sort($files); - - $i = 0; - global $myLanguages; - $myLanguages = array(); - foreach($files as $f) { - if (strstr($f,'.') == false) { - $myLanguages[$i] = $f; - $i++; - } - //$myLanguages[] = $f; - } - } - else { - echo 'error: missing language files'; - exit; - } - //print_r($myLanguages); - return $myLanguages; -} - -//function _locale_language_from_browser($languages) { -function _locale_language_from_browser() { - if (empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { - return FALSE; - } - - $languages = ""; - // The Accept-Language header contains information about the language - // preferences configured in the user's browser / operating system. - // RFC 2616 (section 14.4) defines the Accept-Language header as follows: - // Accept-Language = "Accept-Language" ":" - // 1#( language-range [ ";" "q" "=" qvalue ] ) - // language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" ) - // Samples: "hu, en-us;q=0.66, en;q=0.33", "hu,en-us;q=0.5" - $browser_langcodes = array(); - if (preg_match_all('@(?<=[, ]|^)([a-zA-Z-]+|\\*)(?:;q=([0-9.]+))?(?:$|\\s*,\\s*)@', trim($_SERVER['HTTP_ACCEPT_LANGUAGE']), $matches, PREG_SET_ORDER)) { - foreach ($matches as $match) { - - // We can safely use strtolower() here, tags are ASCII. - // RFC2616 mandates that the decimal part is no more than three digits, - // so we multiply the qvalue by 1000 to avoid floating point comparisons. - $langcode = strtolower($match[1]); - $qvalue = isset($match[2]) ? (double) $match[2] : 1; - $browser_langcodes[$langcode] = (int) ($qvalue * 1000); - - _pr($match); - echo $langcode . '-' . $qvalue . '-' . $browser_langcodes[$langcode] . '
'; - } - } - -//_pr($browser_langcodes); - - // We should take pristine values from the HTTP headers, but Internet Explorer - // from version 7 sends only specific language tags (eg. fr-CA) without the - // corresponding generic tag (fr) unless explicitly configured. In that case, - // we assume that the lowest value of the specific tags is the value of the - // generic language to be as close to the HTTP 1.1 spec as possible. - // See http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4 and - // http://blogs.msdn.com/b/ie/archive/2006/10/17/accept-language-header-for-internet-explorer-7.aspx - asort($browser_langcodes); - foreach ($browser_langcodes as $langcode => $qvalue) { - $generic_tag = strtok($langcode, '-'); - if (!isset($browser_langcodes[$generic_tag])) { - $browser_langcodes[$generic_tag] = $qvalue; - } - } - -echo "browser_langcodes
"; -_pr($browser_langcodes); -echo "languages
"; -_pr($languages); - - // Find the enabled language with the greatest qvalue, following the rules - // of RFC 2616 (section 14.4). If several languages have the same qvalue, - // prefer the one with the greatest weight. - $best_match_langcode = FALSE; - $max_qvalue = 0; - foreach ($languages as $langcode => $language) { - - // Language tags are case insensitive (RFC2616, sec 3.10). - $langcode = strtolower($langcode); - - // If nothing matches below, the default qvalue is the one of the wildcard - // language, if set, or is 0 (which will never match). - $qvalue = isset($browser_langcodes['*']) ? $browser_langcodes['*'] : 0; - - // Find the longest possible prefix of the browser-supplied language - // ('the language-range') that matches this site language ('the language tag'). - $prefix = $langcode; - echo "prefix: " . $prefix . "
"; - - do { - if (isset($browser_langcodes[$prefix])) { - $qvalue = $browser_langcodes[$prefix]; - break; - } - } while ($prefix = substr($prefix, 0, strrpos($prefix, '-'))); - - // Find the best match. - if ($qvalue > $max_qvalue) { - $best_match_langcode = $language->language; - $max_qvalue = $qvalue; - } - } - -_pr($best_match_langcode); -echo "bml" . $best_match_langcode . "
"; - - return $best_match_langcode; -} - - -function locale_language_from_browser($languages) { - // Specified by the user via the browser's Accept Language setting - // Samples: "hu, en-us;q=0.66, en;q=0.33", "hu,en-us;q=0.5" - $browser_langs = array(); - - if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { - $browser_accept = explode(",", $_SERVER['HTTP_ACCEPT_LANGUAGE']); - foreach ($browser_accept as $langpart) { - // The language part is either a code or a code with a quality. - // We cannot do anything with a * code, so it is skipped. - // If the quality is missing, it is assumed to be 1 according to the RFC. - if (preg_match("!([a-z-]+)(;q=([0-9\\.]+))?!", trim($langpart), $found)) { - $browser_langs[$found[1]] = (isset($found[3]) ? (float) $found[3] : 1.0); - } - } - } - - // Order the codes by quality - arsort($browser_langs); - //Array ( [en-us] => 1 [en] => 0.7 [fr] => 0.3 ) Firefox Fr - //Array ( [fr-] => 1 [en-] => 1 [fr] => 0.8 [en] => 0.4 ) Chrome 5 Fr - //Array ( [fr-fr] => 1 ) Safari Fr - //Array ( [fr-fr] => 1 ) iCab Fr - //Array ( [zh-] => 1 [fr] => 1 [pt-] => 1 [en-] => 1 [en] => 0.9 [ja] => 0.7 [de] => 0.6 [es] => 0.5 [it] => 0.4 [pt] => 0.3 [pl] => 0.1 [ru] => 0.1 [ko] => 0.1 [sv] => 0.1 [nl] => 0.1 [nb] => 0.1 [da] => 0.1 [fi] => 0.1 ) Opera 10.6 - - // Try to find the first preferred language we have - foreach ($browser_langs as $langcode => $q) { - foreach ($languages as $value) { - /* - $string = strtolower(str_replace('_','-',$value)); - echo $langcode . '-' . $q . '-' . $value . '
'; - if ($string == $langcode) { - echo $value; - return $value; - break; - } - */ - //echo $langcode . '-' . $q . '-' . $value . '
'; - if (substr($langcode, 0, 2) == substr($value, 0, 2)) { - $lang = $value; - break 2; - } - } - } - - return $lang; -} - -function localize($domain) { - //if ($_SERVER['SERVER_NAME'] == 'airbook.local') - $root = $_SERVER['DOCUMENT_ROOT']; - //$root = dirname($_SERVER['SCRIPT_FILENAME']); // /Users/bruno/Sites/sls - //include($root.'/lib2/localize.php'); - $dir_locales = $root . '/Locale'; - - $liste_locale = list_dir($dir_locales); - /* - Array - ( - [0] => de_DE - [1] => en_US - [2] => es_ES - [3] => fr_FR - ) - */ - - //if ((!isset($_POST['lang'])) and (!isset($_GET['lang']))) $langue = locale_language_from_browser($liste_locale); - //else $langue = $_REQUEST['lang']; - if ((empty($_REQUEST['lang'])) and (empty($_SESSION['language']))){ - $langue = locale_language_from_browser($liste_locale); - } - elseif (!empty($_REQUEST['lang'])) { - $langue = $_REQUEST['lang']; - $_SESSION['language'] = $_REQUEST['lang']; - } - else $langue = $_SESSION['language']; - $langue .= ".utf8"; - - /* - if (isset($_GET['lang'])) echo "_GET lang: " . $_GET['lang'] . "
"; - else echo "_GET lang: NULL" . "
"; - if (isset($_REQUEST['lang'])) echo "_REQUEST lang: " . $_REQUEST['lang'] . "
"; - else echo "_REQUEST lang: NULL" . "
"; - if (isset($_SESSION['language'])) echo "_SESSION language: " . $_SESSION['language'] . "
"; - else echo "_SESSION language: NULL" . "
"; - echo "langue: " . $langue . "
"; - */ - - putenv('LC_ALL=' . $langue); - $loc = setlocale(LC_ALL, $langue); - - bindtextdomain($domain, $root . '/Locale/'); - bind_textdomain_codeset($domain, 'UTF-8'); - textdomain($domain); - - $nation = array('fr_FR' => gettext('French'), 'en_US' => gettext('English') , 'de_DE' => gettext('German'), 'es_ES' => gettext('Spanish') ); -} - - ?> \ No newline at end of file diff --git a/index.php b/index.php index 6f2764f..0a6722e 100644 --- a/index.php +++ b/index.php @@ -1,3 +1,9 @@ + + @@ -26,12 +32,6 @@ - - "; + echo '' . debug_backtrace()[0]['file'] . ' ' . debug_backtrace()[0]['line'] . ''; + echo ""; + echo '
';
+    if(is_array($d)) {
+    print_r($d);
+    } else if(is_object($d)) {
+    var_dump($d);
+    }
+    echo '
'; +} + +echo "PHP_SAPI: "; +echo PHP_SAPI; +echo "

"; + +echo "Display $ _SERVER: "; +_pr($_SERVER); +echo "

"; + +/* +if (is_mod_rewrite_enabled()) { + print "The apache module mod_rewrite is enabled.
\n"; +} else { + print "The apache module mod_rewrite is NOT enabled.
\n"; +} +*/ +/** + * Verifies if the mod_rewrite module is enabled + * + * @return boolean True if the module is enabled. + */ + /* +function is_mod_rewrite_enabled() { + if ($_SERVER['HTTP_MOD_REWRITE'] == 'On') { + return TRUE; + } else { + return FALSE; + } +} +*/ + +// Extensions PHP +echo "get_loaded_extensions:"; +_pr(get_loaded_extensions()); +echo "\n"; +?> + + + + * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License + * @link https://silverbook.local/ + */ + phpinfo(); + + echo ''; + + + $email = "bruno@clicclac.info"; + $default = 'http://' . $_SERVER['HTTP_HOST'] .'/images/avatar.jpg'; + $size = 40; + $grav_url = "https://www.gravatar.com/avatar/" . md5(strtolower(trim($email))) . "?d=" . urlencode($default) . "&s=" . $size; + echo ''; +?> \ No newline at end of file diff --git a/insert_bdd.php b/insert_bdd.php index 63f9a5c..c768f39 100644 --- a/insert_bdd.php +++ b/insert_bdd.php @@ -1,3 +1,9 @@ + @@ -5,77 +11,90 @@ - <?php gettext('Insert photos in Sqlite base'); ?> + <?php echo gettext('Insert photos in Sqlite base'); ?> - - - + + + - - - + ' . gettext("Insert images in " . $base . " database.") . '
'; + +if (file_exists($base)) { + echo '

Database ' . $base . ' already exist! Delete it !

'; + unlink($base); +} + // Taille des vignettes $th_w = 300; $th_h = 300; $dir = (new AdvancedFilesystemIterator('photos/img/'))->match('/heic|HEIC|jpg|jpeg|JPG|JPEG|webp|WEBP|avif|AVIF$/'); -echo '

' . count($dir) . gettext(' images found in folder') . ' photos/img/ ...

'; +echo '

' . count($dir) . gettext(' images found in folder') . ' photos/img/ ...

'; echo '

' . gettext("Creation of the database") . ' ' . $base . ' ' . gettext("and the table") . ' photo (' . gettext("if necessary") . ')...

'; -// Création de la base et de la table photos -$conn = new PDO("sqlite:db_photo.sqlite3"); -$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); -$query = "CREATE TABLE IF NOT EXISTS photos ( - id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, - filename TEXT NOT NULL, - dateoriginal TEXT, - lens TEXT, - speed TEXT, - iso INTEGER, - width INTEGER, - height INTEGER, - html TEXT, - aperture TEXT, - model TEXT, - lat REAL, - long REAL, - alt REAL, - legende TEXT, - copyright TEXT, - title TEXT, - creator TEXTr, - keywords TEXT, - metering TEXT, - flash TEXT, - focal TEXT, - wb TEXT, - program TEXT, - UNIQUE(filename) - )"; -$conn->exec($query); +try { -echo '

' . gettext('Read image files in the folder') . ' photos/img/...

'; + // Création de la base et de la table photos + $conn = new PDO("sqlite:db_photo.sqlite3"); + $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + $query = "CREATE TABLE IF NOT EXISTS photos ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + filename TEXT NOT NULL, + filesize TEXT, + dateoriginal TEXT, + lens TEXT, + speed TEXT, + correctexpo TEXT, + iso INTEGER, + usercomment TEXT, + comment TEXT, + model TEXT, + metering TEXT, + flash TEXT, + focal TEXT, + program TEXT, + wb TEXT, + mode TEXT, + width INTEGER, + height INTEGER, + html TEXT, + aperture TEXT, + software TEXT, + lat TEXT, + long TEXT, + alt TEXT, + keywords TEXT, + title TEXT, + creator TEXT, + city TEXT, + department TEXT, + code TEXT, + country TEXT, + copyright TEXT, + legende TEXT, + UNIQUE(filename) + )"; + // 33 entrées + + $conn->exec($query); + } + catch(PDOException $e) { + echo $e->getMessage(); + } + +echo '

' . gettext('Read image files in the folder') . ' photos/img/...

'; $i = 1; $photos = array(); @@ -87,26 +106,40 @@ foreach($dir as $file){ */ $file = $file->getpathName(); $x = in_bdd($file); - + + /* + if ($i > 5) { + break; + } + */ + // https://exiftool.org/TagNames/EXIF.html + // https://exiftool.org/TagNames/Canon.html + if ($x == false) { //false if ($exif = @exif_read_data($file, 0, true )) { + + //_pr($exif); + + unset($fla); + unset($flash); + + $fs = isset($exif['FILE']['FileSize']) ? $exif['FILE']['FileSize'] : ''; + $fsize = formatBytes($fs, $precision = 0); - $mod = isset($exif['IFD0']['Model']) ? $exif['IFD0']['Model'] : ''; - # YYYY-MM-DD HH:MM:SS.SSS - 2019:10:01 14:03:12 $da = isset($exif['EXIF']['DateTimeOriginal']) ? $exif['EXIF']['DateTimeOriginal'] : ''; if (isset($exif['EXIF']['DateTimeOriginal'])) { $d = explode(' ', $exif['EXIF']['DateTimeOriginal']); $da = str_replace(':', '-', $d[0]) . " " . $d[1] . ".000"; } else { - $d = ''; + $da = ''; } if (isset($exif['EXIF']['UndefinedTag:0xA434'])) { - $w = $exif['EXIF']['UndefinedTag:0xA434']; + $w = trim($exif['EXIF']['UndefinedTag:0xA434']); - $arr = array("100.0 mm" => "EF100mm f/2.8 Macro USM", "100.0-400.0 mm" => "EF100-400mm f/4.5-5.6L IS USM", "140.0-560.0 mm" => "EF100-400mm f/4.5-5.6L IS USM +1.4x II", "17.0-40.0 mm" => "EF17-40mm f/4L USM", "24-70mm" => "SIGMA 24-70mm F2.8 EX DG", "70.0-200.0 mm" => "EF70-200mm f/4L USM", "10.0-22.0 mm" => "EF-S10-22mm f/3.5-4.5 USM", "500.0 mm" => "Sigma 500mm f/4.5 EX HSM ", "500mm" => "Sigma 500mm f/4.5 EX HSM "); + $arr = array("600" => "EF600mm f/4L IS III USM", "100.0 mm" => "EF100mm f/2.8 Macro USM", "100.0-400.0 mm" => "EF100-400mm f/4.5-5.6L IS USM", "140.0-560.0 mm" => "EF100-400mm f/4.5-5.6L IS USM +1.4x II", "17.0-40.0 mm" => "EF17-40mm f/4L USM", "24-70mm" => "SIGMA 24-70mm F2.8 EX DG", "70.0-200.0 mm" => "EF70-200mm f/4L USM", "10.0-22.0 mm" => "EF-S10-22mm f/3.5-4.5 USM", "500.0 mm" => "SIGMA 500mm f/4.5 EX HSM", "500mm" => "SIGMA 500mm f/4.5 EX HSM"); if (array_key_exists($w, $arr)) $obj= $arr[$w]; else $obj = $w; @@ -122,8 +155,28 @@ foreach($dir as $file){ $sp = ''; } + + $ev = isset($exif['EXIF']['ExposureBiasValue']) ? $exif['EXIF']['ExposureBiasValue'] : ''; + $div = explode( "/", $ev); + $dividende = $div[0]; + $diviseur = $div[1]; + + if (str_starts_with($ev, '0')) { + $ev = '0'; + } + elseif ($dividende === $diviseur) { + $ev = '0'; + } + if ((! str_starts_with($ev, '0')) && (! str_starts_with($ev, '-'))) { + $ev = "+" . $ev; + } + $iso = isset($exif['EXIF']['ISOSpeedRatings']) ? $exif['EXIF']['ISOSpeedRatings'] : ''; - + $uc = isset($exif['COMPUTED']['UserComment']) ? $exif['COMPUTED']['UserComment'] : ''; + $comment = isset($exif['COMMENT']['0']) ? $exif['COMMENT']['0'] : ''; + + $mod = isset($exif['IFD0']['Model']) ? $exif['IFD0']['Model'] : ''; + if (isset($exif['EXIF']['MeteringMode'])) { $mm = $exif['EXIF']['MeteringMode']; @@ -154,29 +207,64 @@ foreach($dir as $file){ $mm = ''; } + // https://stackoverflow.com/questions/7076958/read-exif-and-determine-if-the-flash-has-fired + if (isset($exif['EXIF']['Flash'])) { $fla = $exif['EXIF']['Flash']; - + + $flash = $fla; + //$flashfired = ($fla & 1) != 0; + //echo "flashfired: " . $flashfired . "
"; + + // 12_2018.jpg No Flash 0 + // 5_2013.jpg Off, Did not fire 16 + // folder flash 9 + switch ($fla) { - case 0: $fla = gettext("Off"); + case 0: $fla = gettext("No Flash"); break; - case 1: $fla = gettext("Auto"); + case 9: $fla = gettext("On, Fired"); break; - case 2: $fla = gettext("On"); - break; - case 3: $fla = gettext("Red Eye Reduction"); - break; - case 4: $fla = gettext("Slow Synchro"); - break; - case 5: $fla = gettext("Auto + Red Eye Reduction"); - break; - case 6: $fla = gettext("On + Red Eye Reduction"); - break; - case 16: $fla = gettext("External Flash"); + case 16: $fla = gettext("Off, Did not fire"); break; default: $fla = gettext("Unknown"); } + /* + Exiftool: + [Flash] => On, Fired + [Flash Compensation] => -1 + */ + /* + 0x0 = No Flash + 0x1 = Fired + 0x5 = Fired, Return not detected + 0x7 = Fired, Return detected + 0x8 = On, Did not fire + 0x9 = On, Fired + 0xd = On, Return not detected + 0xf = On, Return detected + 0x10 = Off, Did not fire + 0x14 = Off, Did not fire, Return not detected + 0x18 = Auto, Did not fire + 0x19 = Auto, Fired + 0x1d = Auto, Fired, Return not detected + 0x1f = Auto, Fired, Return detected + 0x20 = No flash function + 0x30 = Off, No flash function + 0x41 = Fired, Red-eye reduction + 0x45 = Fired, Red-eye reduction, Return not detected + 0x47 = Fired, Red-eye reduction, Return detected + 0x49 = On, Red-eye reduction + 0x4d = On, Red-eye reduction, Return not detected + 0x4f = On, Red-eye reduction, Return detected + 0x50 = Off, Red-eye reduction + 0x58 = Auto, Did not fire, Red-eye reduction + 0x59 = Auto, Fired, Red-eye reduction + 0x5d = Auto, Fired, Red-eye reduction, Return not detected + 0x5f = Auto, Fired, Red-eye reduction, Return detected + */ + } else { $fla = ''; } @@ -188,33 +276,34 @@ foreach($dir as $file){ $fl = ''; } - /* - if (isset($exif['EXIF']['ExposureMode'])) { - $em = $exif['EXIF']['ExposureMode']; - echo $em; - $em = hexdec(intel2Moto($exif['EXIF']['ExposureMode'])); - echo $em; - - switch ($em) { - case 0: $em = gettext("EasyShoot"); + if (isset($exif['EXIF']['ExposureProgram'])) { + $ep = $exif['EXIF']['ExposureProgram']; // 0 + + switch ($ep) { + case 0: $ep = gettext("EasyShoot"); break; - case 1: $em = gettext("Program"); + case 1: $ep = gettext("Program"); break; - case 2: $em = gettext("Tv"); + case 2: $ep = gettext("Tv (Shutter speed priority)"); break; - case 3: $em = gettext("Av"); + case 3: $ep = gettext("Av (Aperture-priority)"); break; - case 4: $em = gettext("Manual"); + case 4: $ep = gettext("Manual"); break; - case 5: $em = gettext("Auto-DEP"); + case 5: $ep = gettext("Auto-DEP"); break; - default: $em = gettext("Unknown"); + case 6: $ep = gettext("M-DEP"); + break; + case 7: $ep = gettext("Bulb"); + break; + case 8: $ep = gettext("F (Flexible-priority)"); + break; + default: $ep = gettext("Unknown"); } } else { - $em = ''; + $ep = ''; } - */ if (isset($exif['EXIF']['WhiteBalance'])) { $wb = $exif['EXIF']['WhiteBalance']; @@ -242,13 +331,25 @@ foreach($dir as $file){ break; default: $wb = gettext("Unknown"); } - + } else { $wb = ''; } - if (isset($exif['EXIF']['ExposureProgram'])) { - $ep = $exif['EXIF']['ExposureProgram']; + + if (isset($exif['EXIF']['ExposureMode'])) { + $em = $exif['EXIF']['ExposureMode']; + //$em = hexdec(intel2Moto($exif['EXIF']['ExposureMode'])); + //echo $em; + + switch ($em) { + case 0: $em = gettext("OFF"); + break; + case 1: $em = gettext("ON"); + break; + default: $em = gettext("Unknown"); + } + /* switch ($ep) { case 1: $ep = gettext('Manual'); break; @@ -266,89 +367,160 @@ foreach($dir as $file){ break; case 8: $ep = gettext('Landscape'); break; - default: $ep = gettext('Unknown') . ': ' . $data; + default: $ep = gettext('Unknown') . ': ' . $ep; break; } + */ } else { - $ep = ''; + $em = ''; } $wi = isset($exif['COMPUTED']['Width']) ? $exif['COMPUTED']['Width'] : ''; $he = isset($exif['COMPUTED']['Height']) ? $exif['COMPUTED']['Height'] : ''; $ht = isset($exif['COMPUTED']['html']) ? $exif['COMPUTED']['html'] : ''; $ap = isset($exif['COMPUTED']['ApertureFNumber']) ? $exif['COMPUTED']['ApertureFNumber'] : ''; - + $soft = isset($exif['IFD0']['Software']) ? $exif['IFD0']['Software'] : ''; + $gps = get_gps($exif); - if ($gps['latitude'] != "") { - echo "lat: " . $gps['latitude'] . "
"; - echo "long: " . $gps['longitude'] . "
"; - echo "alt: " . $gps['altitude'] . "
"; - } + + $photos[$i] = array( 'filename' => $file, - + 'filesize' => $fsize, + 'dateoriginal' => $da, 'lens' => $obj, 'speed' => $sp, + 'correctexpo' => $ev, 'iso' => $iso, + 'usercomment' => $uc, + 'comment' => $comment, + 'model' => $mod, + + 'metering' => $mm, + 'flash' => $fla, + 'focal' => $fl, + + 'program' => $ep, + 'wb' => $wb, + 'mode' => $em, + 'width' => $wi, 'height' => $he, 'html' => $ht, 'aperture' => $ap, - - 'model' => $mod, - + 'software' => $soft, + 'lat' => $gps['latitude'], 'long' => $gps['longitude'], 'alt' => $gps['altitude'], - - 'metering' => $mm, - 'flash' => $fla, - 'focal' => $fl, - 'wb' => $wb, - 'program' => $ep - + ); } if ($iptc = @getimagesize($file, $info)) { - //_pr($iptc); + + //zz = iptcparse($info['APP1']); + //_pr(zz); + //$ww = iptcparse($info['8BIM']); + //_pr(ww); + if (isset($info["APP13"])) { $mots = ""; $iptc = iptcparse ($info["APP13"]); - $legende = (isset($iptc["2#120"][0])) ? $iptc["2#120"][0] : ''; - $copyright = (isset($iptc["2#116"][0])) ? $iptc["2#116"][0] : ''; - $title = (isset($iptc["2#105"][0])) ? $iptc["2#105"][0] : ''; - $creator = (isset($iptc["2#080"][0])) ? $iptc["2#080"][0] : ''; - $mots_cles = (isset($iptc["2#025"])) ? $iptc["2#025"] : ''; // array + //_pr($iptc); + /* + '2#005'=>'DocumentTitle', + '2#010'=>'Urgency', + '2#015'=>'Category', + '2#020'=>'Subcategories', + '2#040'=>'SpecialInstructions', + '2#055'=>'CreationDate', 20240619 + '2#080'=>'AuthorByline', + '2#085'=>'AuthorTitle', + '2#090'=>'City', + '2#095'=>'State', + '2#101'=>'Country', + '2#103'=>'OTR', + '2#105'=>'Headline', + '2#110'=>'Source', + '2#115'=>'PhotoSource', + '2#116'=>'Copyright', + '2#120'=>'Caption', + '2#122'=>'CaptionWriter' + + '1#090'=>'CodedCharacterSet' %G + '2#060' 200514+0200 + '2#062' 20240619 + '2#063' 200514+0200 + */ + $mots_cles = (isset($iptc["2#025"])) ? $iptc["2#025"] : ''; // array - ok if (!empty($mots_cles)) { foreach ($mots_cles as $key => $val) { $mots .= strtolower($val) . ","; } $mots = substr($mots, 0, -1); } - - $photos[$i]['legende'] = $legende; + $titre = (isset($iptc["2#005"][0])) ? $iptc["2#005"][0] : ''; // ok + $creator = (isset($iptc["2#080"][0])) ? $iptc["2#080"][0] : ''; //ok + //$AuthorTitle = (isset($iptc["2#085"][0])) ? $iptc["2#085"][0] : ''; + $ville = (isset($iptc["2#090"][0])) ? $iptc["2#090"][0] : ''; //ok + $departement = (isset($iptc["2#095"][0])) ? $iptc["2#095"][0] : ''; //ok + $code = (isset($iptc["2#100"][0])) ? $iptc["2#100"][0] : ''; //ok + $pays = (isset($iptc["2#101"][0])) ? $iptc["2#101"][0] : ''; //ok + //$title = (isset($iptc["2#105"][0])) ? $iptc["2#105"][0] : ''; + $copyright = (isset($iptc["2#116"][0])) ? $iptc["2#116"][0] : ''; //ok + $legende = (isset($iptc["2#120"][0])) ? $iptc["2#120"][0] : ''; //ok + + /* + _pr($mots_cles); // ok + echo $city . "
"; //ok + echo $creator . "
"; // ok + echo $AuthorTitle . "
"; + echo $ville . "
"; //ok + echo $departement . "
"; //ok + echo $code . "
"; + echo $pays . "
"; //ok + echo $title . "
"; //ok + echo $copyright . "
"; + echo $legende . "
"; + */ + + $photos[$i]['keywords'] = $mots; + $photos[$i]['title'] = $titre; + $photos[$i]['creator'] = $creator; + $photos[$i]['city'] = $ville; + $photos[$i]['department'] = $departement; + $photos[$i]['code'] = $code; + $photos[$i]['country'] = $pays; $photos[$i]['copyright'] = $copyright; - $photos[$i]['title'] = $title; - $photos[$i]['creator'] = $creator; - $photos[$i]['mots_cles'] = $mots; + $photos[$i]['legende'] = $legende; } + /* else { - $photos[$i]['legende'] = ''; + $photos[$i]['mots_cles'] = ''; + $photos[$i]['titre'] = ''; + $photos[$i]['creator'] = ''; + $photos[$i]['ville'] = ''; + $photos[$i]['departement'] = ''; + $photos[$i]['code'] = ''; + $photos[$i]['pays'] = ''; $photos[$i]['copyright'] = ''; - $photos[$i]['title'] = ''; - $photos[$i]['creator'] = ''; - $photos[$i]['mots_cles'] = ''; + $photos[$i]['legende'] = ''; } + */ } } $i++; } + +// _pr($photos); + + $z = count($photos); if ($z == 0) { echo '

' . gettext('No new image files to add') . '...

'; @@ -357,6 +529,8 @@ if ($z == 0) { die(); } +//_pr($photos); + $query5 = "SELECT MAX(id) FROM photos"; $stmt = $conn->prepare($query5); $stmt->execute(); @@ -366,7 +540,7 @@ $avant = $resultat['MAX(id)']; $nb_avant = (isset($avant)) ? $avant : 0; -echo '

' . gettext('Creation of thumbnails') . ' ('. $th_w . 'px x ' . $th_h . 'px) ' . gettext('in the folder') . ' photos/thumb/.

'; +echo '

' . gettext('Creation of thumbnails') . ' ('. $th_w . 'px x ' . $th_h . 'px) ' . gettext('in the folder') . ' photos/thumb/.

'; $b = ($z > 1) ? gettext('new images') : gettext('new image'); echo '

' . gettext('Insertion of ') . $z . ' ' . $b . gettext(' in database') . '...

'; @@ -374,69 +548,100 @@ echo '

' . gettext('Insertion of ') . $z . ' ' . $b . gettext(' in database') // Insertion des photos dans la base // Création des vignettes try { - $query2 = "INSERT OR IGNORE INTO photos (filename, dateoriginal, lens, speed, iso, width, height, html, aperture, model, lat, long, alt, legende, copyright, title, creator, keywords, metering, flash, focal, wb, program) VALUES (:filename, :dateoriginal, :lens, :speed, :iso, :width, :height, :html, :aperture, :model, :lat, :long, :alt, :legende, :copyright, :title, :creator, :keywords, :metering, :flash, :focal, :wb, :program)"; + $query2 = "INSERT OR IGNORE INTO photos (filename, filesize, dateoriginal, lens, speed, correctexpo, iso, usercomment, comment, model, metering, flash, focal, program, wb, mode, width, height, html, aperture, software, lat, long, alt, keywords, title, creator, city, department, code, country, copyright, legende) + VALUES (:filename, :filesize, :dateoriginal, :lens, :speed, :correctexpo, :iso, :usercomment, :comment, :model, :metering, :flash, :focal, :program, :wb, :mode, :width, :height, :html, :aperture, :software, :lat, :long, :alt, :keywords, :title, :creator, :city, :department, :code, :country, :copyright, :legende)"; $stmt = $conn->prepare($query2); $stmt->bindParam(':filename', $file); + $stmt->bindParam(':filesize', $fsize); $stmt->bindParam(':dateoriginal', $da); $stmt->bindParam(':lens', $obj); $stmt->bindParam(':speed', $sp); + $stmt->bindParam(':correctexpo', $ev); $stmt->bindParam(':iso', $iso); - $stmt->bindParam(':width', $wi); - $stmt->bindParam(':height', $he); - $stmt->bindParam(':html', $ht); - $stmt->bindParam(':aperture', $ap); + + $stmt->bindParam(':usercomment', $uc); + $stmt->bindParam(':comment', $comment); $stmt->bindParam(':model', $mod); - $stmt->bindParam(':lat', $gps['latitude']); - $stmt->bindParam(':long', $gps['longitude']); - $stmt->bindParam(':alt', $gps['altitude']); - - $stmt->bindParam(':legende', $leg); - $stmt->bindParam(':copyright', $cop); - $stmt->bindParam(':title', $tit); - $stmt->bindParam(':creator', $crea); - $stmt->bindParam(':keywords', $mot); $stmt->bindParam(':metering', $mm); $stmt->bindParam(':flash', $fla); $stmt->bindParam(':focal', $fl); - $stmt->bindParam(':wb', $wb); $stmt->bindParam(':program', $ep); + $stmt->bindParam(':wb', $wb); + $stmt->bindParam(':mode', $em); + + $stmt->bindParam(':width', $wi); + $stmt->bindParam(':height', $he); + $stmt->bindParam(':html', $ht); + $stmt->bindParam(':aperture', $ap); + $stmt->bindParam(':software', $soft); + + $stmt->bindParam(':lat', $gps['latitude']); + $stmt->bindParam(':long', $gps['longitude']); + $stmt->bindParam(':alt', $gps['altitude']); + + $stmt->bindParam(':keywords', $mots); + $stmt->bindParam(':title', $titre); + $stmt->bindParam(':creator', $creator); + $stmt->bindParam(':city', $ville); + $stmt->bindParam(':department', $departement); + $stmt->bindParam(':code',$code); + $stmt->bindParam(':country',$pays); + $stmt->bindParam(':copyright', $copyright); + $stmt->bindParam(':legende', $legende); if (isset($photos)) { + + //_pr($photos); + foreach ($photos as $item) { - $file = $item['filename']; - $da = $item['dateoriginal']; - $obj = $item['lens']; - $sp = $item['speed']; - $iso = $item['iso']; - $wi = $item['width']; - $he = $item['height']; - $ht = $item['html']; - $ap = $item['aperture']; - $mod = $item['model']; - $gps['latitude'] = $item['lat']; - $gps['longitude'] = $item['long']; - $gps['altitude'] = $item['alt']; + $file = $item['filename']; // *** photos/img/3_2023.jpg + $fsize = $item['filesize']; // 232 Ko + $da = $item['dateoriginal']; // *** 2023-03-04 10:05:25.000 + $obj = $item['lens']; // *** EF600mm f/4L IS III USM +1.4x III + $sp = $item['speed']; // *** 1/3200 + $ev = $item['correctexpo']; // -1/3 + $iso = $item['iso']; // *** 800 - $leg = $item['legende']; - $cop = $item['copyright']; - $tit = $item['title']; - $crea = $item['creator']; - $mot = $item['mots_cles']; - - $mm = $item['metering']; - $fla = $item['flash']; - $fl = $item['focal']; - $wb = $item['wb']; - $ep = $item['program']; - + $uc = $item['usercomment']; + $comment = $item['comment']; // Optimized by JPEGmini 3.18.9.220874607-AV 0x21824209 + $mod = $item['model']; // *** Canon EOS R7 + + $mm = $item['metering']; // *** Mesure évaluative + $fla = $item['flash']; // Off + $fl = $item['focal']; // *** 840 mm + $ep = $item['program']; // Av (Priorité ouverture) + $wb = $item['wb']; // *** Lumière du jour + $em = $item['mode']; // OFF + + $wi = $item['width']; // 1600 + $he = $item['height']; // 1067 + $ht = $item['html']; // width="1600" height="1067" + $ap = $item['aperture']; // *** f/6.3 + $soft = $item['software']; // Adobe Photoshop Lightroom Classic 12.2.1 (Macintosh) + + $gps['latitude'] = $item['lat']; // *** 47.169489533333 + $gps['longitude'] = $item['long']; // *** 4.7472749 + $gps['altitude'] = $item['alt']; // *** 492 + + $mots = $item['keywords']; // *** falco peregrinus,falconidés,falconiformes,faucon pèlerin,oiseaux,_vert_,falaise,femelle + $creator = $item['creator']; // Pesenti + $ville = $item['city']; // Antheuil + $departement = $item['department']; // Côte-d'Or + $code = $item['code']; // FR + $pays = $item['country']; // France + $copyright = $item['copyright']; // clicclac.info + $titre = $item['title']; // *** + $legende = $item['legende']; // *** + create_thumb($th_w, $th_h, $file); $stmt->execute(); } } + echo "
"; } catch(PDOException $e) { echo $e->getMessage(); @@ -502,12 +707,12 @@ try { }); - + -

© 2013- sur-le-sentier.fr

+

© 2013- sur-le-sentier.fr

- - + + diff --git a/lc-lightbox/css/fonts/lc_lightbox.eot b/lc-lightbox/css/fonts/lc_lightbox.eot new file mode 100644 index 0000000..b1f2a81 Binary files /dev/null and b/lc-lightbox/css/fonts/lc_lightbox.eot differ diff --git a/lc-lightbox/css/fonts/lc_lightbox.svg b/lc-lightbox/css/fonts/lc_lightbox.svg new file mode 100644 index 0000000..6eb8ae5 --- /dev/null +++ b/lc-lightbox/css/fonts/lc_lightbox.svg @@ -0,0 +1,33 @@ + + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lc-lightbox/css/fonts/lc_lightbox.ttf b/lc-lightbox/css/fonts/lc_lightbox.ttf new file mode 100644 index 0000000..b783f88 Binary files /dev/null and b/lc-lightbox/css/fonts/lc_lightbox.ttf differ diff --git a/lc-lightbox/css/fonts/lc_lightbox.woff b/lc-lightbox/css/fonts/lc_lightbox.woff new file mode 100644 index 0000000..1616bcc Binary files /dev/null and b/lc-lightbox/css/fonts/lc_lightbox.woff differ diff --git a/lc-lightbox/css/lc_lightbox.css b/lc-lightbox/css/lc_lightbox.css new file mode 100644 index 0000000..6ece10b --- /dev/null +++ b/lc-lightbox/css/lc_lightbox.css @@ -0,0 +1,1491 @@ +@font-face { + font-family: 'lc_lightbox'; + src:url('fonts/lc_lightbox.eot'); + src:url('fonts/lc_lightbox.eot') format('embedded-opentype'), + url('fonts/lc_lightbox.woff') format('woff'), + url('fonts/lc_lightbox.ttf') format('truetype'), + url('fonts/lc_lightbox.svg') format('svg'); + font-weight: normal; + font-style: normal; +} + + + +/*------------------------------------------------------------------ +[Table of contents] + +* (1) wrapper / #lcl_wrap + + + (2) lightbox window / #lcl_window + + - (3) loader / #lcl_loader + - (4) commands container / #lcl_nav_cmd + + - single command / .lcl_icon + + - socials tooltip / .lcl_socials_tt + + - (5) contents wrapper / #lcl_contents_wrap + + - shown element wrapper / #lcl_subj + - (6) texts wrapper / #lcl_txt + + - title / #lcl_title + - author / #lcl_author + - description / #lcl_descr + - comments wrapper / .lcl_comments_wrap + + + + (7) thumbnails navigator / #lcl_thumbs_nav + + - thumb image / .lcl_tn_image + + + + lightbox overlay / #lcl_overlay + + (8) progressbar / #lcl_progressbar + +-------------------------------------------------------------------*/ + + + + +/* (1) basic styles */ +#lcl_wrap { + bottom: 0; + left: 0; + position: fixed; + top: 0; + right: 0; + text-align: center; + overflow-x: hidden; + overflow-y: hidden; + z-index: 999999999; + -webkit-overflow-scrolling: touch; +} +#lcl_wrap:before { + content: ""; + display: inline-block; + height: 100%; + vertical-align: middle; +} +#lcl_wrap > * { + text-align: left; + box-sizing: border-box; +} +#lcl_overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + overflow: hidden; + z-index: -1; + background-position: top left; + background-repeat: repeat; + + -webkit-transform: translateZ(0); + transform: translateZ(0); +} +#lcl_wrap:not(.lcl_pre_show) { + -webkit-transition: all .35s ease-in; + transition: all .35s ease-in; +} + + +/* (3) loader */ +#lcl_loader { + display: block; + opacity: 0; + height: 40px; + width: 40px; + position: absolute; + top: 50%; + left: 50%; + margin-left: -20px; + margin-top: -20px; + z-index: -1; + + /* timing overrided by JS */ + -webkit-transition: opacity .3s ease-out; + transition: opacity .3s ease-out; +} +#lcl_loader.lcl_loader_pre_first_el { + opacity: 0 !important; +} +.lcl_first_sizing #lcl_loader:not(.no_loader), +.lcl_loading_iframe #lcl_loader:not(.no_loader), +.lcl_loading_videojs #lcl_loader:not(.no_loader), +.lcl_switching_elem #lcl_loader:not(.no_loader) { + opacity: 1; + z-index: 99999; +} +#lcll_1, #lcll_2 { + box-sizing: border-box; + position: absolute; + width: 100%; + height: 100%; + top: 50%; + left: 50%; + border-radius: 50%; + margin-top: -50%; + margin-left: -50%; + background: transparent; + + border-color: #aaa #aaa transparent; + border-width: 3px; + border-style: solid; + + -webkit-animation: lcl-loader 1.4s infinite linear; + animation: lcl-loader 1.4s infinite linear; +} +#lcll_2 { + width: 50%; + height: 50%; + margin-left: -25%; + margin-top: -25%; + border-right-color: transparent !important; + + -webkit-animation-duration: 1.15s; + animation-duration: 1.15s; + -webkit-animation-direction: reverse; + animation-direction: reverse; +} +@-webkit-keyframes lcl-loader { + 100% {-webkit-transform: rotate(360deg) translateZ(0);} +} +@keyframes lcl-loader { + 100% {transform: rotate(360deg) translateZ(0);} +} + + + +/* (2) window */ +#lcl_subj.lcl_switching_el > * { + opacity: 0; +} +#lcl_contents_wrap { /* timing overrided by JS */ + -webkit-transition: opacity .3s ease; + transition: opacity .3s ease; +} +.lcl_first_sizing #lcl_contents_wrap, +.lcl_loading_iframe #lcl_contents_wrap, +.lcl_loading_videojs #lcl_contents_wrap, +.lcl_switching_elem #lcl_contents_wrap, +.lcl_toggling_fs #lcl_contents_wrap { + opacity: 0 !important; +} +.lcl_first_sizing #lcl_contents_wrap *, +.lcl_loading_iframe #lcl_contents_wrap *, +.lcl_loading_videojs #lcl_contents_wrap *, +.lcl_switching_elem #lcl_contents_wrap *, +.lcl_toggling_fs #lcl_contents_wrap * { + -webkit-transition: none !important; + transition: none !important; +} +#lcl_window { + display: inline-block; + text-align: left; + z-index: 30; + vertical-align: middle; + + width: 100%; + height: 100%; + max-height: 100%; + max-width: 100%; + min-width: 50px; + min-height: 50px; + line-height: 0 !important; + overflow: visible; + position: relative; + top: 0; + left: 0; + + -webkit-transform: translateZ(0); + transform: translateZ(0); +} +.lcl_image_elem, +#lcl_elem_wrap:not(.lcl_image_elem) .lcl_elem { /* timing overrided by JS */ + -webkit-transition: all .3s ease-out; + transition: all .3s ease-out; +} +.lcl_toggling_fs#lcl_wrap, /* fullscreen switch - fast transition */ +.lcl_toggling_fs #lcl_window, +.lcl_toggling_fs .lcl_image_elem, +.lcl_toggling_fs #lcl_elem_wrap .lcl_elem { + -webkit-transition: all .05s linear; + transition: all .05s linear; +} +.lcl_is_resizing:not(.lcl_first_sizing):not(.lcl_toggling_txt):not(.lcl_toggling_tn):not(.lcl_toggling_fs) #lcl_window, +.lcl_is_resizing:not(.lcl_toggling_txt):not(.lcl_toggling_tn) .lcl_image_elem, +.lcl_is_resizing:not(.lcl_toggling_txt):not(.lcl_toggling_tn) #lcl_elem_wrap:not(.lcl_image_elem), +.lcl_show_already_shaped #lcl_window { + -webkit-transition: none !important; + transition: none !important; +} +.lcl_tn_hidden #lcl_window { + margin-top: 0 !important; +} +.lcl_pre_first_el:not(.lcl_show_already_shaped) #lcl_window { + width: 100px; + height: 100px; + max-width: 85px !important; + max-height: 85px !important; +} +.lcl_is_closing #lcl_window { + -webkit-transition-timing-function: ease-in; + transition-timing-function: ease-in; +} + + +/* (5) contents wrap */ +#lcl_contents_wrap, +#lcl_subj { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + overflow: hidden !important; +} +.lcl_on_mobile #lcl_subj { + overflow: auto !important; +} +#lcl_subj { + z-index: 10; +} +#lcl_wrap:not(.lcl_switching_elem) #lcl_subj { + -webkit-transition: border-width .35s ease; + transition: border-width .35s ease; +} + +.lcl_toggling_txt #lcl_subj { + -webkit-transition-delay: .55s !important; /* delay to allow sizing on text hiding */ + transition-delay: .55s !important; +} +#lcl_elem_wrap { + position: relative; + background-repeat: no-repeat; + background-position: center center; + background-size: cover; +} +.lcl_image_elem, +.lcl_html_elem { + position: absolute !important; + top: 0; + left: 0; + right: 0; + bottom: 0; +} +.lcl_image_elem img { + left: -99999px; + position: fixed !important; +} +.lcl_html_elem { + line-height: normal; + padding: 15px; + overflow-y: auto; + background: #fdfdfd; +} +.lcl_fullscreen_mode[lcl-type=iframe] #lcl_subj { + top: 60px; +} + +.lcl_video_elem > *, +.lcl_youtube_elem > *, +.lcl_vimeo_elem > *, +.lcl_dailymotion_elem > *, +.lcl_iframe_elem > *, +.lcl_postered_video > iframe { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +/* video.js customization */ +.lcl_elem.video-js { + bottom: 0; + height: auto; + left: 0; + position: absolute; + right: 0; + top: 0; + width: auto; + background: #000 !important; +} +.lcl_elem.video-js .vjs-fullscreen-control { + display: none !important; +} +.lcl_elem.video-js .vjs-big-play-button { + background-color: rgba(43, 51, 63, 0.7); + border: 2px solid #fff; + border-radius: 50%; + font-size: 40px; + line-height: 62px; + width: 66px; + height: 66px; + left: 50%; + top: 50%; + margin: -33px 0 0 -33px; +} +.lcl_elem.video-js .vjs-poster { + background-size: cover; +} + + +/* video poster */ +.lcl_postered_video { + background-size: cover; + background-position: center; +} +.lcl_postered_video:not(.lcl_poster_clicked) { + cursor: pointer; +} +.lcl_postered_video:not(.lcl_poster_clicked):before { + content: "\f0bf"; + box-sizing: border-box; + font-size: 38px !important; + line-height: 62px !important; + text-indent: 5px !important; + color: #fff; + border-radius: 50%; + position: absolute; + background: rgba(43, 51, 63, 0.7); + + top: 50%; + left: 50%; + width: 66px; + height: 66px; + margin-left: -33px; + margin-top: -33px; + border: 2px solid #fff; + + -webkit-transition: background .03s linear; + transition: background .03s linear; +} +.lcl_postered_video:not(.lcl_poster_clicked):hover:before { + background: rgba(115, 133, 159, .5); +} +.lcl_postered_video:not(.lcl_poster_clicked) iframe { + display: none; +} + + +/* HTML element - special sizing */ +.lcl_html_container { + margin: auto; + overflow: auto; + position: relative; +} +#lcl_wrap[lcl-type="html"]:not(.lcl_fullscreen_mode) .lcl_html_elem { + position: static !important; +} +#lcl_wrap[lcl-type="html"]:not(.lcl_fullscreen_mode) #lcl_contents_wrap, +#lcl_wrap[lcl-type="html"]:not(.lcl_fullscreen_mode) #lcl_subj { + position: relative !important; +} + +#lcl_wrap[lcl-type="html"].lcl_txt_under:not(.lcl_fullscreen_mode) #lcl_txt { + position: relative !important; +} +#lcl_wrap[lcl-type="html"].lcl_txt_under:not(.lcl_forced_over) #lcl_contents_wrap, +#lcl_wrap[lcl-type="html"] #lcl_subj { + overflow: auto; +} +.lcl_fullscreen_mode#lcl_wrap[lcl-type="html"] #lcl_elem_wrap { + display: flex; + -webkit-align-items: center; + align-items: center; +} +.lcl_fullscreen_mode .lcl_html_elem { + padding-top: 18px; + border-top: 42px solid #fdfdfd; + padding-bottom: 0; + border-bottom: 15px solid #fdfdfd; +} + + +/* error message */ +#lcl_inline { + padding: 15px 10px; + line-height: 20px; +} + + + +/* (4) BUTTONS */ +#lcl_nav_cmd { + position: absolute; + top: 0; + z-index: 100; + overflow: visible; + padding: 8px; + height: 0; /* allow contents click */ +} +.lcl_corner_close.lcl_inner_cmd:not(.lcl_txt_rside):not(.lcl_forced_outer_cmd) #lcl_nav_cmd, +.lcl_corner_close.lcl_no_txt:not(.lcl_forced_outer_cmd) #lcl_nav_cmd, +.lcl_corner_close.lcl_hidden_txt:not(.lcl_forced_outer_cmd) #lcl_nav_cmd, +.lcl_corner_close.lcl_force_txt_over:not(.lcl_forced_outer_cmd) #lcl_nav_cmd { + padding-right: 24px !important +} + +.lcl_first_sizing #lcl_nav_cmd, +.lcl_loading_iframe #lcl_nav_cmd, +.lcl_loading_videojs #lcl_nav_cmd, +.lcl_switching_elem #lcl_nav_cmd, +.lcl_toggling_txt.lcl_inner_cmd #lcl_nav_cmd, +.lcl_toggling_fs #lcl_nav_cmd { + opacity: 0 !important; +} + +#lcl_nav_cmd { + right: 0; + left: 0; +} +.lcl_outer_cmd #lcl_nav_cmd { + z-index: 99999; + margin: 0 !important; + padding: 10px 15px; +} +.lcl_outer_cmd:not(.lcl_first_sizing):not(.lcl_first_sizing):not(.lcl_loading_iframe):not(.lcl_switching_elem):not(.lcl_toggling_txt):not(.lcl_toggling_fs):not(.lcl_is_closing) #lcl_nav_cmd { + opacity: 1 !important; +} +.lcl_is_closing.lcl_outer_cmd #lcl_nav_cmd { + -webkit-transition: all .2s ease; + transition: all .2s ease; + + opacity: 0 !important; +} + +#lcl_nav_cmd .lcl_icon { + display: inline-block; + border-radius: 3px; + background: #fefefe; + + box-shadow: 0 0 2px rgb(20, 20, 20, 0.05); + + border: 1px solid #eaeaea; + text-align: center; + vertical-align: top; + margin: 4px; + width: 28px; + height: 28px; + color: #6f6f6f; + position: relative; +} +.lcl_outer_cmd .lcl_close { + right: 0 !important; + top: 0 !important; +} +@media screen and (min-width:450px) { + .lcl_inner_cmd:not(.lcl_on_mobile) #lcl_nav_cmd .lcl_icon, + .lcl_fullscreen_mode.lcl_outer_cmd:not(.lcl_on_mobile):not([lcl-type=iframe]):not([lcl-type=html]) #lcl_nav_cmd .lcl_icon { + opacity: 0; + -webkit-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + + -webkit-transition: opacity .2s ease-in .5s, box-shadow .2s ease-in .5s, -webkit-transform .2s ease-in .5s; + transition: opacity .2s ease-in .5s, box-shadow .2s ease-in .5s, transform .2s ease-in .5s; + } + #lcl_window:not(.lcl_on_mobile):hover #lcl_nav_cmd .lcl_icon, + .lcl_fullscreen_mode.lcl_outer_cmd:not(.lcl_on_mobile):not([lcl-type=iframe]):not([lcl-type=html]):hover #lcl_nav_cmd .lcl_icon { + opacity: 1; + + -webkit-transition: all .2s ease-in 0s; + transition: all .2s ease-in 0s; + + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} + +.lcl_icon:before, +.lcl_tn_prev:before, +.lcl_tn_next:before, +#lcl_corner_close:before, +.lcl_postered_video:not(.lcl_poster_clicked):before { + font-family: 'lc_lightbox' !important; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + text-align: center; + display: block; + font-size: 16px; + line-height: 27px; + z-index: 10; + position: relative; + + -webkit-transition: all .15s ease; + transition: all .15s ease; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.lcl_icon:not(.lcl_counter):after { + content: ""; + display: block; + left: -1px; + right: -1px; + position: absolute; + top: -1px; + bottom: -1px; + z-index: 5; + border-radius: 3px; + opcity: 0; + background: #6f6f6f; + + -webkit-transition: all .2s ease; + transition: all .2s ease; + + -webkit-transform: scale(0); + transform: scale(0); +} +.lcl_nav_btn_middle .lcl_next:after, +.lcl_nav_btn_middle .lcl_prev:after { + -webkit-transition-duration: .15s; + transition-duration: .15s; +} +.lcl_nav_btn_middle.lcl_inner_cmd .lcl_next:after { + right: 0 !important; +} +.lcl_nav_btn_middle.lcl_inner_cmd .lcl_prev:after { + left: 0 !important; +} +#lcl_wrap:not(.lcl_on_mobile) .lcl_icon:not(.lcl_counter):not(.lcl_zoom_disabled):not(a):hover { + border-radius: 5px !important; +} +#lcl_wrap:not(.lcl_on_mobile) .lcl_icon:not(.lcl_counter):not(.lcl_zoom_disabled):not(a):hover:before, +#lcl_corner_close:before { + color: #fff; +} +#lcl_wrap:not(.lcl_on_mobile) .lcl_icon:not(.lcl_counter):not(.lcl_zoom_disabled):not(a):hover:after { + opacity: 1; + + -webkit-transform: scale(1); + transform: scale(1); +} + + +.lcl_prev:before {content: "\f053"; text-indent: -1px;} +.lcl_next:before {content: "\f054"; text-indent: 1px;} +.lcl_play:before {content: "\f0bf"; font-size: 20px; line-height: 28px; text-indent: 1px;} +.lcl_is_playing .lcl_play:before {content: "\f0bb"; font-size: 20px; line-height: 28px; text-indent: 0;} + +.lcl_close:before, #lcl_corner_close:before {content: "\e901"; font-size: 20px; line-height: 28px;} +.lcl_fullscreen:before {content: "\f065";} +.lcl_fullscreen_mode .lcl_fullscreen:before {content: "\e900";} +.lcl_zoom_out:before {content: "\e909"; font-size:16px;} +.lcl_zoom_in:before {content: "\e908"; font-size:16px;} +.lcl_txt_toggle:before {content: "\f10e"; font-size: 16px;} +.lcl_thumbs_toggle:before {content: "\e902"; font-size: 15px; line-height: 26px; text-indent: -1px;} + +.lcl_window:before {content: "\e900";} +.lcl_download:before {content: "\e9c5";} +.lcl_socials:before {content: "\e600"; font-size: 15px; line-height: 26px;} + +.lcl_fb:before {content: "\f09a"; font-size: 17px;} +.lcl_pint:before {content: "\f0d2"; font-size: 18px;} +.lcl_wa:before {content: "\f232"; font-size: 18px;} + +.lcl_twit:before { + content: "x"; + background-color: #fafafa; + -webkit-mask-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MTIgNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuNC4yIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIzIEZvbnRpY29ucywgSW5jLiAtLT48cGF0aCBkPSJNMzg5LjIgNDhoNzAuNkwzMDUuNiAyMjQuMiA0ODcgNDY0SDM0NUwyMzMuNyAzMTguNiAxMDYuNSA0NjRIMzUuOEwyMDAuNyAyNzUuNSAyNi44IDQ4SDE3Mi40TDI3Mi45IDE4MC45IDM4OS4yIDQ4ek0zNjQuNCA0MjEuOGgzOS4xTDE1MS4xIDg4aC00MkwzNjQuNCA0MjEuOHoiLz48L3N2Zz4="); + mask-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MTIgNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuNC4yIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIzIEZvbnRpY29ucywgSW5jLiAtLT48cGF0aCBkPSJNMzg5LjIgNDhoNzAuNkwzMDUuNiAyMjQuMiA0ODcgNDY0SDM0NUwyMzMuNyAzMTguNiAxMDYuNSA0NjRIMzUuOEwyMDAuNyAyNzUuNSAyNi44IDQ4SDE3Mi40TDI3Mi45IDE4MC45IDM4OS4yIDQ4ek0zNjQuNCA0MjEuOGgzOS4xTDE1MS4xIDg4aC00MkwzNjQuNCA0MjEuOHoiLz48L3N2Zz4="); + font-size: 18px; + text-indent: -99999px; + mask-repeat: no-repeat; + -webkit-mask-repeat: no-repeat; + mask-position: center; + -webkit-mask-position: center; +} + + +.lcl_tn_prev:before {content: "\f137";} +.lcl_tn_next:before {content: "\f138";} + +.lcl_right_icon { + float: right; +} +.lcl_close { + margin-left: 36px !important; +} + + +.lcl_counter { + cursor: default !important; + font-size: 12px; + font-weight: bold; + line-height: 27px; + padding: 0 10px; + width: auto !important; +} +@media screen and (max-width:340px) { + .lcl_counter { + display: none !important; + } +} +.lcl_download { + position: relative; +} +.lcl_download a { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 50; +} +.lcl_first_elem:not(.lcl_on_mobile) #lcl_window:hover .lcl_prev { + opacity: 0.5 !important; + cursor: default !important; +} +.lcl_last_elem:not(.lcl_on_mobile) #lcl_window:hover .lcl_next { + opacity: 0.5 !important; + cursor: default !important; +} +.lcl_last_elem .lcl_play { + display: none !important; +} +#lcl_thumb_prev div:before, +#lcl_thumb_next div:before { + font-size: 20px; +} +.lcl_icon { + cursor: pointer; + display: inline-block; + height: 24px; + width: 24px; + border-radius: 2px; + box-sizing: content-box !important; + + -webkit-transition: all .2s linear; + transition: all .2s linear; +} + + +/* button status */ +.lcl_no_carousel[lc-lelem="0"] .lcl_prev:before, +.lcl_no_carousel.lcl_last_elem .lcl_next:before, +.lcl_hidden_txt .lcl_txt_toggle:before, +.lcl_tn_hidden .lcl_thumbs_toggle:before, +.lcl_zoom_icon.lcl_zoom_disabled:before { + opacity: .6 !important; +} +.lcl_no_carousel[lc-lelem="0"] .lcl_prev, +.lcl_no_carousel.lcl_last_elem .lcl_next { + cursor: default !important; +} +.lcl_no_carousel[lc-lelem="0"] .lcl_prev:after, +.lcl_no_carousel.lcl_last_elem .lcl_next:after { + display: none !important; +} + + +/* alternative inner close button */ +#lcl_corner_close { + position: absolute; + right: -22px; /* pos overwritten by JS */ + top: -24px; + border: 3px solid #d3d3d3; + background: #6f6f6f; + box-sizing: content-box !important; + border-radius: 50%; + min-height: 34px; + min-width: 34px; + cursor: pointer; + z-index: 150; + + -webkit-transition: opacity .3s ease; + transition: opacity .3s ease; +} +.lcl_first_sizing #lcl_corner_close, +.lcl_loading_iframe #lcl_corner_close, +.lcl_loading_videojs #lcl_corner_close, +.lcl_switching_elem #lcl_corner_close, +.lcl_toggling_fs #lcl_corner_close { + opacity: 0 !important; +} +#lcl_corner_close:before { + font-size: 20px !important; + line-height: 34px !important; + + -webkit-transition: all .3s ease; + transition: all .3s ease; +} +#lcl_corner_close:not(.lcl_on_mobile):hover:before { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); +} +.lcl_normal_close #lcl_corner_close, +.lcl_outer_cmd #lcl_corner_close, +.lcl_corner_close.lcl_inner_cmd .lcl_close { + display: none !important; +} + + +/* nav arrows in middle position */ +.lcl_nav_btn_middle .lcl_prev, +.lcl_nav_btn_middle .lcl_next { + position: fixed !important; + top: 50%; + margin-top: -32px !important; + padding: 16px 4px; +} +.lcl_nav_btn_middle.lcl_inner_cmd:not(.lcl_fullscreen_mode) .lcl_prev, +.lcl_nav_btn_middle.lcl_inner_cmd:not(.lcl_fullscreen_mode) .lcl_next { + box-shadow: none !important; + border: none !important; +} +.lcl_nav_btn_middle .lcl_prev:before, +.lcl_nav_btn_middle .lcl_next:before { + font-size: 23px !important; +} +.lcl_nav_btn_middle .lcl_prev { + left: 0px; +} +.lcl_nav_btn_middle.lcl_inner_cmd .lcl_prev { + border-top-left-radius: 0 !important; + border-bottom-left-radius: 0 !important; +} +.lcl_nav_btn_middle .lcl_next { + right: 0px; +} +.lcl_nav_btn_middle.lcl_inner_cmd .lcl_next { + border-top-right-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} +.lcl_nav_btn_middle.lcl_outer_cmd .lcl_prev { + margin-left: 19px !important; +} +.lcl_nav_btn_middle.lcl_outer_cmd .lcl_next { + margin-right: 19px !important; +} +.lcl_nav_btn_middle.lcl_inner_cmd:not(.lcl_fullscreen_mode) .lcl_prev:after { + border-top-left-radius: 0 !important; + border-bottom-left-radius: 0 !important; +} +.lcl_nav_btn_middle.lcl_inner_cmd:not(.lcl_fullscreen_mode) .lcl_next:after { + border-top-right-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} + +/* manage btn margins on mobile screens*/ +@media screen and (max-width:450px) { + #lcl_nav_cmd .lcl_icon { + margin: 0; + } + .lcl_close { + margin-left: 26px !important; + } +} + + +/* IMAGE ZOOM */ +.lcl_on_mobile .lcl_zoom_wrap { + overflow: scroll !important; +} +.lcl_zoom_wrap, +.lcl_zoom_wrap * { + cursor: move; /* fallback if grab cursor is unsupported */ + cursor: grab; + cursor: -webkit-grab; + + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.lcl_zoom_wrap:active { + cursor: move; /* fallback if grab cursor is unsupported */ + cursor: grabbing; + cursor: -webkit-grabbing; +} +.lcl_zoom_icon.lcl_zoom_disabled { + cursor: default !important; +} +.lcl_zoom_icon.lcl_zoom_disabled:after { + display: none !important; +} +.lcl_zoom_helper { + position: absolute; + font-size: 8.4px; + color: rgb(250,250,250); + background: #972626; + display: inline-block; + border: 2px solid #972626; + padding: 5px 1px; + font-family: arial; + text-shadow: 0 0 0 rgba(250,250,250, 0.8); + letter-spacing: 0.28px; + border-radius: 1px; + line-height: 0; + z-index: 10; + bottom: -11px; + right: -7px; + + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + + + +/* (6) TEXTS */ +#lcl_txt { + padding: 12px 10px; + line-height: 20px; + z-index: 50; + position: absolute; + overflow: hidden; + box-sizing: border-box; +} +.lcl_toggling_txt #lcl_txt { + -webkit-transition: -webkit-transform .45s ease .1s, opacity .35s ease .1s; + transition: transform .45s ease .1s, opacity .35s ease .1s; +} +#lcl_txt * { + font-family: 'Arial',​ 'sans-serif'; +} +.lcl_no_txt #lcl_txt { + display: none !important; +} +#lcl_txt > * { + padding: 0; + margin: 0; + text-align: left; + position: relative; + + overflow-wrap: break-word; + word-wrap: break-word; + -webkit-hyphens: auto; + -ms-hyphens: auto; + -moz-hyphens: auto; + hyphens: auto; +} +#lcl_title { + font-size: 17px; + font-weight: bold; + line-height: normal; + margin-bottom: 4px; +} +#lcl_author { + font-size: 12px; + line-height: 15px; + font-weight: normal; +} +.lcl_comments_wrap { + min-width: 178px; +} +.lcl_txt_rside:not(.lcl_force_txt_over) #lcl_txt .lcl_txt_border, +.lcl_txt_lside:not(.lcl_force_txt_over) #lcl_txt .lcl_txt_border { + border-bottom: 1px dashed #cfcfcf; + margin-bottom: 12px; + padding-bottom: 17px; +} +.lcl_txt_under #lcl_txt .lcl_txt_border, +.lcl_txt_over #lcl_txt .lcl_txt_border, +.lcl_force_txt_over #lcl_txt .lcl_txt_border { + border-bottom: 1px dashed #cfcfcf; + margin-bottom: 10px; + padding-bottom: 12px; +} +#lcl_descr { + font-size: 14px; + line-height: 20px; +} +.lcl_switching_el #lcl_txt, +.lcl_txt_under_calc #lcl_txt, .lcl_txt_under_calc #lcl_txt *, +.lcl_txt_under.lcl_is_resizing:not(.lcl_force_txt_over) #lcl_txt { + -webkit-transition-duration: 0ms !important; + transition-duration: 0ms !important; +} + + +/* text under/over element */ +.lcl_txt_under #lcl_txt, +.lcl_txt_over #lcl_txt { + left: 0; + bottom: 0; +} + +/* text under */ +.lcl_txt_under #lcl_txt { + background: #fff; +} +.lcl_txt_under:not(.lcl_force_txt_over) #lcl_txt { + padding: 18px 25px 22px; + margin-bottom: 0 !important; +} +.lcl_txt_under.lcl_is_resizing:not(.lcl_force_txt_over) #lcl_txt, +.lcl_txt_under.lcl_toggling_txt:not(.lcl_force_txt_over) #lcl_txt { + opacity: 0 !important; +} +.lcl_txt_under.lcl_hidden_txt.lcl_toggling_txt:not(.lcl_force_txt_over) #lcl_txt { + visibility: hidden !important; +} +.lcl_txt_under:not(.lcl_force_txt_over) #lcl_txt:after { + height: 7px; + left: 0; + position: absolute; + right: 0; + top: 0; +} + +/* text over */ +.lcl_force_txt_over #lcl_txt, +.lcl_txt_over #lcl_txt { + background: rgba(255, 255, 255, 0.9); + background-clip: padding-box !important; + border: 15px solid transparent; + border-radius: 0 17px 17px 0; + max-height: calc(100% - 42px); + padding: 13px 22px; + overflow: auto; + bottom: 0; +} +.lcl_fullscreen_mode.lcl_force_txt_over #lcl_txt, +.lcl_fullscreen_mode.lcl_txt_over #lcl_txt { + bottom: auto !important; + right: auto !important; + left: 0 !important; + top: 42px !important; + padding: 17px 22px !important; + max-width: 33.3%; + max-height: calc(100% - 42px); + + -webkit-transition: -webkit-transform .45s ease .1s, opacity .35s ease .1s, bottom .3s ease; + transition: transform .45s ease .1s, opacity .35s ease .1s, bottom .3s ease; +} +.lcl_playing_video.lcl_txt_over #lcl_txt, +.lcl_playing_video.lcl_force_txt_over #lcl_txt { + max-height: calc(100% - 42px - 45px); /* top = 42 + bottom = 45 */ + bottom: 45px; +} +@media screen and (max-width:1024px) { + .lcl_fullscreen_mode.lcl_force_txt_over #lcl_txt, + .lcl_fullscreen_mode.lcl_txt_over #lcl_txt { + max-width: 66.6%; + } +} +@media screen and (max-width:780px) { + .lcl_fullscreen_mode.lcl_force_txt_over #lcl_txt, + .lcl_fullscreen_mode.lcl_txt_over #lcl_txt { + max-width: 100%; + } +} + + + +/* text on sides */ +.lcl_txt_rside:not(.lcl_force_txt_over) #lcl_txt, +.lcl_txt_lside:not(.lcl_force_txt_over) #lcl_txt { + padding: 16px 24px; + top: 0; + bottom: 0; + width: 330px; + overflow-y: auto; + overflow-x: hidden; +} +.lcl_txt_rside:not(.lcl_force_txt_over) #lcl_txt:after, +.lcl_txt_lside:not(.lcl_force_txt_over) #lcl_txt:after { + bottom: 0; + position: absolute; + top: 0; + width: 4px; +} +.lcl_txt_lside:not(.lcl_force_txt_over) #lcl_txt { + padding-left: 18px; +} +.lcl_txt_rside:not(.lcl_force_txt_over) #lcl_txt { + padding-right: 18px; +} + + + +/* text on right side */ +.lcl_txt_rside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_subj { + border-right: 330px solid transparent; +} +.lcl_txt_rside.lcl_inner_cmd:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_nav_cmd, +.lcl_nav_btn_middle.lcl_txt_rside.lcl_inner_cmd:not(.lcl_no_txt):not(.lcl_force_txt_over) .lcl_next, .lcl_fullscreen_mode.lcl_nav_btn_middle.lcl_txt_rside:not(.lcl_no_txt):not(.lcl_force_txt_over) .lcl_next, +.lcl_fullscreen_mode.lcl_txt_rside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_thumbs_nav, .lcl_fullscreen_mode.lcl_txt_rside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_nav_cmd { + right: 330px; +} +.lcl_txt_rside:not(.lcl_force_txt_over) #lcl_txt { + right: 0; + background: #fefefe; +} + + + +/* text on left side */ +.lcl_txt_lside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_subj { + border-left: 330px solid transparent; +} +.lcl_txt_lside.lcl_inner_cmd:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_nav_cmd, +.lcl_nav_btn_middle.lcl_txt_lside.lcl_inner_cmd:not(.lcl_no_txt):not(.lcl_force_txt_over) .lcl_prev, .lcl_fullscreen_mode.lcl_nav_btn_middle.lcl_txt_lside:not(.lcl_no_txt):not(.lcl_force_txt_over) .lcl_prev, +.lcl_fullscreen_mode.lcl_txt_lside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_thumbs_nav, .lcl_fullscreen_mode.lcl_txt_lside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_nav_cmd { + left: 330px; +} +.lcl_txt_lside:not(.lcl_force_txt_over) #lcl_txt { + left: 0; + background: #fefefe; +} + + + +/* text on side on small screens */ +@media screen and (max-width:780px) { + .lcl_txt_rside:not(.lcl_force_txt_over) #lcl_txt, + .lcl_txt_lside:not(.lcl_force_txt_over) #lcl_txt { + width: 220px; + } + + .lcl_txt_rside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_subj { + border-right-width: 220px; + } + .lcl_txt_lside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_subj { + border-left-width: 220px; + } + + .lcl_txt_rside.lcl_inner_cmd:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_nav_cmd, + .lcl_nav_btn_middle.lcl_txt_rside.lcl_inner_cmd:not(.lcl_no_txt):not(.lcl_force_txt_over) .lcl_next, .lcl_fullscreen_mode.lcl_nav_btn_middle.lcl_txt_rside:not(.lcl_no_txt):not(.lcl_force_txt_over) .lcl_next, + .lcl_fullscreen_mode.lcl_txt_rside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_thumbs_nav, .lcl_fullscreen_mode.lcl_txt_rside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_nav_cmd { + right: 220px; + } + .lcl_txt_lside.lcl_inner_cmd:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_nav_cmd, + .lcl_nav_btn_middle .lcl_txt_lside.lcl_inner_cmd:not(.lcl_no_txt):not(.lcl_force_txt_over) .lcl_prev, .lcl_fullscreen_mode.lcl_nav_btn_middle.lcl_txt_lside:not(.lcl_no_txt):not(.lcl_force_txt_over) .lcl_prev, + .lcl_fullscreen_mode.lcl_txt_lside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_thumbs_nav, .lcl_fullscreen_mode.lcl_txt_lside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_nav_cmd { + left: 220px; + } +} + +/* text on side on large screens + fullscreen */ +@media screen and (min-width:1700px) { + .lcl_fullscreen_mode.lcl_txt_rside:not(.lcl_force_txt_over) #lcl_txt, + .lcl_fullscreen_mode.lcl_txt_lside:not(.lcl_force_txt_over) #lcl_txt { + width: 400px; + } + + .lcl_fullscreen_mode.lcl_txt_rside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_subj { + border-right-width: 400px; + } + .lcl_fullscreen_mode.lcl_txt_lside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_subj { + border-left-width: 400px; + } + + .lcl_fullscreen_mode.lcl_nav_btn_middle.lcl_txt_rside:not(.lcl_no_txt):not(.lcl_force_txt_over) .lcl_next, + .lcl_fullscreen_mode.lcl_txt_rside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_thumbs_nav, + .lcl_fullscreen_mode.lcl_txt_rside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_nav_cmd { + right: 400px; + } + .lcl_fullscreen_mode.lcl_nav_btn_middle.lcl_txt_lside:not(.lcl_no_txt):not(.lcl_force_txt_over) .lcl_prev, + .lcl_fullscreen_mode.lcl_txt_lside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_thumbs_nav, + .lcl_fullscreen_mode.lcl_txt_lside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_nav_cmd { + left: 400px; + } +} + + +/* hidden side text - force sizes */ +.lcl_hidden_txt.lcl_inner_cmd #lcl_nav_cmd, +.lcl_hidden_txt.lcl_outer_cmd #lcl_nav_cmd, +.lcl_fullscreen_mode.lcl_hidden_txt #lcl_thumbs_nav { + right: 0 !important; + left: 0 !important; +} +.lcl_nav_btn_middle.lcl_hidden_txt.lcl_inner_cmd .lcl_prev, +.lcl_nav_btn_middle.lcl_hidden_txt.lcl_outer_cmd .lcl_prev { + left: 0px !important; +} +.lcl_nav_btn_middle.lcl_hidden_txt.lcl_inner_cmd .lcl_next, + +.lcl_nav_btn_middle.lcl_hidden_txt.lcl_outer_cmd .lcl_next { + right: 0px !important; +} + + + +/* sub-texts */ +#lcl_txt > *:first-child { + padding-top: 0; + margin-top: 0; +} +#lcl_txt > *:last-child { + padding-bottom: 0; + margin-bottom: 0; +} + + +/* hide texts */ +.lcl_hidden_txt.lcl_txt_under:not(.lcl_force_txt_over) #lcl_txt { + height: 0 !important; + padding: 0 !important; + + -webkit-transform: translateY(100%); + -ms-transform: translateY(100%); + transform: translateY(100%); +} +.lcl_hidden_txt:not(.lcl_fullscreen_mode).lcl_txt_over #lcl_txt, +.lcl_hidden_txt:not(.lcl_fullscreen_mode).lcl_force_txt_over #lcl_txt { + opacity: 0 !important; + z-index: -1; + + -webkit-transform: translateY(30px) scale(.95); + -ms-transform: translateY(30px) scale(.95); + transform: translateY(30px) scale(.95); +} +.lcl_hidden_txt.lcl_fullscreen_mode.lcl_txt_over #lcl_txt, +.lcl_hidden_txt.lcl_fullscreen_mode.lcl_force_txt_over #lcl_txt { + -webkit-transform: translateX(-110%) scale(.8); + -ms-transform: translateX(-110%) scale(.8); + transform: translateX(-110%) scale(.8); +} + +.lcl_hidden_txt.lcl_txt_rside:not(.lcl_force_txt_over) #lcl_subj, +.lcl_hidden_txt.lcl_txt_lside:not(.lcl_force_txt_over) #lcl_subj { + border-width: 0 !important; +} +.lcl_hidden_txt.lcl_txt_rside:not(.lcl_force_txt_over) #lcl_txt { + -webkit-transform: translateX(100%); + -ms-transform: translateX(100%); + transform: translateX(100%); +} +.lcl_hidden_txt.lcl_txt_lside:not(.lcl_force_txt_over) #lcl_txt { + -webkit-transform: translateX(-100%); + -ms-transform: translateX(-100%); + transform: translateX(-100%); +} + + + + +/* TOOLTIP */ +.lcl_tooltip { + position: absolute; + left: 50%; + background: #fff; + padding: 7px; + border-radius: 3px; + box-shadow: 0 0 6px 1px rgba(0, 0, 0, 0.15); + opacity: 0; + font-size: 14px; + + -webkit-transition: all .25s ease-out; + transition: all .25s ease-out; +} +.lcl_tooltip:before { + content: ""; + border-style: solid; + border-width: 7px; + left: 50%; + margin-left: -7px; + position: absolute; +} +.lcl_tooltip.lcl_tt_bottom:before { + bottom: 100%; + border-color: transparent transparent #fff; +} +.lcl_tooltip.lcl_tt_top:before { + top: 100%; + border-color: #fff transparent transparent; +} +.lcl_tooltip.lcl_tt_bottom { + top: 115%; + + -webkit-transform: translate(-50%, 8px); + -ms-transform: translate(-50%, 8px); + transform: translate(-50%, 8px); +} +.lcl_tooltip.lcl_tt_top { + bottom: 115%; + + -webkit-transform: translate(-50%, -8px); + -ms-transform: translate(-50%, -8px); + transform: translate(-50%, -8px); +} +.lcl_tooltip.lcl_show_tt { + opacity: 1; + + -webkit-transform: translate(-50%, 0); + -ms-transform: translate(-50%, 0); + transform: translate(-50%, 0); +} + + + +/* SOCIALS VISIBILITY */ +.lcl_tooltip.lcl_socials_tt { + white-space: nowrap; + padding-left: 0; + padding-right: 0; + top: 150%; +} +.lcl_socials { + position: relative; +} +#lcl_wrap[lcl-type=html] .lcl_socials, +#lcl_wrap[lcl-type=iframe] .lcl_socials { + display: none !important; +} +.lcl_socials_tt a { + border-width: 0 0 0 1px !important; + border-style: solid; + border-color: #eaeaea; + border-radius: 0 !important; + box-shadow: none !important; + padding: 0px 12px; + text-decoration: none !important; + margin: 0 !important; + max-width: 17px; +} +.lcl_socials_tt a:first-child { + border: none !important; +} + + + +/* FULLSCREEN MODE */ +#lcl_wrap.lcl_fullscreen_mode { + padding: 0 !important; +} +.lcl_fullscreen_mode #lcl_window, +.lcl_fullscreen_mode #lcl_contents_wrap { + border-radius: 0 !important; + +} +.lcl_fullscreen_mode #lcl_window { + border-width: 0 !important; + margin-top: 0 !important; +} +.lcl_fullscreen_mode #lcl_subj, +.lcl_fullscreen_mode #lcl_txt { + margin: 0 !important; +} +.lcl_fullscreen_mode #lcl_elem_wrap { + bottom: 0 !important; +} + +.lcl_fullscreen_mode.lcl_toggling_txt.lcl_outer_cmd, +.lcl_fullscreen_mode.lcl_toggling_txt.lcl_nav_btn_middle .lcl_prev, +.lcl_fullscreen_mode.lcl_toggling_txt.lcl_nav_btn_middle .lcl_next { + -webkit-transition: all .4s ease .2s !important; + transition: all .4s ease .2s !important; +} + + + +/* (7) THUMBS NAVIGATOR */ +#lcl_thumbs_nav { + margin: 10px 20px; + position: fixed; + bottom: 0; + left: 0; + right:0; + box-sizing: content-box !important; + z-index: 60; + + -webkit-transition: -webkit-transform .35s ease-in, opacity .5s ease, margin .35s ease, left .4s ease .2s, right .4s ease .2s; + transition: transform .35s ease-in, opacity .5s ease, margin .35s ease, left .4s ease .2s, right .4s ease .2s; +} +#lcl_thumbs_nav, #lcl_thumbs_nav * { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.lcl_playing_video.lcl_fullscreen_mode #lcl_thumbs_nav { + margin-bottom: 50px; +} +.lcl_tn_hidden #lcl_thumbs_nav, +.lcl_pre_first_el #lcl_thumbs_nav, +#lcl_thumbs_nav.lcl_pre_tn_scroll { + opacity: 0; + + -webkit-transform: translateY(150%); + -ms-transform: translateY(150%); + transform: translateY(150%); +} + +#lcl_thumbs_nav .lcl_tn_inner { + position: absolute; + z-index: 10; + left: 45px; + right: 45px; + bottom: 0; + top: 0; + list-style: none !important; + margin: 0 !important; + text-align: center; + white-space: nowrap; + overflow: hidden !important; +} +.lcl_on_mobile .lcl_tn_inner { + overflow: auto !important; + touch-action: pan-x; +} +.lcl_tn_inner li { + height: 100%; + margin: 0 0 0 10px; + display: inline-block; + border: 0px solid #ccc; + border-radius: 2px; + position: relative; + background-repeat: no-repeat; + background-position: center center; + background-size: cover; + background-clip: content-box; + background-color: #9f9f9f; + cursor: pointer; + overflow: hidden; + box-shadow: 0 0 4px rgba(10, 10, 10, 0.45); + + -webkit-transform: scale(0.83) translateZ(0); + -ms-transform: scale(0.83) translateZ(0); + transform: scale(0.83) translateZ(0); + + -webkit-transition: all .25s ease; + transition: all .25s ease; +} +.lcl_tn_inner li:first-child { + margin: 0; +} +.lcl_tn_inner li.lcl_sel_thumb, +#lcl_wrap:not(.lcl_on_mobile) .lcl_tn_inner li:not(.lcl_sel_thumb):hover { + -webkit-transform: scale(.97); + -ms-transform: scale(.97); + transform: scale(.97); +} +.lcl_tn_inner li.lcl_tn_preload, +.lcl_tn_inner li.lcl_sel_thumb.lcl_tn_preload { + margin: 0 !important; + width: 0 !important; + height: 0 !important; + + -webkit-transform: scale(0) !important; + -ms-transform: scale(0) !important; + transform: scale(0) !important; +} +.lcl_thumb_title_tt { + padding: 7px 10px; +} +#lcl_thumbs_nav span { + position: absolute; + cursor: pointer; + width: 23px; + height: 23px; + top: 50%; + margin-top: -12px; + z-index: 15; + color: #f5f5f5; +} +#lcl_thumbs_nav:not(.lcl_tn_has_arr) span { + display: none !important; +} +#lcl_thumbs_nav.lcl_tn_has_arr span { + display: inline-block !important; +} +#lcl_thumbs_nav.lcl_tn_has_arr span:before { + font-size: 23px; +} +#lcl_thumbs_nav span.lcl_tn_prev { + left: 0; +} +#lcl_thumbs_nav span.lcl_tn_next { + right: 0; +} + +.lcl_tn_video video { + position: absolute; + top: -15%; + left: -15%; + width: 130%; + height: 130%; +} + +.lcl_tn_mixed_types li::before { + background: rgba(0, 0, 0, 0.25); + content: ""; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; + z-index: 10; + + -webkit-transition: all .25s ease; + transition: all .25s ease; +} +.lcl_tn_mixed_types li.lcl_sel_thumb::before { + opacity: 0; +} +.lcl_tn_mixed_types li:after { + font-family: 'lc_lightbox' !important; + bottom: 0; + color: #fff; + font-size: 18px; + line-height: 28px; + position: absolute; + right: 5px; + position: absolute; + text-shadow: 0 0 3px rgba(0, 0, 0, 0.7); + z-index: 15; + content: "\e929"; /* video - by default */ +} +.lcl_tn_mixed_types li.lcl_tn_image:after {content: "\e927";} +.lcl_tn_mixed_types li.lcl_tn_iframe:after {content: "\e903";} +.lcl_tn_mixed_types li.lcl_tn_html:after {content: "\e926";} + + +/* (8) PROGRESSBAR */ +#lcl_progressbar { + position: fixed; + z-index: 99999; + top: 0; + height: 2px; + left: 0; + width: 0; + background: #fff; + box-shadow: 0px 2px 2px 0 rgba(0, 0, 0, 0.4); + + -webkit-transition: opacity .6s ease; + transition: opacity .6s ease; +} +.lcl_loading_videojs #lcl_progressbar, +.lcl_loading_iframe #lcl_progressbar { + opacity: 0; !important; + + -webkit-transition-duration: 0s; + transition-duration: 0s; +} + + + + +/* OVERLAY PATTERNS */ +.lcl_pattern_oblique_dots { background-image: url(../img/patterns/oblique_dots.png); } +.lcl_pattern_1 { background-image: url(../img/patterns/pattern-1.png); } +.lcl_pattern_dot-1 { background-image: url(../img/patterns/pattern-dot-1.png); } +.lcl_pattern_dot-2 { background-image: url(../img/patterns/pattern-dot-2.png); } +.lcl_pattern_dot-b1 { background-image: url(../img/patterns/pattern-dot-b1.png); } +.lcl_pattern_dot-b2 { background-image: url(../img/patterns/pattern-dot-b2.png); } +.lcl_pattern_dot-b3 { background-image: url(../img/patterns/pattern-dot-b3.png); } +.lcl_pattern_dot-b4 { background-image: url(../img/patterns/pattern-dot-b4.png); } +.lcl_pattern_triangle-05 { background-image: url(../img/patterns/pattern-triangle-05.png); } +.lcl_pattern_triangle-10 { background-image: url(../img/patterns/pattern-triangle-10.png); } +.lcl_pattern_triangle-20 { background-image: url(../img/patterns/pattern-triangle-20.png); } +.lcl_pattern_triangle-30 { background-image: url(../img/patterns/pattern-triangle-30.png); } +.lcl_pattern_triangle-40 { background-image: url(../img/patterns/pattern-triangle-40.png); } +.lcl_pattern_ver-line-10 { background-image: url(../img/patterns/pattern-ver-line-10.png); } +.lcl_pattern_ver-line-20 { background-image: url(../img/patterns/pattern-ver-line-20.png); } +.lcl_pattern_ver-line-30 { background-image: url(../img/patterns/pattern-ver-line-30.png); } +.lcl_pattern_ver-line-40 { background-image: url(../img/patterns/pattern-ver-line-40.png); } +.lcl_pattern_ver-line-50 { background-image: url(../img/patterns/pattern-ver-line-50.png); } \ No newline at end of file diff --git a/lc-lightbox/css/lc_lightbox.min.css b/lc-lightbox/css/lc_lightbox.min.css new file mode 100644 index 0000000..e427a1f --- /dev/null +++ b/lc-lightbox/css/lc_lightbox.min.css @@ -0,0 +1 @@ +#lcl_overlay,#lcl_wrap{position:fixed;top:0;left:0}#lcl_window,#lcl_wrap:before{display:inline-block;vertical-align:middle}#lcl_txt,#lcl_wrap>*,#lcll_1,#lcll_2{box-sizing:border-box}#lcl_descr,#lcl_inline,#lcl_txt{line-height:20px}@font-face{font-family:lc_lightbox;src:url('fonts/lc_lightbox.eot');src:url('fonts/lc_lightbox.eot') format('embedded-opentype'),url('fonts/lc_lightbox.woff') format('woff'),url('fonts/lc_lightbox.ttf') format('truetype'),url('fonts/lc_lightbox.svg') format('svg');font-weight:400;font-style:normal}#lcl_wrap{bottom:0;right:0;text-align:center;overflow-x:hidden;overflow-y:hidden;z-index:999999999;-webkit-overflow-scrolling:touch}#lcl_wrap:before{content:"";height:100%}#lcl_wrap>*{text-align:left}#lcl_corner_close,#lcl_thumbs_nav,.lcl_icon{box-sizing:content-box!important}#lcl_overlay{width:100%;height:100%;overflow:hidden;z-index:-1;background-position:top left;background-repeat:repeat;-webkit-transform:translateZ(0);transform:translateZ(0)}#lcl_wrap:not(.lcl_pre_show){-webkit-transition:.35s ease-in;transition:.35s ease-in}#lcl_loader{display:block;opacity:0;height:40px;width:40px;position:absolute;top:50%;left:50%;margin-left:-20px;margin-top:-20px;z-index:-1;-webkit-transition:opacity .3s ease-out;transition:opacity .3s ease-out}#lcl_loader.lcl_loader_pre_first_el,.lcl_first_sizing #lcl_contents_wrap,.lcl_first_sizing #lcl_corner_close,.lcl_first_sizing #lcl_nav_cmd,.lcl_loading_iframe #lcl_contents_wrap,.lcl_loading_iframe #lcl_corner_close,.lcl_loading_iframe #lcl_nav_cmd,.lcl_loading_videojs #lcl_contents_wrap,.lcl_loading_videojs #lcl_corner_close,.lcl_loading_videojs #lcl_nav_cmd,.lcl_switching_elem #lcl_contents_wrap,.lcl_switching_elem #lcl_corner_close,.lcl_switching_elem #lcl_nav_cmd,.lcl_toggling_fs #lcl_contents_wrap,.lcl_toggling_fs #lcl_corner_close,.lcl_toggling_fs #lcl_nav_cmd,.lcl_toggling_txt.lcl_inner_cmd #lcl_nav_cmd,.lcl_txt_under.lcl_is_resizing:not(.lcl_force_txt_over) #lcl_txt,.lcl_txt_under.lcl_toggling_txt:not(.lcl_force_txt_over) #lcl_txt{opacity:0!important}.lcl_first_sizing #lcl_loader:not(.no_loader),.lcl_loading_iframe #lcl_loader:not(.no_loader),.lcl_loading_videojs #lcl_loader:not(.no_loader),.lcl_switching_elem #lcl_loader:not(.no_loader){opacity:1;z-index:99999}#lcll_1,#lcll_2{position:absolute;width:100%;height:100%;top:50%;left:50%;border-radius:50%;margin-top:-50%;margin-left:-50%;background:0 0;border-color:#aaa #aaa transparent;border-width:3px;border-style:solid;-webkit-animation:1.4s linear infinite lcl-loader;animation:1.4s linear infinite lcl-loader}#lcl_elem_wrap,.lcl_tn_inner li{background-repeat:no-repeat;background-position:center center}#lcll_2{width:50%;height:50%;margin-left:-25%;margin-top:-25%;border-right-color:transparent!important;-webkit-animation-duration:1.15s;animation-duration:1.15s;-webkit-animation-direction:reverse;animation-direction:reverse}@-webkit-keyframes lcl-loader{100%{-webkit-transform:rotate(360deg) translateZ(0)}}@keyframes lcl-loader{100%{transform:rotate(360deg) translateZ(0)}}#lcl_subj.lcl_switching_el>*,.lcl_tn_mixed_types li.lcl_sel_thumb::before{opacity:0}#lcl_contents_wrap{-webkit-transition:opacity .3s;transition:opacity .3s}.lcl_first_sizing #lcl_contents_wrap *,.lcl_is_resizing:not(.lcl_first_sizing):not(.lcl_toggling_txt):not(.lcl_toggling_tn):not(.lcl_toggling_fs) #lcl_window,.lcl_is_resizing:not(.lcl_toggling_txt):not(.lcl_toggling_tn) #lcl_elem_wrap:not(.lcl_image_elem),.lcl_is_resizing:not(.lcl_toggling_txt):not(.lcl_toggling_tn) .lcl_image_elem,.lcl_loading_iframe #lcl_contents_wrap *,.lcl_loading_videojs #lcl_contents_wrap *,.lcl_show_already_shaped #lcl_window,.lcl_switching_elem #lcl_contents_wrap *,.lcl_toggling_fs #lcl_contents_wrap *{-webkit-transition:none!important;transition:none!important}#lcl_window{text-align:left;z-index:30;width:100%;height:100%;max-height:100%;max-width:100%;min-width:50px;min-height:50px;line-height:0!important;overflow:visible;position:relative;top:0;left:0;-webkit-transform:translateZ(0);transform:translateZ(0)}#lcl_elem_wrap:not(.lcl_image_elem) .lcl_elem,.lcl_image_elem{-webkit-transition:.3s ease-out;transition:.3s ease-out}.lcl_toggling_fs #lcl_elem_wrap .lcl_elem,.lcl_toggling_fs #lcl_window,.lcl_toggling_fs .lcl_image_elem,.lcl_toggling_fs#lcl_wrap{-webkit-transition:.05s linear;transition:.05s linear}.lcl_tn_hidden #lcl_window{margin-top:0!important}.lcl_pre_first_el:not(.lcl_show_already_shaped) #lcl_window{width:100px;height:100px;max-width:85px!important;max-height:85px!important}.lcl_is_closing #lcl_window{-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}#lcl_contents_wrap,#lcl_subj{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden!important}.lcl_on_mobile #lcl_subj{overflow:auto!important}#lcl_subj{z-index:10}#lcl_wrap:not(.lcl_switching_elem) #lcl_subj{-webkit-transition:border-width .35s;transition:border-width .35s}.lcl_toggling_txt #lcl_subj{-webkit-transition-delay:.55s!important;transition-delay:.55s!important}#lcl_elem_wrap{position:relative;background-size:cover}.lcl_html_elem,.lcl_image_elem{position:absolute!important;top:0;left:0;right:0;bottom:0}.lcl_image_elem img{left:-99999px;position:fixed!important}.lcl_html_elem{line-height:normal;padding:15px;overflow-y:auto;background:#fdfdfd}.lcl_elem.video-js .vjs-poster,.lcl_postered_video,.lcl_tn_inner li{background-size:cover}.lcl_fullscreen_mode[lcl-type=iframe] #lcl_subj{top:60px}.lcl_dailymotion_elem>*,.lcl_iframe_elem>*,.lcl_postered_video>iframe,.lcl_video_elem>*,.lcl_vimeo_elem>*,.lcl_youtube_elem>*{position:absolute;top:0;left:0;width:100%;height:100%}.lcl_elem.video-js{bottom:0;height:auto;left:0;position:absolute;right:0;top:0;width:auto;background:#000!important}#lcl_thumbs_nav:not(.lcl_tn_has_arr) span,#lcl_wrap[lcl-type=html] .lcl_socials,#lcl_wrap[lcl-type=iframe] .lcl_socials,.lcl_corner_close.lcl_inner_cmd .lcl_close,.lcl_elem.video-js .vjs-fullscreen-control,.lcl_last_elem .lcl_play,.lcl_no_carousel.lcl_last_elem .lcl_next:after,.lcl_no_carousel[lc-lelem="0"] .lcl_prev:after,.lcl_no_txt #lcl_txt,.lcl_normal_close #lcl_corner_close,.lcl_outer_cmd #lcl_corner_close,.lcl_zoom_icon.lcl_zoom_disabled:after{display:none!important}.lcl_elem.video-js .vjs-big-play-button{background-color:rgba(43,51,63,.7);border:2px solid #fff;border-radius:50%;font-size:40px;line-height:62px;width:66px;height:66px;left:50%;top:50%;margin:-33px 0 0 -33px}.lcl_postered_video{background-position:center}.lcl_postered_video:not(.lcl_poster_clicked){cursor:pointer}.lcl_counter,.lcl_no_carousel.lcl_last_elem .lcl_next,.lcl_no_carousel[lc-lelem="0"] .lcl_prev,.lcl_zoom_icon.lcl_zoom_disabled{cursor:default!important}.lcl_postered_video:not(.lcl_poster_clicked):before{content:"\f0bf";box-sizing:border-box;font-size:38px!important;line-height:62px!important;text-indent:5px!important;color:#fff;border-radius:50%;background:rgba(43,51,63,.7);top:50%;left:50%;width:66px;height:66px;margin-left:-33px;margin-top:-33px;border:2px solid #fff}.lcl_postered_video:not(.lcl_poster_clicked):hover:before{background:rgba(115,133,159,.5)}.lcl_postered_video:not(.lcl_poster_clicked) iframe{display:none}.lcl_html_container{margin:auto;overflow:auto;position:relative}#lcl_wrap[lcl-type=html]:not(.lcl_fullscreen_mode) .lcl_html_elem{position:static!important}#lcl_wrap[lcl-type=html].lcl_txt_under:not(.lcl_fullscreen_mode) #lcl_txt,#lcl_wrap[lcl-type=html]:not(.lcl_fullscreen_mode) #lcl_contents_wrap,#lcl_wrap[lcl-type=html]:not(.lcl_fullscreen_mode) #lcl_subj{position:relative!important}#lcl_wrap[lcl-type=html] #lcl_subj,#lcl_wrap[lcl-type=html].lcl_txt_under:not(.lcl_forced_over) #lcl_contents_wrap{overflow:auto}.lcl_fullscreen_mode#lcl_wrap[lcl-type=html] #lcl_elem_wrap{display:flex;-webkit-align-items:center;align-items:center}.lcl_fullscreen_mode .lcl_html_elem{padding-top:18px;border-top:42px solid #fdfdfd;padding-bottom:0;border-bottom:15px solid #fdfdfd}#lcl_inline{padding:15px 10px}#lcl_nav_cmd{position:absolute;top:0;z-index:100;overflow:visible;padding:8px;height:0;right:0;left:0}.lcl_corner_close.lcl_force_txt_over:not(.lcl_forced_outer_cmd) #lcl_nav_cmd,.lcl_corner_close.lcl_hidden_txt:not(.lcl_forced_outer_cmd) #lcl_nav_cmd,.lcl_corner_close.lcl_inner_cmd:not(.lcl_txt_rside):not(.lcl_forced_outer_cmd) #lcl_nav_cmd,.lcl_corner_close.lcl_no_txt:not(.lcl_forced_outer_cmd) #lcl_nav_cmd{padding-right:24px!important}.lcl_outer_cmd #lcl_nav_cmd{z-index:99999;margin:0!important;padding:10px 15px}.lcl_outer_cmd:not(.lcl_first_sizing):not(.lcl_first_sizing):not(.lcl_loading_iframe):not(.lcl_switching_elem):not(.lcl_toggling_txt):not(.lcl_toggling_fs):not(.lcl_is_closing) #lcl_nav_cmd{opacity:1!important}.lcl_is_closing.lcl_outer_cmd #lcl_nav_cmd{-webkit-transition:.2s;transition:.2s;opacity:0!important}#lcl_nav_cmd .lcl_icon{display:inline-block;border-radius:3px;background:#fefefe;box-shadow:0 0 2px rgb(20,20,20,.05);border:1px solid #eaeaea;text-align:center;vertical-align:top;margin:4px;width:28px;height:28px;color:#6f6f6f;position:relative}.lcl_outer_cmd .lcl_close{right:0!important;top:0!important}@media screen and (min-width:450px){.lcl_fullscreen_mode.lcl_outer_cmd:not(.lcl_on_mobile):not([lcl-type=iframe]):not([lcl-type=html]) #lcl_nav_cmd .lcl_icon,.lcl_inner_cmd:not(.lcl_on_mobile) #lcl_nav_cmd .lcl_icon{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7);-webkit-transition:opacity .2s ease-in .5s,box-shadow .2s ease-in .5s,-webkit-transform .2s ease-in .5s;transition:opacity .2s ease-in .5s,box-shadow .2s ease-in .5s,transform .2s ease-in .5s}#lcl_window:not(.lcl_on_mobile):hover #lcl_nav_cmd .lcl_icon,.lcl_fullscreen_mode.lcl_outer_cmd:not(.lcl_on_mobile):not([lcl-type=iframe]):not([lcl-type=html]):hover #lcl_nav_cmd .lcl_icon{opacity:1;-webkit-transition:.2s ease-in;transition:.2s ease-in;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}#lcl_corner_close:before,.lcl_icon:before,.lcl_postered_video:not(.lcl_poster_clicked):before,.lcl_tn_next:before,.lcl_tn_prev:before{font-family:lc_lightbox!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;text-align:center;display:block;font-size:16px;line-height:27px;z-index:10;position:relative;-webkit-transition:.15s;transition:.15s;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.lcl_icon:not(.lcl_counter):after{content:"";display:block;left:-1px;right:-1px;position:absolute;top:-1px;bottom:-1px;z-index:5;border-radius:3px;opcity:0;background:#6f6f6f;-webkit-transition:.2s;transition:.2s;-webkit-transform:scale(0);transform:scale(0)}.lcl_nav_btn_middle .lcl_next:after,.lcl_nav_btn_middle .lcl_prev:after{-webkit-transition-duration:.15s;transition-duration:.15s}.lcl_nav_btn_middle.lcl_hidden_txt.lcl_inner_cmd .lcl_next,.lcl_nav_btn_middle.lcl_hidden_txt.lcl_outer_cmd .lcl_next,.lcl_nav_btn_middle.lcl_inner_cmd .lcl_next:after{right:0!important}.lcl_nav_btn_middle.lcl_hidden_txt.lcl_inner_cmd .lcl_prev,.lcl_nav_btn_middle.lcl_hidden_txt.lcl_outer_cmd .lcl_prev,.lcl_nav_btn_middle.lcl_inner_cmd .lcl_prev:after{left:0!important}#lcl_wrap:not(.lcl_on_mobile) .lcl_icon:not(.lcl_counter):not(.lcl_zoom_disabled):not(a):hover{border-radius:5px!important}#lcl_corner_close:before,#lcl_wrap:not(.lcl_on_mobile) .lcl_icon:not(.lcl_counter):not(.lcl_zoom_disabled):not(a):hover:before{color:#fff}#lcl_wrap:not(.lcl_on_mobile) .lcl_icon:not(.lcl_counter):not(.lcl_zoom_disabled):not(a):hover:after{opacity:1;-webkit-transform:scale(1);transform:scale(1)}.lcl_prev:before{content:"\f053";text-indent:-1px}.lcl_next:before{content:"\f054";text-indent:1px}.lcl_play:before{content:"\f0bf";font-size:20px;line-height:28px;text-indent:1px}.lcl_is_playing .lcl_play:before{content:"\f0bb";font-size:20px;line-height:28px;text-indent:0}#lcl_corner_close:before,.lcl_close:before{content:"\e901";font-size:20px;line-height:28px}.lcl_fullscreen:before{content:"\f065"}.lcl_fullscreen_mode .lcl_fullscreen:before,.lcl_window:before{content:"\e900"}.lcl_zoom_out:before{content:"\e909";font-size:16px}.lcl_zoom_in:before{content:"\e908";font-size:16px}.lcl_txt_toggle:before{content:"\f10e";font-size:16px}.lcl_thumbs_toggle:before{content:"\e902";font-size:15px;line-height:26px;text-indent:-1px}.lcl_download:before{content:"\e9c5"}.lcl_socials:before{content:"\e600";font-size:15px;line-height:26px}.lcl_fb:before{content:"\f09a";font-size:17px}.lcl_pint:before{content:"\f0d2";font-size:18px}.lcl_wa:before{content:"\f232";font-size:18px}.lcl_twit:before{content:"x";background-color:#fafafa;-webkit-mask-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MTIgNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuNC4yIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIzIEZvbnRpY29ucywgSW5jLiAtLT48cGF0aCBkPSJNMzg5LjIgNDhoNzAuNkwzMDUuNiAyMjQuMiA0ODcgNDY0SDM0NUwyMzMuNyAzMTguNiAxMDYuNSA0NjRIMzUuOEwyMDAuNyAyNzUuNSAyNi44IDQ4SDE3Mi40TDI3Mi45IDE4MC45IDM4OS4yIDQ4ek0zNjQuNCA0MjEuOGgzOS4xTDE1MS4xIDg4aC00MkwzNjQuNCA0MjEuOHoiLz48L3N2Zz4=");mask-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MTIgNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuNC4yIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIzIEZvbnRpY29ucywgSW5jLiAtLT48cGF0aCBkPSJNMzg5LjIgNDhoNzAuNkwzMDUuNiAyMjQuMiA0ODcgNDY0SDM0NUwyMzMuNyAzMTguNiAxMDYuNSA0NjRIMzUuOEwyMDAuNyAyNzUuNSAyNi44IDQ4SDE3Mi40TDI3Mi45IDE4MC45IDM4OS4yIDQ4ek0zNjQuNCA0MjEuOGgzOS4xTDE1MS4xIDg4aC00MkwzNjQuNCA0MjEuOHoiLz48L3N2Zz4=");font-size:18px;text-indent:-99999px;mask-repeat:no-repeat;-webkit-mask-repeat:no-repeat;mask-position:center;-webkit-mask-position:center}.lcl_tn_prev:before{content:"\f137"}.lcl_tn_next:before{content:"\f138"}.lcl_right_icon{float:right}.lcl_close{margin-left:36px!important}.lcl_counter{font-size:12px;font-weight:700;line-height:27px;padding:0 10px;width:auto!important}@media screen and (max-width:340px){.lcl_counter{display:none!important}}.lcl_download,.lcl_socials{position:relative}.lcl_download a{position:absolute;top:0;right:0;bottom:0;left:0;z-index:50}.lcl_first_elem:not(.lcl_on_mobile) #lcl_window:hover .lcl_prev,.lcl_last_elem:not(.lcl_on_mobile) #lcl_window:hover .lcl_next{opacity:.5!important;cursor:default!important}#lcl_thumb_next div:before,#lcl_thumb_prev div:before{font-size:20px}.lcl_icon{cursor:pointer;display:inline-block;height:24px;width:24px;border-radius:2px;-webkit-transition:.2s linear;transition:.2s linear}.lcl_hidden_txt .lcl_txt_toggle:before,.lcl_no_carousel.lcl_last_elem .lcl_next:before,.lcl_no_carousel[lc-lelem="0"] .lcl_prev:before,.lcl_tn_hidden .lcl_thumbs_toggle:before,.lcl_zoom_icon.lcl_zoom_disabled:before{opacity:.6!important}#lcl_corner_close{position:absolute;right:-22px;top:-24px;border:3px solid #d3d3d3;background:#6f6f6f;border-radius:50%;min-height:34px;min-width:34px;cursor:pointer;z-index:150;-webkit-transition:opacity .3s;transition:opacity .3s}#lcl_corner_close:before{font-size:20px!important;line-height:34px!important;-webkit-transition:.3s;transition:.3s}#lcl_corner_close:not(.lcl_on_mobile):hover:before{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.lcl_nav_btn_middle .lcl_next,.lcl_nav_btn_middle .lcl_prev{position:fixed!important;top:50%;margin-top:-32px!important;padding:16px 4px}.lcl_nav_btn_middle.lcl_inner_cmd:not(.lcl_fullscreen_mode) .lcl_next,.lcl_nav_btn_middle.lcl_inner_cmd:not(.lcl_fullscreen_mode) .lcl_prev{box-shadow:none!important;border:none!important}.lcl_nav_btn_middle .lcl_next:before,.lcl_nav_btn_middle .lcl_prev:before{font-size:23px!important}#lcl_thumbs_nav span.lcl_tn_prev,.lcl_nav_btn_middle .lcl_prev{left:0}.lcl_nav_btn_middle.lcl_inner_cmd .lcl_prev,.lcl_nav_btn_middle.lcl_inner_cmd:not(.lcl_fullscreen_mode) .lcl_prev:after{border-top-left-radius:0!important;border-bottom-left-radius:0!important}#lcl_thumbs_nav span.lcl_tn_next,.lcl_nav_btn_middle .lcl_next{right:0}.lcl_nav_btn_middle.lcl_inner_cmd .lcl_next,.lcl_nav_btn_middle.lcl_inner_cmd:not(.lcl_fullscreen_mode) .lcl_next:after{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.lcl_nav_btn_middle.lcl_outer_cmd .lcl_prev{margin-left:19px!important}.lcl_nav_btn_middle.lcl_outer_cmd .lcl_next{margin-right:19px!important}@media screen and (max-width:450px){#lcl_nav_cmd .lcl_icon{margin:0}.lcl_close{margin-left:26px!important}}.lcl_on_mobile .lcl_zoom_wrap{overflow:scroll!important}.lcl_zoom_wrap,.lcl_zoom_wrap *{cursor:move;cursor:grab;cursor:-webkit-grab;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.lcl_zoom_wrap:active{cursor:move;cursor:grabbing;cursor:-webkit-grabbing}.lcl_zoom_helper{position:absolute;font-size:8.4px;color:#fafafa;background:#972626;display:inline-block;border:2px solid #972626;padding:5px 1px;font-family:arial;text-shadow:0 0 0 rgba(250,250,250,.8);letter-spacing:.28px;border-radius:1px;line-height:0;z-index:10;bottom:-11px;right:-7px;-webkit-user-select:none;-ms-user-select:none;user-select:none}.lcl_tooltip,.lcl_txt_under #lcl_txt{background:#fff}#lcl_txt{padding:12px 10px;z-index:50;position:absolute;overflow:hidden}.lcl_toggling_txt #lcl_txt{-webkit-transition:-webkit-transform .45s .1s,opacity .35s .1s;transition:transform .45s .1s,opacity .35s .1s}#lcl_txt *{font-family:Arial,​ 'sans-serif'}#lcl_txt>*{padding:0;margin:0;text-align:left;position:relative;overflow-wrap:break-word;word-wrap:break-word;-webkit-hyphens:auto;-ms-hyphens:auto;-moz-hyphens:auto;hyphens:auto}#lcl_title{font-size:17px;font-weight:700;line-height:normal;margin-bottom:4px}#lcl_author{font-size:12px;line-height:15px;font-weight:400}.lcl_comments_wrap{min-width:178px}.lcl_txt_lside:not(.lcl_force_txt_over) #lcl_txt .lcl_txt_border,.lcl_txt_rside:not(.lcl_force_txt_over) #lcl_txt .lcl_txt_border{border-bottom:1px dashed #cfcfcf;margin-bottom:12px;padding-bottom:17px}.lcl_force_txt_over #lcl_txt .lcl_txt_border,.lcl_txt_over #lcl_txt .lcl_txt_border,.lcl_txt_under #lcl_txt .lcl_txt_border{border-bottom:1px dashed #cfcfcf;margin-bottom:10px;padding-bottom:12px}#lcl_descr{font-size:14px}.lcl_switching_el #lcl_txt,.lcl_txt_under.lcl_is_resizing:not(.lcl_force_txt_over) #lcl_txt,.lcl_txt_under_calc #lcl_txt,.lcl_txt_under_calc #lcl_txt *{-webkit-transition-duration:0s!important;transition-duration:0s!important}.lcl_txt_over #lcl_txt,.lcl_txt_under #lcl_txt{left:0;bottom:0}.lcl_txt_under:not(.lcl_force_txt_over) #lcl_txt{padding:18px 25px 22px;margin-bottom:0!important}.lcl_txt_under.lcl_hidden_txt.lcl_toggling_txt:not(.lcl_force_txt_over) #lcl_txt{visibility:hidden!important}.lcl_txt_under:not(.lcl_force_txt_over) #lcl_txt:after{height:7px;left:0;position:absolute;right:0;top:0}.lcl_force_txt_over #lcl_txt,.lcl_txt_over #lcl_txt{background:rgba(255,255,255,.9);background-clip:padding-box!important;border:15px solid transparent;border-radius:0 17px 17px 0;max-height:calc(100% - 42px);padding:13px 22px;overflow:auto;bottom:0}.lcl_fullscreen_mode.lcl_force_txt_over #lcl_txt,.lcl_fullscreen_mode.lcl_txt_over #lcl_txt{bottom:auto!important;right:auto!important;left:0!important;top:42px!important;padding:17px 22px!important;max-width:33.3%;max-height:calc(100% - 42px);-webkit-transition:-webkit-transform .45s .1s,opacity .35s .1s,bottom .3s;transition:transform .45s .1s,opacity .35s .1s,bottom .3s}.lcl_playing_video.lcl_force_txt_over #lcl_txt,.lcl_playing_video.lcl_txt_over #lcl_txt{max-height:calc(100% - 42px - 45px);bottom:45px}@media screen and (max-width:1024px){.lcl_fullscreen_mode.lcl_force_txt_over #lcl_txt,.lcl_fullscreen_mode.lcl_txt_over #lcl_txt{max-width:66.6%}}.lcl_txt_lside:not(.lcl_force_txt_over) #lcl_txt,.lcl_txt_rside:not(.lcl_force_txt_over) #lcl_txt{padding:16px 24px;top:0;bottom:0;width:330px;overflow-y:auto;overflow-x:hidden}.lcl_txt_lside:not(.lcl_force_txt_over) #lcl_txt:after,.lcl_txt_rside:not(.lcl_force_txt_over) #lcl_txt:after{bottom:0;position:absolute;top:0;width:4px}.lcl_txt_lside:not(.lcl_force_txt_over) #lcl_txt{padding-left:18px;left:0;background:#fefefe}.lcl_txt_rside:not(.lcl_force_txt_over) #lcl_txt{padding-right:18px;right:0;background:#fefefe}.lcl_txt_rside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_subj{border-right:330px solid transparent}.lcl_fullscreen_mode.lcl_nav_btn_middle.lcl_txt_rside:not(.lcl_no_txt):not(.lcl_force_txt_over) .lcl_next,.lcl_fullscreen_mode.lcl_txt_rside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_nav_cmd,.lcl_fullscreen_mode.lcl_txt_rside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_thumbs_nav,.lcl_nav_btn_middle.lcl_txt_rside.lcl_inner_cmd:not(.lcl_no_txt):not(.lcl_force_txt_over) .lcl_next,.lcl_txt_rside.lcl_inner_cmd:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_nav_cmd{right:330px}.lcl_txt_lside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_subj{border-left:330px solid transparent}.lcl_fullscreen_mode.lcl_nav_btn_middle.lcl_txt_lside:not(.lcl_no_txt):not(.lcl_force_txt_over) .lcl_prev,.lcl_fullscreen_mode.lcl_txt_lside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_nav_cmd,.lcl_fullscreen_mode.lcl_txt_lside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_thumbs_nav,.lcl_nav_btn_middle.lcl_txt_lside.lcl_inner_cmd:not(.lcl_no_txt):not(.lcl_force_txt_over) .lcl_prev,.lcl_txt_lside.lcl_inner_cmd:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_nav_cmd{left:330px}@media screen and (max-width:780px){.lcl_fullscreen_mode.lcl_force_txt_over #lcl_txt,.lcl_fullscreen_mode.lcl_txt_over #lcl_txt{max-width:100%}.lcl_txt_lside:not(.lcl_force_txt_over) #lcl_txt,.lcl_txt_rside:not(.lcl_force_txt_over) #lcl_txt{width:220px}.lcl_txt_rside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_subj{border-right-width:220px}.lcl_txt_lside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_subj{border-left-width:220px}.lcl_fullscreen_mode.lcl_nav_btn_middle.lcl_txt_rside:not(.lcl_no_txt):not(.lcl_force_txt_over) .lcl_next,.lcl_fullscreen_mode.lcl_txt_rside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_nav_cmd,.lcl_fullscreen_mode.lcl_txt_rside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_thumbs_nav,.lcl_nav_btn_middle.lcl_txt_rside.lcl_inner_cmd:not(.lcl_no_txt):not(.lcl_force_txt_over) .lcl_next,.lcl_txt_rside.lcl_inner_cmd:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_nav_cmd{right:220px}.lcl_fullscreen_mode.lcl_nav_btn_middle.lcl_txt_lside:not(.lcl_no_txt):not(.lcl_force_txt_over) .lcl_prev,.lcl_fullscreen_mode.lcl_txt_lside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_nav_cmd,.lcl_fullscreen_mode.lcl_txt_lside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_thumbs_nav,.lcl_nav_btn_middle .lcl_txt_lside.lcl_inner_cmd:not(.lcl_no_txt):not(.lcl_force_txt_over) .lcl_prev,.lcl_txt_lside.lcl_inner_cmd:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_nav_cmd{left:220px}}@media screen and (min-width:1700px){.lcl_fullscreen_mode.lcl_txt_lside:not(.lcl_force_txt_over) #lcl_txt,.lcl_fullscreen_mode.lcl_txt_rside:not(.lcl_force_txt_over) #lcl_txt{width:400px}.lcl_fullscreen_mode.lcl_txt_rside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_subj{border-right-width:400px}.lcl_fullscreen_mode.lcl_txt_lside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_subj{border-left-width:400px}.lcl_fullscreen_mode.lcl_nav_btn_middle.lcl_txt_rside:not(.lcl_no_txt):not(.lcl_force_txt_over) .lcl_next,.lcl_fullscreen_mode.lcl_txt_rside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_nav_cmd,.lcl_fullscreen_mode.lcl_txt_rside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_thumbs_nav{right:400px}.lcl_fullscreen_mode.lcl_nav_btn_middle.lcl_txt_lside:not(.lcl_no_txt):not(.lcl_force_txt_over) .lcl_prev,.lcl_fullscreen_mode.lcl_txt_lside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_nav_cmd,.lcl_fullscreen_mode.lcl_txt_lside:not(.lcl_no_txt):not(.lcl_force_txt_over) #lcl_thumbs_nav{left:400px}}.lcl_fullscreen_mode.lcl_hidden_txt #lcl_thumbs_nav,.lcl_hidden_txt.lcl_inner_cmd #lcl_nav_cmd,.lcl_hidden_txt.lcl_outer_cmd #lcl_nav_cmd{right:0!important;left:0!important}#lcl_txt>:first-child{padding-top:0;margin-top:0}#lcl_txt>:last-child{padding-bottom:0;margin-bottom:0}.lcl_fullscreen_mode #lcl_subj,.lcl_fullscreen_mode #lcl_txt,.lcl_socials_tt a{margin:0!important}.lcl_hidden_txt.lcl_txt_under:not(.lcl_force_txt_over) #lcl_txt{height:0!important;padding:0!important;-webkit-transform:translateY(100%);-ms-transform:translateY(100%);transform:translateY(100%)}.lcl_hidden_txt:not(.lcl_fullscreen_mode).lcl_force_txt_over #lcl_txt,.lcl_hidden_txt:not(.lcl_fullscreen_mode).lcl_txt_over #lcl_txt{opacity:0!important;z-index:-1;-webkit-transform:translateY(30px) scale(.95);-ms-transform:translateY(30px) scale(.95);transform:translateY(30px) scale(.95)}.lcl_hidden_txt.lcl_fullscreen_mode.lcl_force_txt_over #lcl_txt,.lcl_hidden_txt.lcl_fullscreen_mode.lcl_txt_over #lcl_txt{-webkit-transform:translateX(-110%) scale(.8);-ms-transform:translateX(-110%) scale(.8);transform:translateX(-110%) scale(.8)}.lcl_hidden_txt.lcl_txt_lside:not(.lcl_force_txt_over) #lcl_subj,.lcl_hidden_txt.lcl_txt_rside:not(.lcl_force_txt_over) #lcl_subj{border-width:0!important}.lcl_hidden_txt.lcl_txt_rside:not(.lcl_force_txt_over) #lcl_txt{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.lcl_hidden_txt.lcl_txt_lside:not(.lcl_force_txt_over) #lcl_txt{-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%)}.lcl_tooltip{position:absolute;left:50%;padding:7px;border-radius:3px;box-shadow:0 0 6px 1px rgba(0,0,0,.15);opacity:0;font-size:14px;-webkit-transition:.25s ease-out;transition:.25s ease-out}.lcl_tooltip:before{content:"";border-style:solid;border-width:7px;left:50%;margin-left:-7px;position:absolute}.lcl_tooltip.lcl_tt_bottom:before{bottom:100%;border-color:transparent transparent #fff}.lcl_tooltip.lcl_tt_top:before{top:100%;border-color:#fff transparent transparent}.lcl_tooltip.lcl_tt_bottom{top:115%;-webkit-transform:translate(-50%,8px);-ms-transform:translate(-50%,8px);transform:translate(-50%,8px)}.lcl_tooltip.lcl_tt_top{bottom:115%;-webkit-transform:translate(-50%,-8px);-ms-transform:translate(-50%,-8px);transform:translate(-50%,-8px)}.lcl_tooltip.lcl_show_tt{opacity:1;-webkit-transform:translate(-50%,0);-ms-transform:translate(-50%,0);transform:translate(-50%,0)}.lcl_tooltip.lcl_socials_tt{white-space:nowrap;padding-left:0;padding-right:0;top:150%}.lcl_socials_tt a{border-width:0 0 0 1px!important;border-style:solid;border-color:#eaeaea;border-radius:0!important;box-shadow:none!important;padding:0 12px;text-decoration:none!important;max-width:17px}.lcl_socials_tt a:first-child{border:none!important}#lcl_wrap.lcl_fullscreen_mode{padding:0!important}.lcl_fullscreen_mode #lcl_contents_wrap,.lcl_fullscreen_mode #lcl_window{border-radius:0!important}.lcl_fullscreen_mode #lcl_window{border-width:0!important;margin-top:0!important}.lcl_fullscreen_mode #lcl_elem_wrap{bottom:0!important}.lcl_fullscreen_mode.lcl_toggling_txt.lcl_nav_btn_middle .lcl_next,.lcl_fullscreen_mode.lcl_toggling_txt.lcl_nav_btn_middle .lcl_prev,.lcl_fullscreen_mode.lcl_toggling_txt.lcl_outer_cmd{-webkit-transition:.4s .2s!important;transition:.4s .2s!important}#lcl_thumbs_nav{margin:10px 20px;position:fixed;bottom:0;left:0;right:0;z-index:60;-webkit-transition:-webkit-transform .35s ease-in,opacity .5s,margin .35s,left .4s .2s,right .4s .2s;transition:transform .35s ease-in,opacity .5s,margin .35s,left .4s .2s,right .4s .2s}#lcl_thumbs_nav,#lcl_thumbs_nav *{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.lcl_playing_video.lcl_fullscreen_mode #lcl_thumbs_nav{margin-bottom:50px}#lcl_thumbs_nav.lcl_pre_tn_scroll,.lcl_pre_first_el #lcl_thumbs_nav,.lcl_tn_hidden #lcl_thumbs_nav{opacity:0;-webkit-transform:translateY(150%);-ms-transform:translateY(150%);transform:translateY(150%)}#lcl_thumbs_nav .lcl_tn_inner{position:absolute;z-index:10;left:45px;right:45px;bottom:0;top:0;list-style:none!important;margin:0!important;text-align:center;white-space:nowrap;overflow:hidden!important}.lcl_on_mobile .lcl_tn_inner{overflow:auto!important;touch-action:pan-x}.lcl_tn_inner li{height:100%;margin:0 0 0 10px;display:inline-block;border:0 solid #ccc;border-radius:2px;position:relative;background-clip:content-box;background-color:#9f9f9f;cursor:pointer;overflow:hidden;box-shadow:0 0 4px rgba(10,10,10,.45);-webkit-transform:scale(.83) translateZ(0);-ms-transform:scale(.83) translateZ(0);transform:scale(.83) translateZ(0);-webkit-transition:.25s;transition:.25s}.lcl_tn_inner li:first-child{margin:0}#lcl_wrap:not(.lcl_on_mobile) .lcl_tn_inner li:not(.lcl_sel_thumb):hover,.lcl_tn_inner li.lcl_sel_thumb{-webkit-transform:scale(.97);-ms-transform:scale(.97);transform:scale(.97)}.lcl_tn_inner li.lcl_sel_thumb.lcl_tn_preload,.lcl_tn_inner li.lcl_tn_preload{margin:0!important;width:0!important;height:0!important;-webkit-transform:scale(0)!important;-ms-transform:scale(0)!important;transform:scale(0)!important}.lcl_thumb_title_tt{padding:7px 10px}#lcl_thumbs_nav span{position:absolute;cursor:pointer;width:23px;height:23px;top:50%;margin-top:-12px;z-index:15;color:#f5f5f5}#lcl_thumbs_nav.lcl_tn_has_arr span{display:inline-block!important}#lcl_thumbs_nav.lcl_tn_has_arr span:before{font-size:23px}.lcl_tn_video video{position:absolute;top:-15%;left:-15%;width:130%;height:130%}.lcl_tn_mixed_types li::before{background:rgba(0,0,0,.25);content:"";height:100%;left:0;position:absolute;top:0;width:100%;z-index:10;-webkit-transition:.25s;transition:.25s}.lcl_tn_mixed_types li:after{font-family:lc_lightbox!important;bottom:0;color:#fff;font-size:18px;line-height:28px;right:5px;position:absolute;text-shadow:0 0 3px rgba(0,0,0,.7);z-index:15;content:"\e929"}.lcl_tn_mixed_types li.lcl_tn_image:after{content:"\e927"}.lcl_tn_mixed_types li.lcl_tn_iframe:after{content:"\e903"}.lcl_tn_mixed_types li.lcl_tn_html:after{content:"\e926"}#lcl_progressbar{position:fixed;z-index:99999;top:0;height:2px;left:0;width:0;background:#fff;box-shadow:0 2px 2px 0 rgba(0,0,0,.4);-webkit-transition:opacity .6s;transition:opacity .6s}.lcl_loading_iframe #lcl_progressbar,.lcl_loading_videojs #lcl_progressbar{opacity:0;transition-duration:0s}.lcl_pattern_oblique_dots{background-image:url(../img/patterns/oblique_dots.png)}.lcl_pattern_1{background-image:url(../img/patterns/pattern-1.png)}.lcl_pattern_dot-1{background-image:url(../img/patterns/pattern-dot-1.png)}.lcl_pattern_dot-2{background-image:url(../img/patterns/pattern-dot-2.png)}.lcl_pattern_dot-b1{background-image:url(../img/patterns/pattern-dot-b1.png)}.lcl_pattern_dot-b2{background-image:url(../img/patterns/pattern-dot-b2.png)}.lcl_pattern_dot-b3{background-image:url(../img/patterns/pattern-dot-b3.png)}.lcl_pattern_dot-b4{background-image:url(../img/patterns/pattern-dot-b4.png)}.lcl_pattern_triangle-05{background-image:url(../img/patterns/pattern-triangle-05.png)}.lcl_pattern_triangle-10{background-image:url(../img/patterns/pattern-triangle-10.png)}.lcl_pattern_triangle-20{background-image:url(../img/patterns/pattern-triangle-20.png)}.lcl_pattern_triangle-30{background-image:url(../img/patterns/pattern-triangle-30.png)}.lcl_pattern_triangle-40{background-image:url(../img/patterns/pattern-triangle-40.png)}.lcl_pattern_ver-line-10{background-image:url(../img/patterns/pattern-ver-line-10.png)}.lcl_pattern_ver-line-20{background-image:url(../img/patterns/pattern-ver-line-20.png)}.lcl_pattern_ver-line-30{background-image:url(../img/patterns/pattern-ver-line-30.png)}.lcl_pattern_ver-line-40{background-image:url(../img/patterns/pattern-ver-line-40.png)}.lcl_pattern_ver-line-50{background-image:url(../img/patterns/pattern-ver-line-50.png)} \ No newline at end of file diff --git a/lc-lightbox/css/open_close_fx.css b/lc-lightbox/css/open_close_fx.css new file mode 100644 index 0000000..d1dfb20 --- /dev/null +++ b/lc-lightbox/css/open_close_fx.css @@ -0,0 +1,150 @@ +/* fading */ +.lcl_fade_oc.lcl_pre_show #lcl_overlay, +.lcl_fade_oc.lcl_pre_show #lcl_window, +.lcl_fade_oc.lcl_is_closing #lcl_overlay, +.lcl_fade_oc.lcl_is_closing #lcl_window { + opacity: 0 !important; +} +.lcl_fade_oc.lcl_is_closing #lcl_overlay { + -webkit-transition-delay: .15s !important; + transition-delay: .15s !important; +} + + +/* zoom-in */ +.lcl_zoomin_oc.lcl_pre_show #lcl_window, +.lcl_zoomin_oc.lcl_is_closing #lcl_window { + opacity: 0 !important; + + -webkit-transform: scale(0.05) translateZ(0) !important; + transform: scale(0.05) translateZ(0) !important; +} +.lcl_zoomin_oc.lcl_is_closing #lcl_overlay { + opacity: 0 !important; +} + + +/* bottom-to-top */ +.lcl_bottop_oc.lcl_pre_show #lcl_overlay, +.lcl_bottop_oc.lcl_is_closing #lcl_overlay { + opacity: 0 !important; +} +.lcl_bottop_oc.lcl_pre_show #lcl_window { + transition-property: transform !important; + opacity: 1 !important; + + -webkit-transform: translate3d(0, 100vh, 0); + transform: translate3d(0, 100vh, 0); +} +.lcl_bottop_oc.lcl_is_closing #lcl_window { + -webkit-transform: translate3d(0, -100vh, 0); + transform: translate3d(0, -100vh, 0); +} + + +/* bottom-to-top v2 */ +.lcl_bottop_v2_oc.lcl_pre_show #lcl_window, +.lcl_bottop_v2_oc.lcl_is_closing #lcl_window { + opacity: 0 !important; + + -webkit-transition-timing-function: ease; + transition-timing-function: ease; +} +.lcl_bottop_v2_oc.lcl_pre_show #lcl_window { + top: 40vh; +} +.lcl_bottop_v2_oc.lcl_is_closing #lcl_window { + top: -40vh; + + -webkit-transform: scale(0.8) translateZ(0); + transform: scale(0.8) translateZ(0); + + -webkit-transition-delay: 0s !important; + transition-delay: 0s !important; +} +.lcl_bottop_v2_oc.lcl_pre_show #lcl_overlay { + top: 100vh; +} +.lcl_bottop_v2_oc.lcl_is_closing #lcl_overlay { + top: -100vh; +} + + +/* right to left */ +.lcl_rtl_oc.lcl_pre_show #lcl_overlay, +.lcl_rtl_oc.lcl_is_closing #lcl_overlay { + opacity: 0 !important; +} +.lcl_rtl_oc.lcl_pre_show #lcl_window, +.lcl_rtl_oc.lcl_is_closing #lcl_window { + opacity: 1 !important; + -webkit-transform: scale(.8) translateZ(0); + transform: scale(.8) translateZ(0); +} + +.lcl_rtl_oc.lcl_pre_show #lcl_window { + left: -100vw; +} +.lcl_rtl_oc.lcl_is_closing #lcl_window { + left: 100vw; +} +.lcl_rtl_oc.lcl_is_closing #lcl_overlay { + -webkit-transition-delay: .2s !important; + transition-delay: .2s !important; +} + + +/* horizontal flip */ +.lcl_horiz_flip_oc.lcl_pre_show #lcl_overlay, +.lcl_horiz_flip_oc.lcl_is_closing #lcl_overlay { + opacity: 0 !important; +} +.lcl_horiz_flip_oc.lcl_pre_show #lcl_window, +.lcl_horiz_flip_oc.lcl_is_closing #lcl_window { + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + + -webkit-transition-timing-function: ease; + transition-timing-function: ease; +} +.lcl_horiz_flip_oc.lcl_pre_show #lcl_window { + -webkit-transform: rotateY(90deg) perspective(800px); + transform: rotateY(90deg) perspective(800px); +} +.lcl_horiz_flip_oc.lcl_is_closing #lcl_window { + -webkit-transform: rotateY(-90deg) scale(.8) perspective(800px); + transform: rotateY(-90deg) scale(.8) perspective(800px); +} +.lcl_horiz_flip_oc.lcl_is_closing #lcl_overlay { + -webkit-transition-delay: .2s !important; + transition-delay: .2s !important; +} + + +/* vertical flip */ +.lcl_vert_flip_oc.lcl_pre_show #lcl_overlay, +.lcl_vert_flip_oc.lcl_is_closing #lcl_overlay { + opacity: 0 !important; +} +.lcl_vert_flip_oc.lcl_pre_show #lcl_window, +.lcl_vert_flip_oc.lcl_is_closing #lcl_window { + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + + -webkit-transition-timing-function: ease; + transition-timing-function: ease; +} +.lcl_vert_flip_oc.lcl_pre_show #lcl_window { + -webkit-transform: rotateX(-90deg) perspective(1000px); + transform: rotateX(-90deg) perspective(1000px); +} +.lcl_vert_flip_oc.lcl_is_closing #lcl_window { + opacity: .5 !important; + + -webkit-transform: rotateX(90deg) scale(.6) perspective(1000px); + transform: rotateX(90deg) scale(.6) perspective(1000px); +} +.lcl_vert_flip_oc.lcl_is_closing #lcl_overlay { + -webkit-transition-delay: .2s !important; + transition-delay: .2s !important; +} \ No newline at end of file diff --git a/lc-lightbox/demo_gallery.html b/lc-lightbox/demo_gallery.html new file mode 100644 index 0000000..3e60270 --- /dev/null +++ b/lc-lightbox/demo_gallery.html @@ -0,0 +1,148 @@ + + + + + +LC Lightbox - Image Gallery Demo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+

LC Lightbox

+

Yet.. another jQuery lightbox .. or not?

+ by LCweb +

+
+
+ + +
+
+

Image Gallery

+ + + + + + + + + + + + + + + + + + + + + + + +

+
+
+ + + + + + + + + + + diff --git a/lc-lightbox/demo_multitype.html b/lc-lightbox/demo_multitype.html new file mode 100644 index 0000000..5c8f19b --- /dev/null +++ b/lc-lightbox/demo_multitype.html @@ -0,0 +1,170 @@ + + + + + +LC Lightbox - Mixed Types Demo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+

LC Lightbox

+

Yet.. another jQuery lightbox .. or not?

+ by LCweb +

+
+
+ + +
+
+

Mixed Types

+ + + + + + + + + + + + + + + + + + + + + + + +

+
+
+ + + + + + + + + + + + + + + + + + + + + + diff --git a/lc-lightbox/img/patterns/oblique_dots.png b/lc-lightbox/img/patterns/oblique_dots.png new file mode 100644 index 0000000..5180c75 Binary files /dev/null and b/lc-lightbox/img/patterns/oblique_dots.png differ diff --git a/lc-lightbox/img/patterns/pattern-1.png b/lc-lightbox/img/patterns/pattern-1.png new file mode 100644 index 0000000..d88afdd Binary files /dev/null and b/lc-lightbox/img/patterns/pattern-1.png differ diff --git a/lc-lightbox/img/patterns/pattern-dot-1.png b/lc-lightbox/img/patterns/pattern-dot-1.png new file mode 100644 index 0000000..81fe2c7 Binary files /dev/null and b/lc-lightbox/img/patterns/pattern-dot-1.png differ diff --git a/lc-lightbox/img/patterns/pattern-dot-2.png b/lc-lightbox/img/patterns/pattern-dot-2.png new file mode 100644 index 0000000..30fa3f1 Binary files /dev/null and b/lc-lightbox/img/patterns/pattern-dot-2.png differ diff --git a/lc-lightbox/img/patterns/pattern-dot-b1.png b/lc-lightbox/img/patterns/pattern-dot-b1.png new file mode 100644 index 0000000..8068206 Binary files /dev/null and b/lc-lightbox/img/patterns/pattern-dot-b1.png differ diff --git a/lc-lightbox/img/patterns/pattern-dot-b2.png b/lc-lightbox/img/patterns/pattern-dot-b2.png new file mode 100644 index 0000000..6b124a9 Binary files /dev/null and b/lc-lightbox/img/patterns/pattern-dot-b2.png differ diff --git a/lc-lightbox/img/patterns/pattern-dot-b3.png b/lc-lightbox/img/patterns/pattern-dot-b3.png new file mode 100644 index 0000000..19d9a23 Binary files /dev/null and b/lc-lightbox/img/patterns/pattern-dot-b3.png differ diff --git a/lc-lightbox/img/patterns/pattern-dot-b4.png b/lc-lightbox/img/patterns/pattern-dot-b4.png new file mode 100644 index 0000000..23fb706 Binary files /dev/null and b/lc-lightbox/img/patterns/pattern-dot-b4.png differ diff --git a/lc-lightbox/img/patterns/pattern-triangle-05.png b/lc-lightbox/img/patterns/pattern-triangle-05.png new file mode 100644 index 0000000..feadf6b Binary files /dev/null and b/lc-lightbox/img/patterns/pattern-triangle-05.png differ diff --git a/lc-lightbox/img/patterns/pattern-triangle-10.png b/lc-lightbox/img/patterns/pattern-triangle-10.png new file mode 100644 index 0000000..20ad1d0 Binary files /dev/null and b/lc-lightbox/img/patterns/pattern-triangle-10.png differ diff --git a/lc-lightbox/img/patterns/pattern-triangle-20.png b/lc-lightbox/img/patterns/pattern-triangle-20.png new file mode 100644 index 0000000..9091de6 Binary files /dev/null and b/lc-lightbox/img/patterns/pattern-triangle-20.png differ diff --git a/lc-lightbox/img/patterns/pattern-triangle-30.png b/lc-lightbox/img/patterns/pattern-triangle-30.png new file mode 100644 index 0000000..3110612 Binary files /dev/null and b/lc-lightbox/img/patterns/pattern-triangle-30.png differ diff --git a/lc-lightbox/img/patterns/pattern-triangle-40.png b/lc-lightbox/img/patterns/pattern-triangle-40.png new file mode 100644 index 0000000..7a41a78 Binary files /dev/null and b/lc-lightbox/img/patterns/pattern-triangle-40.png differ diff --git a/lc-lightbox/img/patterns/pattern-ver-line-10.png b/lc-lightbox/img/patterns/pattern-ver-line-10.png new file mode 100644 index 0000000..3ccb91a Binary files /dev/null and b/lc-lightbox/img/patterns/pattern-ver-line-10.png differ diff --git a/lc-lightbox/img/patterns/pattern-ver-line-20.png b/lc-lightbox/img/patterns/pattern-ver-line-20.png new file mode 100644 index 0000000..15b5307 Binary files /dev/null and b/lc-lightbox/img/patterns/pattern-ver-line-20.png differ diff --git a/lc-lightbox/img/patterns/pattern-ver-line-30.png b/lc-lightbox/img/patterns/pattern-ver-line-30.png new file mode 100644 index 0000000..45bfd08 Binary files /dev/null and b/lc-lightbox/img/patterns/pattern-ver-line-30.png differ diff --git a/lc-lightbox/img/patterns/pattern-ver-line-40.png b/lc-lightbox/img/patterns/pattern-ver-line-40.png new file mode 100644 index 0000000..8e156c6 Binary files /dev/null and b/lc-lightbox/img/patterns/pattern-ver-line-40.png differ diff --git a/lc-lightbox/img/patterns/pattern-ver-line-50.png b/lc-lightbox/img/patterns/pattern-ver-line-50.png new file mode 100644 index 0000000..b5667f6 Binary files /dev/null and b/lc-lightbox/img/patterns/pattern-ver-line-50.png differ diff --git a/lc-lightbox/js/lc_lightbox.js b/lc-lightbox/js/lc_lightbox.js new file mode 100644 index 0000000..689e2fb --- /dev/null +++ b/lc-lightbox/js/lc_lightbox.js @@ -0,0 +1,3621 @@ +/** + * LC Lightbox + * yet.. another jQuery lightbox.. or not? + * + * @version : 1.3.2 + * @copyright : Luca Montanari (LCweb) + * @website : https://lcweb.it + * @requires : jQuery v1.7 or later + + * Commercial license + */ + +(function ($) { + lcl_objs = []; // array containing all initialized objects - useful for deeplinks + + lcl_shown = false; // know whether lightbox is shown + lcl_is_active = false; // true when lightbox systems are acting (disable triggers) + lcl_slideshow = undefined; // lightbox slideshow - setInterval object + lcl_on_mobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); + + + // static vars avoiding useless parameters usage - related to currently opened lightbox - otherwise they are empty + lcl_curr_obj = false; // store currently active object + lcl_curr_opts = false; // currently active instance settings + lcl_curr_vars = false; // currently active instance settings + + lcl_deeplink_tracked= false; // flag to track url changes and initial reading once + lcl_hashless_url = false; // page URL without eventual hashes + lcl_url_hash = ''; // URL hashtag + + // fixed values + lcl_vid_instance_num = 0; // video.js instances number + + // lightbox structure + var lb_code = + '
'+ + '
'+ + '
'+ + '
'+ + '
'+ + '
'+ + '
'+ + '
'+ + '
'+ + + '
'+ + + '
'+ + '
'+ + '
'+ + '
'+ + '
'+ + + '
'+ + '
'+ + '
'+ + '
'+ + '
'+ + '
'+ + '
'+ + '
'+ + '
'+ + '
'+ + '
'+ + '
'+ + '
'; + + + //////////////////////////////////////////////////////////////////// + + + // initialization + // obj can be an array and overrides elements / [src: url/selector (only required data), title: (string), txt: (string), author: (string), ajax: bool, type: image/frame/text] + lc_lightbox = function(obj, lcl_settings) { + if(typeof(obj) != 'string' && (typeof(obj) != 'object' || !obj.length)) {return false;} + + // check among already initialized + var already_init = false; + $.each(lcl_objs, function(i, v) { + if(JSON.stringify(v) == JSON.stringify(obj)) { + already_init = v; + return false; + } + }); + + if(already_init === false) { + var instance = new lcl(obj, lcl_settings); + lcl_objs.push(instance); + return instance; + } + + return already_init; + }; + + + + // destruct method + lcl_destroy = function(instance) { + var index = $.inArray(instance, lcl_objs); + + if(index !== -1) { + lcl_objs.splice(index, 1); + } + }; + + + //////////////////////////////////////////////////////////////////// + + + /* initialize */ + var lcl = function(obj, settings) { + + var lcl_settings = $.extend({ + gallery : true, // whether to display a single element or compose a gallery + gallery_hook : 'rel', // attribute grouping elements - use false to create a gallery with all fetched elements + live_elements : true, // if a selector is found, set true to handle automatically DOM changes + preload_all : false, // whether to preload all images on document ready + global_type : false, // force elements type - can be overrided by in-element attribute | supported types: image - video - youtube - vimeo - dailymotion - html - iframe + + deeplink : false, // whether to create browser history and an unique URL for every element + img_zoom : false, // whether to enable zooming system + comments : false, // bool|obj / whether to use facebook or Disqus comments. Must be used with text on sides (Read the doc to know what to use) + + src_attr : 'href', // attribute containing element's source + title_attr : 'title', // attribute containing the title - is possible to specify a selector with this syntax: "> .selector" or "> span" + txt_attr : 'data-lcl-txt', // attribute containing the description - is possible to specify a selector with this syntax: "> .selector" or "> span" + author_attr : 'data-lcl-author', // attribute containing the author - is possible to specify a selector with this syntax: "> .selector" or "> span" + author_by_txt : 'by', // which text is used before the author name, by default is "by" + + slideshow : true, // whether to enable slideshow + open_close_time : 400, // animation duration for lightbox opening and closing / 1000 = 1sec + ol_time_diff : 100, // overlay's animation advance (on opening) and delay (on close) to window / 1000 = sec + fading_time : 80, // elements fading animation duration in millisecods / 1000 = 1sec + animation_time : 250, // sizing animation duration in millisecods / 1000 = 1sec + slideshow_time : 6000, // slideshow interval duration in milliseconds / 1000 = 1sec + autoplay : false, // autoplay slideshow - bool + counter : false, // whether to display elements counter + progressbar : true, // whether to display a progressbar when slideshow runs + carousel : true, // whether to create a non-stop pagination cycling elements + + max_width : '93%', // Lightbox maximum width. Use a responsive percent value or an integer for static pixel value + max_height : '93%', // Lightbox maximum height. Use a responsive percent value or an integer for static pixel value + wrap_padding : false, // set lightbox wrapping padding. Useful to maintain spaces using px max-sizes. Use a CSS value (string) + ol_opacity : 0.7, // overlay opacity / value between 0 and 1 + ol_color : '#111', // background color of the overlay + ol_pattern : false, // overlay patterns - insert the pattern name or false + border_w : 0, // width of the lightbox border in pixels + border_col : '#ddd', // color of the lightbox border + padding : 0, // width of the lightbox padding in pixels + radius : 0, // lightbox border radius in pixels + shadow : true, // whether to apply a shadow around lightbox window + remove_scrollbar: true, // whether to hide page's vertical scroller + + wrap_class : '', // custom classes added to wrapper - for custom styling/tracking + skin : 'light', // light / dark / custom + data_position : 'over', // over / under / lside / rside + cmd_position : 'inner', // inner / outer + ins_close_pos : 'normal', // set closing button position for inner commands - normal/corner + nav_btn_pos : 'normal', // set arrows and play/pause position - normal/middle + + txt_hidden : 500, // whether to hide texts on lightbox opening - bool or int (related to browser's smaller side) + show_title : true, // bool / whether to display titles + show_descr : true, // bool / whether to display descriptions + show_author : true, // bool / whether to display authors + + thumbs_nav : true, // enables thumbnails navigation (requires elements poster or images) + //tn_pos : 'bottom', // thumbs nav position - bottom/right/left - TODO + tn_icons : true, // print type icons on thumbs if types are mixed + tn_hidden : 500, // whether to hide thumbs nav on lightbox opening - bool or int (related to browser's smaller side) + thumbs_w : 110, // width of the thumbs for the standard lightbox + thumbs_h : 110, // height of the thumbs for the standard lightbox + thumb_attr : false, // attribute containing thumb URL to use or false to use thumbs maker + thumbs_maker_url: false, // script baseurl to create thumbnails (use src=%URL% w=%W% h=%H%) + + fullscreen : false, // Allow the user to expand a resized image. true/false + fs_img_behavior : 'fit', // resize mode of the fullscreen image - smart/fit/fill + fs_only : 500, // when directly open in fullscreen mode - bool or int (related to browser's smaller side) + browser_fs_mode : true, // whether to trigger or nor browser fullscreen mode + + socials : false, // bool + fb_share_params : false, // bool/string / whether to use direct FB contents share (Read the doc to know what to use) + + txt_toggle_cmd : true, // bool / allow text hiding + download : false, // bool / whether to add download button + autoplay_videos : true, // bool / whether to autoplay videos (NB: modern browsers ignore this for deeplinked elements. Not applied if video has poster) + touchswipe : true, // bool / Allow touch interactions for mobile (requires AlloyFinger) + mousewheel : true, // bool / Allow elements navigation with mousewheel + modal : false, // enable modal mode (no closing on overlay click) + rclick_prevent : false, // whether to avoid right click on lightbox + + elems_parsed : function() {}, + html_is_ready : function() {}, + on_open : function() {}, + on_elem_switch : function() {}, + slideshow_start : function() {}, + slideshow_end : function() {}, + on_fs_enter : function() {}, + on_fs_exit : function() {}, + on_close : function() {}, + + }, settings); + + + // Variables accessible globally + var lcl_vars = { + elems : [], // elements object / src: url/text (only required data), title: (string), descr: (string), author: (string), type: image/iframe/text + is_arr_instance : (typeof(obj) != 'string' && typeof(obj[0].childNodes) == 'undefined') ? true : false, // true if lightbox is initialized usign direct array immission + elems_count : (typeof(obj) != 'string' && typeof(obj[0].childNodes) == 'undefined') ? obj.length : $(obj).length, // elements count at the moment of lb initialization + elems_selector : (typeof(obj) == 'string') ? obj : false, // elements selector - used for dynamic elements fetching + elem_index : false, // current element index + gallery_hook_val: false, // gallery hook value - to discard other ones + preload_all_used: false, // flag to know when complete preload on document's ready has been triggered + img_sizes_cache : [], // store image sizes after their preload - index is images index + vimeo_thumb_cache: [], // store vimeo thumbs already preloaded - indexes are video URLs + + inner_cmd_w : false, // store inner commands width for inner->outer switch + txt_exists : false, // any text exists in current element? + txt_und_sizes : false, // custom lb sizes after text under calculation + force_fullscreen: false, // flag to know whether to simulate "always fs" for small screens + html_style : '', // html tag style (for scrollbar hiding) + body_style : '', // body tag style (for scrollbar hiding) + }; + + + // textal element selector has been used? setup the real obj + if(typeof(obj) == 'string') { + obj = $(obj); + } + + + // .data() system to avoid issues on multi instances + var lcl_ai_opts = $.data(obj, 'lcl_settings', lcl_settings); + var lcl_ai_vars = $.data(obj, 'lcl_vars', lcl_vars); + + + + ///////////////////////////////////////////////////////////// + + + + /* given a string - returns an unique numerical hash */ + var get_hash = function(str) { + if(typeof(str) != 'string') { + return str; + } + + var hash = 0, i = 0, len = str.toString().length; + + while (i < len) { + hash = ((hash << 5) - hash + str.charCodeAt(i++)) << 0; + } + return (hash < 0) ? hash * -1 : hash; + }; + + + + /* element already elaborated? check through hash - returns false or elem object */ + var obj_already_man = function(hash) { + var found = false; + + $.each(lcl_ai_vars.elems, function(i, v) { + if(v.hash == hash) { + found = v; + return false; + } + }); + return found; + }; + + + + /* get video ID from youtube/vimeo/dailymotion */ + var get_video_id = function(type, elem) { + var id = ''; + + switch(type) { + case 'youtube' : + var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/; + var match = elem.src.match(regExp); + id = (match&&match[7].length==11)? match[7] : false; + break; + + case 'vimeo' : + var arr = elem.src.split('/'); + id = arr[ (arr.length -1) ]; + break; + + case 'dailymotion' : + var arr = elem.src.split('/'); + var last = arr[ (arr.length -1) ]; + var last_arr = last.split('_'); + id = last_arr[0]; + break; + } + + return id; + }; + + + /* revert HTML entitles that might have been used in attrs (and trim) */ + var revert_html_entit = function(str) { + if(!str) {return str;} + + str = str.replace(/</g, '<') + .replace(/>/g, '>') + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(/'/g, "'"); + return $.trim(str); + }; + + + /* returns title/text/author detecting whether to get an attribute or selector */ + var attr_or_selector_data = function($elem, subj_key) { + var o = lcl_ai_opts; + var subj = o[subj_key]; + + if(subj.indexOf('> ') !== -1) { + return ($elem.find( subj.replace('> ', '') ).length) ? $.trim( $elem.find( subj.replace('> ', '') ).html()) : ''; + } + else { + return (typeof($elem.attr( subj )) != 'undefined') ? revert_html_entit( $elem.attr( subj )) : ''; + } + }; + + + + /* elaborate binded elements */ + var setup_elems_obj = function($subj) { + var o = lcl_ai_opts; + + // [src: url/selector (only required data), title: (string), descr: (string), author: (string), ajax: bool, type: image/frame/text] + var new_elems = []; + $subj.each(function() { + var $e = $(this); + var src = $e.attr( o.src_attr ); + var hash = get_hash(src); + + // check against gallery hook + if(lcl_ai_vars.gallery_hook_val && $e.attr(o.gallery_hook) != lcl_ai_vars.gallery_hook_val) { + return true; + } + + var already_man = obj_already_man(hash); + if(already_man) { + var el = already_man; + } + else { + var type = el_type_finder(src, $e.data('lcl-type')); + + // compose + if(type != 'unknown') { + var el = { + src : src, + type : type, + hash : (o.deeplink) ? get_hash(src) : false, + title : (o.show_title) ? attr_or_selector_data($e, 'title_attr') : '', + txt : (o.show_descr) ? attr_or_selector_data($e, 'txt_attr') : '', + author : (o.show_author) ? attr_or_selector_data($e, 'author_attr') : '', + thumb : (o.thumb_attr && typeof(o.thumb_attr) != 'undefined') ? $e.attr(o.thumb_attr) : '', + + width : (type != 'image' && typeof($e.data('lcl-w')) != 'undefined') ? $e.data('lcl-w') : false, + height : (type != 'image' && typeof($e.data('lcl-h')) != 'undefined') ? $e.data('lcl-h') : false, + + force_over_data : (typeof($e.data('lcl-force-over-data')) != 'undefined') ? parseInt($e.data('lcl-force-over-data'), 10) : '', + force_outer_cmd : (typeof($e.data('lcl-outer-cmd')) != 'undefined') ? $e.data('lcl-outer-cmd') : '', + canonical_url : (typeof($e.data('lcl-canonical-url')) != 'undefined') ? $e.data('lcl-canonical-url') : '', + }; + + + // download attribute + if(type == 'image') { + el.download = (typeof($e.data('lcl-path')) != 'undefined') ? $e.data('lcl-path') : src; + } else { + el.download = ((type == 'video' || type == 'html') && typeof($e.data('lcl-path')) != 'undefined') ? $e.data('lcl-path') : false; + } + + // if youtube/vimeo/dailymotion - store video ID + if($.inArray(type, ['youtube', 'vimeo', 'dailymotion']) !== -1) { + el.video_id = get_video_id(type, el); + } + + // search for poster + if(type != 'image' && typeof($e.data('lcl-poster')) != 'undefined') { + + // youtube supports also "auto" value - use the endpoint + if(type == 'youtube' && $e.data('lcl-poster') == 'auto') { + el.poster = 'https://img.youtube.com/vi/'+ el.video_id +'/maxresdefault.jpg'; + } else { + el.poster = $e.data('lcl-poster'); + } + } + } + else { + var el = { + src : src, + type : type, + hash : (o.deeplink) ? get_hash(src) : false + }; + } + } + + new_elems.push(el); + }); + + // if only one element - remove nav arrows and thumbs nav + if(new_elems.length < 2) { + $('.lcl_prev, .lcl_next, #lcl_thumb_nav').remove(); + } + + if(!new_elems.length) { + return false; + } + + // setup + lcl_ai_vars.elems = new_elems; + return true; + }; + + + /* given element source - return its type | accepts type forcing */ + var el_type_finder = function(src, forced_type) { + if(typeof(forced_type) == 'undefined') { + forced_type = lcl_ai_opts.global_type; + } + if($.inArray(forced_type, ['image', 'video', 'youtube', 'vimeo', 'dailymotion', 'html', 'iframe']) !== -1) { + return forced_type; + } + + src = src.toLowerCase(); + var img_regex = /^(http|https)?:\/\/(?:[a-z\-]+\.)+[a-z]{2,6}(?:\/[^\/#?]+)+\.(?:jpe?g|gif|png|webp|avif)$/; + var video_regex = /^(http|https)?:\/\/(?:[a-z\-]+\.)+[a-z]{2,6}(?:\/[^\/#?]+)+\.(?:mp4|ogg|webm)$/; + var yt_regex = /^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})(?:\S+)?$/; + var url_regex = /^(http|https)?:\/\/[a-zA-Z0-9-\.]+\.[a-z]{2,4}/; + + + if(img_regex.test(src)) { // image matching + return 'image'; + } + else if(video_regex.test(src)) { // video matching + return 'video'; + } + else if(yt_regex.test(src)) { // youtube + return 'youtube'; + } + else if(src.indexOf('vimeo.com/') !== -1) { // vimeo + return 'vimeo'; + } + else if(src.indexOf('dailymotion.com/video') !== -1) { // dailymotion + return 'dailymotion'; + } + else if(url_regex.test(src)) { // iframe + return 'iframe'; + } + else if(src.substr(0,1) == '#' && $(src).length) { // html + return 'html'; + } + + return 'unknown'; + }; + + + ///////////// + + + /* smart images preload */ + var close_img_preload = function() { + if(lcl_ai_vars.elems.length < 2 || !lcl_ai_opts.gallery) { + return false; + } + + if(lcl_ai_vars.elem_index > 0) { // prev + + maybe_preload(false, (lcl_ai_vars.elem_index - 1)); + } + if(lcl_ai_vars.elem_index != (lcl_ai_vars.elems.length - 1)) { // next + maybe_preload(false, (lcl_ai_vars.elem_index + 1)); + } + }; + + + /* preload images and eventually trigger showing function - if index not specified, loads current index */ + var maybe_preload = function(show_when_ready, el_index, cache_check) { + var v = lcl_ai_vars; + + // if forced index is missing - use current one + if(typeof(el_index) == 'undefined') { + el_index = v.elem_index; + } + if(typeof(el_index) == 'undefined') { // if lightbox has alraedy been closed + return false; + } + + // is a preloadable element? + if(v.elems[el_index].type == 'image' || ($.inArray(v.elems[el_index].type, ['video', 'youtube', 'vimeo', 'dailymotion']) !== -1 && v.elems[el_index].poster)) { + var to_preload = (v.elems[el_index].type == 'image') ? v.elems[el_index].src : v.elems[el_index].poster; + } + else {var to_preload = '';} + + if(to_preload && typeof(v.img_sizes_cache[to_preload]) == 'undefined') { + let img = new Image(); + img.src = to_preload; + + img.onload = function(e) { + v.img_sizes_cache[to_preload] = { + w : e.target.width, + h : e.target.height + }; + + // if sizes are zero, recalculate + if(show_when_ready && el_index == v.elem_index) { + show_element(); + } + }; + } + else { + if(show_when_ready || typeof(cache_check) != 'undefined') { + $('#lcl_loader').addClass('no_loader'); + } + if(show_when_ready) { + show_element(); + } + } + }; + + + + // handle video poster click and setup iframe + wait until it's loaded + $(document).on('click', '.lcl_postered_video:not(.lcl_poster_clicked)', function() { + var $iframe = $(this).find('iframe'); + + $(this).addClass('lcl_poster_clicked'); + $iframe.attr('src', $iframe.data('lazy-src') ); + + // remove poster to avoid bad results on resize + $iframe.on('load', function() { + $('#lcl_wrap').addClass('lcl_playing_video'); + + setTimeout(function() { + $iframe.parent().removeAttr('style'); + }, 100); + }); + }); + + + // iframes preload - wait until it is loaded + var iframes_preload = function() { + var $subj = $('#lcl_wrap[lc-lelem='+ lcl_ai_vars.elem_index +'] #lcl_elem_wrap > iframe'); + if(!$subj.length) {return false;} + + $('#lcl_wrap').addClass('lcl_loading_iframe'); + temp_slideshow_stop(); + + $subj.on('load', function() { + $('#lcl_wrap').removeClass('lcl_loading_iframe'); + + // set focus to allow scroll + setTimeout(function() { + if($('iframe.lcl_elem').length) { + $('iframe.lcl_elem')[0].contentWindow.focus(); + } + }, 20); + + // restart slideshow + if($('.lcl_is_playing').length) { + lcl_start_slideshow(true); + } + }); + }; + + + ///////////// + + + /* elements parsing */ + var elems_parsing = function(inst_obj, $clicked_obj) { + var o = $.data(inst_obj, 'lcl_settings'); + var vars = $.data(inst_obj, 'lcl_vars'); + + // direct array initialization - validate and setup hashes + if(vars.is_arr_instance) { + var elems = []; + + $.each(inst_obj, function(i,v) { + var el = {}; + + var el_type = (typeof(v.type) == 'undefined' && o.global_type) ? o.global_type : false; + if(typeof(v.type) != 'undefined') {el_type = v.type;} + + if(el_type && $.inArray(el_type, ['image', 'video', 'youtube', 'vimeo', 'dailymotion', 'html', 'iframe']) !== -1) { + if(typeof(v.src) != 'undefined' && v.src) { + el.src = v.src; + el.type = el_type; + el.hash = get_hash(v.src); + + el.title = (typeof(v.title) == 'undefined') ? '' : revert_html_entit(v.title); + el.txt = (typeof(v.txt) == 'undefined') ? '' : revert_html_entit(v.txt); + el.author = (typeof(v.author) == 'undefined') ? '' : revert_html_entit(v.author); + + el.width = (typeof(v.width) == 'undefined') ? false : v.width; + el.height = (typeof(v.height) == 'undefined') ? false : v.height; + + el.force_over_data = (typeof(v.force_over_data) == 'undefined') ? false : parseInt(v.force_over_data, 10); + el.force_outer_cmd = (typeof(v.force_outer_cmd) == 'undefined') ? false : v.force_outer_cmd; + el.canonical_url = (typeof(v.canonical_url) == 'undefined') ? false : v.canonical_url; + + el.thumb = (typeof(v.thumb) == 'undefined') ? false : v.thumb; + + + // download calculate type and parameter + if(el_type == 'image') { + el.download = (typeof(v.download) != 'undefined') ? v.download : v.src; + } else { + el.download = ((el_type == 'video' || el_type == 'html') && typeof(v.download) != 'undefined') ? v.download : false; + } + + // if youtube/vimeo/dailymotion - store video ID + if($.inArray(el_type, ['youtube', 'vimeo', 'dailymotion']) !== -1) { + el.video_id = get_video_id(el_type, v); + } + + // if video/html/iframe - search for poster + el.poster = (el_type == 'image' || typeof(v.poster) == 'undefined') ? '' : v.poster; + + elems.push(el); + } + } + else { + var el = { + src : el.src, + type : 'unknown', + hash : (o.deeplink) ? get_hash(el.src) : false + }; + elems.push(el); + } + }); + + vars.elems = elems; + } + + + // if is from DOM object - prepare elements object + else { + var $subj = inst_obj; + + // can fetch elements in real-time? save selector + if(o.live_elements && vars.elems_selector) { + var consider_group = ($clicked_obj && o.gallery && o.gallery_hook && typeof($(obj[0]).attr(o.gallery_hook)) != 'undefined') ? true : false; + + var sel = (consider_group) ? vars.elems_selector +'['+ o.gallery_hook +'='+ $clicked_obj.attr( o.gallery_hook ) +']' : vars.elems_selector; + $subj = $(sel); + } + + if(!setup_elems_obj($subj)) { + if(!o.live_elements || (o.live_elements && !vars.elems_selector)) { + console.error('LC Lightbox - no valid elements found'); + } + return false; + } + } + + + // if preload every image on document's ready + if(o.preload_all && !vars.preload_all_used) { + vars.preload_all_used = true; + + $(document).ready(function(e) { + $.each(vars.elems, function(i, v) { + maybe_preload(false, i); + }); + }); + } + + ///// + + // elements parsed - throw callback + if(typeof(o.elems_parsed) == 'function') { + o.elems_parsed.call(null, lcl_ai_opts, lcl_ai_vars); + } + + // elements parsed | args: elements array + if(!vars.is_arr_instance) { + var $subj = (vars.elems_selector) ? $(vars.elems_selector) : inst_obj; + $subj.first().trigger('lcl_elems_parsed', [vars.elems]); + } + + return true; + }; + elems_parsing(obj); // parsing on lightbox INIT + + + + //////////////////////////////////////////////////////////// + + + + /* open lightbox */ + var open_lb = function(inst_obj, $clicked_obj) { + if(lcl_shown || lcl_is_active) {return false;} + lcl_shown = true; + lcl_is_active = true; + + // setup static globals + lcl_curr_obj = inst_obj; + lcl_ai_opts = $.data(inst_obj, 'lcl_settings'); + lcl_ai_vars = $.data(inst_obj, 'lcl_vars'); + + lcl_curr_opts = lcl_ai_opts; + lcl_curr_vars = lcl_ai_vars; + + var o = lcl_ai_opts; + var v = lcl_ai_vars; + var $co = (typeof($clicked_obj) != 'undefined') ? $clicked_obj : false; + + + // check instance existence + if(!lcl_ai_vars) { + console.error('LC Lightbox - cannot open. Object not initialized'); + return false; + } + + + // set gallery hook value + v.gallery_hook_val = ($co && o.gallery && o.gallery_hook && typeof($co.attr(o.gallery_hook)) != 'undefined') ? $co.attr(o.gallery_hook) : false; + + // parse elements + if(!elems_parsing(inst_obj, $clicked_obj)) { + return false; + } + + // if there is a clicked element - set selected index + if($co) { + $.each(v.elems, function(i, e) { + if( e.src == $co.attr(o.src_attr) ) { + v.elem_index = i; + return false; + } + }); + + + } + + // array or deeplink initialization - check index existence + else { + if(parseInt(v.elem_index, 10) >= v.elems_count) { + console.error('LC Lightbox - selected index does not exist'); + return false; + } + } + + // try recalling cached images to already shape lightbox + maybe_preload(false); + + // setup lightbox code + setup_code(); + + if((o.touchswipe)) { + touch_events(); + } + + // directly fullscreen? + if(v.force_fullscreen) { + enter_fullscreen(true, true); + } + + // prepare thumbs nav + if($('#lcl_thumbs_nav').length) { + setup_thumbs_nav(); + } + + // prepare first element and show + maybe_preload(true); + close_img_preload(); + }; + + + /* remove lightbox pre-show classes */ + var rm_pre_show_classes = function() { + // show window and overlay + $('#lcl_wrap').removeClass('lcl_pre_show').addClass('lcl_shown'); + $('#lcl_loader').removeClass('lcl_loader_pre_first_el'); + }; + + + /* setup lightbox code */ + var setup_code = function() { + var o = lcl_ai_opts; + var v = lcl_ai_vars; + + var wrap_classes = []; + var css = ''; + + // add class if IE <= 11 and for commands positions + if(typeof(document.documentMode) == 'number') { + $('body').addClass('lcl_old_ie'); + + // actually disable middle nav + if(o.cmd_position != 'outer') {o.nav_btn_pos = 'normal';} + } + + if($('#lcl_wrap').length) {$('#lcl_wrap').remove();} + $('body').append(lb_code); + + + // lightbox max sizes + $('#lcl_wrap').attr('data-lcl-max-w', o.max_width).attr('data-lcl-max-h', o.max_height); + + + // command positions classes + wrap_classes.push('lcl_'+o.ins_close_pos+'_close lcl_nav_btn_'+o.nav_btn_pos+' lcl_'+ o.ins_close_pos +'_close lcl_nav_btn_'+ o.nav_btn_pos); + + // hidden thumbs nav class + if( + o.tn_hidden === true || + (typeof(o.tn_hidden) == 'number' && ($(window).width() < o.tn_hidden || $(window).height() < o.tn_hidden)) + ) { + wrap_classes.push('lcl_tn_hidden'); + } + + // hide texts class + if( + o.txt_hidden === true || + (typeof(o.txt_hidden) == 'number' && ($(window).width() < o.txt_hidden || $(window).height() < o.txt_hidden)) + ) { + wrap_classes.push('lcl_hidden_txt'); + } + + // no carousel class + if(!o.carousel) { + wrap_classes.push('lcl_no_carousel'); + } + + // comments class + if(o.comments) { + wrap_classes.push('lcl_has_comments'); + } + + // mobile class + if(lcl_on_mobile) {wrap_classes.push('lcl_on_mobile');} + + // custom classes + if(o.wrap_class) {wrap_classes.push(o.wrap_class);} + + // manage elements + wrap_classes.push('lcl_'+ o.cmd_position +'_cmd'); + if(o.cmd_position != 'inner') { + var nav = $('#lcl_nav_cmd').detach(); + $('#lcl_wrap').prepend(nav); + } + + if(!o.slideshow) {$('.lcl_play').remove();} + if(!o.txt_toggle_cmd) {$('.lcl_txt_toggle').remove();} + if(!o.socials) {$('.lcl_socials').remove();} + if(!o.download) {$('.lcl_download').remove();} + if(!o.img_zoom) {$('.lcl_zoom_icon').remove();} + if(!o.counter || v.elems.length < 2 || !o.gallery) {$('.lcl_counter').remove();} + + // fullscreen + v.force_fullscreen = false; + if(!o.fullscreen) { + $('.lcl_fullscreen').remove(); + } + else if(o.fs_only === true || (typeof(o.fs_only) == 'number' && ($(window).width() < o.fs_only || $(window).height() < o.fs_only))) { + $('.lcl_fullscreen').remove(); + lcl_ai_vars.force_fullscreen = true; + } + + // prev/next buttons + if(v.elems.length < 2 || !o.gallery) { + $('.lcl_prev, .lcl_play, .lcl_next').remove(); + } else { + if(o.nav_btn_pos == 'middle') { + css += '.lcl_prev, .lcl_next {margin: '+ o.padding +'px;}'; + } + } + + // thumbs nav + if(!o.thumbs_nav || lcl_ai_vars.elems.length < 2 || !o.gallery) { + $('#lcl_thumbs_nav, .lcl_thumbs_toggle').remove(); + } + else { + $('#lcl_thumbs_nav').css('height', o.thumbs_h); // use JS to pick outerHeight after + + var th_margins = $('#lcl_thumbs_nav').outerHeight(true) - o.thumbs_h; + css += '#lcl_window {margin-top: '+ ((o.thumbs_h - th_margins ) * -1) +'px;}'; + + // center lightbox if cmds are on top and thumbs are hidden + css += '.lcl_tn_hidden.lcl_outer_cmd:not(.lcl_fullscreen_mode) #lcl_window {margin-bottom: '+ ($('.lcl_close').outerHeight(true) * -1) +'px;}'; + } + + ////// + + // apply skin and layout + wrap_classes.push('lcl_txt_'+ o.data_position +' lcl_'+ o.skin); + + css += '#lcl_overlay {background-color: '+ o.thumbs_h +'px; opacity: '+ o.ol_opacity +';}'; + + if(o.ol_pattern) {$('#lcl_overlay').addClass('lcl_pattern_'+ o.ol_pattern);} + if(o.modal) {$('#lcl_overlay').addClass('lcl_modal');} + + if(o.wrap_padding) {css += '#lcl_wrap {padding: '+ o.wrap_padding +';}';} + if(o.border_w) {css += '#lcl_window {border: '+ o.border_w +'px solid '+ o.border_col +';}';} + if(o.padding) {css += '#lcl_subj, #lcl_txt, #lcl_nav_cmd {margin: '+ o.padding +'px;}';} + if(o.radius) {css += '#lcl_window, #lcl_contents_wrap {border-radius: '+ o.radius +'px;}';} + if(o.shadow) {css += '#lcl_window {box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);}';} + + if(o.cmd_position == 'inner' && o.ins_close_pos == 'corner') { + css += '#lcl_corner_close {'+ + 'top: '+ ((o.border_w + Math.ceil($('#lcl_corner_close').outerWidth() / 2)) * -1) +'px;'+ + 'right: '+ ((o.border_w + Math.ceil($('#lcl_corner_close').outerHeight() / 2)) * -1) +';'+ + '}'; + + + // if no button is in inner cmd w/ corner close - hide bar (not on FS) + if(!$('#lcl_nav_cmd > *:not(.lcl_close)').length) { + css += '#lcl_wrap:not(.lcl_fullscreen_mode):not(.lcl_forced_outer_cmd) #lcl_nav_cmd {'+ + 'display: none;'+ + '}'; + } + } + + // custom CSS + if($('#lcl_inline_style').length) {$('#lcl_inline_style').remove();} + $('head').append( + ''); + + ////// + + // backup html/body inline CSS + if(o.remove_scrollbar) { + lcl_ai_vars.html_style = (typeof(jQuery('html').attr('style')) != 'undefined') ? jQuery('html').attr('style') : ''; + lcl_ai_vars.body_style = (typeof(jQuery('body').attr('style')) != 'undefined') ? jQuery('body').attr('style') : ''; + + // avoid page scrolling and maintain contents position + var orig_page_w = $(window).width(); + $('html').css('overflow', 'hidden'); + + $('html').css({ + 'margin-right' : ($(window).width() - orig_page_w), + 'touch-action' : 'none' + }); + + $('body').css({ + 'overflow' : 'visible', + 'touch-action' : 'none' + }); + } + + + // opening element could already be shaped? + var el = lcl_ai_vars.elems[v.elem_index]; + if(el.type != 'image' || (el.type == 'image' && typeof(v.img_sizes_cache[el.src]) != 'undefined')) { + wrap_classes.push('lcl_show_already_shaped'); + } else { + rm_pre_show_classes(); + } + + + // apply wrap classes + $('#lcl_wrap').addClass( wrap_classes.join(' ') ); + + + ////// + + // html is appended and ready - callback + if(typeof(o.html_is_ready) == 'function') { + o.html_is_ready.call(null, lcl_ai_opts, lcl_ai_vars); + } + + // lightbox html has been appended and managed + if(!lcl_ai_vars.is_arr_instance) { + var $subj = (lcl_ai_vars.elems_selector) ? $(lcl_ai_vars.elems_selector) : lcl_curr_obj; + $subj.first().trigger('lcl_html_is_ready', [lcl_ai_opts, lcl_ai_vars]); + } + }; + + + + // prevent page touch scroll while moving a specific element + var no_body_touch_scroll = function(selector) { + + var _overlay = $(selector)[0]; + var _clientY = null; // remember Y position on touch start + + _overlay.addEventListener('touchstart', function (event) { + if (event.targetTouches.length === 1) { + // detect single touch + _clientY = event.targetTouches[0].clientY; + } + }, false); + + _overlay.addEventListener('touchmove', function (event) { + if (event.targetTouches.length === 1) { + // detect single touch + disableRubberBand(event); + } + }, false); + + function disableRubberBand(event) { + var clientY = event.targetTouches[0].clientY - _clientY; + + if (_overlay.scrollTop === 0 && clientY > 0) { + // element is at the top of its scroll + event.preventDefault(); + } + + if (isOverlayTotallyScrolled() && clientY < 0) { + //element is at the top of its scroll + event.preventDefault(); + } + } + + function isOverlayTotallyScrolled() { + // https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight#Problems_and_solutions + return _overlay.scrollHeight - _overlay.scrollTop <= _overlay.clientHeight; + } + }; + + + + /* show element in lightbox */ + var show_element = function() { + if(!lcl_shown) {return false;} + + var v = lcl_ai_vars; + var el = v.elems[v.elem_index]; + + $('#lcl_wrap').attr('lc-lelem', v.elem_index); + + // if not carousel - set classes + if(!lcl_ai_opts.carousel) { + $('#lcl_wrap').removeClass('lcl_first_elem lcl_last_elem'); + + if(!v.elem_index) { + $('#lcl_wrap').addClass('lcl_first_elem'); + } + else if(v.elem_index == (v.elems.length - 1)) { + $('#lcl_wrap').addClass('lcl_last_elem'); + } + } + + // global trigger - before element population | args: element object, element index + $(document).trigger('lcl_before_populate_global', [el, v.elem_index]); + + // populate + populate_lb(el); + + ////// + + // trigger right before EVERY element showing | args: element index, element object + if(!v.is_arr_instance) { + var $subj = (v.elems_selector) ? $(v.elems_selector) : lcl_curr_obj; + $subj.first().trigger('lcl_before_show', [el, v.elem_index]); + } + + // global trigger - before EVERY element showing | args: element object, element index + $(document).trigger('lcl_before_show_global', [el, v.elem_index]); + + ////// + + // actions on first opening + if($('#lcl_wrap').hasClass('lcl_pre_first_el')) { + + // first element show - callback + if(typeof(lcl_ai_opts.on_open) == 'function') { + lcl_ai_opts.on_open.call(null, lcl_ai_opts, lcl_ai_vars); + } + + // first element show | args: element + if(!v.is_arr_instance) { + var $subj = (v.elems_selector) ? $(v.elems_selector) : lcl_curr_obj; + $subj.first().trigger('lcl_on_open', [el, v.elem_index]); + } + } + + ////// + + // set sizes and display + size_elem(el); + + ////// + + $('#lcl_subj').removeClass('lcl_switching_el'); + }; + + + + /* element has text ? */ + var elem_has_txt = function(el) { + return (el.title || el.txt || el.author) ? true : false; + }; + + + /* populate lightbox */ + var populate_lb = function(el){ + var el_index = lcl_ai_vars.elem_index; + + // reset + $('#lcl_elem_wrap').removeAttr('style').removeAttr('class').empty(); + + // set classes/atts + $('#lcl_wrap').attr('lcl-type', el.type); + $('#lcl_elem_wrap').addClass('lcl_'+ el.type +'_elem'); + + // setup subect + switch(el.type) { + case 'image' : + $('#lcl_elem_wrap').css('background-image', 'url(\''+ el.src +'\')'); + break; + + + case 'video' : + + // be sure video.js has been added + if(!$('#lcl_videojs_css').length) { + $('head').append(''); + + if(typeof(videojs) != 'function') { + $('head').append(''); + } + } + + // wait until video.js is loaded + if(typeof(videojs) != 'function') { + $('#lcl_wrap').addClass('lcl_loading_videojs'); + temp_slideshow_stop(); + + setTimeout(function() { + if(el_index == lcl_ai_vars.elem_index) { + populate_lb(el); + } + }, 30); + return false; + } + else { + $('#lcl_wrap').removeClass('lcl_loading_videojs'); + lcl_vid_instance_num++; + + // support multiple video formats + var vids = el.src.split(';'); + var v_sources = ''; + $.each(vids, function(i,v_url) { + v_sources += ''; + }); + + const autoplay = (lcl_settings.autoplay_videos && !el.poster) ? 'autoplay' : ''; + + $('#lcl_elem_wrap').html( + ''); + $('#lcl_elem_wrap').css('position', 'static'); + + + videojs('lcl_video_elem'+ lcl_vid_instance_num, { + "poster": el.poster + }); + $('.lcl_elem').addClass('video-js'); + + // restart slideshow + if($('.lcl_is_playing').length) { + lcl_start_slideshow(true); + } + } + break; + + + case 'youtube' : + if(el.poster) { + $('#lcl_elem_wrap').html( + '
'+ + ''+ + '
'); + } + else { + const autoplay = (lcl_settings.autoplay_videos) ? '&autoplay=1' : ''; + + $('#lcl_elem_wrap').html(''); + $('#lcl_wrap').addClass('lcl_playing_video'); + } + + $('#lcl_elem_wrap').css('position', 'static'); + break; + + case 'vimeo' : + if(el.poster) { + $('#lcl_elem_wrap').html( + '
'+ + ''+ + '
'); + } + else { + const autoplay = (lcl_settings.autoplay_videos) ? '&autoplay=1' : ''; + + $('#lcl_elem_wrap').html(''); + $('#lcl_wrap').addClass('lcl_playing_video'); + } + + $('#lcl_elem_wrap').css('position', 'static'); + break; + + case 'dailymotion' : + if(el.poster) { + $('#lcl_elem_wrap').html( + '
'+ + ''+ + '
'); + } + else { + const autoplay = (lcl_settings.autoplay_videos) ? '&autoPlay=1' : ''; + + $('#lcl_elem_wrap').html(''); + + $('#lcl_wrap').addClass('lcl_playing_video'); + } + + $('#lcl_elem_wrap').css('position', 'static'); + break; + + case 'html' : + $('#lcl_elem_wrap').html('
'+ $(el.src).html() +'
'); + break; + + case 'iframe' : + $('#lcl_elem_wrap').html(''); + $('#lcl_elem_wrap').css('position', 'static'); + break; + + default : // error message size + $('#lcl_elem_wrap').html('

Error loading the resource ..
'); + break; + } + + // preload iframes + if($.inArray(el.type, ['image', 'video', 'unknown', 'html']) === -1) { + iframes_preload(); + } + + + if(lcl_curr_opts.download) { + if(el.download) { + $('.lcl_download').show(); + + var arr = el.download.split('/'); + var filename = arr[ (arr.length -1) ]; + $('.lcl_download').html(''); + } else { + $('.lcl_download').hide(); + } + } + + // counter + $('.lcl_counter').html( (el_index+1) +' / '+ lcl_ai_vars.elems.length ); + + // texts + if(elem_has_txt(el) && el.type != 'unknown') { + $('#lcl_wrap').removeClass('lcl_no_txt'); + $('.lcl_txt_toggle').show(); + + if(el.title) {$('#lcl_txt').append('

'+ el.title +'

');} + if(el.author) {$('#lcl_txt').append('
'+ lcl_settings.author_by_txt +' '+ el.author +'
');} + if(el.txt) {$('#lcl_txt').append('
'+ el.txt +'
');} + + // set class for bottom border + if(el.txt) { + if(el.title && el.author) { + $('#lcl_txt h5').addClass('lcl_txt_border'); + } + else { + if($('#lcl_txt h3').length) { + $('#lcl_txt h3').addClass('lcl_txt_border'); + } else { + $('#lcl_txt h5').addClass('lcl_txt_border'); + } + } + } + + add_comments(); + } + else { + $('.lcl_txt_toggle').hide(); + $('#lcl_wrap').addClass('lcl_no_txt'); + } + + + // prevent body scroll moving text + no_body_touch_scroll('#lcl_txt'); + }; + + + /* + * given a CSS size (integer (px), %, vw or vh) returns the related pixel value + * dimension = w or h + */ + var css_size_to_px = function(size, dimension, ignore_max) { + var px = 0; + var $wrap = $('#lcl_wrap'); + + var win_w = $(window).width() - parseInt($wrap.css('padding-left'), 10) - parseInt($wrap.css('padding-right'), 10); + var win_h = $(window).height() - parseInt($wrap.css('padding-top'), 10) - parseInt($wrap.css('padding-bottom'), 10); + + if(!isNaN(parseFloat(size)) && isFinite(size)) { // integer value + px = parseInt(size, 10); + } + else if (size.toString().indexOf('%') !== -1) { + var val = (dimension == 'w') ? win_w : win_h; + px = val * (parseInt(size, 10) / 100); + } + else if (size.toString().indexOf('vw') !== -1) { + px = win_w * (parseInt(size, 10) / 100); + } + else if (size.toString().indexOf('vh') !== -1) { + px = win_h * (parseInt(size, 10) / 100); + } + + // avoid > 100% values + if(typeof(ignore_max) == 'undefined') { + if(dimension == 'w' && px > win_w) {px = win_w;} + if(dimension == 'h' && px > win_h) {px = win_h;} + } + return px; + }; + + + /* set element sizes */ + var size_elem = function(el, flags, txt_und_sizes) { // flags: no_txt_under, inner_cmd_checked + var o = lcl_ai_opts; + var v = lcl_ai_vars; + var w, h; + + if(typeof(flags) == 'undefined') {flags = {};} + var fs_mode = ($('.lcl_fullscreen_mode').length) ? true : false; + + // calculate padding and borders + var add_space = (fs_mode) ? 0 : ((parseInt(o.border_w, 10) * 2) + (parseInt(o.padding, 10) * 2)); + + // is side-text layout? remove forced on hover + if(typeof(flags.side_txt_checked) == 'undefined' && (typeof(flags.no_txt_under) == 'undefined' || !flags.no_txt_under)) { + $('#lcl_wrap').removeClass('lcl_force_txt_over'); + } + var side_txt = (!$('.lcl_force_txt_over').length && !$('.lcl_hidden_txt').length && $.inArray(o.data_position, ['rside', 'lside']) !== -1 && elem_has_txt(el)) ? $('#lcl_txt').outerWidth() : 0; + + // has thumbs nav? + var thumbs_nav = (!fs_mode && $('#lcl_thumbs_nav').length && !$('.lcl_tn_hidden').length) ? $('#lcl_thumbs_nav').outerHeight(true) - parseInt($('#lcl_wrap').css('padding-bottom'), 10) : 0; + + // outer commands? + var cmd_h = (!fs_mode && $('.lcl_outer_cmd').length) ? $('.lcl_close').outerHeight(true) + parseInt($('#lcl_nav_cmd').css('padding-top'), 10) + parseInt($('#lcl_nav_cmd').css('padding-bottom'), 10) : 0; + + // wrap-up px to remove + var horiz_add_space = add_space + side_txt; + var vert_add_space = add_space + thumbs_nav + cmd_h; + + // calculate max sizes + var max_w_attr = $('#lcl_wrap').attr('data-lcl-max-w'); + var max_h_attr = $('#lcl_wrap').attr('data-lcl-max-h'); + + var max_w = (fs_mode) ? $(window).width() : Math.floor(css_size_to_px(max_w_attr, 'w')) - horiz_add_space; + var max_h = (fs_mode) ? $(window).height() : Math.floor(css_size_to_px(max_h_attr, 'h')) - vert_add_space; + + ///////// + + // sizes already calculated by text under processor + if(typeof(v.txt_und_sizes) == 'object') { + w = v.txt_und_sizes.w; + h = v.txt_und_sizes.h; + + if(el.type == 'image') { + var img_sizes = v.img_sizes_cache[ el.src ]; + } + } + + // normal processing + else { + switch(el.type) { + case 'image' : // discard forced sizes + $('#lcl_elem_wrap').css('bottom', 0); + + // no image found in cache - wait a bit and retry + if(typeof(v.img_sizes_cache[ el.src ]) == 'undefined') { + setTimeout(function() { + size_elem(el, flags, txt_und_sizes); + }, 50); + + return false; + } + var img_sizes = v.img_sizes_cache[ el.src ]; + + // get image sizes + if(img_sizes.w <= max_w) { + w = img_sizes.w; + h = img_sizes.h; + } else { + w = max_w; + h = Math.floor(w * (img_sizes.h / img_sizes.w)); + } + + // height is bigger than max one? + if(h > max_h) { + h = max_h; + w = Math.floor(h * (img_sizes.w / img_sizes.h)); + } + + // calculate text under + if(elem_has_txt(el) && !$('.lcl_hidden_txt').length && o.data_position == 'under' && typeof(flags.no_txt_under) == 'undefined') { + txt_under_h(w, h, max_h); + + $(document).off('lcl_txt_und_calc').on('lcl_txt_und_calc', function() { + if(v.txt_und_sizes) { + if(v.txt_und_sizes == 'no_under') { + flags.no_txt_under = true; + } + + + + return size_elem( v.elems[ v.elem_index], flags); + } + }); + return false; + } + else { + $('#lcl_subj').css('maxHeight', 'none'); + } + break; + + + case 'video' : + case 'youtube' : + case 'vimeo' : + case 'dailymotion' : + case 'iframe' : + + // reset + $('.lcl_elem').css('height', '100%'); + + // is there any new max size? + if(el.width) {max_w = css_size_to_px(el.width, 'w') - horiz_add_space;} + if(el.height) {max_h = css_size_to_px(el.height, 'h') - vert_add_space;} + + //// get aspect ratio + // has both custom sizes? + if(el.width && el.height) { + var nc_w = css_size_to_px(el.width, 'w', true); + var nc_h = css_size_to_px(el.height, 'h', true); + + var w_ratio = nc_w / nc_h; + var h_ratio = nc_h / nc_w; + } + else { + var w_ratio = (el.type == 'iframe') ? (max_w / max_h) : 1.779; + var h_ratio = (el.type == 'iframe') ? (max_h / max_w) : 0.562; + } + + //// once we know max sizes and ratios - calculate size + // if has both custom sizes and they are smaller than max sizes + if(el.width && el.height && nc_w <= max_w && nc_h <= max_h) { + w = max_w; + h = max_h; + } + else { + w = max_w; + h = Math.round(w * h_ratio); // get height (respecting aspect ratio) + + if(h > max_h) { + h = max_h; + w = Math.round(h * w_ratio); + } + } + + + // calculate text under + if(elem_has_txt(el) && !$('.lcl_hidden_txt').length && o.data_position == 'under' && typeof(flags.no_txt_under) == 'undefined') { + txt_under_h(w, h, max_h); + + $(document).off('lcl_txt_und_calc').on('lcl_txt_und_calc', function() { + if(v.txt_und_sizes) { + if(v.txt_und_sizes == 'no_under') { + flags.no_txt_under = true; + } + + return size_elem(v.elems[ v.elem_index], flags); + } + }); + return false; + } + else { + $('#lcl_subj').css('maxHeight', 'none'); + } + break; + + + case 'html' : + + // has got custom maximum sizes? + if(el.width) {max_w = css_size_to_px(el.width, 'w') - horiz_add_space;} + if(el.height) {max_h = css_size_to_px(el.height, 'h') - vert_add_space;} + + w = max_w; + + if(o.data_position == 'under') { + (fs_mode) ? $('#lcl_wrap').addClass('lcl_force_txt_over') : $('#lcl_wrap').removeClass('lcl_force_txt_over'); + } + + var cwrap_h = (fs_mode) ? 'none' : max_h; + if(o.data_position == 'under' && !fs_mode) { + $('#lcl_contents_wrap').css('maxHeight', cwrap_h); + $('#lcl_subj').css('maxHeight', 'none'); + } + else { + $('#lcl_contents_wrap').css('maxHeight', 'none'); + $('#lcl_subj').css('maxHeight', cwrap_h); + } + + // set an height to avoid bumpy switch + if(!fs_mode) { + if(!$('.lcl_first_sizing').length) { + + $('.lcl_html_elem').css('width', w); + h = $('#lcl_elem_wrap').outerHeight(true); + $('.lcl_html_elem').css('width', 'auto'); + + if(o.data_position == 'under' && !fs_mode && $('#lcl_txt').length) { + $('#lcl_txt').css('width', w); + h = h + $('#lcl_txt').outerHeight(true); + $('#lcl_txt').css('width', 'auto'); + } + + if(h > max_h) {h = max_h;} + } + else { + $('#lcl_window').css('height', 'auto'); + } + } + break; + + + default : // error message size + w = 280; + h = 125; + + break; + } + } + + + // text on side - turn into text over if small screen or tiny lb + if( + (o.data_position == 'rside' || o.data_position == 'lside') && + !$('.lcl_no_txt').length && typeof(flags.side_txt_checked) == 'undefined' + ) { + var sto_w = w + add_space; + var sto_h = h + add_space; + var img_sizes = (el.type == 'image') ? v.img_sizes_cache[ el.src ] : ''; + + // forced text over threshold + var tot = el.force_over_data; + if(!tot) {tot = 400;} + + if(el.type != 'image' || (el.type == 'image' && img_sizes.w > tot && img_sizes.h > tot)) { + + if(!side_to_over_txt(el, tot, sto_w, sto_h, side_txt)) { + flags.side_txt_checked = true; + return size_elem(el, flags); + } + } + } + + + // reset text under var + v.txt_und_sizes = false; + + // force outer commands? + if( + typeof(flags.inner_cmd_checked) == 'undefined' && + (o.cmd_position == 'inner' || el.force_outer_cmd) && + inner_to_outer_cmd(el, w) + ) { + flags.inner_cmd_checked = true; + return size_elem(el, flags); + } + + + // set lb window sizes + $('#lcl_wrap').removeClass('lcl_pre_first_el'); + $('#lcl_window').css({ + width : (fs_mode) ? '100%' : w + add_space + side_txt, + height : (fs_mode) ? '100%' : h + add_space + }); + + + // if has to be shown already shaped + if($('.lcl_show_already_shaped').length) { + setTimeout(function() { // allow CSS propagation + $('#lcl_wrap').removeClass('lcl_show_already_shaped'); + rm_pre_show_classes(); + }, 10); + } + + // check thumbs nav arrows visibility + thumbs_nav_arrows_vis(); + + if(typeof(lcl_size_n_show_timeout) != 'undefined') { + clearTimeout(lcl_size_n_show_timeout); + } + var timing = ($('.lcl_first_sizing').length) ? o.open_close_time + 20 : o.animation_time; // +20 trick used to let CSS execute the opening timing + if($('.lcl_browser_resize').length || $('.lcl_toggling_fs').length || fs_mode) { + timing = 0; + } + + lcl_size_n_show_timeout = setTimeout(function() { + if(lcl_is_active) {lcl_is_active = false;} + + // autoplay if first opening + if($('.lcl_first_sizing').length) { + if( o.autoplay && v.elems.length > 1 && + (o.carousel || v.elem_index < (v.elems.length - 1)) + ) { + lcl_start_slideshow(); + } + } + + // html element - set auto height + if(el.type == 'html' && !fs_mode && !$('.lcl_first_sizing').length) { + $('#lcl_window').css('height', 'auto'); + } + + // fullscreen - image rendering manag + if(el.type == 'image') { + if($('.lcl_fullscreen_mode').length) { + fs_img_manag(img_sizes); + } else { + $('.lcl_image_elem').css('background-size', 'cover'); + } + + disable_zoom_on_resize(); + } + + // focus iframe to track click + if($('.lcl_loading_iframe').length) { + lcl_iframe_click(); + } + + $('#lcl_wrap').removeClass('lcl_first_sizing lcl_switching_elem lcl_is_resizing lcl_browser_resize'); + $('#lcl_loader').removeClass('no_loader'); + $(document).trigger('lcl_resized_window'); + }, timing); + }; + + /* track window size changes */ + $(window).resize(function() { + if(!lcl_shown || obj != lcl_curr_obj || $('.lcl_toggling_fs').length) {return false;} + $('#lcl_wrap').addClass('lcl_browser_resize'); + + if(typeof(lcl_rs_defer) != 'undefined') {clearTimeout(lcl_rs_defer);} + lcl_rs_defer = setTimeout(function() { + lcl_resize(); + }, 50); + }); + + + + /* calculate text under size - return new element's width and height in an object */ + var txt_under_h = function(curr_w, curr_h, max_height, recursive_count) { + var rc = (typeof(recursive_count) == 'undefined') ? 1 : recursive_count; + var fs_mode = $('.lcl_fullscreen_mode').length; + var old_txt_h = Math.ceil( $('#lcl_txt').outerHeight() ); + var w_ratio = curr_w / curr_h; + + // fullscreen mode and thumbs - text always over + if(fs_mode && $('#lcl_thumbs_nav').length) { + $('#lcl_wrap').addClass('lcl_force_txt_over'); + $('#lcl_subj').css('maxHeight', 'none'); + + $('#lcl_txt').css({ + 'right' : 0, + 'width' : 'auto' + }); + + lcl_ai_vars.txt_und_sizes = 'no_under'; + $(document).trigger('lcl_txt_und_calc'); + return false; + } + + // reset + $('#lcl_wrap').removeClass('lcl_force_txt_over').addClass('lcl_txt_under_calc'); + + if(!fs_mode) { + $('#lcl_txt').css({ + 'right' : 'auto', + 'width' : curr_w + }); + } else { + $('#lcl_txt').css({ + 'right' : 0, + 'width' : 'auto' + }); + } + + // wait for CSS to be rendered + if(typeof(lcl_txt_under_calc) != 'undefined') {clearInterval(lcl_txt_under_calc);} + lcl_txt_under_calc = setTimeout(function() { + + var txt_h = Math.ceil( $('#lcl_txt').outerHeight() ); + var overflow = (curr_h + txt_h) - max_height; + + // fullscreen mode (no thumbs) - just set max height + if(fs_mode) { + $('#lcl_wrap').removeClass('lcl_txt_under_calc'); + $('#lcl_subj').css('maxHeight', 'calc(100% - '+ txt_h +'px)'); + + lcl_ai_vars.txt_und_sizes = {w: curr_w, h: curr_h}; + $(document).trigger('lcl_txt_und_calc'); + return false; + } + + // there's overflow - recurse + if(overflow > 0 && ( typeof(recursive_count) == 'undefined' || recursive_count < 10)) { + + var new_h = curr_h - overflow; + var new_w = Math.floor(new_h * w_ratio); + + + // text over threshold + var tot = lcl_ai_vars.elems[lcl_ai_vars.elem_index].force_over_data; + if(!tot) {tot = 400;} + + if(new_w < tot || new_h < tot) { + $('#lcl_wrap').removeClass('lcl_txt_under_calc').addClass('lcl_force_txt_over'); // screen too small or image excessively tall - switch to text over + $('#lcl_subj').css('maxHeight', 'none'); + + $('#lcl_txt').css({ + 'right' : 0, + 'width' : 'auto' + }); + + lcl_ai_vars.txt_und_sizes = 'no_under'; + $(document).trigger('lcl_txt_und_calc'); + return true; + } + + return txt_under_h(new_w, new_h, max_height, (rc + 1)); + } + + // no overflow - ok + else { + $('#lcl_wrap').removeClass('lcl_txt_under_calc'); + $('#lcl_subj').css('maxHeight', (curr_h + lcl_ai_opts.padding)); + + lcl_ai_vars.txt_und_sizes = { + w: curr_w, + h: (curr_h + txt_h) + }; + + $(document).trigger('lcl_txt_und_calc'); + return true; + } + }, 120); // min val to let CSS propagate + }; + + + + /* is lightbox too small to show contents with side text? turn into over txt */ + var side_to_over_txt = function(el, threshold, w, h, side_txt_w) { + var already_forced = $('.lcl_force_txt_over').length; + + if(w < threshold || (el.type != 'html' && h < threshold)) { + if(already_forced) {return true;} + + $('#lcl_wrap').addClass('lcl_force_txt_over'); + } + else { + if(!already_forced) {return true;} + + $('#lcl_wrap').removeClass('lcl_force_txt_over'); + } + + return false; + }; + + + /* are inner commands too wide for lb window? move to outer */ + var inner_to_outer_cmd = function(el, window_width) { + var o = lcl_ai_opts; + var fs_mode = ($('.lcl_fullscreen_mode').length) ? true : false; + + // if already acted - reset + if($('.lcl_forced_outer_cmd').length) { + $('#lcl_wrap').removeClass('lcl_forced_outer_cmd'); + $('#lcl_wrap').removeClass('lcl_outer_cmd').addClass('lcl_inner_cmd'); + + var nav = $('#lcl_nav_cmd').detach(); + $('#lcl_window').prepend(nav); + } + + // calculate + if(!fs_mode && lcl_ai_vars.inner_cmd_w === false) { + lcl_ai_vars.inner_cmd_w = 0; + + jQuery('#lcl_nav_cmd .lcl_icon').each(function() { + if(($(this).hasClass('lcl_prev') || $(this).hasClass('lcl_next')) && o.nav_btn_pos == 'middle') { + return true; + } + + lcl_ai_vars.inner_cmd_w = lcl_ai_vars.inner_cmd_w + $(this).outerWidth(true); + }); + } + + // is wider? + if(fs_mode || el.force_outer_cmd || window_width <= lcl_ai_vars.inner_cmd_w) { + $('#lcl_wrap').addClass('lcl_forced_outer_cmd'); + $('#lcl_wrap').removeClass('lcl_inner_cmd').addClass('lcl_outer_cmd'); + + var nav = $('#lcl_nav_cmd').detach(); + $('#lcl_wrap').prepend(nav); + + return true; + } + else { + return false; + } + }; + + + ////////////////////////////////////////////////////////////// + + + /* switch element - new_el could be "next", "prev" or element index */ + var switch_elem = function(new_el, slideshow_switch) { + var v = lcl_ai_vars; + var carousel = lcl_ai_opts.carousel; + + if(lcl_is_active || v.elems.length < 2 || !lcl_ai_opts.gallery || $('.lcl_switching_elem').length) {return false;} + + // find and sanitize new index + if(new_el == 'next'){ + if(v.elem_index == (v.elems.length - 1)) { + if(!carousel) {return false;} + + new_el = 0; + } + else { + new_el = v.elem_index + 1; + } + } + else if(new_el == 'prev') { + if(!v.elem_index) { + if(!carousel) {return false;} + + new_el = (v.elems.length - 1); + } + else { + new_el = v.elem_index - 1; + } + } + else { + new_el = parseInt(new_el, 10); + if(new_el < 0 || new_el >= v.elems.length || new_el == v.elem_index) { + return false; + } + } + + + // if slideshow is active + if(typeof(lcl_slideshow) != 'undefined') { + + // if isn't a slideshow switch and it is active || if isn't carousel and index is latest one - stop ss + if(typeof(slideshow_switch) == 'undefined' || (!carousel && new_el == (v.elems.length - 1))) { + lcl_stop_slideshow(); + } + } + + + // hide current element and set a new one + lcl_is_active = true; + thumbs_nav_scroll_to_item(new_el); + + // use maybe_preload to not display loader when next item is already cached + maybe_preload(false, new_el, true); + + + // switching wrapper class + $('#lcl_wrap').addClass('lcl_switching_elem'); + + setTimeout(function() { + $('#lcl_wrap').removeClass('lcl_playing_video'); + + // if switching from an html element - set static heights + if(v.elems[v.elem_index].type == 'html') { + $('#lcl_window').css('height', $('#lcl_contents_wrap').outerHeight()); + $('#lcl_contents_wrap').css('maxHeight', 'none'); + } + + + // switching element - callback + if(typeof(lcl_ai_opts.on_elem_switch) == 'function') { + lcl_ai_opts.on_elem_switch.call(null, lcl_ai_opts, lcl_ai_vars, new_el); + } + + // switching | args: old_elem_id, new_elem_id + if(!v.is_arr_instance && lcl_curr_obj) { + var $subj = (v.elems_selector) ? $(v.elems_selector) : lcl_curr_obj; + $subj.first().trigger('lcl_on_elem_switch', [v.elem_index, new_el]); + } + + ////// + + $('#lcl_wrap').removeClass('lcl_no_txt lcl_loading_iframe'); + $('#lcl_txt').empty(); + v.elem_index = new_el; + + maybe_preload(true); + close_img_preload(); + }, lcl_ai_opts.fading_time); + }; + + + + /* temporary stop slideshow (to wait a preloader for example) */ + var temp_slideshow_stop = function() { + if(typeof(lcl_slideshow) == 'undefined') {return false;} + clearInterval(lcl_slideshow); + }; + + + /* progressbar animation management */ + var progbar_animate = function(first_run) { + var o = lcl_ai_opts; + if(!o.progressbar) {return false;} + + var delay = (first_run) ? 0 : (o.animation_time + o.fading_time); + var time = o.slideshow_time + o.animation_time - delay; + + if(!$('#lcl_progressbar').length) { + $('#lcl_wrap').append('
'); + } + + if(typeof(lcl_pb_timeout) != 'undefined') {clearTimeout(lcl_pb_timeout);} + lcl_pb_timeout = setTimeout(function() { + $('#lcl_progressbar').stop(true).removeAttr('style').css('width', 0).animate({width: '100%'}, time, 'linear', function() { + + $('#lcl_progressbar').fadeTo(0, 0); // duration through CSS + }); + }, delay); + }; + + + + /* close lightbox */ + var close_lb = function() { + if(!lcl_shown) {return false;} + + // lightbox is about to be closed - callback + if(typeof(lcl_ai_opts.on_close) == 'function') { + lcl_ai_opts.on_close.call(null, lcl_ai_opts, lcl_ai_vars); + } + + // event on lightbox closing + if(!lcl_ai_vars.is_arr_instance) { + var $subj = (lcl_ai_vars.elems_selector) ? $(lcl_ai_vars.elems_selector) : lcl_curr_obj; + $subj.first().trigger('lcl_on_close'); + } + + // global trigger - on lightbox closing + $(document).trigger('lcl_on_close_global'); + + ////// + + $('#lcl_wrap').removeClass('lcl_shown').addClass('lcl_is_closing lcl_tn_hidden'); + lcl_stop_slideshow(); + + // exit fullscreen + if($('.lcl_fullscreen_mode').length) { + exit_browser_fs(); + } + + // remove lb - wait for animations + setTimeout(function() { + $('#lcl_wrap, #lcl_inline_style').remove(); + + // restore html/body inline CSS + if(lcl_ai_opts.remove_scrollbar) { + jQuery('html').attr('style', lcl_ai_vars.html_style); + jQuery('body').attr('style', lcl_ai_vars.body_style); + } + + + // global trigger - lightybox has been closed and code removed + $(document).trigger('lcl_closed_global'); + + + lcl_curr_obj = false; + lcl_curr_opts = false; + lcl_curr_vars = false; + + lcl_shown = false; + lcl_is_active = false; + + }, (lcl_ai_opts.open_close_time + 80)); + + if(typeof(lcl_size_check) != 'undefined') {clearTimeout(lcl_size_check);} + }; + + + + ////////////////////////////////////////////////////////////// + + + + /* get URL query vars and returns them into an associative array */ + var get_url_qvars = function() { + lcl_hashless_url = window.location.href; + + if(lcl_hashless_url.indexOf('#') !== -1) { + var hash_arr = lcl_hashless_url.split('#'); + lcl_hashless_url = hash_arr[0]; + lcl_url_hash = '#' + hash_arr[1]; + } + + // detect + var qvars = {}; + var raw = lcl_hashless_url.slice(lcl_hashless_url.indexOf('?') + 1).split('&'); + + jQuery.each(raw, function(i, v) { + var arr = v.split('='); + qvars[arr[0]] = arr[1]; + }); + + return qvars; + }; + + + /* set deeplink */ + if(lcl_objs.length == 0) { + $(document).on('lcl_before_show_global', function(e, elem) { + if(lcl_curr_opts.deeplink && elem.hash && navigator.appVersion.indexOf("MSIE 9.") === -1) { + var qvars = get_url_qvars(); // get query vars and set clean URL + eventual hash + + // setup deeplink part + var true_val = (elem.title) ? elem.hash +'/'+ encodeURIComponent( elem.title.replace(/\s+/g, '-') ) : elem.hash; + var dl_part = 'lcl='+ true_val + lcl_url_hash; + + + // if URL doesn't have attributes + if(lcl_hashless_url.indexOf('?') === -1) { + history.pushState(null, null, lcl_hashless_url +'?'+ dl_part); + } + else { + + // if new deeplink already exists + if(typeof(qvars['lcl']) != 'undefined' && qvars['lcl'] == true_val) { + return true; + } + + // re-compose URL + var new_url = lcl_hashless_url.slice(0, lcl_hashless_url.indexOf('?') + 1); + + // (if found) discard attribute to be set + var a = 0; + var has_other_qvars = false; + var this_attr_exists = false; + + jQuery.each(qvars, function(i, v) { + if(typeof(i) == 'undefined') {return;} + if(a > 0) {new_url += '&';} + + if(i != 'lcl') { + new_url += (v) ? i+'='+v : i; + + has_other_qvars = true; + a++; + } + else { + this_attr_exists = true; + } + }); + + if(has_other_qvars) {new_url += '&';} + new_url += dl_part; + + history.pushState(null, null, new_url); + } + } + }); + } + + + /* remove deeplink on close */ + if(lcl_objs.length == 0) { + $(document).on('lcl_on_close_global', function() { + var qvars = get_url_qvars(); + if(typeof(qvars['lcl']) == 'undefined' || navigator.appVersion.indexOf("MSIE 9.") !== -1) {return true;} + + // discard attribute to be removed + var parts = []; + jQuery.each(qvars, function(i, v) { + if(typeof(i) != 'undefined' && i && i != 'lcl') { + var val = (v) ? i+'='+v : i; + parts.push(val); + } + }); + + var qm = (parts.length) ? '?' : ''; + var new_url = lcl_hashless_url.slice(0, lcl_hashless_url.indexOf('?')) + qm + parts.join('&') + lcl_url_hash; + + history.pushState(null, null, new_url); + }); + } + + + if(lcl_settings.deeplink && !lcl_deeplink_tracked) { + lcl_deeplink_tracked = true; + + /* detect URL changes */ + window.onpopstate = function(e) { + var qvars = get_url_qvars(); + + // if no LCL and lightbox is opened - close + if(typeof(qvars['lcl']) == 'undefined') { + if(lcl_shown) { + lcl_close(); + } + } + else { + var arr = (qvars['lcl'].indexOf('/') !== -1) ? qvars['lcl'].split('/') : qvars['lcl'].split('%2F'); + + // if has LCL and lightbox is opened - switch + if(lcl_shown) { + $.each(lcl_curr_vars.elems, function(i, v) { + if(v.hash == arr[0]) { + lcl_switch(i); + return false; + } + }); + } + + // open from hash + else { + $.each(lcl_objs, function(i, inst_obj) { + $(document).trigger('lcl_open_from_hash', [inst_obj, arr[0]]); + }); + } + } + }; + } + + + /* scan page's URL for deeplinked elements and open lightbox */ + var look_for_deeplink = function() { + var qvars = get_url_qvars(); + + if(!lcl_shown && typeof(qvars['lcl']) != 'undefined') { + var arr = (qvars['lcl'].indexOf('/') !== -1) ? qvars['lcl'].split('/') : qvars['lcl'].split('%2F'); + + $.each(lcl_objs, function(i, inst_obj) { + $(document).trigger('lcl_open_from_hash', [inst_obj, arr[0]]); + }); + } + }; + + /* on page's opening - wait a bit to avoid interferences with default lb opening */ + $(document).ready(function() { + setTimeout(function() { + $(document).trigger('lcl_look_for_deeplink'); + }, 100); + }); + + /* via custom event */ + $(document).off('lcl_look_for_deeplink').on('lcl_look_for_deeplink', function() { + look_for_deeplink(); + }); + + + /* open from hash - handler */ + $(document).off('lcl_open_from_hash').on('lcl_open_from_hash', function(e, inst_obj, hash) { + var vars = $.data(inst_obj, 'lcl_vars'); + if(typeof(vars) == 'undefined' || !vars) {return false;} + + $.each(vars.elems, function(i,v) { + if(v.hash == hash) { + lcl_curr_obj = inst_obj; + lcl_open(inst_obj, i); + return false; + } + }); + }); + + + + ////////////////////////////////////////////////////////////// + + + + /* Setup fullscreen mode */ + var enter_fullscreen = function(set_browser_status, on_opening) { + if(typeof(on_opening) == 'undefined') {on_opening = false;} + + if(!lcl_shown || !lcl_ai_opts.fullscreen || (!on_opening && lcl_is_active)) {return false;} + + var o = lcl_ai_opts; + var v = lcl_ai_vars; + + // hide window elements + $('#lcl_wrap').addClass('lcl_toggling_fs'); + + // enbale browser's fs + if(o.browser_fs_mode && document.fullscreenEnabled && typeof(navigator.userActivation) != 'undefined' && navigator.userActivation.hasBeenActive) { + if (document.documentElement.requestFullscreen) { + document.documentElement.requestFullscreen(); + } else if (document.documentElement.msRequestFullscreen) { + document.documentElement.msRequestFullscreen(); + } else if (document.documentElement.mozRequestFullScreen) { + document.documentElement.mozRequestFullScreen(); + } else if (document.documentElement.webkitRequestFullscreen) { + document.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT); + } + } + + // set wrap class - recalculate sizes - show + var timing = (on_opening) ? o.open_close_time : o.fading_time; + setTimeout(function() { + $('#lcl_wrap').addClass('lcl_fullscreen_mode'); + size_elem( v.elems[v.elem_index] ); + + // disable fs toogle class when has been sized + $(document).on('lcl_resized_window', function() { + $(document).off('lcl_resized_window'); + + // text under or on opening - recalculate + if(on_opening || (lcl_curr_opts.data_position == 'under' && !$('.lcl_force_txt_over').length)) { + size_elem( lcl_curr_vars.elems[lcl_curr_vars.elem_index] ); + } + + setTimeout(function() { + $('#lcl_wrap').removeClass('lcl_toggling_fs'); + }, 150); // 50 (sizing) + 100 (smoothing) is forced sizing timing for fs switch + }); + }, timing); + + ////// + + // entering fullscreen - callback + if(typeof(o.on_fs_enter) == 'function') { + o.on_fs_enter.call(null, o, v); + } + + // entering fullscreen - action + if(!lcl_ai_vars.is_arr_instance) { + lcl_curr_obj.first().trigger('lcl_on_fs_enter'); + } + }; + + + /* fullscreen image rendering manag - smart/fit/fill */ + var fs_img_manag = function(img_sizes) { + var behav = lcl_ai_opts.fs_img_behavior; + + // if image is smaller than screen - bg size = auto + if($('.lcl_fullscreen_mode').length && img_sizes.w <= $('#lcl_subj').width() && img_sizes.h <= $('#lcl_subj').height()) { + $('.lcl_image_elem').css('background-size', 'auto'); + return false; + } + + + // fit into screen + if(behav == 'fit') { + $('.lcl_image_elem').css('background-size', 'contain'); + } + + // fill screen + else if(behav == 'fill') { + $('.lcl_image_elem').css('background-size', 'cover'); + } + + // smart - fill only if is bigger than screen or same aspect ratio + else { + + + if(typeof(img_sizes) == 'undefined') { + $('.lcl_image_elem').css('background-size', 'cover'); + return false; + } + + var ratio_diff = ($(window).width() / $(window).height()) - (img_sizes.w / img_sizes.h); + var w_diff = $(window).width() - img_sizes.w; + var h_diff = $(window).height() - img_sizes.h; + + if( (ratio_diff <= 1.15 && ratio_diff >= -1.15) && (w_diff <= 350 && h_diff <= 350) ) { // fill + $('.lcl_image_elem').css('background-size', 'cover'); + } + else { // fit + $('.lcl_image_elem').css('background-size', 'contain'); + } + } + }; + + + /* exit fullscreen */ + var exit_fullscreen = function(set_browser_status) { + if(!lcl_shown || !lcl_ai_opts.fullscreen || lcl_is_active) {return false;} + var o = lcl_ai_opts; + + // hide window elements + $('#lcl_wrap').addClass('lcl_toggling_fs'); + $('#lcl_window').fadeTo(70, 0); + + + // set wrap class - recalculate sizes - show + setTimeout(function() { + // disable browser's fs + if(o.browser_fs_mode && typeof(set_browser_status) != 'undefined') { + exit_browser_fs(); + var browser_fs_timing = 250; // time taken by browser to exit fullscreen mode + } else { + var browser_fs_timing = 0; + } + + $('#lcl_wrap').removeClass('lcl_fullscreen_mode'); + + // resize after a little while + setTimeout(function() { + size_elem( lcl_ai_vars.elems[lcl_ai_vars.elem_index] ); + + // IE 11 requires a bit more + var userAgent = userAgent || navigator.userAgent; + var ie11_time = (userAgent.indexOf("MSIE ") > -1 || userAgent.indexOf("Trident/") > -1) ? 100 : 0; + + // disable fs toogle class + setTimeout(function() { + $('#lcl_window').fadeTo(30, 1); + $('#lcl_wrap').removeClass('lcl_toggling_fs'); + }, 300 + ie11_time); // 50 (sizing) + 100 (smoothing) is forced sizing timing for fs switch + + }, browser_fs_timing); + }, 70); + + ////// + + // exiting fullscreen - callback + if(typeof(o.on_fs_exit) == 'function') { + o.on_fs_exit.call(null, lcl_ai_opts, lcl_ai_vars); + } + + // exiting fullscreen - action + if(!lcl_ai_vars.is_arr_instance) { + var $subj = (lcl_ai_vars.elems_selector) ? $(lcl_ai_vars.elems_selector) : lcl_curr_obj; + $subj.first().trigger('lcl_on_fs_exit'); + } + }; + + + /* trigger browser instruction to exit fullscreen mode */ + var exit_browser_fs = function() { + if (document.exitFullscreen) { + document.exitFullscreen(); + } else if (document.msExitFullscreen) { + document.msExitFullscreen(); + } else if (document.mozCancelFullScreen) { + document.mozCancelFullScreen(); + } else if (document.webkitExitFullscreen) { + document.webkitExitFullscreen(); + } + }; + + + ////////////////////////////////////////////////////////////// + + + /* zooming system setup after element's opening */ + if(lcl_objs.length == 0) { + $(document).on('lcl_before_show_global', function(e, el, el_index) { + $('.lcl_zoom_icon').hide(); + $('#lcl_subj').removeClass('lcl_zoomable lcl_zoom_wrap'); + + if(el.type != 'image' || !lcl_curr_opts.img_zoom) { + $('#lcl_elem_wrap').removeAttr('lcl-zoom'); + return true; + } + + var img_sizes = lcl_curr_vars.img_sizes_cache[ el.src ]; + if($('#lcl_subj').width() >= img_sizes.w && $('#lcl_subj').height() >= img_sizes.h) { + return true; + } + + $('#lcl_elem_wrap').css({ + 'width' : '100%', + 'height': '100%' + }); + + $('#lcl_elem_wrap').attr('lcl-zoom', 1); + $('#lcl_subj').addClass('lcl_zoomable'); + $('.lcl_zoom_out').addClass('lcl_zoom_disabled'); + $('.lcl_zoom_in').removeClass('lcl_zoom_disabled'); + $('.lcl_zoom_in .lcl_zoom_helper').remove(); + $('.lcl_zoom_icon').show(); + }); + } + + + /* manage zoom enabling on window resize */ + var disable_zoom_on_resize = function() { + if(!$('.lcl_zoomable').length) {return false;} + var curr_zoom = parseFloat( $('#lcl_elem_wrap').attr('lcl-zoom') ); + + var v = lcl_ai_vars; + + var el = v.elems[ v.elem_index ]; + if(typeof(el) == 'undefined') {return false;} + + var img_sizes = lcl_ai_vars.img_sizes_cache[ el.src ]; + + if(img_sizes.w <= $('#lcl_subj').width() && img_sizes.h <= $('#lcl_subj').height()) { + $('.lcl_zoom_icon').hide(); + + $('#lcl_elem_wrap').css({ + 'width' : '100%', + 'height': '100%' + }); + + $('#lcl_elem_wrap').attr('lcl-zoom', 1); + $('.lcl_zoom_out').addClass('lcl_zoom_disabled'); + $('.lcl_zoom_in').removeClass('lcl_zoom_disabled'); + $('#lcl_subj').removeClass('lcl_zoom_wrap'); + } + else { + $('.lcl_zoom_icon').show(); + } + }; + + + /* perform zoom (if !zoom_in, obviously is zooming out) */ + var zoom = function(zoom_in, reset) { + var $wrap = $('#lcl_elem_wrap'); + var wrap_w = $wrap.width(); + var wrap_h = $wrap.height(); + var curr_zoom = parseFloat( $('#lcl_elem_wrap').attr('lcl-zoom') ); + var new_zoom = 0; + + var v = lcl_ai_vars; + var el = v.elems[ v.elem_index ]; + var img_sizes = lcl_ai_vars.img_sizes_cache[ el.src ]; + + // zoom in + if(zoom_in && (wrap_w < img_sizes.w || wrap_h < img_sizes.h)) { + new_zoom = curr_zoom + 0.25; + + $wrap.css({ + 'width' : (100 * new_zoom) +'%', + 'height': (100 * new_zoom) +'%' + }); + + // stop active slideshow + lcl_stop_slideshow(); + } + + // zoom out + else if(!zoom_in && wrap_w > $('#lcl_subj').width()) { + new_zoom = curr_zoom - 0.25; + if(new_zoom <= 1) { + new_zoom = 1; + } + + $wrap.css({ + 'width' : (100 * new_zoom) +'%', + 'height': (100 * new_zoom) +'%' + }); + } + + + // if acted + if(new_zoom) { + $('#lcl_elem_wrap').attr('lcl-zoom', new_zoom); + + // zoom helper + $('.lcl_zoom_in .lcl_zoom_helper').remove(); + if(new_zoom > 1) { + $('.lcl_zoom_in').append(''+ new_zoom +'x'); + } + + + // desktop smoothscroll + if(new_zoom > 1) { + $('.lcl_zoom_out').removeClass('lcl_zoom_disabled'); + $('#lcl_subj').addClass('lcl_zoom_wrap'); + $('#lcl_subj').lcl_smoothscroll(0.35, 400); + + // try to keep centered what is showing during zoom + var curr_st = $('#lcl_subj').scrollTop(); + var curr_sl = $('#lcl_subj').scrollLeft(); + var s_perc = (zoom_in) ? 1.25 : 0.75; + + $('#lcl_subj').clearQueue().animate({ + scrollTop : (!curr_st && !curr_sl) ? ($('#lcl_subj').height() / 4) : (curr_st * s_perc), + scrollLeft : (!curr_st && !curr_sl) ? ($('#lcl_subj').width() / 4) : (curr_sl * s_perc) + }, 300, 'linear'); + + + // full zoom? disable zoom-in + setTimeout(function() { + if(img_sizes.w <= $wrap.width() && img_sizes.h <= $wrap.height()) { + $('.lcl_zoom_in').addClass('lcl_zoom_disabled'); + } else { + $('.lcl_zoom_in').removeClass('lcl_zoom_disabled'); + } + }, 310); + } + else { + $('.lcl_zoom_out').addClass('lcl_zoom_disabled'); + $('.lcl_zoom_in').removeClass('lcl_zoom_disabled'); + + $('#lcl_subj').removeClass('lcl_zoom_wrap'); + } + } + }; + + $(document).on('click', '.lcl_zoom_in', function() { + if(obj != lcl_curr_obj) {return true;} + zoom(true); + }); + $(document).on('click', '.lcl_zoom_out', function() { + if(obj != lcl_curr_obj) {return true;} + zoom(false); + }); + + + ////////////////////////////////////////////////////////////// + + + // inject comments into text + var add_comments = function() { + var o = lcl_ai_opts; + if(!o.comments || typeof(o.comments.type) == 'undefined' || (o.data_position != 'rside' && o.data_position != 'lside')) {return false;} + + // create an unique URL for current element or use fixed canonical + var el_index = lcl_ai_vars.elem_index; + var el = lcl_ai_vars.elems[el_index]; + + if(el.canonical_url) { + var unique_url = el.canonical_url; + } + else { + var unique_url = window.location.origin; + + if((typeof(o.comments.local_comments) != 'undefined' && o.comments.local_comments) || typeof(lcl_local_comments) != 'undefined') { + unique_url += window.location.pathname; + } + + unique_url += '?lcl='+ el.hash; + } + + + // facebook + if(o.comments.type == 'facebook') { + $('#lcl_txt > *').last().addClass('lcl_txt_border'); + + $('#lcl_txt').append( + '
' + + '
'+ + '
'+ + '' + ); + } + + + // Disqus + else if(o.comments.type == 'disqus') { + $('#lcl_txt > *').last().addClass('lcl_txt_border'); + + $('#lcl_txt').append( + '
' + + '
'+ + '
' + ); + + $(document).ready(function(e) { + var disqus_config = function () { + this.page.url = unique_url; + this.page.identifier = el.hash; + this.page.title = el.title; + }; + + var d = document, s = d.createElement('script'); + s.src = '//'+ o.comments.shortname +'.disqus.com/embed.js'; + s.setAttribute('data-timestamp', +new Date()); + (d.head || d.body).appendChild(s); + }); + } + } + + + ////////////////////////////////////////////////////////////// + + + /* setup thumbnails navigator */ + var setup_thumbs_nav = function() { + var mixed_types = false; + var tracked_type = false; + var uniq_id = Date.now(); + + $('#lcl_thumbs_nav').append(''); + $('#lcl_thumbs_nav').attr('rel', uniq_id); + + $.each(lcl_ai_vars.elems, function(i, v) { + if(v.type != 'unknown') { + + if(!mixed_types) { + if(!tracked_type || tracked_type == v.type) { + tracked_type = v.type; + } + else { + mixed_types = true; + } + } + + var bg = '', + bg_img = ''; + tpc = ''; // thumbs preload class + + + // has got a specific thumbnail? + if(v.thumb) { + bg_img = v.thumb; + bg = 'style="background-image: url(\''+ v.thumb +'\');"'; + } + else { + + // find thumbnail for each source + switch(v.type) { + case 'image' : bg_img = v.src; break; + case 'youtube' : bg_img = (v.poster) ? v.poster : 'https://img.youtube.com/vi/'+ v.video_id +'/maxresdefault.jpg'; break; + + case 'vimeo' : + + if(v.poster) { + bg_img = v.poster; + break; + } + else { + if(typeof(lcl_ai_vars.vimeo_thumb_cache[ v.src ]) == 'undefined') { + tpc = 'lcl_tn_preload'; + + $.ajax({ + url: 'https://vimeo.com/api/v2/video/' + v.video_id + '.json', + success: function(data) { + thumbs_nav_img_preload(data[0].thumbnail_large, i, uniq_id); + lcl_ai_vars.vimeo_thumb_cache[ v.src ] = data[0].thumbnail_large; + + // use ATTR to avoid issues with IE10 + $('.lcl_tn_inner li[rel='+i+']').attr('style', $('.lcl_tn_inner li[rel='+i+']').attr('style') + ' background-image: url(\''+ data[0].thumbnail_large +'\');'); + }, + error: function(e) { + console.error('LCL Vimeo thumb retrieval', e); + } + }); + } + else { + bg_img = lcl_ai_vars.vimeo_thumb_cache[ v.src ]; + } + } + break; + + case 'video' : + case 'iframe' : + case 'html' : + + if(v.poster) {bg_img = v.poster;} break; + + case 'dailymotion' : bg_img = (v.poster) ? v.poster : 'http://www.dailymotion.com/thumbnail/video/'+ v.video_id; break; + } + + if(bg_img) { + + // has thumbs maker? + if(lcl_ai_opts.thumbs_maker_url && (v.poster || $.inArray(v.type, ['youtube', 'vimeo', 'dailymotion']) === -1)) { + var base = lcl_ai_opts.thumbs_maker_url; + bg_img = base.replace('%URL%', encodeURIComponent(bg_img)).replace('%W%', lcl_ai_opts.thumbs_w).replace('%H%', lcl_ai_opts.thumbs_h); + } + + bg = 'style="background-image: url(\''+ bg_img +'\');"'; + + + // if is video - store as vid_poster + if( $.inArray(v.type, ['youtube', 'vimeo', 'dailymotion']) !== -1 && !v.poster) { + lcl_ai_vars.elems[i].vid_poster = bg_img; + } + } + } + + + // if iframe and html and no poster - skip + if((v.type == 'html' || v.type == 'iframe') && !bg) {return true;} + + // video preview + var vp = (v.type == 'video' && !bg) ? '' : ''; + + // thumbs preload class + //if(!tpc && bg && typeof(lcl_ai_vars.img_sizes_cache[ bg_img ]) == 'undefined') {tpc = 'lcl_tn_preload';} + tpc = 'lcl_tn_preload'; + + // append + $('.lcl_tn_inner').append('
  • '+ vp +'
  • '); + + // thumbs image preload + if(tpc) { + thumbs_nav_img_preload(bg_img, i, uniq_id); + } + } + }); + + + // be sure at least 2 elements are left + if($('.lcl_tn_inner > li').length < 2) { + $('#lcl_thumbs_nav').remove(); + return false; + } + + $('.lcl_tn_inner > li').css('width', lcl_ai_opts.thumbs_w); + $('.lcl_tn_inner').lcl_smoothscroll(0.3, 400, false, true); + + // mixed type class + if(mixed_types && lcl_ai_opts.tn_icons) { + $('.lcl_tn_inner').addClass('lcl_tn_mixed_types'); + } + + // elem offset - use a bit of delay to let thumbs to have proper shape + setTimeout(function() { + thumbs_nav_scroll_to_item(lcl_ai_vars.elem_index); + }, 300); + }; + + + /* thumbs image preload */ + var thumbs_nav_img_preload = function(img_url, el_index, uniq_id) { + $('').bind("load", function(){ + if(!lcl_ai_vars) {return false;} + + lcl_ai_vars.img_sizes_cache[ img_url ] = { + w : this.width, + h : this.height + }; + + $('#lcl_thumbs_nav[rel='+ uniq_id +'] li[rel='+ el_index +']').removeClass('lcl_tn_preload'); + setTimeout(function() { + thumbs_nav_arrows_vis(); + thumbs_nav_arrows_opacity(); + }, 500); + }).attr('src', img_url); + }; + + + /* thumbs navigator - thumbs total width */ + var thumbs_nav_elems_w = function() { + var thumbs_w = 0; + $('.lcl_tn_inner > li').each(function() {thumbs_w = thumbs_w + $(this).outerWidth(true);}); + + return thumbs_w; + }; + + + /* thumbs navigator - arrows visibility */ + var thumbs_nav_arrows_vis = function() { + if(!$('#lcl_thumbs_nav').length) {return false;} + + if(thumbs_nav_elems_w() > $('.lcl_tn_inner').width()) { + $('#lcl_thumbs_nav').addClass('lcl_tn_has_arr'); + } else { + $('#lcl_thumbs_nav').removeClass('lcl_tn_has_arr'); + } + }; + + + /* thumbs navigator - arrows opacity */ + var thumbs_nav_arrows_opacity = function() { + var sl = $('.lcl_tn_inner').scrollLeft(); + + if(!sl) { + $('.lcl_tn_prev').addClass('lcl_tn_disabled_arr').stop(true).fadeTo(150, 0.5); + } else { + $('.lcl_tn_prev').removeClass('lcl_tn_disabled_arr').stop(true).fadeTo(150, 1); + } + + if(sl >= (thumbs_nav_elems_w() - $('.lcl_tn_inner').width())) { + $('.lcl_tn_next').addClass('lcl_tn_disabled_arr').stop(true).fadeTo(150, 0.5); + } else { + $('.lcl_tn_next').removeClass('lcl_tn_disabled_arr').stop(true).fadeTo(150, 1); + } + }; + $(document).on('lcl_smoothscroll_end', '.lcl_tn_inner', function(e) { + if(obj != lcl_curr_obj) {return true;} + thumbs_nav_arrows_opacity(); + }); + + + /* thumbs navigator - scroll to shown element - centering it */ + var thumbs_nav_scroll_to_item = function(elem_id) { + var $subj = $('.lcl_tn_inner > li[rel='+ elem_id +']'); + if(!$subj.length) {return false;} + + var id = 0; + $('.lcl_tn_inner > li').each(function(i,v) { + if($(this).attr('rel') == elem_id) { + id = i; + return false; + } + }); + + // center thumb with scroll + var elem_w = $('.lcl_tn_inner > li').last().outerWidth(); + var margin = parseInt($('.lcl_tn_inner > li').last().css('margin-left'), 10); + var wrap_w = $('.lcl_tn_inner').width(); + var to_center = Math.floor( ($('.lcl_tn_inner').width() - elem_w - margin) / 2 ); + + var new_offset = ((elem_w * id) + margin * (id - 1)) + Math.floor(margin / 2) - to_center; + + $('.lcl_tn_inner').stop(true).animate({"scrollLeft" : new_offset}, 500, function() { + $('.lcl_tn_inner').trigger('lcl_smoothscroll_end'); + + // show after having scrolled + $('#lcl_thumbs_nav').removeClass('lcl_pre_tn_scroll'); + }); + + // set selected nav thumb class + $('.lcl_tn_inner > li').removeClass('lcl_sel_thumb'); + $subj.addClass('lcl_sel_thumb'); + }; + + + /* lc smooth scroll system */ + // suggested ratio = 0.3 + // suggested duration = 400 + $.fn.lcl_smoothscroll = function(ratio, duration, ignoreX, ignoreY) { + if(lcl_on_mobile) {return false;} + this.off("mousemove mousedown mouseup mouseenter mouseleave"); + + var $subj = this, + trackX = (typeof(ignoreX) == 'undefined' || !ignoreX) ? true : false, + trackY = (typeof(ignoreY) == 'undefined' || !ignoreY) ? true : false, + + mouseout_timeout = false, + curDown = false, + curYPos = 0, + curXPos = 0, + + startScrollY = 0, + startScrollX = 0, + scrollDif = 0; + + $subj.mousemove(function(m){ + if(curDown === true) { + $subj.stop(true); + + if(trackX) { + $subj.scrollLeft(startScrollX + (curXPos - m.pageX)); + } + if(trackY) { + $subj.scrollTop(startScrollY + (curYPos - m.pageY)); + } + } + }); + + + $subj.mouseover(function() { + if(mouseout_timeout) { + clearTimeout(mouseout_timeout); + } + }); + $subj.mouseout(function() { + mouseout_timeout = setTimeout(function() { + curDown = false; + mouseout_timeout = false; + }, 500); + }); + + $subj.mousedown(function(m){ + if(typeof(lc_sms_timeout) != 'undefined') {clearTimeout(lc_sms_timeout);} + curDown = true; + + startScrollY = $subj.scrollTop(); + startScrollX = $subj.scrollLeft(); + + curYPos = m.pageY; + curXPos = m.pageX; + }); + + $subj.mouseup(function(m){ + curDown = false; + + // smooth scroll + var currScrollY = $subj.scrollTop(); + var scrollDiffY = (startScrollY - currScrollY) * -1; + var newScrollY = currScrollY + ( scrollDiffY * ratio); + + var currScrollX = $subj.scrollLeft(); + var scrollDiffX = (startScrollX - currScrollX) * -1; + var newScrollX = currScrollX + ( scrollDiffX * ratio); + + // thumbs nav - if is tiny movement, simulate a true click on element + if( + (scrollDiffY < 3 && scrollDiffY > -3) && + (scrollDiffX < 3 && scrollDiffX > -3) + ) { + $(m.target).trigger('lcl_tn_elem_click'); + return false; + } + + // animate (only if movement was wide enough) + if(scrollDiffY > 20 || scrollDiffX > 20) { + var anim_obj = {}; + if(trackY) { + anim_obj["scrollTop"] = newScrollY; + } + if(trackX) { + anim_obj["scrollLeft"] = newScrollX; + } + + $subj.stop(true).animate(anim_obj, duration, 'linear', function() { + $subj.trigger('lcl_smoothscroll_end'); + }); + } + }); + }; + + + ////////////////////////////////////////////////////////////// + + + /* show lightbox - click handlers */ + if(!lcl_vars.is_arr_instance) { + if(lcl_settings.live_elements && lcl_vars.elems_selector) { // switch between static and dynamic elements retrieval + + $(document).off('click', lcl_vars.elems_selector) + .on('click', lcl_vars.elems_selector, function(e) { + e.preventDefault(); + + // update elements count - live + var vars = $.data(obj, 'lcl_vars'); + vars.elems_count = $(lcl_vars.elems_selector).length; + + // open lightbox + open_lb(obj, $(this)); + + // binded element click - lb should open | args: clicked element + obj.first().trigger('lcl_clicked_elem', [$(this)]); + }); + } + else { + obj.off('click'); + obj.on('click', function(e) { + e.preventDefault(); + + open_lb(obj, $(this)); + + // binded element click - lb should open + obj.first().trigger('lcl_clicked_elem', [$(this)]); + }); + } + } + + + /* close clicking overlay or button */ + $(document).on('click', '#lcl_overlay:not(.lcl_modal), .lcl_close, #lcl_corner_close', function(e) { + if(obj != lcl_curr_obj) {return true;} + close_lb(); + }); + + + /* navigation button - prev */ + $(document).on('click', '.lcl_prev', function(e) { + if(obj != lcl_curr_obj) {return true;} + switch_elem('prev'); + }); + + /* navigation button - next */ + $(document).on('click', '.lcl_next', function(e) { + if(obj != lcl_curr_obj) {return true;} + switch_elem('next'); + }); + + + /* Keyboard events */ + $(document).bind('keydown',function(e){ + if(lcl_shown) { + if(obj != lcl_curr_obj) {return true;} + + // next + if (e.keyCode == 39) { + e.preventDefault(); + switch_elem('next'); + } + + // prev + else if (e.keyCode == 37) { + e.preventDefault(); + switch_elem('prev'); + } + + // close + else if (e.keyCode == 27) { + e.preventDefault(); + close_lb(); + } + + // fullscreen + else if(e.keyCode == 122 && lcl_ai_opts.fullscreen) { + if(typeof(lcl_fs_key_timeout) != 'undefined') {clearTimeout(lcl_fs_key_timeout);} + + lcl_fs_key_timeout = setTimeout(function() { + if($('.lcl_fullscreen_mode').length) { + exit_fullscreen(); + } else { + enter_fullscreen(); + } + }, 50); + } + } + }); + + + /* elems navigation with mousewheel */ + $(document).on('wheel', '#lcl_overlay, #lcl_window, #lcl_thumbs_nav:not(.lcl_tn_has_arr)', function(e) { + if(obj != lcl_curr_obj || !lcl_curr_opts.mousewheel) {return true;} + var $target = $(e.target); + + // if not in window, do it! + if(!$target.is('#lcl_window') && !$target.parents('#lcl_window').length) { + e.preventDefault(); + var delta = e.originalEvent.deltaY; + + if(delta > 0) {switch_elem('next');} + else {switch_elem('prev');} + } + + else { + // cycle to know if parents have scrollers + var perform = true; + for(a=0; a<20; a++) { + if($target.is('#lcl_window')) {break;} + + if($target[0].scrollHeight > $target.outerHeight()) { + perform = false; + break; + } + else { + $target = $target.parent(); + } + } + + if(perform) { + e.preventDefault(); + var delta = e.originalEvent.deltaY; + + if(delta > 0) {switch_elem('next');} + else {switch_elem('prev');} + } + } + }); + + + /* next element clicking on image or zoom (where available with doubleclick) */ + $(document).on('click', '.lcl_image_elem', function(e) { + if(obj != lcl_curr_obj) {return true;} + + lcl_img_click_track = setTimeout(function() { + if(!$('.lcl_zoom_wrap').length) { + switch_elem('next'); + } + }, 250); + }); + + + /* track doubleclick to zoom image */ + $(document).on('dblclick', '.lcl_image_elem', function(e) { + if(obj != lcl_curr_obj) {return true;} + + if(!lcl_curr_opts.img_zoom) {return true;} + if(!$('.lcl_zoom_icon').length) {return true;} + + // avoid single click trigger + if(typeof(lcl_img_click_track) != 'undefined') { + clearTimeout(lcl_img_click_track); + zoom(true); + } + }); + + + /* toggle text */ + $(document).on('click', '.lcl_txt_toggle', function(e) { + if(obj != lcl_curr_obj) {return true;} + var o = lcl_ai_opts; + + // class lcl_toggling_txt enables window sizing animations + if(!lcl_is_active && !$('.lcl_no_txt').length && !$('.lcl_toggling_txt').length) { + if(o.data_position != 'over') { + + var txt_on_side = (o.data_position == 'rside' || o.data_position == 'lside') ? true : false; + var forced_over = $('.lcl_force_txt_over').length; + var timing = (o.animation_time < 150) ? o.animation_time : 150; + var classes_delay = 0; + + + // if text on side - hide subject + if(txt_on_side && !forced_over) { + $('#lcl_subj').fadeTo(timing, 0); + } + // text under - hide + else { + if(!forced_over) { + $('#lcl_contents_wrap').fadeTo(timing, 0); + classes_delay = timing; + } + } + + setTimeout(function() { + $('#lcl_wrap').toggleClass('lcl_hidden_txt'); + }, classes_delay); + + + if(!forced_over) { + lcl_is_active = true; + $('#lcl_wrap').addClass('lcl_toggling_txt'); + + // wait until text is hidden + setTimeout(function() { + lcl_is_active = false; + lcl_resize(); + }, o.animation_time); + + // after sizing - disable animations again + setTimeout(function() { + $('#lcl_wrap').removeClass('lcl_toggling_txt'); + + if(txt_on_side && !forced_over) { + $('#lcl_subj').fadeTo(timing, 1); + } else { + if(!forced_over) { + $('#lcl_contents_wrap').fadeTo(timing, 1); + } + } + }, (o.animation_time * 2) + 50); + } + } + + // text over - just hide + else { + $('#lcl_wrap').toggleClass('lcl_hidden_txt'); + } + } + }); + + + /* start/end slideshow */ + $(document).on('click', '.lcl_play', function(e) { + if(obj != lcl_curr_obj) {return true;} + + if($('.lcl_is_playing').length) { + lcl_stop_slideshow(); + } else { + lcl_start_slideshow(); + } + }); + + + /* track video start on click */ + $(document).on('click', '.lcl_elem', function(e) { + if(obj != lcl_curr_obj) {return true;} + + if(!$('.lcl_playing_video').length && $.inArray($('#lcl_wrap').attr('lcl-type'), ['video']) !== -1) { + + lcl_stop_slideshow(); + $('#lcl_wrap').addClass('lcl_playing_video'); + } + }); + + /* trick to detect click on iframes */ + var lcl_iframe_click = function() { + if(typeof(lcl_iframe_click_intval) != 'undefined') {clearInterval(lcl_iframe_click_intval);} + + lcl_iframe_click_intval = setInterval(function() { + var $ae = $(document.activeElement); + + if($ae.is('iframe') && $ae.hasClass('lcl_elem') && ($('.lcl_youtube_elem').length || $('.lcl_vimeo_elem').length || $('.lcl_dailymotion_elem').length)) { + lcl_stop_slideshow(); + $('#lcl_wrap').addClass('lcl_playing_video'); + + clearInterval(lcl_iframe_click_intval); + } + }, 300); + }; + + + /* toggle socials */ + $(document).on('click', '.lcl_socials', function(e) { + if(obj != lcl_curr_obj) {return true;} + + // show + if(!$('.lcl_socials > div').length) { + var el = lcl_curr_vars.elems[ lcl_curr_vars.elem_index ]; + var page_url = encodeURIComponent(window.location.href); + + var title = encodeURIComponent(el.title).replace(/'/g, "\\'"); + var descr = encodeURIComponent(el.txt).replace(/'/g, "\\'"); + + // find image's URL + if(el.type == 'image') { + var img = el.src; + } else { + var img = (el.poster) ? el.poster : false; + if(!img && typeof(el.vid_poster) != 'undefined') {img = el.vid_poster;} + } + + + // prepare and append code + var code = + '
    '; + + if(lcl_curr_opts.fb_share_params) { + + var share_url = page_url; + share_url += (window.location.href.indexOf('?') === -1) ? '%3F' : '%26'; + share_url += encodeURIComponent(lcl_curr_opts.fb_share_params.replace('%TITLE%', title).replace('%DESCR%', descr).replace('%IMG%', img)); + + code += ''; + } else { + code += ''; + } + + code += ''; + + // on mobile - use Whatsapp + if(lcl_on_mobile) { + code += '
    '; + } + + // pinterest only if there's an image + if(img) { + code += + ''; + } + + code += + '
    '; + + $('.lcl_socials').addClass('lcl_socials_shown').html(code); + + setTimeout(function() { // delay to let CSS execute animation + $('.lcl_socials_tt').addClass('lcl_show_tt'); + }, 20); + } + + // hide + else { + $('.lcl_socials_tt').removeClass('lcl_show_tt'); + + setTimeout(function() { + $('.lcl_socials').removeClass('lcl_socials_shown').empty(); + }, 260); + } + }); + + + /* toggle fullscreen via button */ + $(document).on('click', '.lcl_fullscreen', function(e) { + if(obj != lcl_curr_obj) {return true;} + + if($('.lcl_fullscreen_mode').length) { + exit_fullscreen(true); + } else { + enter_fullscreen(true); + } + }); + + + + /* thumbs navigator - toggle */ + $(document).on('click', '.lcl_thumbs_toggle', function(e) { + if(obj != lcl_curr_obj) {return true;} + + var fs_mode = $('.lcl_fullscreen_mode').length; + $('#lcl_wrap').addClass('lcl_toggling_tn').toggleClass('lcl_tn_hidden'); + + + // if not fullscreen - hide contents + if(!fs_mode) { + setTimeout(function() { + lcl_resize(); + }, 160); + } + + setTimeout(function() { + $('#lcl_wrap').removeClass('lcl_toggling_tn'); + }, lcl_curr_opts.animation_time + 50); + }); + + + /* thumbs navigator - switch element */ + var tn_track_touch = (lcl_on_mobile) ? ' click' : ''; + + $(document).on('lcl_tn_elem_click'+tn_track_touch, '.lcl_tn_inner > li', function(e) { + if(obj != lcl_curr_obj) {return true;} + + var elem_id = $(this).attr('rel'); + switch_elem( elem_id ); + }); + + + /* thumbs navigator - navigate with arrows click */ + $(document).on('click', '.lcl_tn_prev:not(.lcl_tn_disabled_arr)', function(e) { + if(obj != lcl_curr_obj) {return true;} + + $('.lcl_tn_inner').stop(true).animate({"scrollLeft" : ($('.lcl_tn_inner').scrollLeft() - lcl_curr_opts.thumbs_w - 10)}, 300, 'linear', function() { + $('.lcl_tn_inner').trigger('lcl_smoothscroll_end'); + }); + }); + + $(document).on('click', '.lcl_tn_next:not(.lcl_tn_disabled_arr)', function(e) { + if(obj != lcl_curr_obj) {return true;} + + $('.lcl_tn_inner').stop(true).animate({"scrollLeft" : ($('.lcl_tn_inner').scrollLeft() + lcl_curr_opts.thumbs_w + 10)}, 300, 'linear', function() { + $('.lcl_tn_inner').trigger('lcl_smoothscroll_end'); + }); + }); + + + /* thumbs navigator - navigate with mousewheel */ + $(document).on('wheel', '#lcl_thumbs_nav.lcl_tn_has_arr', function(e) { + if(obj != lcl_curr_obj) {return true;} + + e.preventDefault(); + var delta = e.originalEvent.deltaY; + + if(delta > 0) {$('.lcl_tn_prev:not(.lcl_tn_disabled_arr)').trigger('click');} + else {$('.lcl_tn_next:not(.lcl_tn_disabled_arr)').trigger('click');} + }); + + + /* right click prevent */ + $(document).on("contextmenu", "#lcl_wrap *", function() { + if(obj != lcl_curr_obj) {return true;} + + if(lcl_ai_opts.rclick_prevent) { + return false; + } + }); + + + /* avoid page scrolling on touch devices */ + $(window).on('touchmove', function(e) { + var $t = $(e.target); + if(!lcl_shown || !lcl_on_mobile) {return true;} + if(obj != lcl_curr_obj) {return true;} + + if(!$(e.target).parents('#lcl_window').length && !$(e.target).parents('#lcl_thumbs_nav').length) { + e.preventDefault(); + } + }); + + + ///////////////////////////////////////////////////////////// + + + // touchswipe & zoom on pinch - requires alloy_finger.min.js + var touch_events = function() { + if(typeof(AlloyFinger) != 'function') {return false;} + lcl_is_pinching = false; + + var el = document.querySelector('#lcl_wrap'); + var af = new AlloyFinger(el, { + singleTap: function(e) { + + // close lb tapping on overlay + if($(e.target).attr('id') == 'lcl_overlay' && !lcl_ai_opts.modal) { + lcl_close(); + } + }, + doubleTap: function (e) { + e.preventDefault(); + zoom(true); + }, + pinch: function(e) { + e.preventDefault(); + lcl_is_pinching = true; + + if(typeof(lcl_swipe_delay) != 'undefined') {clearTimeout(lcl_swipe_delay);} + + if(typeof(lcl_pinch_delay) != 'undefined') {clearTimeout(lcl_pinch_delay);} + lcl_pinch_delay = setTimeout(function() { + + if(e.scale > 1.2) { + zoom(true); + } + else if(e.scale < 0.8) { + zoom(false); + } + + // avoid swipe if zoom-out + setTimeout(function() { + lcl_is_pinching = false; + }, 300); + }, 20); + }, + touchStart: function(e) { + lcl_touchstartX = e.changedTouches[0].clientX; + }, + touchEnd: function(e) { // simulate swipe with threshold + var diff = lcl_touchstartX - e.changedTouches[0].clientX; + + if((diff < -50 || diff > 50) && !lcl_is_pinching) { + + // ignore if consulting thumbs nav + if($(e.target).parents('#lcl_thumbs_nav').length) { + return false; + } + + // do not swipe on zoomed + if($(e.target).parents('.lcl_zoom_wrap').length) { + return false; + } + + var delay = ($(e.target).parents('.lcl_zoomable').length) ? 250 : 0; + if(typeof(lcl_swipe_delay) != 'undefined') {clearTimeout(lcl_swipe_delay);} + + lcl_swipe_delay = setTimeout(function() { + + if(diff < -50) { + switch_elem('prev'); + } + else { + switch_elem('next'); + } + }, delay); + } + } + }); + }; + + + ///////////////////////////////////////////////////////////// + + + //// PUBLIC METHODS + // set current settings and vars - for actions with lightbox opened - return false if object not initialized + var set_curr_vars = function() { + if(!lcl_curr_obj) {return false;} + + lcl_ai_vars = $.data(lcl_curr_obj, 'lcl_vars'); + lcl_ai_opts = $.data(lcl_curr_obj, 'lcl_settings'); + + if(!lcl_ai_vars) { + console.error('LC Lightbox. Object not initialized'); + return false; + } + return true; + }; + + + // open lightbox + lcl_open = function(obj, index) { + lcl_ai_vars = $.data(obj, 'lcl_vars'); + var v = lcl_ai_vars; + + // check instance existence + if(!v) { + console.error('LC Lightbox - cannot open. Object not initialized'); + return false; + } + else if(typeof(v.elems[index]) == 'undefined') { + console.error('LC Lightbox - cannot open. Unexisting index'); + return false; + } + else { + v.elem_index = index; + $clicked_obj = (v.is_arr_instance) ? false : $(obj[index]); + + return open_lb(obj, $clicked_obj); + } + }; + + + // resize lightbox + lcl_resize = function() { + if(!lcl_shown || lcl_is_active || !set_curr_vars()) {return false;} + + var v = lcl_ai_vars; + if(typeof(lcl_size_check) != 'undefined') {clearTimeout(lcl_size_check);} + + lcl_size_check = setTimeout(function() { + $('#lcl_wrap').addClass('lcl_is_resizing'); + thumbs_nav_arrows_opacity(); + + var el = v.elems[ v.elem_index ]; + return size_elem(el); + }, 20); + }; + + + // close lightbox and destroy vars + lcl_close = function() { + if(!lcl_shown || lcl_is_active || !set_curr_vars()) {return false;} + return close_lb(); + }; + + + // pagination (next/prev/index) + lcl_switch = function(new_el) { + if(!lcl_shown || lcl_is_active || !set_curr_vars()) {return false;} + return switch_elem(new_el); + }; + + + // start slideshow + lcl_start_slideshow = function(restart) { + if(!lcl_shown || (typeof(restart) == 'undefined' && typeof(lcl_slideshow) != 'undefined') || !set_curr_vars()) {return false;} + var o = lcl_ai_opts; + + // if is latest element and isn't carousel - return false + if(!o.carousel && lcl_ai_vars.elem_index == (lcl_ai_vars.elems.length - 1)) { + return false; + } + + if(typeof(lcl_slideshow) != 'undefined') {clearInterval(lcl_slideshow);} // if reset timing + $('#lcl_wrap').addClass('lcl_is_playing'); + + var time = o.animation_time + o.slideshow_time; + + // use progressbar? + progbar_animate(true); + + // start + lcl_slideshow = setInterval(function() { + progbar_animate(false); + switch_elem('next', true); + }, time); + + ////// + + if(typeof(restart) == 'undefined') { + + // slideshow start - callback + if(typeof(o.slideshow_start) == 'function') { + o.slideshow_start.call(null, o, lcl_ai_vars); + } + + // slideshow start - hook | args: interval time + if(!lcl_ai_vars.is_arr_instance) { + var $subj = (lcl_ai_vars.elems_selector) ? $(lcl_ai_vars.elems_selector) : lcl_curr_obj; + $subj.first().trigger('lcl_slideshow_start', [time]); + } + } + + return true; + }; + + + // stop slideshow + lcl_stop_slideshow = function() { + if(!lcl_shown || typeof(lcl_slideshow) == 'undefined' || !set_curr_vars()) {return false;} + var o = lcl_ai_opts; + + // check instance existence + if(!o) { + console.error('LC Lightbox. Object not initialized'); + return false; + } + + clearInterval(lcl_slideshow); lcl_slideshow = undefined; + $('#lcl_wrap').removeClass('lcl_is_playing'); + + $('#lcl_progressbar').stop(true).animate({'marginTop' : ($('#lcl_progressbar').height() * -3)}, 300, function() { + $(this).remove(); + }); + + ////// + + // slideshow end - callback + if(typeof(o.slideshow_end) == 'function') { + o.slideshow_end.call(null, lcl_ai_opts, lcl_ai_vars); + } + + // slideshow end - hook + if(!lcl_ai_vars.is_arr_instance) { + var $subj = (lcl_ai_vars.elems_selector) ? $(lcl_ai_vars.elems_selector) : lcl_curr_obj; + $subj.first().trigger('lcl_slideshow_end', []); + } + + + return true; + }; + + return obj; + }; +})(jQuery); \ No newline at end of file diff --git a/lc-lightbox/js/lc_lightbox.min.js b/lc-lightbox/js/lc_lightbox.min.js new file mode 100644 index 0000000..e9d5357 --- /dev/null +++ b/lc-lightbox/js/lc_lightbox.min.js @@ -0,0 +1,13 @@ +/** + * LC Lightbox + * yet.. another jQuery lightbox.. or not? + * + * @version : 1.3.2 + * @copyright : Luca Montanari (LCweb) + * @website : https://lcweb.it + * @requires : jQuery v1.7 or later + + * Commercial license + */ + +!function(l){lcl_objs=[],lcl_shown=!1,lcl_is_active=!1,lcl_slideshow=void 0,lcl_on_mobile=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),lcl_curr_obj=!1,lcl_curr_opts=!1,lcl_curr_vars=!1,lcl_deeplink_tracked=!1,lcl_hashless_url=!1,lcl_url_hash="",lcl_vid_instance_num=0;lc_lightbox=function(t,c){if("string"!=typeof t&&("object"!=typeof t||!t.length))return!1;var o=!1;if(l.each(lcl_objs,(function(l,e){if(JSON.stringify(e)==JSON.stringify(t))return o=e,!1})),!1===o){var i=new e(t,c);return lcl_objs.push(i),i}return o},lcl_destroy=function(e){var t=l.inArray(e,lcl_objs);-1!==t&&lcl_objs.splice(t,1)};var e=function(e,t){var c=l.extend({gallery:!0,gallery_hook:"rel",live_elements:!0,preload_all:!1,global_type:!1,deeplink:!1,img_zoom:!1,comments:!1,src_attr:"href",title_attr:"title",txt_attr:"data-lcl-txt",author_attr:"data-lcl-author",author_by_txt:"by",slideshow:!0,open_close_time:400,ol_time_diff:100,fading_time:80,animation_time:250,slideshow_time:6e3,autoplay:!1,counter:!1,progressbar:!0,carousel:!0,max_width:"93%",max_height:"93%",wrap_padding:!1,ol_opacity:.7,ol_color:"#111",ol_pattern:!1,border_w:0,border_col:"#ddd",padding:0,radius:0,shadow:!0,remove_scrollbar:!0,wrap_class:"",skin:"light",data_position:"over",cmd_position:"inner",ins_close_pos:"normal",nav_btn_pos:"normal",txt_hidden:500,show_title:!0,show_descr:!0,show_author:!0,thumbs_nav:!0,tn_icons:!0,tn_hidden:500,thumbs_w:110,thumbs_h:110,thumb_attr:!1,thumbs_maker_url:!1,fullscreen:!1,fs_img_behavior:"fit",fs_only:500,browser_fs_mode:!0,socials:!1,fb_share_params:!1,txt_toggle_cmd:!0,download:!1,autoplay_videos:!0,touchswipe:!0,mousewheel:!0,modal:!1,rclick_prevent:!1,elems_parsed:function(){},html_is_ready:function(){},on_open:function(){},on_elem_switch:function(){},slideshow_start:function(){},slideshow_end:function(){},on_fs_enter:function(){},on_fs_exit:function(){},on_close:function(){}},t),o={elems:[],is_arr_instance:"string"!=typeof e&&void 0===e[0].childNodes,elems_count:"string"!=typeof e&&void 0===e[0].childNodes?e.length:l(e).length,elems_selector:"string"==typeof e&&e,elem_index:!1,gallery_hook_val:!1,preload_all_used:!1,img_sizes_cache:[],vimeo_thumb_cache:[],inner_cmd_w:!1,txt_exists:!1,txt_und_sizes:!1,force_fullscreen:!1,html_style:"",body_style:""};"string"==typeof e&&(e=l(e));var i=l.data(e,"lcl_settings",c),_=l.data(e,"lcl_vars",o),n=function(l){if("string"!=typeof l)return l;for(var e=0,t=0,c=l.toString().length;t").replace(/&/g,"&").replace(/"/g,'"').replace(/'/g,"'"),l.trim(e)):e},d=function(e,t){var c=i[t];return-1!==c.indexOf("> ")?e.find(c.replace("> ","")).length?l.trim(e.find(c.replace("> ","")).html()):"":void 0!==e.attr(c)?s(e.attr(c)):""},u=function(e){var t=i,c=[];return e.each((function(){var e=l(this),o=e.attr(t.src_attr),i=n(o);if(_.gallery_hook_val&&e.attr(t.gallery_hook)!=_.gallery_hook_val)return!0;var s=function(e){var t=!1;return l.each(_.elems,(function(l,c){if(c.hash==e)return t=c,!1})),t}(i);if(s)var a=s;else{var u=m(o,e.data("lcl-type"));if("unknown"!=u)(a={src:o,type:u,hash:!!t.deeplink&&n(o),title:t.show_title?d(e,"title_attr"):"",txt:t.show_descr?d(e,"txt_attr"):"",author:t.show_author?d(e,"author_attr"):"",thumb:t.thumb_attr&&void 0!==t.thumb_attr?e.attr(t.thumb_attr):"",width:"image"!=u&&void 0!==e.data("lcl-w")&&e.data("lcl-w"),height:"image"!=u&&void 0!==e.data("lcl-h")&&e.data("lcl-h"),force_over_data:void 0!==e.data("lcl-force-over-data")?parseInt(e.data("lcl-force-over-data"),10):"",force_outer_cmd:void 0!==e.data("lcl-outer-cmd")?e.data("lcl-outer-cmd"):"",canonical_url:void 0!==e.data("lcl-canonical-url")?e.data("lcl-canonical-url"):""}).download="image"==u?void 0!==e.data("lcl-path")?e.data("lcl-path"):o:("video"==u||"html"==u)&&void 0!==e.data("lcl-path")&&e.data("lcl-path"),-1!==l.inArray(u,["youtube","vimeo","dailymotion"])&&(a.video_id=r(u,a)),"image"!=u&&void 0!==e.data("lcl-poster")&&("youtube"==u&&"auto"==e.data("lcl-poster")?a.poster="https://img.youtube.com/vi/"+a.video_id+"/maxresdefault.jpg":a.poster=e.data("lcl-poster"));else a={src:o,type:u,hash:!!t.deeplink&&n(o)}}c.push(a)})),c.length<2&&l(".lcl_prev, .lcl_next, #lcl_thumb_nav").remove(),!!c.length&&(_.elems=c,!0)},m=function(e,t){if(void 0===t&&(t=i.global_type),-1!==l.inArray(t,["image","video","youtube","vimeo","dailymotion","html","iframe"]))return t;e=e.toLowerCase();return/^(http|https)?:\/\/(?:[a-z\-]+\.)+[a-z]{2,6}(?:\/[^\/#?]+)+\.(?:jpe?g|gif|png|webp|avif)$/.test(e)?"image":/^(http|https)?:\/\/(?:[a-z\-]+\.)+[a-z]{2,6}(?:\/[^\/#?]+)+\.(?:mp4|ogg|webm)$/.test(e)?"video":/^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})(?:\S+)?$/.test(e)?"youtube":-1!==e.indexOf("vimeo.com/")?"vimeo":-1!==e.indexOf("dailymotion.com/video")?"dailymotion":/^(http|https)?:\/\/[a-zA-Z0-9-\.]+\.[a-z]{2,4}/.test(e)?"iframe":"#"==e.substr(0,1)&&l(e).length?"html":"unknown"},h=function(){if(_.elems.length<2||!i.gallery)return!1;_.elem_index>0&&p(!1,_.elem_index-1),_.elem_index!=_.elems.length-1&&p(!1,_.elem_index+1)},p=function(e,t,c){var o=_;if(void 0===t&&(t=o.elem_index),void 0===t)return!1;if("image"==o.elems[t].type||-1!==l.inArray(o.elems[t].type,["video","youtube","vimeo","dailymotion"])&&o.elems[t].poster)var i="image"==o.elems[t].type?o.elems[t].src:o.elems[t].poster;else i="";if(i&&void 0===o.img_sizes_cache[i]){let l=new Image;l.src=i,l.onload=function(l){o.img_sizes_cache[i]={w:l.target.width,h:l.target.height},e&&t==o.elem_index&&y()}}else(e||void 0!==c)&&l("#lcl_loader").addClass("no_loader"),e&&y()};l(document).on("click",".lcl_postered_video:not(.lcl_poster_clicked)",(function(){var e=l(this).find("iframe");l(this).addClass("lcl_poster_clicked"),e.attr("src",e.data("lazy-src")),e.on("load",(function(){l("#lcl_wrap").addClass("lcl_playing_video"),setTimeout((function(){e.parent().removeAttr("style")}),100)}))}));var f=function(t,c){var o=l.data(t,"lcl_settings"),a=l.data(t,"lcl_vars");if(a.is_arr_instance){var d=[];l.each(t,(function(e,t){var c={},i=!(void 0!==t.type||!o.global_type)&&o.global_type;if(void 0!==t.type&&(i=t.type),i&&-1!==l.inArray(i,["image","video","youtube","vimeo","dailymotion","html","iframe"]))void 0!==t.src&&t.src&&(c.src=t.src,c.type=i,c.hash=n(t.src),c.title=void 0===t.title?"":s(t.title),c.txt=void 0===t.txt?"":s(t.txt),c.author=void 0===t.author?"":s(t.author),c.width=void 0!==t.width&&t.width,c.height=void 0!==t.height&&t.height,c.force_over_data=void 0!==t.force_over_data&&parseInt(t.force_over_data,10),c.force_outer_cmd=void 0!==t.force_outer_cmd&&t.force_outer_cmd,c.canonical_url=void 0!==t.canonical_url&&t.canonical_url,c.thumb=void 0!==t.thumb&&t.thumb,c.download="image"==i?void 0!==t.download?t.download:t.src:("video"==i||"html"==i)&&void 0!==t.download&&t.download,-1!==l.inArray(i,["youtube","vimeo","dailymotion"])&&(c.video_id=r(i,t)),c.poster="image"==i||void 0===t.poster?"":t.poster,d.push(c));else{c={src:c.src,type:"unknown",hash:!!o.deeplink&&n(c.src)};d.push(c)}})),a.elems=d}else{var m=t;if(o.live_elements&&a.elems_selector){var h=!!(c&&o.gallery&&o.gallery_hook&&void 0!==l(e[0]).attr(o.gallery_hook))?a.elems_selector+"["+o.gallery_hook+"="+c.attr(o.gallery_hook)+"]":a.elems_selector;m=l(h)}if(!u(m))return(!o.live_elements||o.live_elements&&!a.elems_selector)&&console.error("LC Lightbox - no valid elements found"),!1}(o.preload_all&&!a.preload_all_used&&(a.preload_all_used=!0,l(document).ready((function(e){l.each(a.elems,(function(l,e){p(!1,l)}))}))),"function"==typeof o.elems_parsed&&o.elems_parsed.call(null,i,_),a.is_arr_instance)||(m=a.elems_selector?l(a.elems_selector):t).first().trigger("lcl_elems_parsed",[a.elems]);return!0};f(e);var v=function(e,t){if(lcl_shown||lcl_is_active)return!1;lcl_shown=!0,lcl_is_active=!0,lcl_curr_obj=e,i=l.data(e,"lcl_settings"),_=l.data(e,"lcl_vars"),lcl_curr_opts=i,lcl_curr_vars=_;var c=i,o=_,n=void 0!==t&&t;if(!_)return console.error("LC Lightbox - cannot open. Object not initialized"),!1;if(o.gallery_hook_val=!!(n&&c.gallery&&c.gallery_hook&&void 0!==n.attr(c.gallery_hook))&&n.attr(c.gallery_hook),!f(e,t))return!1;if(n)l.each(o.elems,(function(l,e){if(e.src==n.attr(c.src_attr))return o.elem_index=l,!1}));else if(parseInt(o.elem_index,10)>=o.elems_count)return console.error("LC Lightbox - selected index does not exist"),!1;p(!1),w(),c.touchswipe&&V(),o.force_fullscreen&&H(!0,!0),l("#lcl_thumbs_nav").length&&U(),p(!0),h()},g=function(){l("#lcl_wrap").removeClass("lcl_pre_show").addClass("lcl_shown"),l("#lcl_loader").removeClass("lcl_loader_pre_first_el")},w=function(){var e=i,t=_,c=[],o="";if("number"==typeof document.documentMode&&(l("body").addClass("lcl_old_ie"),"outer"!=e.cmd_position&&(e.nav_btn_pos="normal")),l("#lcl_wrap").length&&l("#lcl_wrap").remove(),l("body").append('
    '),l("#lcl_wrap").attr("data-lcl-max-w",e.max_width).attr("data-lcl-max-h",e.max_height),c.push("lcl_"+e.ins_close_pos+"_close lcl_nav_btn_"+e.nav_btn_pos+" lcl_"+e.ins_close_pos+"_close lcl_nav_btn_"+e.nav_btn_pos),(!0===e.tn_hidden||"number"==typeof e.tn_hidden&&(l(window).width() *:not(.lcl_close)").length||(o+="#lcl_wrap:not(.lcl_fullscreen_mode):not(.lcl_forced_outer_cmd) #lcl_nav_cmd {display: none;}")),l("#lcl_inline_style").length&&l("#lcl_inline_style").remove(),l("head").append('"),e.remove_scrollbar){_.html_style=void 0!==jQuery("html").attr("style")?jQuery("html").attr("style"):"",_.body_style=void 0!==jQuery("body").attr("style")?jQuery("body").attr("style"):"";var s=l(window).width();l("html").css("overflow","hidden"),l("html").css({"margin-right":l(window).width()-s,"touch-action":"none"}),l("body").css({overflow:"visible","touch-action":"none"})}var a=_.elems[t.elem_index];("image"!=a.type||"image"==a.type&&void 0!==t.img_sizes_cache[a.src]?c.push("lcl_show_already_shaped"):g(),l("#lcl_wrap").addClass(c.join(" ")),"function"==typeof e.html_is_ready&&e.html_is_ready.call(null,i,_),_.is_arr_instance)||(_.elems_selector?l(_.elems_selector):lcl_curr_obj).first().trigger("lcl_html_is_ready",[i,_])},b=function(e){var t=l(e)[0],c=null;t.addEventListener("touchstart",(function(l){1===l.targetTouches.length&&(c=l.targetTouches[0].clientY)}),!1),t.addEventListener("touchmove",(function(l){1===l.targetTouches.length&&function(l){var e=l.targetTouches[0].clientY-c;0===t.scrollTop&&e>0&&l.preventDefault();t.scrollHeight-t.scrollTop<=t.clientHeight&&e<0&&l.preventDefault()}(l)}),!1)},y=function(){if(!lcl_shown)return!1;var e=_,t=e.elems[e.elem_index];(l("#lcl_wrap").attr("lc-lelem",e.elem_index),i.carousel||(l("#lcl_wrap").removeClass("lcl_first_elem lcl_last_elem"),e.elem_index?e.elem_index==e.elems.length-1&&l("#lcl_wrap").addClass("lcl_last_elem"):l("#lcl_wrap").addClass("lcl_first_elem")),l(document).trigger("lcl_before_populate_global",[t,e.elem_index]),k(t),e.is_arr_instance)||(e.elems_selector?l(e.elems_selector):lcl_curr_obj).first().trigger("lcl_before_show",[t,e.elem_index]);(l(document).trigger("lcl_before_show_global",[t,e.elem_index]),l("#lcl_wrap").hasClass("lcl_pre_first_el"))&&("function"==typeof i.on_open&&i.on_open.call(null,i,_),e.is_arr_instance||(e.elems_selector?l(e.elems_selector):lcl_curr_obj).first().trigger("lcl_on_open",[t,e.elem_index]));C(t),l("#lcl_subj").removeClass("lcl_switching_el")},x=function(l){return!!(l.title||l.txt||l.author)},k=function(e){var t=_.elem_index;switch(l("#lcl_elem_wrap").removeAttr("style").removeAttr("class").empty(),l("#lcl_wrap").attr("lcl-type",e.type),l("#lcl_elem_wrap").addClass("lcl_"+e.type+"_elem"),e.type){case"image":l("#lcl_elem_wrap").css("background-image","url('"+e.src+"')");break;case"video":if(l("#lcl_videojs_css").length||(l("head").append(''),"function"!=typeof videojs&&l("head").append(' - + @@ -41,7 +42,7 @@ try { $conn4 = new PDO('sqlite:db_photo.sqlite3'); - $query4 = "SELECT filename, dateoriginal, lens, speed, iso, width, height, html, aperture, model, lat, long, alt, legende, copyright, title, creator, keywords, metering, flash, focal, wb, program FROM photos WHERE lat != '' ORDER BY dateoriginal DESC"; + $query4 = "SELECT filename, filesize, dateoriginal, lens, speed, correctexpo, iso, usercomment, comment, model, metering, flash, focal, program, wb, mode, width, height, html, aperture, software, lat, long, alt, keywords, title, creator, city, department, code, country, copyright, legende FROM photos WHERE lat != '' ORDER BY dateoriginal DESC"; $stmt = $conn4->prepare($query4); $stmt->execute(); @@ -54,6 +55,8 @@ catch(PDOException $e) { echo $e->getMessage(); } + + //_pr($result); ?> @@ -178,14 +181,14 @@ }); }); - +

    © 2013- sur-le-sentier.fr

    - - + + diff --git a/modify_bdd.php b/modify_bdd.php index aaafad0..9569f8f 100644 --- a/modify_bdd.php +++ b/modify_bdd.php @@ -1,3 +1,152 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + + //echo " close session
    "; + +/* +if (!empty($_POST)) { + _pr($_POST); +} + +Array +( + [lens] => EF17-40mm f/4L USM + [keywords] => _vert_,neige,vigne + [titre] => Vignes + [creator] => Pesenti Bruno + [city] => Fixin + [department] => Côte d'Or + [code] => FR + [country] => France + [copyright] => © bruno@clicclac.info + [legende] => Vignes dans la neige + [id] => 77 + [update] => update +) +*/ +if (isset($_POST['update']) && $_POST['update'] === 'update') { + + $w = filter_var_array($_POST['id'], FILTER_VALIDATE_INT); + $z = ""; + $count = 0; + $requests = array(); + + foreach ($w as $key => $value) { + + if (isset($_POST['id'][$key]) && (! empty($_POST['id'][$key]))) { + + $id = filter_var($_POST['id'][$key], FILTER_VALIDATE_INT); + + $lens = filter_var($_POST['lens'][$key], FILTER_SANITIZE_SPECIAL_CHARS); + $keywords = filter_var($_POST['keywords'][$key], FILTER_SANITIZE_SPECIAL_CHARS); + $title = filter_var($_POST['title'][$key], FILTER_SANITIZE_SPECIAL_CHARS); + $creator = filter_var($_POST['creator'][$key], FILTER_SANITIZE_SPECIAL_CHARS); + $city = filter_var($_POST['city'][$key], FILTER_SANITIZE_SPECIAL_CHARS); + $department = filter_var($_POST['department'][$key], FILTER_SANITIZE_SPECIAL_CHARS); + $code = filter_var($_POST['code'][$key], FILTER_SANITIZE_SPECIAL_CHARS); + $country = filter_var($_POST['country'][$key], FILTER_SANITIZE_SPECIAL_CHARS); + $copyright = filter_var($_POST['copyright'][$key], FILTER_SANITIZE_SPECIAL_CHARS); + $legende = filter_var($_POST['legende'][$key], FILTER_SANITIZE_SPECIAL_CHARS); + + $z .= "id = '" . $id . "' OR "; + + //echo $id . "----" . $lens. "----" . $keywords. "----" . $title. "----" . $creator. "----" . $city . "
    "; + //echo $department . "----" . $code. "----" . $country. "----" . $copyright. "----" . $legende . "

    "; + /* + echo "id:$id--". "
    "; + echo "lens:$lens--". "
    "; + echo "keywords:$keywords--". "
    "; + echo "title:$title--". "
    "; + echo "creator:$creator--". "
    "; + echo "city :$city --". "
    "; + echo "department:$department--". "
    "; + echo "code:$code--". "
    "; + echo "country:$country--". "
    "; + echo "copyright:$copyright--". "
    "; + echo "legende:$legende--". "
    ". "
    "; + */ + /* + $id = $_POST['id']; + $lens = (isset($_POST['lens']) && (! empty($_POST['lens']))) ? $_POST['lens'] : ''; + $keywords = (isset($_POST['keywords']) && (! empty($_POST['keywords']))) ? $_POST['keywords'] : ''; + $title = (isset($_POST['title']) && (! empty($_POST['title']))) ? $_POST['title'] : ''; + $creator = (isset($_POST['creator']) && (! empty($_POST['creator']))) ? $_POST['creator'] : ''; + $city = (isset($_POST['city']) && (! empty($_POST['city']))) ? $_POST['city'] : ''; + $department = (isset($_POST['department']) && (! empty($_POST['department']))) ? $_POST['department'] : ''; + $code = (isset($_POST['code']) && (! empty($_POST['code']))) ? $_POST['code'] : ''; + $country = (isset($_POST['country']) && (! empty($_POST['country']))) ? $_POST['country'] : ''; + $copyright = (isset($_POST['copyright']) && (! empty($_POST['copyright']))) ? $_POST['copyright'] : ''; + $legende = (isset($_POST['legende']) && (! empty($_POST['legende']))) ? $_POST['legende'] : ''; + */ + + $req = "UPDATE photos SET lens = :lens , keywords = :keywords , title = :title , creator = :creator "; + $req .= ", city = :city , department = :department , code = :code , country = :country "; + $req .= ", copyright = :copyright , legende = :legende WHERE id= :id"; + + // affichage requetes + $keys = array_keys($_POST); + $count_id = count($_POST["id"]); + + for ($i = 0; $i < $count_id; $i++) { + + foreach ($keys as $key => $value) { + if ($value != "update") { + $search = ":" . $value; + $replace = "'" . $_POST[$value][$i] . "'"; + $replacements[$search] = $replace; + } + } + $requests[$i] = strtr($req, $replacements); + //$requests[$i] = wordwrap(strtr($req, $replacements), 120, "\n", true); + } + + try { + $stmt = $conn->prepare($req); + + $stmt->bindValue(':id', $id); + $stmt->bindValue(':lens', $lens); + $stmt->bindValue(':keywords', $keywords); + $stmt->bindValue(':title', $title); + $stmt->bindValue(':creator', $creator); + $stmt->bindValue(':city', $city); + $stmt->bindValue(':department', $department); + $stmt->bindValue(':code', $code); + $stmt->bindValue(':country', $country); + $stmt->bindValue(':copyright', $copyright); + $stmt->bindValue(':legende', $legende); + + $stmt->execute(); + + $count = $count + $stmt->rowCount(); + + } + catch(PDOException $e) { + echo $e->getMessage(); + } + + } + } + + $msg = "Updated $count rows with following request:"; + $conn = null; + +} +else { + $url = "view_bdd.php?message=" . urlencode(gettext("No image select !")); + header("location: $url"); +} +?> + @@ -8,59 +157,92 @@ <?php gettext('View photos in Sqlite base'); ?> - - - + + + - "; -_pr($_SESSION); -//echo $_SESSION['query']; - - $domain = 'sentier'; - localize($domain); - - - if (!empty($_POST)) { - _pr($_POST); - } - /* - $_SESSION['query'] = $_POST; - echo "post query non vide"; - echo gettype($_POST); - echo gettype($_SESSION['query']); - */ - #$liste = $_POST; - - ?> - - -

    - +

    + ' . $msg . ''; - $base = 'db_photo.sqlite3'; + echo '
    ';
    +	foreach ($requests as $request) {
    +		echo $request . "
    "; + } + echo '
    '; + + + $req = substr($z, 0, -4); + $req_edit = "SELECT * FROM photos WHERE " . $req . " ORDER BY id"; - echo " close session
    "; -?> - + try { + $conn = new PDO('sqlite:db_photo.sqlite3'); + $stmt = $conn->prepare($req_edit); + $stmt->execute(); -

    © 2013- sur-le-sentier.fr

    + echo ''; + echo ''; + echo ''; + echo ''; + + echo ''; + echo ''; + echo ''; + + $nRows = 0; + while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { + $thumbnail = host() . str_replace("photos/img", "photos/thumb", $row['filename']); + $full = host() . $row['filename']; + + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + + echo ''; + echo ''; + echo ''; + echo ''; + + echo ''; + echo ''; - - + echo ''; + + $nRows++; + } + + echo '
    ' . gettext('Id') . '' . gettext('Thumb') . '' . gettext('Filename') . '' . gettext('Date') . ' ' . gettext('Speed') . '' . gettext('Iso') . '' . gettext('Aperture') . '' . gettext('Expo. correct') . '' . gettext('Model') . '' . gettext('Lens') . '' . gettext('Focal') . '' . gettext('Metering') . '' . gettext('Program') . '' . gettext('Wb') . '' . gettext('Flash') . '' . gettext('Software') . '' . gettext('Keywords') . '' . gettext('Title') . '' . gettext('Creator') . '' . gettext('City') . '' . gettext('Department') . '' . gettext('Code') . '' . gettext('Country') . '' . gettext('Copyright') . '' . gettext('Legende') . '
    ' . $row['id'] . '' . '' . '' . $row['filename'] . '' . $row['dateoriginal'] . '' . $row['speed'] . '' . $row['iso'] . '' . $row['aperture'] . '' . $row['correctexpo'] . '' . $row['model'] . '' . $row['focal'] . '' . $row['metering'] . '' . $row['program'] . '' . $row['wb'] . '' . $row['flash'] . '' . $row['software'] . '
    '; + + $conn = null; + + } + catch(PDOException $e) { + echo $e->getMessage(); + } + ?> + + + + +

    © 2013- sur-le-sentier.fr

    + + + diff --git a/photo-du-mois.php b/photo-du-mois.php index 2bb37a6..3f6ace3 100644 --- a/photo-du-mois.php +++ b/photo-du-mois.php @@ -1,3 +1,4 @@ + @@ -5,20 +6,21 @@ - <?php echo gettext("Picture of the month"); ?> + <?php //echo gettext("Picture of the month"); ?> - - - + + + - - + @@ -32,10 +34,15 @@ else $page = intval($_GET['page']); ?> getMessage(); } +} +else exit("Database " . $base . " does not exist !"); +//_pr($result); + ?>

    @@ -58,11 +69,26 @@ try { '; - echo ''; - echo ''; + echo ''; + echo '' . htmlspecialchars($lb['title']) . ''; echo ""; echo ''; + if (!empty($lb['title']) || !empty($lb['legende'])) { ?> @@ -117,6 +143,9 @@ try { for ($i = 1; $i <= ($rowcount -1); $i++) { $date = $result[$i]['dateoriginal']; + //_pr($result[$i]); + //debug_to_console($result[$i]); + $lb = data_for_lightbox($result[$i]); // @@ -132,7 +161,12 @@ try { // echo '
    '; - echo ''; + //echo ''; + //echo ''; + // '" by="par' . + + echo ''; + echo '' . htmlspecialchars($lb['title']) . ''; echo ""; echo '' . month($date) . ''; @@ -163,31 +197,48 @@ try { - + + diff --git a/query_bdd.php b/query_bdd.php new file mode 100644 index 0000000..efe40d5 --- /dev/null +++ b/query_bdd.php @@ -0,0 +1,67 @@ +open('db_photo.sqlite3'); + } + } + $db = new MyDB(); + if(!$db){ + echo $db->lastErrorMsg(); + } else { + $ret = $db->query("SELECT * FROM photos WHERE id LIKE '$id%' AND filename LIKE '%$filename%' AND dateoriginal LIKE '%$dateoriginal%' AND speed LIKE '$speed%' AND iso LIKE '$iso%' AND aperture LIKE '$aperture%' AND correctexpo LIKE '$correctexpo%' AND model LIKE '%$model%' AND lens LIKE '%$lens%' AND focal LIKE '%$focal%' AND metering LIKE '%$metering%' AND program LIKE '%$program%' AND wb LIKE '%$wb%' AND software LIKE '%$software%' ORDER BY $column $order"); + while($row = $ret->fetchArray(SQLITE3_ASSOC) ){ + + $thumbnail = host() . str_replace("photos/img", "photos/thumb", $row['filename']); + $full = host() . $row['filename']; + $lb = data_for_lightbox($row); + + echo ""; + echo (isset($_SESSION["user"])) ? '' . '' . '' : ''; + echo "".$row['id'].""; + echo "" . "" . htmlspecialchars($lb["; + echo "".$row['filename'].""; + echo "".$row['dateoriginal'].""; + echo "".$row['speed'].""; + echo "".$row['iso'].""; + echo "".$row['aperture'].""; + echo "".$row['correctexpo'].""; + echo "".$row['model'].""; + echo "".$row['lens'].""; + echo "".$row['focal'].""; + echo "".$row['metering'].""; + echo "".$row['program'].""; + echo "".$row['wb'].""; + + echo "".$row['software'].""; + echo ""; + } + } + $db->close(); +}else{ + header('Location: view_bdd.php'); +} + +?> \ No newline at end of file diff --git a/requests.php b/requests.php index 08f62e2..e95d383 100644 --- a/requests.php +++ b/requests.php @@ -1,3 +1,9 @@ + @@ -5,28 +11,16 @@ - <?php gettext('View photos in Sqlite base'); ?> + <?php echo gettext('View photos in Sqlite base'); ?> - - - + + + - - - @@ -37,6 +31,49 @@ $base = 'db_photo.sqlite3'; +_pr($_POST); +/* +( + [model] => Canon EOS 7D +) +*/ +//if ((isset($_POST)) and (! empty($_POST))) { +if (! empty($_POST)){ + echo "info dispo"; + $key = key($_POST); + $val = $_POST["$key"]; + $_POST = array(); + + $page = 1; + + //echo $key . " - " . $val; + $req = "SELECT * FROM photos WHERE " . $key . " = '" . $val . "'"; + echo $req; + + $conn2 = new PDO("sqlite:db_photo.sqlite3"); + $conn2->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + + $limit = 13; + $offset = $limit * ($page -1); + + $stmt = $conn2->prepare($req); + //$stmt->execute(array($limit, $offset)); + $stmt->execute(); + + $result = $stmt->fetchAll(PDO::FETCH_ASSOC); + $rowcount = count($result); + echo $rowcount; + +} +else { + echo "non dispo"; +} + +_pr($_POST); + +echo 'requests'; + + $conn = new PDO("sqlite:db_photo.sqlite3"); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); @@ -124,12 +161,12 @@ https://www.csscodelab.com/pure-css-custom-select-box-dropdown-styling/ ?>
    -
    + @@ -138,12 +175,12 @@ https://www.csscodelab.com/pure-css-custom-select-box-dropdown-styling/
    - + @@ -151,25 +188,25 @@ https://www.csscodelab.com/pure-css-custom-select-box-dropdown-styling/
    -
    +
    -
    + @@ -177,12 +214,12 @@ https://www.csscodelab.com/pure-css-custom-select-box-dropdown-styling/
    -
    + @@ -190,12 +227,12 @@ https://www.csscodelab.com/pure-css-custom-select-box-dropdown-styling/
    - + -

    © 2013- sur-le-sentier.fr

    +

    © 2013- sur-le-sentier.fr

    - - + + diff --git a/view_bdd.php b/view_bdd.php index 42cb107..10cf529 100644 --- a/view_bdd.php +++ b/view_bdd.php @@ -1,399 +1,239 @@ - - - - - - - - <?php gettext('View photos in Sqlite base'); ?> - - - - - - - - "; -_pr($_SESSION); -//echo $_SESSION['query']; - - $domain = 'sentier'; - localize($domain); - ?> - - - - - - - -

    - - close session "; - -if (!isset($_GET['page'])) $page = 1; -else $page = intval($_GET['page']); - -echo "_POST
    "; -_pr($_POST); -if (!empty($_POST)) { - $_SESSION['query'] = $_POST; - echo "post query non vide"; - echo gettype($_POST); - echo gettype($_SESSION['query']); - } -echo "_SESSION['query']
    "; -_pr($_SESSION['query']); -$gps = (isset($_SESSION['query']['gps'])) ? $_SESSION['query']['gps'] : "off"; -echo $gps; -// form option - -$dir = (new AdvancedFilesystemIterator('photos/img/'))->match('/heic|HEIC|jpg|jpeg|JPG|JPEG|webp|WEBP$/'); - -echo '

    ' . count($dir) . gettext(' images found in folder') . ' photos/img/ ...

    '; - -$conn = new PDO("sqlite:db_photo.sqlite3"); -$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); - - -// Construction des requêtes -# SELECT * FROM photos WHERE dateoriginal LIKe '2021%' -# SELECT * FROM photos WHERE strftime('%Y', dateoriginal) = '2021' ORDER BY dateoriginal -# SELECT * FROM photos WHERE strftime('%Y', dateoriginal) = '2015' ORDER BY dateoriginal - -# SELECT DISTINCT strftime('%Y', dateoriginal) FROM photos WHERE dateoriginal <> "" ORDER BY dateoriginal - -$request = array( - 'lens' => 'SELECT DISTINCT lens FROM photos WHERE lens <> "" ORDER BY lens', - 'model' => 'SELECT DISTINCT model FROM photos WHERE model <> "" ORDER BY model', - 'iso' => 'SELECT DISTINCT iso FROM photos WHERE iso <> "" ORDER BY iso', - 'speed' => 'SELECT DISTINCT speed FROM photos WHERE speed <> "" ORDER BY speed', - 'keywords' => 'SELECT DISTINCT keywords FROM photos WHERE keywords <> ""', - 'strftime("%Y", dateoriginal)' => 'SELECT DISTINCT strftime("%Y", dateoriginal) FROM photos WHERE dateoriginal <> "" ORDER BY dateoriginal DESC' -); - -/* -$req = 'SELECT DISTINCT strftime("%Y", dateoriginal) FROM photos WHERE dateoriginal <> "" ORDER BY dateoriginal'; -$query = $conn->query($req); -$res = $query->fetchAll(PDO::FETCH_ASSOC); -preprint($res); -$res = array_column($res,'strftime("%Y", dateoriginal)'); -preprint($res); -*/ - -$select = array(); -$i = 0; -foreach ($request as $key => $val){ - $query = $conn->query($val); - $select[$i] = $query->fetchAll(PDO::FETCH_ASSOC); - $select[$i] = array_column($select[$i],$key); - if ($i == 4){ - $mc = array(); - foreach($select[$i] as $row){ - $x = explode(",", $row); - foreach ($x as $y){ - if ((! str_starts_with($y, "_")) && (! str_ends_with($y, "_"))) { - $mc [] = $y; - } - } - } - $motcles = array_unique($mc); - usort($motcles, 'strcasecmp'); // 'strcasecmp' - $select[$i] = $motcles; - } - $i++; -} - -//preprint($select); - -// Affichage des photos - -try { - $columns = array('dateoriginal','lens','model','iso','lat'); - $column = isset($_GET['column']) && in_array($_GET['column'], $columns) ? $_GET['column'] : $columns[0]; - $sort_order = isset($_GET['order']) && strtolower($_GET['order']) == 'desc' ? 'DESC' : 'ASC'; - - // SELECT id,filename, date, lens, speed, iso, width, height, html, aperture, model, lat, long, alt, legende, copyright, title, creator, keywords, metering, flash, focal, wb, program -/* - if (isset($_POST['lens'])) $req = "WHERE lens = '" . $_POST['lens'] . "' "; - elseif (isset($_POST['model'])) $req = "WHERE model = '" . $_POST['model'] . "' "; - elseif (isset($_POST['iso'])) $req = "WHERE iso = '" . $_POST['iso'] . "' "; - elseif (isset($_POST['speed'])) $req = "WHERE speed = '" . $_POST['speed'] . "' "; - elseif (isset($_POST['keyword'])) $req = "WHERE keywords LIKE '%" . str_replace("'","''", $_POST['keyword']) . "%' "; - else $req = ""; -*/ - $req1 = ""; - $req2 = ""; - $req3 = ""; - $req4 = ""; - $req5 = ""; - $req6 = ""; - $req7 = ""; - if (!empty($_SESSION['query']['lens'])) $req1 = "lens = '" . $_SESSION['query']['lens'] . "'"; - if (!empty($_SESSION['query']['model'])) $req2 = "model = '" . $_SESSION['query']['model'] . "'"; - if (!empty($_SESSION['query']['iso'])) $req3 = "iso = '" . $_SESSION['query']['iso'] . "'"; - if (!empty($_SESSION['query']['speed'])) $req4 = "speed = '" . $_SESSION['query']['speed'] . "'"; - if (!empty($_SESSION['query']['keyword'])) $req5 = "keywords LIKE '%" . str_replace("'","''", $_SESSION['query']['keyword']) . "%'"; - if (!empty($_SESSION['query']['all']) && ($_SESSION['query']['all'] == "all")) $req = ""; - if (isset($_SESSION['query']['operator'])) $operator = " " . $_SESSION['query']['operator'] . " "; - if (!empty($_SESSION['query']['gps'])) $req6 = "lat != '' AND long != ''"; - if (!empty($_SESSION['query']['date'])) $req7 = "strftime('%Y', dateoriginal) = '" . $_SESSION['query']['date'] . "'"; - - if (($req1 != "") || ($req2 != "") || ($req3 != "") || ($req4 != "") || ($req5 != "")) { - $req = "WHERE " . ($req1 != "" ? $req1 . $operator : "") . ($req2 != "" ? $req2 . $operator : "") . ($req3 != "" ? $req3 . $operator : "") . ($req4 != "" ? $req4 . $operator : "") . ($req5 != "" ? $req5 . $operator : ""); - $req = substr_replace($req, " ", (strlen($req) - strlen($operator)), strlen($operator)); - } - // add - elseif ($req6 != "") { - $req = "WHERE " . $req6 . " "; - } - elseif ($req7 != "") { - $req = "WHERE " . $req7 . " "; - } - // - else $req = ""; - - //echo '
    ' . $req . '
    '; - - - - - $query = "SELECT * FROM photos " . $req . "ORDER BY " . $column . " " . $sort_order . " " . "LIMIT ? OFFSET ?"; - - echo '
    ' . $query . '
    '; - - $offset = $perpage * ($page -1); - - $stmt = $conn->prepare($query); - $stmt->execute(array($perpage, $offset)); // (1,3...) 1=1ere valeur 3=valeur - // id 1 -> 3 - //$stmt->execute(array(1, 3)); // WHERE id >= ? AND id <= ? ORDER BY date DESC"; - - //$result = $stmt->fetchAll(PDO::FETCH_ASSOC); - //$count = $rows['count(*)']; - //echo count($result); - //_pr($rows); - - $up_or_down = str_replace(array('ASC','DESC'), array('up','down'), $sort_order); - $asc_or_desc = $sort_order == 'ASC' ? 'desc' : 'asc'; - $add_class = ' class="highlight"'; - ?> - -
    -
    - APN - - - - - - - - - - - - - - - - -
    -
    - - -
    -
    - All - -
    -
    - -
    -
    - Divers - - - - - - - -
    -
    - - '; - echo '
    '; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - - $nRows = 0; - while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - $thumbnail = host() . str_replace("photos/img", "photos/thumb", $row['filename']); - $full = host() . $row['filename']; - - echo ''; - $nRows++; - } - - if ($nRows == 0) echo ''; - - echo '
    ' . gettext('Select') . '' . gettext('Id') . '' . gettext('Thumb') . '' . gettext('Filename') . '' . gettext('Date') . ' ' . gettext('Lens') . ' ' . gettext('Speed') . '' . gettext('Aperture') . '' . gettext('Iso') . ' ' . gettext('Width') . '' . gettext('Height') . '' . gettext('Model') . ' ' . gettext('Latitude') . ' ' . gettext('Longitude') . '' . gettext('Alttitude') . '' . gettext('Legende') . '' . gettext('Copyright') . '' . gettext('Title') . '' . gettext('Creator') . '' . gettext('Keywords') . '' . gettext('Metering') . '' . gettext('Flash') . '' . gettext('Focal') . '' . gettext('Wb') . '' . gettext('Program') . '' . gettext('Html') . '
    ' . '' . '' . $row['id'] . '' . '' . '' . $row['filename'] . '' . $row['dateoriginal'] . '' . $row['lens'] . '' . $row['speed'] . '' . $row['aperture'] . '' . $row['iso'] . '' . $row['width'] . '' . $row['height'] . '' . $row['model'] . '' . $row['lat'] . '' . $row['long'] . '' . $row['alt'] . '' . $row['legende'] . '' . $row['copyright'] . '' . $row['title'] . '' . $row['creator'] . '' . $row['keywords'] . '' . $row['metering'] . '' . $row['flash'] . '' . $row['focal'] . '' . $row['wb'] . '' . $row['program'] . '' . $row['html'] . '
    ' . gettext("No image found !") .'
    '; - echo ''; - echo ''; - echo '
    '; - echo '
    '; - - //$stmt = $conn->reset(); - //$conn = null; - } - catch(PDOException $e) { - echo $e->getMessage(); - } -?> - - - -prepare($query4); - $stmt->execute(); - - $result = $stmt->fetch(PDO::FETCH_ASSOC); - $numRows = $result['count']; - - $conn = null; - } - catch(PDOException $e) { - echo $e->getMessage(); - } - - // calcul du nombre de pages (arrondi a l'entier supérieur) - $nbpages = ceil($numRows / $perpage); - $prec = $page - 1; - $suiv = $page + 1; - - if ($numRows > 0) { - echo ''; - } - ?> - - - -

    © 2013- sur-le-sentier.fr

    - - - - - - - +" . $_GET['message'] . ""; + } + + if (isset($_SESSION["user"])) { + if ((isset($_POST["suppress"])) && ($_POST["suppress"] == "suppress")) { + if (isset($_POST['coche']) && (! empty($_POST['coche']))) { + $rr = ""; + foreach($_POST['coche'] as $key => $value) { + $r = "id = " . $value . " OR "; + $rr .= $r; + } + + $req_delete = substr($rr, 0, strlen($rr)-4); + + try { + $req = "DELETE FROM Photos WHERE (" . $req_delete . ")"; + $stmt = $conn->prepare($req); + $stmt->execute(); + $nb = $stmt->rowCount(); + } + catch(PDOException $e) { + echo $e->getMessage(); + } + + $msg = (($nb > 0) ? "

    " . $nb . gettext(' photos successfully deleted !') . "

    " : ""); + $request_delete = $req; + } + else { + $msg = "

    " . gettext('Empty request !') . "

    " ; + } + } + } + // } +?> + + + + + + + <?php echo gettext('View photos in Sqlite base'); ?> + + + + + + + + + + + + + + + +' . gettext('View database') . ': ' . $base . '
    '; + + echo $msg; +?> + +'; + echo ''; + echo ''; + } +?> + + + + +  ' : ''; ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    XID
    + +' . gettext('Edit') . ''; + echo ''; + echo ''; + } +?> + + + + ' . gettext("Log out") . '

    ' : ''; ?> + + + +

    © 2013- sur-le-sentier.fr

    + + + + + + \ No newline at end of file diff --git a/view_bdd2.php b/view_bdd2.php new file mode 100644 index 0000000..7a4dbb0 --- /dev/null +++ b/view_bdd2.php @@ -0,0 +1,438 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + +if (!isset($_GET['page'])) $page = 1; +else $page = intval($_GET['page']); + + +// Suppression d'images + +if (isset($_SESSION["user"])) { + if ((isset($_POST["suppress"])) && ($_POST["suppress"] == "suppress")) { + if (isset($_POST['coche']) && (! empty($_POST['coche']))) { + $rr = ""; + foreach($_POST['coche'] as $key => $value) { + $r = "id = " . $value . " OR "; + $rr .= $r; + } + + $req_delete = substr($rr, 0, strlen($rr)-4); + + try { + $req = "DELETE FROM Photos WHERE (" . $req_delete . ")"; + $stmt = $conn->prepare($req); + $stmt->execute(); + $nb = $stmt->rowCount(); + } + catch(PDOException $e) { + echo $e->getMessage(); + } + + $msg = (($nb > 0) ? "

    " . $nb . gettext(' photos successfully deleted !') . "

    " : ""); + $request_delete = $req; + } + else { + $msg = "

    " . gettext('Empty request !') . "

    " ; + } + + } +} + + +$gps = (isset($_SESSION['query']['gps'])) ? $_SESSION['query']['gps'] : "off"; + +$dir = (new AdvancedFilesystemIterator('photos/img/'))->match('/heic|HEIC|jpg|jpeg|JPG|JPEG|webp|WEBP$/'); + + +$request = array( + 'lens' => 'SELECT DISTINCT lens FROM photos WHERE lens <> "" ORDER BY lens', + 'model' => 'SELECT DISTINCT model FROM photos WHERE model <> "" ORDER BY model', + 'iso' => 'SELECT DISTINCT iso FROM photos WHERE iso <> "" ORDER BY iso', + 'speed' => 'SELECT DISTINCT speed FROM photos WHERE speed <> "" ORDER BY speed', + 'keywords' => 'SELECT DISTINCT keywords FROM photos WHERE keywords <> ""', + 'strftime("%Y", dateoriginal)' => 'SELECT DISTINCT strftime("%Y", dateoriginal) FROM photos WHERE dateoriginal <> "" ORDER BY dateoriginal DESC' +); + + +$select = array(); +$i = 0; +foreach ($request as $key => $val){ + $query = $conn->query($val); + $select[$i] = $query->fetchAll(PDO::FETCH_ASSOC); + $select[$i] = array_column($select[$i],$key); + if ($i == 4){ + $mc = array(); + foreach($select[$i] as $row){ + $x = explode(",", $row); + foreach ($x as $y){ + if ((! str_starts_with($y, "_")) && (! str_ends_with($y, "_"))) { + $mc [] = $y; + } + } + } + $motcles = array_unique($mc); + usort($motcles, 'strcasecmp'); // 'strcasecmp' + $select[$i] = $motcles; + } + $i++; +} + +?> + + + + + + + + <?php echo gettext('View photos in Sqlite base'); ?> + + + + + + + + + + + + + +' . gettext('View database') . ': ' . $base . '
    '; + +// Affichage des photos + +try { + $columns = array('dateoriginal','lens','model','iso','lat'); + $column = isset($_GET['column']) && in_array($_GET['column'], $columns) ? $_GET['column'] : $columns[0]; + $sort_order = isset($_GET['order']) && strtolower($_GET['order']) == 'desc' ? 'DESC' : 'ASC'; + + $req1 = ""; + $req2 = ""; + $req3 = ""; + $req4 = ""; + $req5 = ""; + $req6 = ""; + $req7 = ""; + + if (!empty($_POST['lens'])) $req1 = "lens = '" . $_POST['lens'] . "'"; + if (!empty($_POST['model'])) $req2 = "model = '" . $_POST['model'] . "'"; + if (!empty($_POST['iso'])) $req3 = "iso = '" . $_POST['iso'] . "'"; + if (!empty($_POST['speed'])) $req4 = "speed = '" . $_POST['speed'] . "'"; + if (!empty($_POST['keyword'])) $req5 = "keywords LIKE '%" . str_replace("'","''", $_POST['keyword']) . "%'"; + if (!empty($_POST['all']) && ($_POST['all'] == "all")) $req = ""; + if (isset($_POST['operator'])) $operator = " " . $_POST['operator'] . " "; + if (!empty($_POST['gps'])) $req6 = "lat != '' AND long != ''"; + if (!empty($_POST['date'])) $req7 = "strftime('%Y', dateoriginal) = '" . $_POST['date'] . "'"; + + + if (($req1 != "") || ($req2 != "") || ($req3 != "") || ($req4 != "") || ($req5 != "")) { + $req = "WHERE " . ($req1 != "" ? $req1 . $operator : "") . ($req2 != "" ? $req2 . $operator : "") . ($req3 != "" ? $req3 . $operator : "") . ($req4 != "" ? $req4 . $operator : "") . ($req5 != "" ? $req5 . $operator : ""); + $req = substr_replace($req, " ", (strlen($req) - strlen($operator)), strlen($operator)); + } + elseif ($req6 != "") { + $req = "WHERE " . $req6 . " "; + } + elseif ($req7 != "") { + $req = "WHERE " . $req7 . " "; + } + else $req = ""; + + + $query2 = "SELECT * FROM photos " . $req . "ORDER BY " . $column . " " . $sort_order . " " . "LIMIT ? OFFSET ?"; + + /* 1ere requete pour compter les resultats:*/ + /* + $sql = "SELECT COUNT(*) FROM photos " . $req; + $statement = $conn->prepare($sql); + $statement->execute(); + $ct = $statement->fetch(PDO::FETCH_NUM); // Return array indexed by column number + $count = $ct; + reset($ct); // Resets array cursor and returns first value (the count) + $count = current($ct); + //$count = $count[0]; + echo $count; + */ + + $query ="WITH cnt(total) as (SELECT COUNT(*) from photos " . $req . ") SELECT * FROM photos,cnt " . $req . "ORDER BY " . $column . " " . $sort_order . " " . "LIMIT ? OFFSET ?"; + // WITH cnt(total) as (SELECT COUNT(*) from photos WHERE speed = '1.6s' ) SELECT * FROM photos,cnt WHERE speed = '1.6s' ORDER BY dateoriginal ASC LIMIT ? OFFSET ? + + $offset = $perpage * ($page -1); + + $stmt = $conn->prepare($query); + $stmt->execute(array($perpage, $offset)); // (1,3...) 1=1ere valeur 3=valeur + + // nb de resultats de la requete + $count = $stmt->fetchColumn(34); // total => 35 + $stmt->execute(array($perpage, $offset)); + + if (empty($_POST)) { + echo '

    ' . count($dir) . gettext(' images found in folder') . ' photos/img/ ...

    '; + // Display request !! + echo '
    ' . $query2 . '
    '; + } + elseif ($_POST["suppress"] == "suppress") { + + echo $msg; + + if (isset($_POST['coche']) && (! empty($_POST['coche']))) { + echo '
    ' . $request_delete . '
    '; + } + + } + else { + echo '

    ' . $count . gettext(' images founds with the following request:') . '

    '; + // Display request !! + echo '
    ' . $query2 . '
    '; + } + $up_or_down = str_replace(array('ASC','DESC'), array('up','down'), $sort_order); + $asc_or_desc = $sort_order == 'ASC' ? 'desc' : 'asc'; + $add_class = ' class="highlight"'; + ?> + +
    +
    + APN + + + + + + + + + + + + + + + + +
    +
    + + +
    +
    + All + +
    +
    + +
    +
    + Divers + + + + + + + +
    +
    + + '; + echo '

    '; + echo '
    '; + + echo ''; + echo ''; + + echo ''; + echo ''; + echo ((isset($_SESSION["user"])) ? '' : '') . ''; + echo ''; + echo ''; + echo ''; + echo ''; + + $nRows = 0; + while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { + $thumbnail = host() . str_replace("photos/img", "photos/thumb", $row['filename']); + $full = host() . $row['filename']; + $lb = data_for_lightbox($row); + + echo '' . ((isset($_SESSION["user"])) ? '' : '') . ''; + $nRows++; + } + + if ($nRows == 0) echo ''; + + echo '
    ' . gettext('Select') . '' . gettext('Id') . '' . gettext('Thumb') . '' . gettext('Filename') . ' (' . gettext('Size') . ')' . gettext('Date') . ' ' . gettext('Lens') . ' ' . gettext('Speed') . '' . gettext('Aperture') . '' . gettext('Exposure corr.') . '' . gettext('Iso') . ' ' . gettext('Width') . '' . gettext('Height') . '' . gettext('Model') . ' ' . gettext('Latitude') . ' ' . gettext('Longitude') . '' . gettext('Alttitude') . '' . gettext('Legende') . '' . gettext('Copyright') . '' . gettext('Title') . '' . gettext('Creator') . '' . gettext('Keywords') . '' . gettext('Metering') . '' . gettext('Flash') . '' . gettext('Focal') . '' . gettext('Wb') . '' . gettext('Program') . '
    ' . '' . '' . $row['id'] . '' . '' . htmlspecialchars($lb['title']) . '' . '' . $row['filename'] . '
    (' . $row['filesize'] . ')
    ' . $row['dateoriginal'] . '' . $row['lens'] . '' . $row['speed'] . '' . $row['aperture'] . ' ' . $row['correctexpo'] . '' . $row['iso'] . '' . $row['width'] . '' . $row['height'] . '' . $row['model'] . '' . $row['lat'] . '' . $row['long'] . '' . $row['alt'] . '' . $row['legende'] . '' . $row['copyright'] . '' . $row['title'] . '' . $row['creator'] . '' . $row['keywords'] . '' . $row['metering'] . '' . $row['flash'] . '' . $row['focal'] . '' . $row['wb'] . '' . $row['program'] . '
    ' . gettext("No image found !") .'
    '; + if (isset($_SESSION["user"])) { + echo ''; + echo ''; + } + echo '
    '; + echo ''; + + } + catch(PDOException $e) { + echo $e->getMessage(); + } +?> + + + +prepare($query4); + $stmt->execute(); + + $result = $stmt->fetch(PDO::FETCH_ASSOC); + $numRows = $result['count']; + + $stmt = $conn->reset(); + $conn = null; + + } + catch(PDOException $e) { + echo $e->getMessage(); + } + + // calcul du nombre de pages (arrondi a l'entier supérieur) + $nbpages = ceil($numRows / $perpage); + $prec = $page - 1; + $suiv = $page + 1; + + if ($numRows > 0) { + echo ''; + } + ?> + + ' . gettext("Log out") . '

    ' : ''; ?> + + + +

    © 2013- sur-le-sentier.fr

    + + + + + + +