11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)/*
21e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * Javascript EXIF Reader 0.1.2
31e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * Copyright (c) 2008 Jacob Seidelin, cupboy@gmail.com, http://blog.nihilogic.dk/
41e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * MIT License [http://www.opensource.org/licenses/mit-license.php]
51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) */
61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)var EXIF = {};
91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)(function() {
111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)var bDebug = false;
131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)EXIF.Tags = {
151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // version tags
171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x9000 : "ExifVersion",			// EXIF version
181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA000 : "FlashpixVersion",		// Flashpix format version
191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // colorspace tags
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA001 : "ColorSpace",			// Color space information tag
221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // image configuration
241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA002 : "PixelXDimension",		// Valid width of meaningful image
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA003 : "PixelYDimension",		// Valid height of meaningful image
261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x9101 : "ComponentsConfiguration",	// Information about channels
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x9102 : "CompressedBitsPerPixel",	// Compressed bits per pixel
281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // user information
301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x927C : "MakerNote",			// Any desired information written by the manufacturer
311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x9286 : "UserComment",			// Comments by user
321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // related file
341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA004 : "RelatedSoundFile",		// Name of related sound file
351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // date and time
371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x9003 : "DateTimeOriginal",		// Date and time when the original image was generated
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x9004 : "DateTimeDigitized",		// Date and time when the image was stored digitally
391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x9290 : "SubsecTime",			// Fractions of seconds for DateTime
401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x9291 : "SubsecTimeOriginal",		// Fractions of seconds for DateTimeOriginal
411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x9292 : "SubsecTimeDigitized",		// Fractions of seconds for DateTimeDigitized
421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // picture-taking conditions
441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x829A : "ExposureTime",		// Exposure time (in seconds)
451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x829D : "FNumber",			// F number
461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x8822 : "ExposureProgram",		// Exposure program
471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x8824 : "SpectralSensitivity",		// Spectral sensitivity
481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x8827 : "ISOSpeedRatings",		// ISO speed rating
491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x8828 : "OECF",			// Optoelectric conversion factor
501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x9201 : "ShutterSpeedValue",		// Shutter speed
511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x9202 : "ApertureValue",		// Lens aperture
521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x9203 : "BrightnessValue",		// Value of brightness
531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x9204 : "ExposureBias",		// Exposure bias
541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x9205 : "MaxApertureValue",		// Smallest F number of lens
551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x9206 : "SubjectDistance",		// Distance to subject in meters
561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x9207 : "MeteringMode", 		// Metering mode
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x9208 : "LightSource",			// Kind of light source
581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x9209 : "Flash",			// Flash status
591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x9214 : "SubjectArea",			// Location and area of main subject
601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x920A : "FocalLength",			// Focal length of the lens in mm
611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA20B : "FlashEnergy",			// Strobe energy in BCPS
621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA20C : "SpatialFrequencyResponse",	//
631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA20E : "FocalPlaneXResolution", 	// Number of pixels in width direction per FocalPlaneResolutionUnit
641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA20F : "FocalPlaneYResolution", 	// Number of pixels in height direction per FocalPlaneResolutionUnit
651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA210 : "FocalPlaneResolutionUnit", 	// Unit for measuring FocalPlaneXResolution and FocalPlaneYResolution
661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA214 : "SubjectLocation",		// Location of subject in image
671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA215 : "ExposureIndex",		// Exposure index selected on camera
681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA217 : "SensingMethod", 		// Image sensor type
691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA300 : "FileSource", 			// Image source (3 == DSC)
701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA301 : "SceneType", 			// Scene type (1 == directly photographed)
711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA302 : "CFAPattern",			// Color filter array geometric pattern
721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA401 : "CustomRendered",		// Special processing
731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA402 : "ExposureMode",		// Exposure mode
741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA403 : "WhiteBalance",		// 1 = auto white balance, 2 = manual
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA404 : "DigitalZoomRation",		// Digital zoom ratio
761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA405 : "FocalLengthIn35mmFilm",	// Equivalent foacl length assuming 35mm film camera (in mm)
771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA406 : "SceneCaptureType",		// Type of scene
781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA407 : "GainControl",			// Degree of overall image gain adjustment
791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA408 : "Contrast",			// Direction of contrast processing applied by camera
801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA409 : "Saturation", 			// Direction of saturation processing applied by camera
811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA40A : "Sharpness",			// Direction of sharpness processing applied by camera
821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA40B : "DeviceSettingDescription",	//
831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA40C : "SubjectDistanceRange",	// Distance to subject
841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // other tags
861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA005 : "InteroperabilityIFDPointer",
871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA420 : "ImageUniqueID"		// Identifier assigned uniquely to each image
881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)EXIF.TiffTags = {
911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0100 : "ImageWidth",
921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0101 : "ImageHeight",
931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x8769 : "ExifIFDPointer",
941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x8825 : "GPSInfoIFDPointer",
951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xA005 : "InteroperabilityIFDPointer",
961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0102 : "BitsPerSample",
971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0103 : "Compression",
981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0106 : "PhotometricInterpretation",
991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0112 : "Orientation",
1001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0115 : "SamplesPerPixel",
1011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x011C : "PlanarConfiguration",
1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0212 : "YCbCrSubSampling",
1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0213 : "YCbCrPositioning",
1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x011A : "XResolution",
1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x011B : "YResolution",
1061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0128 : "ResolutionUnit",
1071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0111 : "StripOffsets",
1081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0116 : "RowsPerStrip",
1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0117 : "StripByteCounts",
1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0201 : "JPEGInterchangeFormat",
1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0202 : "JPEGInterchangeFormatLength",
1121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x012D : "TransferFunction",
1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x013E : "WhitePoint",
1141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x013F : "PrimaryChromaticities",
1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0211 : "YCbCrCoefficients",
1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0214 : "ReferenceBlackWhite",
1171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0132 : "DateTime",
1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x010E : "ImageDescription",
1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x010F : "Make",
1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0110 : "Model",
1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0131 : "Software",
1221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x013B : "Artist",
1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x8298 : "Copyright"
1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)EXIF.GPSTags = {
1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0000 : "GPSVersionID",
1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0001 : "GPSLatitudeRef",
1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0002 : "GPSLatitude",
1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0003 : "GPSLongitudeRef",
1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0004 : "GPSLongitude",
1321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0005 : "GPSAltitudeRef",
1331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0006 : "GPSAltitude",
1341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0007 : "GPSTimeStamp",
1351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0008 : "GPSSatellites",
1361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0009 : "GPSStatus",
1371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x000A : "GPSMeasureMode",
1381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x000B : "GPSDOP",
1391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x000C : "GPSSpeedRef",
1401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x000D : "GPSSpeed",
1411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x000E : "GPSTrackRef",
1421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x000F : "GPSTrack",
1431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0010 : "GPSImgDirectionRef",
1441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0011 : "GPSImgDirection",
1451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0012 : "GPSMapDatum",
1461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0013 : "GPSDestLatitudeRef",
1471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0014 : "GPSDestLatitude",
1481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0015 : "GPSDestLongitudeRef",
1491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0016 : "GPSDestLongitude",
1501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0017 : "GPSDestBearingRef",
1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0018 : "GPSDestBearing",
1521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x0019 : "GPSDestDistanceRef",
1531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x001A : "GPSDestDistance",
1541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x001B : "GPSProcessingMethod",
1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x001C : "GPSAreaInformation",
1561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x001D : "GPSDateStamp",
1571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x001E : "GPSDifferential"
1581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)EXIF.StringValues = {
1611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ExposureProgram : {
1621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0 : "Not defined",
1631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    1 : "Manual",
1641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    2 : "Normal program",
1651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    3 : "Aperture priority",
1661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    4 : "Shutter priority",
1671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    5 : "Creative program",
1681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    6 : "Action program",
1691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    7 : "Portrait mode",
1701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    8 : "Landscape mode"
1711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  },
1721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  MeteringMode : {
1731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0 : "Unknown",
1741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    1 : "Average",
1751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    2 : "CenterWeightedAverage",
1761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    3 : "Spot",
1771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    4 : "MultiSpot",
1781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    5 : "Pattern",
1791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    6 : "Partial",
1801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    255 : "Other"
1811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  },
1821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  LightSource : {
1831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0 : "Unknown",
1841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    1 : "Daylight",
1851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    2 : "Fluorescent",
1861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    3 : "Tungsten (incandescent light)",
1871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    4 : "Flash",
1881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    9 : "Fine weather",
1891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    10 : "Cloudy weather",
1901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    11 : "Shade",
1911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    12 : "Daylight fluorescent (D 5700 - 7100K)",
1921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    13 : "Day white fluorescent (N 4600 - 5400K)",
1931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    14 : "Cool white fluorescent (W 3900 - 4500K)",
1941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    15 : "White fluorescent (WW 3200 - 3700K)",
1951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    17 : "Standard light A",
1961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    18 : "Standard light B",
1971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    19 : "Standard light C",
1981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    20 : "D55",
1991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    21 : "D65",
2001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    22 : "D75",
2011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    23 : "D50",
2021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    24 : "ISO studio tungsten",
2031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    255 : "Other"
2041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  },
2051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  Flash : {
2061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0x0000 : "Flash did not fire",
2071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0x0001 : "Flash fired",
2081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0x0005 : "Strobe return light not detected",
2091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0x0007 : "Strobe return light detected",
2101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0x0009 : "Flash fired, compulsory flash mode",
2111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0x000D : "Flash fired, compulsory flash mode, return light not detected",
2121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0x000F : "Flash fired, compulsory flash mode, return light detected",
2131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0x0010 : "Flash did not fire, compulsory flash mode",
2141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0x0018 : "Flash did not fire, auto mode",
2151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0x0019 : "Flash fired, auto mode",
2161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0x001D : "Flash fired, auto mode, return light not detected",
2171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0x001F : "Flash fired, auto mode, return light detected",
2181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0x0020 : "No flash function",
2191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0x0041 : "Flash fired, red-eye reduction mode",
2201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0x0045 : "Flash fired, red-eye reduction mode, return light not detected",
2211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0x0047 : "Flash fired, red-eye reduction mode, return light detected",
2221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0x0049 : "Flash fired, compulsory flash mode, red-eye reduction mode",
2231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0x004D : "Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected",
2241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0x004F : "Flash fired, compulsory flash mode, red-eye reduction mode, return light detected",
2251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0x0059 : "Flash fired, auto mode, red-eye reduction mode",
2261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0x005D : "Flash fired, auto mode, return light not detected, red-eye reduction mode",
2271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0x005F : "Flash fired, auto mode, return light detected, red-eye reduction mode"
2281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  },
2291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SensingMethod : {
2301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    1 : "Not defined",
2311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    2 : "One-chip color area sensor",
2321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    3 : "Two-chip color area sensor",
2331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    4 : "Three-chip color area sensor",
2341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    5 : "Color sequential area sensor",
2351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    7 : "Trilinear sensor",
2361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    8 : "Color sequential linear sensor"
2371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  },
2381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SceneCaptureType : {
2391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0 : "Standard",
2401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    1 : "Landscape",
2411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    2 : "Portrait",
2421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    3 : "Night scene"
2431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  },
2441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SceneType : {
2451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    1 : "Directly photographed"
2461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  },
2471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  CustomRendered : {
2481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0 : "Normal process",
2491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    1 : "Custom process"
2501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  },
2511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  WhiteBalance : {
2521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0 : "Auto white balance",
2531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    1 : "Manual white balance"
2541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  },
2551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  GainControl : {
2561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0 : "None",
2571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    1 : "Low gain up",
2581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    2 : "High gain up",
2591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    3 : "Low gain down",
2601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    4 : "High gain down"
2611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  },
2621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  Contrast : {
2631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0 : "Normal",
2641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    1 : "Soft",
2651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    2 : "Hard"
2661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  },
2671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  Saturation : {
2681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0 : "Normal",
2691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    1 : "Low saturation",
2701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    2 : "High saturation"
2711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  },
2721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  Sharpness : {
2731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0 : "Normal",
2741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    1 : "Soft",
2751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    2 : "Hard"
2761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  },
2771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SubjectDistanceRange : {
2781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0 : "Unknown",
2791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    1 : "Macro",
2801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    2 : "Close view",
2811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    3 : "Distant view"
2821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  },
2831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  FileSource : {
2841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    3 : "DSC"
2851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  },
2861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  Components : {
2881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    0 : "",
2891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    1 : "Y",
2901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    2 : "Cb",
2911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    3 : "Cr",
2921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    4 : "R",
2931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    5 : "G",
2941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    6 : "B"
2951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
2961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)function addEvent(oElement, strEvent, fncHandler)
2991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles){
3001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (oElement.addEventListener) {
3011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    oElement.addEventListener(strEvent, fncHandler, false);
3021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  } else if (oElement.attachEvent) {
3031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    oElement.attachEvent("on" + strEvent, fncHandler);
3041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
3051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
3061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)function imageHasData(oImg)
3091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles){
3101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return !!(oImg.exifdata);
3111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
3121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)function getImageData(oImg, fncCallback)
3141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles){
3151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  BinaryAjax(
3161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    oImg.src,
3171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    function(oHTTP) {
3181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      var oEXIF = findEXIFinJPEG(oHTTP.binaryResponse);
3191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      oImg.exifdata = oEXIF || {};
3201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      if (fncCallback) fncCallback();
3211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
3221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  )
3231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
3241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)function findEXIFinJPEG(oFile) {
3261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  var aMarkers = [];
3271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (oFile.getByteAt(0) != 0xFF || oFile.getByteAt(1) != 0xD8) {
3291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return false; // not a valid jpeg
3301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
3311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  var iOffset = 2;
3331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  var iLength = oFile.getLength();
3341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  while (iOffset < iLength) {
3351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (oFile.getByteAt(iOffset) != 0xFF) {
3361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      if (bDebug) console.log("Not a valid marker at offset " + iOffset + ", found: " + oFile.getByteAt(iOffset));
3371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return false; // not a valid marker, something is wrong
3381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
3391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    var iMarker = oFile.getByteAt(iOffset+1);
3411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // we could implement handling for other markers here,
3431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // but we're only looking for 0xFFE1 for EXIF data
3441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (iMarker == 22400) {
3461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      if (bDebug) console.log("Found 0xFFE1 marker");
3471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return readEXIFData(oFile, iOffset + 4, oFile.getShortAt(iOffset+2, true)-2);
3481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      iOffset += 2 + oFile.getShortAt(iOffset+2, true);
3491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    } else if (iMarker == 225) {
3511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      // 0xE1 = Application-specific 1 (for EXIF)
3521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      if (bDebug) console.log("Found 0xFFE1 marker");
3531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return readEXIFData(oFile, iOffset + 4, oFile.getShortAt(iOffset+2, true)-2);
3541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    } else {
3561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      iOffset += 2 + oFile.getShortAt(iOffset+2, true);
3571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
3581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
3601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
3621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)function readTags(oFile, iTIFFStart, iDirStart, oStrings, bBigEnd)
3651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles){
3661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  var iEntries = oFile.getShortAt(iDirStart, bBigEnd);
3671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  var oTags = {};
3681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (var i=0;i<iEntries;i++) {
3691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    var iEntryOffset = iDirStart + i*12 + 2;
3701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    var strTag = oStrings[oFile.getShortAt(iEntryOffset, bBigEnd)];
3711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (!strTag && bDebug) console.log("Unknown tag: " + oFile.getShortAt(iEntryOffset, bBigEnd));
3721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    oTags[strTag] = readTagValue(oFile, iEntryOffset, iTIFFStart, iDirStart, bBigEnd);
3731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
3741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return oTags;
3751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
3761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)function readTagValue(oFile, iEntryOffset, iTIFFStart, iDirStart, bBigEnd)
3791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles){
3801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  var iType = oFile.getShortAt(iEntryOffset+2, bBigEnd);
3811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  var iNumValues = oFile.getLongAt(iEntryOffset+4, bBigEnd);
3821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  var iValueOffset = oFile.getLongAt(iEntryOffset+8, bBigEnd) + iTIFFStart;
3831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  switch (iType) {
3851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case 1: // byte, 8-bit unsigned int
3861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case 7: // undefined, 8-bit byte, value depending on field
3871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      if (iNumValues == 1) {
3881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        return oFile.getByteAt(iEntryOffset + 8, bBigEnd);
3891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      } else {
3901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        var iValOffset = iNumValues > 4 ? iValueOffset : (iEntryOffset + 8);
3911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        var aVals = [];
3921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        for (var n=0;n<iNumValues;n++) {
3931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          aVals[n] = oFile.getByteAt(iValOffset + n);
3941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        }
3951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        return aVals;
3961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      }
3971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      break;
3981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case 2: // ascii, 8-bit byte
4001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      var iStringOffset = iNumValues > 4 ? iValueOffset : (iEntryOffset + 8);
4011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return oFile.getStringAt(iStringOffset, iNumValues-1);
4021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      break;
4031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case 3: // short, 16 bit int
4051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      if (iNumValues == 1) {
4061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        return oFile.getShortAt(iEntryOffset + 8, bBigEnd);
4071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      } else {
4081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        var iValOffset = iNumValues > 2 ? iValueOffset : (iEntryOffset + 8);
4091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        var aVals = [];
4101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        for (var n=0;n<iNumValues;n++) {
4111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          aVals[n] = oFile.getShortAt(iValOffset + 2*n, bBigEnd);
4121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        }
4131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        return aVals;
4141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      }
4151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      break;
4161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case 4: // long, 32 bit int
4181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      if (iNumValues == 1) {
4191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        return oFile.getLongAt(iEntryOffset + 8, bBigEnd);
4201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      } else {
4211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        var aVals = [];
4221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        for (var n=0;n<iNumValues;n++) {
4231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          aVals[n] = oFile.getLongAt(iValueOffset + 4*n, bBigEnd);
4241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        }
4251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        return aVals;
4261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      }
4271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      break;
4281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case 5:	// rational = two long values, first is numerator, second is denominator
4291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      if (iNumValues == 1) {
4301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        return oFile.getLongAt(iValueOffset, bBigEnd) / oFile.getLongAt(iValueOffset+4, bBigEnd);
4311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      } else {
4321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        var aVals = [];
4331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        for (var n=0;n<iNumValues;n++) {
4341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          aVals[n] = oFile.getLongAt(iValueOffset + 8*n, bBigEnd) / oFile.getLongAt(iValueOffset+4 + 8*n, bBigEnd);
4351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        }
4361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        return aVals;
4371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      }
4381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      break;
4391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case 9: // slong, 32 bit signed int
4401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      if (iNumValues == 1) {
4411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        return oFile.getSLongAt(iEntryOffset + 8, bBigEnd);
4421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      } else {
4431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        var aVals = [];
4441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        for (var n=0;n<iNumValues;n++) {
4451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          aVals[n] = oFile.getSLongAt(iValueOffset + 4*n, bBigEnd);
4461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        }
4471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        return aVals;
4481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      }
4491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      break;
4501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case 10: // signed rational, two slongs, first is numerator, second is denominator
4511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      if (iNumValues == 1) {
4521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        return oFile.getSLongAt(iValueOffset, bBigEnd) / oFile.getSLongAt(iValueOffset+4, bBigEnd);
4531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      } else {
4541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        var aVals = [];
4551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        for (var n=0;n<iNumValues;n++) {
4561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          aVals[n] = oFile.getSLongAt(iValueOffset + 8*n, bBigEnd) / oFile.getSLongAt(iValueOffset+4 + 8*n, bBigEnd);
4571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        }
4581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        return aVals;
4591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      }
4601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      break;
4611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
4621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
4631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)function readEXIFData(oFile, iStart, iLength)
4661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles){
4671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (oFile.getStringAt(iStart, 4) != "Exif") {
4681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (bDebug) console.log("Not valid EXIF data! " + oFile.getStringAt(iStart, 4));
4691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return false;
4701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
4711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  var bBigEnd;
4731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  var iTIFFOffset = iStart + 6;
4751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // test for TIFF validity and endianness
4771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (oFile.getShortAt(iTIFFOffset) == 0x4949) {
4781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    bBigEnd = false;
4791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  } else if (oFile.getShortAt(iTIFFOffset) == 0x4D4D) {
4801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    bBigEnd = true;
4811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  } else {
4821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (bDebug) console.log("Not valid TIFF data! (no 0x4949 or 0x4D4D)");
4831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return false;
4841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
4851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (oFile.getShortAt(iTIFFOffset+2, bBigEnd) != 0x002A) {
4871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (bDebug) console.log("Not valid TIFF data! (no 0x002A)");
4881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return false;
4891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
4901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (oFile.getLongAt(iTIFFOffset+4, bBigEnd) != 0x00000008) {
4921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (bDebug) console.log("Not valid TIFF data! (First offset not 8)", oFile.getShortAt(iTIFFOffset+4, bBigEnd));
4931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return false;
4941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
4951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  var oTags = readTags(oFile, iTIFFOffset, iTIFFOffset+8, EXIF.TiffTags, bBigEnd);
4971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (oTags.ExifIFDPointer) {
4991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    var oEXIFTags = readTags(oFile, iTIFFOffset, iTIFFOffset + oTags.ExifIFDPointer, EXIF.Tags, bBigEnd);
5001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    for (var strTag in oEXIFTags) {
5011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      switch (strTag) {
5021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        case "LightSource" :
5031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        case "Flash" :
5041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        case "MeteringMode" :
5051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        case "ExposureProgram" :
5061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        case "SensingMethod" :
5071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        case "SceneCaptureType" :
5081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        case "SceneType" :
5091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        case "CustomRendered" :
5101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        case "WhiteBalance" :
5111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        case "GainControl" :
5121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        case "Contrast" :
5131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        case "Saturation" :
5141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        case "Sharpness" :
5151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        case "SubjectDistanceRange" :
5161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        case "FileSource" :
5171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          oEXIFTags[strTag] = EXIF.StringValues[strTag][oEXIFTags[strTag]];
5181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          break;
5191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        case "ExifVersion" :
5211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        case "FlashpixVersion" :
5221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          oEXIFTags[strTag] = String.fromCharCode(oEXIFTags[strTag][0], oEXIFTags[strTag][1], oEXIFTags[strTag][2], oEXIFTags[strTag][3]);
5231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          break;
5241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        case "ComponentsConfiguration" :
5261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          oEXIFTags[strTag] =
5271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            EXIF.StringValues.Components[oEXIFTags[strTag][0]]
5281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            + EXIF.StringValues.Components[oEXIFTags[strTag][1]]
5291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            + EXIF.StringValues.Components[oEXIFTags[strTag][2]]
5301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            + EXIF.StringValues.Components[oEXIFTags[strTag][3]];
5311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          break;
5321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      }
5331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      oTags[strTag] = oEXIFTags[strTag];
5341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
5351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
5361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (oTags.GPSInfoIFDPointer) {
5381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    var oGPSTags = readTags(oFile, iTIFFOffset, iTIFFOffset + oTags.GPSInfoIFDPointer, EXIF.GPSTags, bBigEnd);
5391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    for (var strTag in oGPSTags) {
5401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      switch (strTag) {
5411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        case "GPSVersionID" :
5421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          oGPSTags[strTag] = oGPSTags[strTag][0]
5431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            + "." + oGPSTags[strTag][1]
5441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            + "." + oGPSTags[strTag][2]
5451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            + "." + oGPSTags[strTag][3];
5461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          break;
5471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      }
5481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      oTags[strTag] = oGPSTags[strTag];
5491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
5501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
5511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return oTags;
5531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
5541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)EXIF.getData = function(oImg, fncCallback)
5571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles){
5581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!oImg.complete) return false;
5591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!imageHasData(oImg)) {
5601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    getImageData(oImg, fncCallback);
5611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  } else {
5621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (fncCallback) fncCallback();
5631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
5641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return true;
5651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
5661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)EXIF.getTag = function(oImg, strTag)
5681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles){
5691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!imageHasData(oImg)) return;
5701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return oImg.exifdata[strTag];
5711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
5721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)EXIF.pretty = function(oImg)
5741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles){
5751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!imageHasData(oImg)) return "";
5761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  var oData = oImg.exifdata;
5771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  var strPretty = "";
5781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (var a in oData) {
5791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (oData.hasOwnProperty(a)) {
5801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      if (typeof oData[a] == "object") {
5811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        strPretty += a + " : [" + oData[a].length + " values]\r\n";
5821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      } else {
5831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        strPretty += a + " : " + oData[a] + "\r\n";
5841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      }
5851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
5861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
5871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return strPretty;
5881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
5891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)EXIF.readFromBinaryFile = function(oFile) {
5911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return findEXIFinJPEG(oFile);
5921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
5931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)function loadAllImages()
5951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles){
5961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  var aImages = document.getElementsByTagName("img");
5971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (var i=0;i<aImages.length;i++) {
5981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (aImages[i].getAttribute("exif") == "true") {
5991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      if (!aImages[i].complete) {
6001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        addEvent(aImages[i], "load",
6011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          function() {
6021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            EXIF.getData(this);
6031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          }
6041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        );
6051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      } else {
6061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        EXIF.getData(aImages[i]);
6071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      }
6081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
6091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
6101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
6111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)addEvent(window, "load", loadAllImages);
6131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)})();
6151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
616