1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412: 413: 414: 415: 416: 417: 418: 419: 420: 421: 422: 423: 424: 425: 426: 427: 428: 429: 430: 431: 432: 433: 434: 435: 436: 437: 438: 439: 440: 441: 442: 443: 444: 445: 446: 447: 448: 449: 450: 451: 452: 453: 454: 455: 456: 457: 458: 459: 460: 461: 462: 463: 464: 465: 466: 467: 468: 469: 470: 471: 472: 473: 474: 475: 476: 477: 478: 479: 480: 481: 482: 483: 484: 485: 486: 487: 488: 489: 490: 491: 492: 493: 494: 495: 496: 497: 498: 499: 500: 501: 502: 503: 504: 505: 506: 507: 508: 509: 510: 511: 512: 513: 514: 515: 516: 517: 518: 519: 520: 521: 522: 523: 524: 525: 526: 527: 528: 529: 530: 531: 532: 533: 534: 535: 536: 537: 538: 539: 540: 541: 542: 543: 544: 545: 546: 547: 548: 549: 550: 551: 552: 553: 554: 555: 556: 557: 558: 559: 560: 561: 562: 563: 564: 565: 566: 567: 568: 569: 570: 571: 572: 573: 574: 575: 576: 577: 578: 579: 580: 581: 582: 583: 584: 585: 586: 587: 588: 589: 590: 591: 592: 593: 594: 595: 596: 597: 598: 599: 600: 601: 602: 603: 604: 605: 606: 607: 608: 609: 610: 611: 612: 613: 614: 615: 616: 617: 618: 619: 620: 621: 622: 623: 624: 625: 626: 627: 628: 629: 630: 631: 632: 633: 634: 635: 636: 637: 638: 639: 640: 641: 642: 643: 644: 645: 646: 647: 648: 649: 650: 651: 652: 653: 654: 655: 656: 657: 658: 659: 660: 661: 662: 663: 664: 665: 666: 667: 668: 669: 670: 671: 672: 673: 674: 675: 676: 677: 678: 679: 680: 681: 682: 683: 684: 685: 686: 687: 688: 689: 690: 691: 692: 693: 694: 695: 696: 697: 698: 699: 700: 701: 702: 703: 704: 705: 706: 707: 708: 709: 710: 711: 712: 713: 714: 715: 716: 717: 718: 719: 720: 721: 722: 723: 724: 725: 726: 727: 728: 729: 730: 731: 732: 733: 734: 735: 736: 737: 738: 739: 740: 741: 742: 743: 744: 745: 746: 747: 748: 749: 750: 751: 752: 753: 754: 755: 756: 757: 758: 759: 760: 761: 762: 763: 764: 765: 766: 767: 768: 769: 770: 771: 772: 773: 774: 775: 776: 777: 778: 779: 780: 781: 782: 783: 784: 785: 786: 787: 788: 789: 790: 791: 792: 793: 794: 795: 796: 797: 798: 799: 800: 801: 802: 803: 804: 805: 806: 807: 808: 809: 810: 811: 812: 813: 814: 815: 816: 817: 818: 819: 820: 821: 822: 823: 824: 825: 826: 827: 828: 829: 830: 831: 832: 833: 834: 835: 836: 837: 838: 839: 840: 841: 842: 843: 844: 845: 846: 847: 848: 849: 850: 851: 852: 853: 854: 855: 856: 857: 858: 859: 860: 861: 862: 863: 864: 865: 866: 867: 868: 869: 870: 871: 872: 873: 874: 875: 876: 877: 878: 879: 880: 881: 882: 883: 884: 885: 886: 887: 888: 889: 890: 891: 892: 893: 894: 895: 896: 897: 898: 899: 900: 901: 902: 903: 904: 905: 906: 907: 908: 909: 910: 911: 912: 913: 914: 915: 916: 917: 918: 919: 920: 921: 922: 923: 924: 925: 926: 927: 928: 929: 930: 931: 932: 933: 934: 935: 936: 937: 938: 939: 940: 941: 942: 943: 944: 945: 946: 947: 948: 949: 950: 951: 952: 953: 954: 955: 956: 957: 958: 959: 960: 961: 962: 963: 964: 965: 966: 967: 968: 969: 970: 971: 972: 973: 974: 975: 976: 977: 978: 979: 980: 981: 982: 983: 984: 985: 986: 987: 988: 989: 990: 991: 992: 993: 994: 995: 996: 997: 998: 999: 1000: 1001: 1002: 1003: 1004: 1005: 1006: 1007: 1008: 1009: 1010: 1011: 1012: 1013: 1014: 1015: 1016: 1017: 1018: 1019: 1020: 1021: 1022: 1023: 1024: 1025: 1026: 1027: 1028: 1029: 1030: 1031: 1032: 1033: 1034: 1035: 1036: 1037: 1038: 1039: 1040: 1041: 1042: 1043: 1044: 1045: 1046: 1047: 1048: 1049: 1050: 1051: 1052: 1053: 1054: 1055: 1056: 1057: 1058: 1059: 1060: 1061: 1062: 1063: 1064: 1065: 1066: 1067: 1068: 1069: 1070: 1071: 1072: 1073: 1074: 1075: 1076: 1077: 1078: 1079: 1080: 1081: 1082: 1083: 1084: 1085: 1086: 1087: 1088: 1089: 1090: 1091: 1092: 1093: 1094: 1095: 1096: 1097: 1098: 1099: 1100: 1101: 1102: 1103: 1104: 1105: 1106: 1107: 1108: 1109: 1110: 1111: 1112: 1113: 1114: 1115: 1116: 1117: 1118: 1119: 1120: 1121: 1122: 1123: 1124: 1125: 1126: 1127: 1128: 1129: 1130: 1131: 1132: 1133: 1134: 1135: 1136: 1137: 1138: 1139: 1140: 1141: 1142: 1143: 1144: 1145: 1146: 1147: 1148: 1149: 1150: 1151: 1152: 1153: 1154: 1155: 1156: 1157: 1158: 1159: 1160: 1161: 1162: 1163: 1164: 1165: 1166: 1167: 1168: 1169: 1170: 1171: 1172: 1173: 1174: 1175: 1176: 1177: 1178: 1179: 1180: 1181: 1182: 1183: 1184: 1185: 1186: 1187: 1188: 1189: 1190: 1191: 1192: 1193: 1194: 1195: 1196: 1197: 1198: 1199: 1200: 1201: 1202: 1203: 1204: 1205: 1206: 1207: 1208: 1209: 1210: 1211: 1212: 1213: 1214: 1215: 1216: 1217: 1218: 1219: 1220: 1221: 1222: 1223: 1224: 1225: 1226: 1227: 1228: 1229: 1230: 1231: 1232: 1233: 1234: 1235: 1236: 1237: 1238: 1239: 1240: 1241: 1242: 1243: 1244: 1245: 1246: 1247: 1248: 1249: 1250: 1251: 1252: 1253: 1254: 1255: 1256: 1257: 1258: 1259: 1260: 1261: 1262: 1263: 1264: 1265: 1266: 1267: 1268: 1269: 1270: 1271: 1272: 1273: 1274: 1275: 1276: 1277: 1278: 1279: 1280: 1281: 1282: 1283: 1284: 1285: 1286: 1287: 1288: 1289: 1290: 1291: 1292: 1293: 1294: 1295: 1296: 1297: 1298: 1299: 1300: 1301: 1302: 1303: 1304: 1305: 1306: 1307: 1308: 1309: 1310: 1311: 1312: 1313: 1314: 1315: 1316: 1317: 1318: 1319: 1320: 1321: 1322: 1323: 1324: 1325: 1326: 1327: 1328: 1329: 1330: 1331: 1332: 1333: 1334: 1335: 1336: 1337: 1338: 1339: 1340: 1341: 1342: 1343: 1344: 1345: 1346: 1347: 1348: 1349: 1350: 1351: 1352: 1353: 1354: 1355: 1356: 1357: 1358: 1359: 1360: 1361: 1362: 1363: 1364: 1365: 1366: 1367: 1368: 1369: 1370: 1371: 1372: 1373: 1374: 1375: 1376: 1377: 1378: 1379: 1380: 1381: 1382: 1383: 1384: 1385: 1386: 1387: 1388: 1389: 1390: 1391: 1392: 1393: 1394: 1395: 1396: 1397: 1398: 1399: 1400: 1401: 1402: 1403: 1404: 1405: 1406: 1407: 1408: 1409: 1410: 1411: 1412: 1413: 1414: 1415: 1416: 1417: 1418: 1419: 1420: 1421: 1422: 1423: 1424: 1425: 1426: 1427: 1428: 1429: 1430: 1431: 1432: 1433: 1434: 1435: 1436: 1437: 1438: 1439: 1440: 1441: 1442: 1443: 1444: 1445: 1446: 1447: 1448: 1449: 1450: 1451: 1452: 1453: 1454: 1455: 1456: 1457: 1458: 1459: 1460: 1461: 1462: 1463: 1464: 1465: 1466: 1467: 1468: 1469: 1470: 1471: 1472: 1473: 1474: 1475: 1476: 1477: 1478: 1479: 1480: 1481: 1482: 1483: 1484: 1485: 1486: 1487: 1488: 1489: 1490: 1491: 1492: 1493: 1494: 1495: 1496: 1497: 1498: 1499: 1500: 1501: 1502: 1503: 1504: 1505: 1506: 1507: 1508: 1509: 1510: 1511: 1512: 1513: 1514: 1515: 1516: 1517: 1518: 1519: 1520: 1521: 1522: 1523: 1524: 1525: 1526: 1527: 1528: 1529: 1530: 1531: 1532: 1533: 1534: 1535: 1536: 1537: 1538: 1539: 1540: 1541: 1542: 1543: 1544: 1545: 1546: 1547: 1548: 1549: 1550: 1551: 1552: 1553: 1554: 1555: 1556: 1557: 1558: 1559: 1560: 1561: 1562: 1563: 1564: 1565: 1566: 1567: 1568: 1569: 1570: 1571: 1572: 1573: 1574: 1575: 1576: 1577: 1578: 1579: 1580: 1581: 1582: 1583: 1584: 1585: 1586: 1587: 1588: 1589: 1590: 1591: 1592: 1593: 1594: 1595: 1596: 1597: 1598: 1599: 1600: 1601: 1602: 1603: 1604: 1605: 1606: 1607: 1608: 1609: 1610: 1611: 1612: 1613: 1614: 1615: 1616: 1617: 1618: 1619: 1620: 1621: 1622: 1623: 1624: 1625:
<?php
$_zp_extra_filetypes = array();
define('WATERMARK_IMAGE', 1);
define('WATERMARK_THUMB', 2);
define('WATERMARK_FULL', 4);
function newImage($album, $filename, $quiet = false) {
global $_zp_extra_filetypes, $_zp_missing_image;
if (is_array($filename)) {
$xalbum = newAlbum($filename['folder'], true, true);
$filename = $filename['filename'];
} else {
if ($album->isDynamic()) {
$xalbum = NULL;
foreach ($album->getImages() as $image) {
if ($filename == $image['filename']) {
$xalbum = newAlbum($image['folder']);
break;
}
}
} else {
$xalbum = $album;
}
}
if (!is_object($xalbum) || !$xalbum->exists || !isAlbumClass($xalbum)) {
if (!$quiet) {
$msg = sprintf(gettext('Bad album object parameter to newImage(%s)'), $filename);
trigger_error($msg, E_USER_NOTICE);
}
return $_zp_missing_image;
}
if ($object = Gallery::validImageAlt($filename)) {
$image = New $object($xalbum, $filename, $quiet);
} else {
if (Gallery::validImage($filename)) {
$image = New Image($xalbum, $filename, $quiet);
} else {
$image = NULL;
}
}
if ($image) {
if ($album && $album->isDynamic()) {
$image->albumname = $album->name;
$image->albumlink = $album->linkname;
$image->albumnamealbum = $album;
}
zp_apply_filter('image_instantiate', $image);
if ($image->exists) {
return $image;
} else {
return $_zp_missing_image;
}
}
if (!$quiet) {
$msg = sprintf(gettext('Bad filename suffix in newImage(%s)'), $filename);
trigger_error($msg, E_USER_NOTICE);
}
return $_zp_missing_image;
}
function isImageClass($image = NULL) {
global $_zp_current_image;
if (is_null($image)) {
if (!in_context(ZP_IMAGE))
return false;
$image = $_zp_current_image;
}
return is_object($image) && ($image->table == 'images');
}
class Image extends MediaObject {
public $filename;
public $exists = true;
public $webpath;
public $localpath;
public $displayname;
public $album;
public $albumname;
public $albumnamealbum;
public $albumlink;
public $imagefolder;
protected $index;
protected $sortorder;
public $filemtime;
public $sidecars = array();
public $manage_rights = MANAGE_ALL_ALBUM_RIGHTS;
public $manage_some_rights = ALBUM_RIGHTS;
public $view_rights = ALL_ALBUMS_RIGHTS;
public $objectsThumb = NULL;
public $thumbdimensions = null;
protected $is_public = null;
function __construct($album, $filename, $quiet = false) {
global $_zp_current_admin_obj;
$msg = false;
if (!is_object($album) || !$album->exists) {
$msg = gettext('Invalid image instantiation: Album does not exist');
} else {
if (!$this->classSetup($album, $filename) || !file_exists($this->localpath) || is_dir($this->localpath)) {
$msg = gettext('Invalid image instantiation: file does not exist');
}
}
if ($msg) {
$this->exists = false;
if (!$quiet) {
trigger_error($msg, E_USER_ERROR);
}
return;
}
$album_name = $album->name;
$new = $this->instantiate('images', array('filename' => $filename, 'albumid' => $this->album->getID()), 'filename', false, empty($album_name));
if ($new || $this->filemtime != $this->get('mtime')) {
if ($new) {
$this->setTitle($this->displayname);
}
$this->updateMetaData();
$this->updateDimensions();
$this->set('mtime', $this->filemtime);
$this->save();
if ($new)
zp_apply_filter('new_image', $this);
}
}
protected function setDefaults() {
global $_zp_gallery;
$this->setShow($_zp_gallery->getImagePublish());
$this->set('mtime', $this->filemtime);
$this->setLastChange();
$this->updateDimensions();
}
protected function classSetup(&$album, $filename) {
if (TEST_RELEASE) {
$bt = debug_backtrace();
$good = false;
foreach ($bt as $b) {
if ($b['function'] == "newImage") {
$good = true;
break;
}
}
if (!$good) {
zp_error(gettext('An image object was instantiated without using the newImage() function.'), E_USER_WARNING);
}
}
global $_zp_current_admin_obj;
$fileFS = internalToFilesystem($filename);
if ($filename != filesystemToInternal($fileFS)) {
return false;
}
$this->albumnamealbum = $this->album = &$album;
if ($album->name == '') {
$this->webpath = ALBUM_FOLDER_WEBPATH . $filename;
$this->encwebpath = ALBUM_FOLDER_WEBPATH . rawurlencode($filename);
$this->localpath = ALBUM_FOLDER_SERVERPATH . internalToFilesystem($filename);
} else {
$this->webpath = ALBUM_FOLDER_WEBPATH . $album->name . "/" . $filename;
$this->encwebpath = ALBUM_FOLDER_WEBPATH . pathurlencode($album->name) . "/" . rawurlencode($filename);
$this->localpath = $album->localpath . $fileFS;
}
$this->imagefolder = $this->albumlink = $this->albumname = $album->name;
$this->filename = $filename;
$this->displayname = substr($this->filename, 0, strrpos($this->filename, '.'));
if (empty($this->displayname))
$this->displayname = $this->filename;
$this->comments = null;
$this->filemtime = @filemtime($this->localpath);
$this->imagetype = strtolower(get_class($this)) . 's';
$date = $this->get('date');
if (empty($date)) {
$this->set('date', strftime('%Y-%m-%d %H:%M:%S', $this->filemtime));
}
return true;
}
function getFileName() {
return $this->filename;
}
protected function fileChanged() {
$storedmtime = $this->get('mtime');
return (empty($storedmtime) || $this->filemtime > $storedmtime);
}
function getMetaData() {
global $_zp_exifvars;
$exif = array();
foreach ($_zp_exifvars as $field => $exifvar) {
if ($_zp_exifvars[$field][5]) {
$exif[$field] = $this->get($field);
}
}
return $exif;
}
function updateMetaData() {
global $_zp_exifvars, $_zp_gallery;
require_once(dirname(__FILE__) . '/exif/exif.php');
$IPTCtags = array(
'SKIP' => '2#000',
'ObjectType' => '2#003',
'ObjectAttr' => '2#004',
'ObjectName' => '2#005',
'EditStatus' => '2#007',
'EditorialUpdate' => '2#008',
'Urgency' => '2#010',
'SubRef' => '2#012',
'Category' => '2#015',
'SuppCategory' => '2#020',
'FixtureID' => '2#022',
'Keywords' => '2#025',
'ContentLocationCode' => '2#026',
'ContentLocationName' => '2#027',
'ReleaseDate' => '2#030',
'ReleaseTime' => '2#035',
'ExpireDate' => '2#037',
'ExpireTime' => '2#038',
'SpecialInstru' => '2#040',
'ActionAdvised' => '2#042',
'RefService' => '2#045',
'RefDate' => '2#047',
'RefNumber' => '2#050',
'DateCreated' => '2#055',
'TimeCreated' => '2#060',
'DigitizeDate' => '2#062',
'DigitizeTime' => '2#063',
'OriginatingProgram' => '2#065',
'ProgramVersion' => '2#070',
'ObjectCycle' => '2#075',
'ByLine' => '2#080',
'ByLineTitle' => '2#085',
'City' => '2#090',
'SubLocation' => '2#092',
'State' => '2#095',
'LocationCode' => '2#100',
'LocationName' => '2#101',
'TransmissionRef' => '2#103',
'ImageHeadline' => '2#105',
'ImageCredit' => '2#110',
'Source' => '2#115',
'Copyright' => '2#116',
'Contact' => '2#118',
'ImageCaption' => '2#120',
'ImageCaptionWriter' => '2#122',
'ImageType' => '2#130',
'Orientation' => '2#131',
'LangID' => '2#135',
'Subfile' => '8#010'
);
$this->set('hasMetadata', 0);
$result = array();
if (get_class($this) == 'Image') {
$localpath = $this->localpath;
} else {
$localpath = $this->getThumbImageFile();
}
$xdate = false;
if (!empty($localpath)) {
$exifraw = read_exif_data_protected($localpath);
if (isset($exifraw['ValidEXIFData'])) {
$this->set('hasMetadata', 1);
foreach ($_zp_exifvars as $field => $exifvar) {
$exif = NULL;
if ($exifvar[5]) {
if (isset($exifraw[$exifvar[0]][$exifvar[1]])) {
$exif = trim(sanitize($exifraw[$exifvar[0]][$exifvar[1]], 1));
} else if (isset($exifraw[$exifvar[0]]['MakerNote'][$exifvar[1]])) {
$exif = trim(sanitize($exifraw[$exifvar[0]]['MakerNote'][$exifvar[1]], 1));
}
}
$this->set($field, $exif);
}
}
$iptcdata = zp_imageIPTC($localpath);
if (!empty($iptcdata)) {
$iptc = iptcparse($iptcdata);
if ($iptc) {
$this->set('hasMetadata', 1);
$characterset = $this->getIPTCTag('1#090', $iptc);
if (!$characterset) {
$characterset = getOption('IPTC_encoding');
} else if (substr($characterset, 0, 1) == chr(27)) {
$characterset = substr($characterset, 1);
if ($characterset == '%G') {
$characterset = 'UTF-8';
} else {
$characterset = getOption('IPTC_encoding');
}
} else if ($characterset == 'UTF8') {
$characterset = 'UTF-8';
}
foreach ($_zp_exifvars as $field => $exifvar) {
if ($exifvar[0] == 'IPTC') {
if ($exifvar[5]) {
$datum = $this->getIPTCTag($IPTCtags[$exifvar[1]], $iptc);
$this->set($field, $this->prepIPTCString($datum, $characterset));
} else {
$this->set($field, NULL);
}
}
}
if ($_zp_exifvars['IPTCKeywords'][5]) {
$datum = $this->getIPTCTagArray($IPTCtags['Keywords'], $iptc);
if (is_array($datum)) {
$tags = array();
$result['tags'] = array();
foreach ($datum as $item) {
$tags[] = $this->prepIPTCString(sanitize($item, 3), $characterset);
}
$this->setTags($tags);
}
}
}
}
}
zp_apply_filter('image_metadata', $this);
$date = $this->get('IPTCDateCreated');
if (!empty($date)) {
if (strlen($date) > 8) {
$time = substr($date, 8);
} else {
$time = $this->get('IPTCTimeCreated');
}
$date = substr($date, 0, 4) . '-' . substr($date, 4, 2) . '-' . substr($date, 6, 2);
if (!empty($time)) {
$date = $date . ' ' . substr($time, 0, 2) . ':' . substr($time, 2, 2) . ':' . substr($time, 4, 2);
}
}
if (empty($date)) {
$date = $this->get('EXIFDateTime');
}
if (empty($date)) {
$date = $this->get('EXIFDateTimeOriginal');
}
if (empty($date)) {
$date = $this->get('EXIFDateTimeDigitized');
}
if (!empty($date)) {
$xdate = $date;
$this->setDateTime($date);
}
$title = $this->get('IPTCObjectName');
if (empty($title)) {
$title = $this->get('IPTCImageHeadline');
}
if (empty($title)) {
$title = $this->get('EXIFDescription');
}
if (!empty($title)) {
$this->setTitle($title);
}
$desc = $this->get('IPTCImageCaption');
if (!empty($desc)) {
if(getOption('IPTC_convert_linebreaks')) {
$desc = nl2br($desc);
}
$this->setDesc($desc);
}
$loc = $this->get('IPTCSubLocation');
if (!empty($loc)) {
$this->setLocation($loc);
}
$city = $this->get('IPTCCity');
if (!empty($city)) {
$this->setCity($city);
}
$state = $this->get('IPTCState');
if (!empty($state)) {
$this->setState($state);
}
$country = $this->get('IPTCLocationName');
if (!empty($country)) {
$this->setCountry($country);
}
$credit = $this->get('IPTCByLine');
if (empty($credit)) {
$credit = $this->get('IPTCImageCredit');
}
if (empty($credit)) {
$credit = $this->get('IPTCSource');
}
if (!empty($credit)) {
$this->setCredit($credit);
}
$this->setCopyright($this->get('IPTCCopyright'));
if (empty($xdate)) {
$this->setDateTime(strftime('%Y-%m-%d %H:%M:%S', $this->filemtime));
}
$alb = $this->album;
if (!is_null($alb)) {
if (!$this->get('owner')) {
$this->setOwner($alb->getOwner());
}
$save = false;
if (strtotime($alb->getUpdatedDate()) < strtotime(date('Y-m-d H:i:s'))) {
$alb->setUpdatedDate();
$alb->setUpdatedDateParents();
$save = true;
}
if (is_null($albdate = $alb->getDateTime()) || ($_zp_gallery->getAlbumUseImagedate() && strtotime($albdate) < strtotime($this->getDateTime()))) {
$alb->setDateTime($this->getDateTime());
$save = true;
}
if ($save) {
$alb->save();
}
}
}
private function getIPTCTag($tag, $iptc) {
if (isset($iptc[$tag])) {
$iptcTag = $iptc[$tag];
$r = "";
$ct = count($iptcTag);
for ($i = 0; $i < $ct; $i++) {
$w = $iptcTag[$i];
if (!empty($r)) {
$r .= ", ";
}
$r .= $w;
}
return trim($r);
}
return '';
}
private function getIPTCTagArray($tag, $iptc) {
if (array_key_exists($tag, $iptc)) {
return $iptc[$tag];
}
return NULL;
}
private function prepIPTCString($iptcstring, $characterset) {
global $_zp_UTF8;
if (substr($iptcstring, -1) === 0x0) {
$iptcstring = substr($iptcstring, 0, -1);
}
$outputset = LOCAL_CHARSET;
if ($characterset == $outputset)
return $iptcstring;
$iptcstring = $_zp_UTF8->convert($iptcstring, $characterset, $outputset);
return trim(sanitize($iptcstring, 1));
}
function getGeodata() {
$gps = array();
if (isImageClass($this)) {
$exif = $this->getMetaData();
if ((!empty($exif['EXIFGPSLatitude'])) && (!empty($exif['EXIFGPSLongitude']))) {
$lat_c = explode('.', str_replace(',', '.', $exif['EXIFGPSLatitude']) . '.0');
$lat_f = round((float) abs($lat_c[0]) + ($lat_c[1] / pow(10, strlen($lat_c[1]))), 12);
if (isset($exif['EXIFGPSLatitudeRef'][0]) && strtoupper($exif['EXIFGPSLatitudeRef'][0]) == 'S') {
$lat_f = -$lat_f;
}
$long_c = explode('.', str_replace(',', '.', $exif['EXIFGPSLongitude']) . '.0');
$long_f = round((float) abs($long_c[0]) + ($long_c[1] / pow(10, strlen($long_c[1]))), 12);
if (isset($exif['EXIFGPSLongitudeRef'][0]) && strtoupper($exif['EXIFGPSLongitudeRef'][0]) == 'W') {
$long_f = -$long_f;
}
$lat_f = str_replace(',', '.', $lat_f);
$long_f = str_replace(',', '.', $long_f);
if (($long_f > -180 && $long_f < 180) && ($lat_f > -90 && $lat_f < 90)) {
return array(
'lat' => $lat_f,
'long' => $long_f
);
}
}
return $gps;
}
}
function updateDimensions() {
$discard = NULL;
$size = zp_imageDims($this->localpath);
$width = $size['width'];
$height = $size['height'];
if (zp_imageCanRotate()) {
$splits = preg_split('/!([(0-9)])/', $this->get('EXIFOrientation'));
$rotation = $splits[0];
switch ($rotation) {
case 5:
case 6:
case 7:
case 8:
$width = $size['height'];
$height = $size['width'];
break;
}
}
$this->set('width', $width);
$this->set('height', $height);
}
function getWidth() {
$w = $this->get('width');
if (empty($w)) {
$this->updateDimensions();
$this->save();
$w = $this->get('width');
}
return $w;
}
function getHeight() {
$h = $this->get('height');
if (empty($h)) {
$this->updateDimensions();
$this->save();
$h = $this->get('height');
}
return $h;
}
function getThumbDimensions() {
if (!is_null($this->thumbdimensions)) {
return $this->thumbdimensions;
}
return $this->thumbdimensions = array(
'width' => $this->getWidth(),
'height' => $this->getHeight()
);
}
function getThumbWidth() {
$dims = $this->getThumbDimensions();
return $dims['width'];
}
function getThumbHeight() {
$dims = $this->getThumbDimensions();
return $dims['height'];
}
function getOrientation($type = 'image') {
switch ($type) {
default:
case 'image':
$width = $this->getWidth();
$height = $this->getHeight();
break;
case 'thumb':
$width = $this->getThumbWidth();
$height = $this->getThumbHeight();
break;
}
if ($width == $height) {
return 'is_square';
} else if ($width > $height) {
return 'is_landscape';
} else if ($width < $height) {
return 'is_portrait';
}
return false;
}
function isLandscape($type = 'image') {
return $this->getOrientation($type) == 'is_landscape';
}
function isSquare($type = 'image') {
return $this->getOrientation($type) == 'is_square';
}
function isPortrait($type = 'image') {
return $this->getOrientation($type) == 'is_portrait';
}
function getAlbum() {
return $this->album;
}
function getAlbumName() {
return $this->albumname;
}
function getLocation($locale = NULL) {
$text = $this->get('location');
if ($locale !== 'all') {
$text = get_language_string($text, $locale);
}
$text = unTagURLs($text);
return $text;
}
function setLocation($location) {
$this->set('location', $location);
}
function getCity($locale = NULL) {
$text = $this->get('city');
if ($locale !== 'all') {
$text = get_language_string($text, $locale);
}
$text = unTagURLs($text);
return $text;
}
function setCity($city) {
$this->set('city', tagURLs($city));
}
function getState($locale = NULL) {
$text = $this->get('state');
if ($locale !== 'all') {
$text = get_language_string($text, $locale);
}
$text = unTagURLs($text);
return $text;
}
function setState($state) {
$this->set('state', tagURLs($state));
}
function getCountry($locale = NULL) {
$text = $this->get('country');
if ($locale !== 'all') {
$text = get_language_string($text, $locale);
}
$text = unTagURLs($text);
return $text;
}
function setCountry($country) {
$this->set('country', tagURLs($country));
}
function getCredit($locale = NULL) {
$text = $this->get('credit');
if ($locale !== 'all') {
$text = get_language_string($text, $locale);
}
$text = unTagURLs($text);
return $text;
}
function setCredit($credit) {
$this->set('credit', tagURLs($credit));
}
function getCopyright($locale = NULL) {
$text = $this->get('copyright');
if ($locale !== 'all') {
$text = get_language_string($text, $locale);
}
$text = unTagURLs($text);
return $text;
}
function setCopyright($copyright) {
$this->set('copyright', tagURLs($copyright));
}
function getCopyrightNotice($locale = null) {
$copyright = trim($this->getCopyright($locale));
if (!empty($copyright)) {
$notice = $copyright;
} else {
$metadata = $this->getMetaData();
if (isset($metadata['IPTCCopyright']) && !empty($metadata['IPTCCopyright'])) {
$notice = $metadata['IPTCCopyright'];
} else if (isset($metadata['EXIFCopyright']) && !empty($metadata['EXIFCopyright'])) {
$notice = $metadata['EXIFCopyright'];
} else if (empty($notice)) {
$option = trim(getOption('copyright_image_notice'));
if (!empty($option)) {
$notice = $option;
}
}
}
if (!empty(trim($notice))) {
$notice = unTagURLs(get_language_string($notice, $locale));
}
return $notice;
}
function getCopyrightRightsholder() {
$rightsholder = trim(getOption('copyright_image_rightsholder'));
if ($rightsholder && $rightsholder != 'none') {
if ($rightsholder == 'custom') {
$rightsholder = trim(getOption('copyright_image_rightsholder_custom'));
} else {
$rightsholder = Administrator::getNameByUser($rightsholder);
}
} else {
$metadata = $this->getMetaData();
if (isset($metadata['EXIFArtist']) && !empty($metadata['EXIFArtist'])) {
$rightsholder = $metadata['EXIFArtist'];
} else if (isset($metadata['VideoArtist']) && !empty($metadata['VideoArtist'])) {
$rightsholder = $metadata['VideoArtist'];
} else if (isset($metadata['IPTCByLine']) && !empty($metadata['IPTCByLine'])) {
$rightsholder = $metadata['IPTCByLine'];
}
}
if (empty($rightsholder)) {
$rightsholder = $this->getOwner(true);
}
return $rightsholder;
}
function getCopyrightURL() {
$url = getOption('copyright_image_url');
if ($url) {
if ($url == 'custom') {
return getOption('copyright_image_url_custom');
} else if ($url == 'none') {
return null;
} else {
if (extensionEnabled('zenpage') && ZP_PAGES_ENABLED) {
$pageobj = new ZenpagePage($url);
if ($pageobj->exists) {
return $pageobj->getLink();
}
}
}
}
}
function remove() {
$result = false;
if (parent::remove()) {
$result = true;
$filestodelete = safe_glob(substr($this->localpath, 0, strrpos($this->localpath, '.')) . '.*');
foreach ($filestodelete as $file) {
@chmod($file, 0777);
$result = $result && @unlink($file);
}
if ($result) {
$this->setUpdatedDateAlbum();
query("DELETE FROM " . prefix('obj_to_tag') . "WHERE `type`='images' AND `objectid`=" . $this->id);
query("DELETE FROM " . prefix('comments') . "WHERE `type` ='images' AND `ownerid`=" . $this->id);
$cachepath = SERVERCACHE . '/' . pathurlencode($this->album->name) . '/' . $this->filename;
$cachefilestodelete = safe_glob(substr($cachepath, 0, strrpos($cachepath, '.')) . '_*');
foreach ($cachefilestodelete as $file) {
@chmod($file, 0777);
@unlink($file);
}
}
}
clearstatcache();
return $result;
}
function move($newalbum, $newfilename = null) {
if (is_string($newalbum))
$newalbum = newAlbum($newalbum, false);
if ($newfilename == null) {
$newfilename = $this->filename;
} else {
if (getSuffix($this->filename) != getSuffix($newfilename)) {
return 6;
}
}
if ($newalbum->getID() == $this->album->getID() && $newfilename == $this->filename) {
return 2;
}
$newpath = $newalbum->localpath . internalToFilesystem($newfilename);
if (file_exists($newpath)) {
if (!(CASE_INSENSITIVE && strtolower($newpath) == strtolower($this->localpath))) {
return 2;
}
}
$filename = basename($this->localpath);
@chmod($filename, 0777);
$result = @rename($this->localpath, $newpath);
@chmod($filename, FILE_MOD);
$this->localpath = $newpath;
clearstatcache();
if ($result) {
$filestomove = safe_glob(substr($this->localpath, 0, strrpos($this->localpath, '.')) . '.*');
foreach ($filestomove as $file) {
if (in_array(strtolower(getSuffix($file)), $this->sidecars)) {
$result = $result && @rename($file, stripSuffix($newpath) . '.' . getSuffix($file));
}
}
}
if ($result) {
if (parent::move(array('filename' => $newfilename, 'albumid' => $newalbum->getID()))) {
$this->setUpdatedDateAlbum();
$newalbum->setUpdatedDate();
$newalbum->save();
$newalbum->setUpdatedDateParents();
$this->set('mtime', filemtime($newpath));
$this->save();
return 0;
}
}
return 1;
}
function rename($newfilename) {
return $this->move($this->album, $newfilename);
}
function copy($newalbum) {
if (is_string($newalbum)) {
$newalbum = newAlbum($newalbum, false);
}
if ($newalbum->getID() == $this->album->getID()) {
return 2;
}
$newpath = $newalbum->localpath . internalToFilesystem($this->filename);
if (file_exists($newpath)) {
return 2;
}
$filename = basename($this->localpath);
$result = @copy($this->localpath, $newpath);
if ($result) {
$filestocopy = safe_glob(substr($this->localpath, 0, strrpos($this->localpath, '.')) . '.*');
foreach ($filestocopy as $file) {
if (in_array(strtolower(getSuffix($file)), $this->sidecars)) {
$result = $result && @copy($file, $newalbum->localpath . basename($file));
}
}
}
if ($result) {
if ($newID = parent::copy(array('filename' => $filename, 'albumid' => $newalbum->getID()))) {
storeTags(readTags($this->getID(), 'images'), $newID, 'images');
query('UPDATE ' . prefix('images') . ' SET `mtime`=' . filemtime($newpath) . ' WHERE `filename`="' . $filename . '" AND `albumid`=' . $newalbum->getID());
$newalbum->setUpdatedDate();
$newalbum->save();
$newalbum->setUpdatedDateParents();
return 0;
}
}
return 1;
}
function getLink() {
if (is_array($this->filename)) {
$albumq = $album = dirname($this->filename['source']);
$image = basename($this->filename['source']);
} else {
$album = $this->albumlink;
$albumq = $this->albumnamealbum->name;
$image = $this->filename;
}
return zp_apply_filter('getLink', rewrite_path(pathurlencode($album) . '/' . urlencode($image) . IM_SUFFIX, '/index.php?album=' . pathurlencode($albumq) . '&image=' . urlencode($image)), $this, NULL);
}
function getFullImage($path = WEBPATH) {
global $_zp_conf_vars;
if ($path == WEBPATH && $_zp_conf_vars['album_folder_class'] == 'external') {
return false;
}
if (is_array($this->filename)) {
$album = dirname($this->filename['source']);
$image = basename($this->filename['source']);
} else {
$album = $this->imagefolder;
$image = $this->filename;
}
return getAlbumFolder($path) . $album . "/" . $image;
}
function getFullImageURL() {
return $this->getFullImage(WEBPATH);
}
function getSizedImage($size) {
$wmt = getWatermarkParam($this, WATERMARK_IMAGE);
$args = getImageParameters(array($size, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, $wmt), $this->album->name);
return getImageURI($args, $this->album->name, $this->filename, $this->filemtime);
}
function getCustomImage($size, $width, $height, $cropw, $croph, $cropx, $cropy, $thumbStandin = false, $effects = NULL) {
if ($thumbStandin < 0) {
$wmt = '!';
} else {
if ($thumbStandin) {
$wmt = getWatermarkParam($this, WATERMARK_THUMB);
} else {
$wmt = getWatermarkParam($this, WATERMARK_IMAGE);
}
}
$args = getImageParameters(array($size, $width, $height, $cropw, $croph, $cropx, $cropy, NULL, $thumbStandin, NULL, $thumbStandin, $wmt, NULL, $effects), $this->album->name);
return getImageURI($args, $this->album->name, $this->filename, $this->filemtime);
}
function getContent() {
$class = '';
if (!$this->isPublished()) {
$class .= " not_visible";
}
$album = $this->getAlbum();
$pwd = $album->getPassword();
if (!empty($pwd)) {
$class .= " password_protected";
}
$size = getOption('image_size');
$h = $this->getHeight();
$w = $this->getWidth();
$side = getOption('image_use_side');
$us = getOption('image_allow_upscale');
$dim = $size;
if ($w == 0) {
$hprop = 1;
} else {
$hprop = round(($h / $w) * $dim);
}
if ($h == 0) {
$wprop = 1;
} else {
$wprop = round(($w / $h) * $dim);
}
if (($size && ($side == 'longest' && $h > $w) || ($side == 'height') || ($side == 'shortest' && $h < $w))) {
$newh = $dim;
$neww = $wprop;
} else {
$neww = $dim;
$newh = $hprop;
}
if (!$us && $newh >= $h && $neww >= $w) {
$neww = $w;
$newh = $h;
}
$html = '<img src="' . html_encode(pathurlencode($this->getSizedImage($size))) . '" alt="' . html_encode($this->getTitle()) . '"' .
' width="' . $neww . '" height="' . $newh . '"' .
(($class) ? " class=\"$class\"" : "") . " />";
$html = zp_apply_filter('standard_image_html', $html, $this);
return $html;
}
function getThumbImageFile() {
return $local = $this->localpath;
}
function getThumbCropping($ts, $sw, $sh) {
$cy = $this->get('thumbY');
if (is_null($cy)) {
$custom = $cx = NULL;
$cw = $sw;
$ch = $sh;
} else {
$custom = true;
$cx = $this->get('thumbX');
$cw = $this->get('thumbW');
$ch = $this->get('thumbH');
if ($sw == $sh) {
$sw = $sh = $ts;
} else {
if ($sw > $sh) {
$r = $ts / $sw;
$sw = $ts;
$sh = $sh * $r;
} else {
$r = $ts / $sh;
$sh = $ts;
$sh = $r * $sh;
}
}
}
return array($custom, $cw, $ch, $cx, $cy);
}
function getThumb($type = 'image') {
$ts = getOption('thumb_size');
if (getOption('thumb_crop')) {
$sw = getOption('thumb_crop_width');
$sh = getOption('thumb_crop_height');
list($custom, $cw, $ch, $cx, $cy) = $this->getThumbCropping($ts, $sw, $sh);
if ($custom) {
$ts = null;
}
} else {
$sw = $sh = $cw = $ch = $cx = $cy = null;
}
return $this->getCustomImage($ts, $sw, $sh, $cw, $ch, $cx, $cy, true);
}
function getIndex() {
global $_zp_current_search, $_zp_current_album;
if ($this->index == NULL) {
$album = $this->albumnamealbum;
if (!is_null($_zp_current_search) && !in_context(ZP_ALBUM_LINKED) || $album->isDynamic()) {
if ($album->isDynamic()) {
$images = $album->getImages();
for ($i = 0; $i < count($images); $i++) {
$image = $images[$i];
if ($this->filename == $image['filename']) {
$this->index = $i;
break;
}
}
} else {
$this->index = $_zp_current_search->getImageIndex($this->imagefolder, $this->filename);
}
} else {
$images = $this->album->getImages(0);
for ($i = 0; $i < count($images); $i++) {
$image = $images[$i];
if ($this->filename == $image) {
$this->index = $i;
break;
}
}
}
}
return $this->index;
}
function getNextImage() {
global $_zp_current_search;
$index = $this->getIndex();
if (!is_null($_zp_current_search) && !in_context(ZP_ALBUM_LINKED)) {
$image = $_zp_current_search->getImage($index + 1);
} else {
$album = $this->albumnamealbum;
$image = $album->getImage($index + 1);
}
return $image;
}
function getPrevImage() {
global $_zp_current_search;
$index = $this->getIndex();
if (!is_null($_zp_current_search) && !in_context(ZP_ALBUM_LINKED)) {
$image = $_zp_current_search->getImage($index - 1);
} else {
$album = $this->albumnamealbum;
$image = $album->getImage($index - 1);
}
return $image;
}
function getImageFootprint() {
return filesize($this->localpath);
}
function getWatermark() {
return $this->get('watermark');
}
function setWatermark($wm) {
$this->set('watermark', $wm);
}
function getWMUse() {
return $this->get('watermark_use');
}
function setWMUse($use) {
$this->set('watermark_use', $use);
}
function getOwner($fullname = false) {
$owner = $this->get('owner');
if (empty($owner)) {
$owner = $this->album->getOwner();
}
if ($fullname) {
return Zenphoto_Administrator::getNameByUser($owner);
}
return $owner;
}
function setOwner($owner) {
$this->set('owner', $owner);
}
function isMyItem($action) {
$album = $this->album;
return $album->isMyItem($action);
}
function checkAccess(&$hint = NULL, &$show = NULL) {
$album = $this->getAlbum();
if ($album->isMyItem(LIST_RIGHTS)) {
return $this->isPublished() || $album->albumSubRights() & (MANAGED_OBJECT_RIGHTS_EDIT | MANAGED_OBJECT_RIGHTS_VIEW);
}
return $album->checkforGuest($hint, $show) && $this->isPublished() && $album->isPublished();
}
function checkforGuest(&$hint = NULL, &$show = NULL) {
if (!parent::checkForGuest()) {
return false;
}
$album = $this->getAlbum();
return $album->checkforGuest($hint, $show);
}
function isProtected() {
return $this->checkforGuest() != 'zp_public_access';
}
function isPublic() {
if (is_null($this->is_public)) {
if (!$this->isPublished()) {
return $this->is_public = false;
}
$album = $this->getAlbum();
if(!$album->isPublic()) {
return $this->is_public = false;
}
return $this->is_public = true;
} else {
return $this->is_public;
}
}
function getFilesize() {
$album = $this->getAlbum();
$filesize = filesize($this->getFullImage(SERVERPATH));
return $filesize;
}
function setUpdatedDateAlbum() {
$album = $this->album;
if($album) {
$album->setUpdatedDate();
$album->save();
$album->setUpdatedDateParents();
}
}
}
class Transientimage extends Image {
function __construct($album, $image) {
if (!is_object($album)) {
$album = new AlbumBase('Transient');
}
$this->album = $album;
$this->localpath = $image;
$filename = makeSpecialImageName($image);
$this->filename = $filename;
$this->displayname = stripSuffix(basename($image));
if (empty($this->displayname)) {
$this->displayname = $this->filename['name'];
}
$this->filemtime = @filemtime($this->localpath);
$this->comments = null;
$this->instantiate('images', array('filename' => $filename['name'], 'albumid' => $this->album->getID()), 'filename', true, true);
$this->exists = false;
}
}
?>