PageRenderTime 52ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/jandcode-wax-core/src/jandcode/wax/core/js/jquery/plupload/plupload.html5.js

https://bitbucket.org/gkraser/jandcode-core
JavaScript | 765 lines | 743 code | 22 blank | 0 comment | 206 complexity | 15805084fe0ea9c8ffa26741cc65056e MD5 | raw file
  1. (function(h, k, j, e) {
  2. var c = {}, g;
  3. function m(o, p) {
  4. var n;
  5. if ("FileReader" in h) {
  6. n = new FileReader();
  7. n.readAsDataURL(o);
  8. n.onload = function() {
  9. p(n.result)
  10. }
  11. } else {
  12. return p(o.getAsDataURL())
  13. }
  14. }
  15. function l(o, p) {
  16. var n;
  17. if ("FileReader" in h) {
  18. n = new FileReader();
  19. n.readAsBinaryString(o);
  20. n.onload = function() {
  21. p(n.result)
  22. }
  23. } else {
  24. return p(o.getAsBinary())
  25. }
  26. }
  27. function d(r, p, n, v) {
  28. var q, o, u, s, t = this;
  29. m(c[r.id], function(w) {
  30. q = k.createElement("canvas");
  31. q.style.display = "none";
  32. k.body.appendChild(q);
  33. o = q.getContext("2d");
  34. u = new Image();
  35. u.onerror = u.onabort = function() {
  36. v({success: false})
  37. };
  38. u.onload = function() {
  39. var B, x, z, y, A;
  40. if (!p.width) {
  41. p.width = u.width
  42. }
  43. if (!p.height) {
  44. p.height = u.height
  45. }
  46. s = Math.min(p.width / u.width, p.height / u.height);
  47. if (s < 1 || (s === 1 && n === "image/jpeg")) {
  48. B = Math.round(u.width * s);
  49. x = Math.round(u.height * s);
  50. q.width = B;
  51. q.height = x;
  52. o.drawImage(u, 0, 0, B, x);
  53. if (n === "image/jpeg") {
  54. y = new f(atob(w.substring(w.indexOf("base64,") + 7)));
  55. if (y.headers && y.headers.length) {
  56. A = new a();
  57. if (A.init(y.get("exif")[0])) {
  58. A.setExif("PixelXDimension", B);
  59. A.setExif("PixelYDimension", x);
  60. y.set("exif", A.getBinary());
  61. if (t.hasEventListener("ExifData")) {
  62. t.trigger("ExifData", r, A.EXIF())
  63. }
  64. if (t.hasEventListener("GpsData")) {
  65. t.trigger("GpsData", r, A.GPS())
  66. }
  67. }
  68. }
  69. if (p.quality) {
  70. try {
  71. w = q.toDataURL(n, p.quality / 100)
  72. } catch(C) {
  73. w = q.toDataURL(n)
  74. }
  75. }
  76. } else {
  77. w = q.toDataURL(n)
  78. }
  79. w = w.substring(w.indexOf("base64,") + 7);
  80. w = atob(w);
  81. if (y && y.headers && y.headers.length) {
  82. w = y.restore(w);
  83. y.purge()
  84. }
  85. q.parentNode.removeChild(q);
  86. v({success: true, data: w})
  87. } else {
  88. v({success: false})
  89. }
  90. };
  91. u.src = w
  92. })
  93. }
  94. j.runtimes.Html5 = j.addRuntime("html5", {getFeatures: function() {
  95. var s, o, r, q, p, n;
  96. o = r = p = n = false;
  97. if (h.XMLHttpRequest) {
  98. s = new XMLHttpRequest();
  99. r = !!s.upload;
  100. o = !!(s.sendAsBinary || s.upload)
  101. }
  102. if (o) {
  103. q = !!(s.sendAsBinary || (h.Uint8Array && h.ArrayBuffer));
  104. p = !!(File && (File.prototype.getAsDataURL || h.FileReader) && q);
  105. n = !!(File && (File.prototype.mozSlice || File.prototype.webkitSlice || File.prototype.slice))
  106. }
  107. g = j.ua.safari && j.ua.windows;
  108. return{html5: o, dragdrop: (function() {
  109. var t = k.createElement("div");
  110. return("draggable" in t) || ("ondragstart" in t && "ondrop" in t)
  111. }()), jpgresize: p, pngresize: p, multipart: p || !!h.FileReader || !!h.FormData, canSendBinary: q, cantSendBlobInFormData: !!(j.ua.gecko && h.FormData && h.FileReader && !FileReader.prototype.readAsArrayBuffer), progress: r, chunks: n, multi_selection: !(j.ua.safari && j.ua.windows), triggerDialog: (j.ua.gecko && h.FormData || j.ua.webkit)}
  112. }, init: function(p, r) {
  113. var n, q;
  114. function o(w) {
  115. var u, t, v = [], x, s = {};
  116. for (t = 0; t < w.length; t++) {
  117. u = w[t];
  118. if (s[u.name]) {
  119. continue
  120. }
  121. s[u.name] = true;
  122. x = j.guid();
  123. c[x] = u;
  124. v.push(new j.File(x, u.fileName || u.name, u.fileSize || u.size))
  125. }
  126. if (v.length) {
  127. p.trigger("FilesAdded", v)
  128. }
  129. }
  130. n = this.getFeatures();
  131. if (!n.html5) {
  132. r({success: false});
  133. return
  134. }
  135. p.bind("Init", function(w) {
  136. var G, F, C = [], v, D, t = w.settings.filters, u, B, s = k.body, E;
  137. G = k.createElement("div");
  138. G.id = w.id + "_html5_container";
  139. j.extend(G.style, {position: "absolute", background: p.settings.shim_bgcolor || "transparent", width: "100px", height: "100px", overflow: "hidden", zIndex: 99999, opacity: p.settings.shim_bgcolor ? "" : 0});
  140. G.className = "plupload html5";
  141. if (p.settings.container) {
  142. s = k.getElementById(p.settings.container);
  143. if (j.getStyle(s, "position") === "static") {
  144. s.style.position = "relative"
  145. }
  146. }
  147. s.appendChild(G);
  148. no_type_restriction:for (v = 0; v < t.length; v++) {
  149. u = t[v].extensions.split(/,/);
  150. for (D = 0; D < u.length; D++) {
  151. if (u[D] === "*") {
  152. C = [];
  153. break no_type_restriction
  154. }
  155. B = j.mimeTypes[u[D]];
  156. if (B && j.inArray(B, C) === -1) {
  157. C.push(B)
  158. }
  159. }
  160. }
  161. G.innerHTML = '<input id="' + p.id + '_html5" style="font-size:999px" type="file" accept="' + C.join(",") + '" ' + (p.settings.multi_selection && p.features.multi_selection ? 'multiple="multiple"' : "") + " />";
  162. G.scrollTop = 100;
  163. E = k.getElementById(p.id + "_html5");
  164. if (w.features.triggerDialog) {
  165. j.extend(E.style, {position: "absolute", width: "100%", height: "100%"})
  166. } else {
  167. j.extend(E.style, {cssFloat: "right", styleFloat: "right"})
  168. }
  169. E.onchange = function() {
  170. o(this.files);
  171. this.value = ""
  172. };
  173. F = k.getElementById(w.settings.browse_button);
  174. if (F) {
  175. var z = w.settings.browse_button_hover, A = w.settings.browse_button_active, x = w.features.triggerDialog ? F : G;
  176. if (z) {
  177. j.addEvent(x, "mouseover", function() {
  178. j.addClass(F, z)
  179. }, w.id);
  180. j.addEvent(x, "mouseout", function() {
  181. j.removeClass(F, z)
  182. }, w.id)
  183. }
  184. if (A) {
  185. j.addEvent(x, "mousedown", function() {
  186. j.addClass(F, A)
  187. }, w.id);
  188. j.addEvent(k.body, "mouseup", function() {
  189. j.removeClass(F, A)
  190. }, w.id)
  191. }
  192. if (w.features.triggerDialog) {
  193. j.addEvent(F, "click", function(H) {
  194. var y = k.getElementById(w.id + "_html5");
  195. if (y && !y.disabled) {
  196. y.click()
  197. }
  198. H.preventDefault()
  199. }, w.id)
  200. }
  201. }
  202. });
  203. p.bind("PostInit", function() {
  204. var s = k.getElementById(p.settings.drop_element);
  205. if (s) {
  206. if (g) {
  207. j.addEvent(s, "dragenter", function(w) {
  208. var v, t, u;
  209. v = k.getElementById(p.id + "_drop");
  210. if (!v) {
  211. v = k.createElement("input");
  212. v.setAttribute("type", "file");
  213. v.setAttribute("id", p.id + "_drop");
  214. v.setAttribute("multiple", "multiple");
  215. j.addEvent(v, "change", function() {
  216. o(this.files);
  217. j.removeEvent(v, "change", p.id);
  218. v.parentNode.removeChild(v)
  219. }, p.id);
  220. s.appendChild(v)
  221. }
  222. t = j.getPos(s, k.getElementById(p.settings.container));
  223. u = j.getSize(s);
  224. if (j.getStyle(s, "position") === "static") {
  225. j.extend(s.style, {position: "relative"})
  226. }
  227. j.extend(v.style, {position: "absolute", display: "block", top: 0, left: 0, width: u.w + "px", height: u.h + "px", opacity: 0})
  228. }, p.id);
  229. return
  230. }
  231. j.addEvent(s, "dragover", function(t) {
  232. t.preventDefault()
  233. }, p.id);
  234. j.addEvent(s, "drop", function(u) {
  235. var t = u.dataTransfer;
  236. if (t && t.files) {
  237. o(t.files)
  238. }
  239. u.preventDefault()
  240. }, p.id)
  241. }
  242. });
  243. p.bind("Refresh", function(s) {
  244. var t, u, v, x, w;
  245. t = k.getElementById(p.settings.browse_button);
  246. if (t) {
  247. u = j.getPos(t, k.getElementById(s.settings.container));
  248. v = j.getSize(t);
  249. x = k.getElementById(p.id + "_html5_container");
  250. j.extend(x.style, {top: u.y + "px", left: u.x + "px", width: v.w + "px", height: v.h + "px"});
  251. if (p.features.triggerDialog) {
  252. if (j.getStyle(t, "position") === "static") {
  253. j.extend(t.style, {position: "relative"})
  254. }
  255. w = parseInt(j.getStyle(t, "z-index"), 10);
  256. if (isNaN(w)) {
  257. w = 0
  258. }
  259. j.extend(t.style, {zIndex: w});
  260. j.extend(x.style, {zIndex: w - 1})
  261. }
  262. }
  263. });
  264. p.bind("DisableBrowse", function(s, u) {
  265. var t = k.getElementById(s.id + "_html5");
  266. if (t) {
  267. t.disabled = u
  268. }
  269. });
  270. p.bind("CancelUpload", function() {
  271. if (q && q.abort) {
  272. q.abort()
  273. }
  274. });
  275. p.bind("UploadFile", function(s, u) {
  276. var v = s.settings, y, t;
  277. function x(A, D, z) {
  278. var B;
  279. if (File.prototype.slice) {
  280. try {
  281. A.slice();
  282. return A.slice(D, z)
  283. } catch(C) {
  284. return A.slice(D, z - D)
  285. }
  286. } else {
  287. if (B = File.prototype.webkitSlice || File.prototype.mozSlice) {
  288. return B.call(A, D, z)
  289. } else {
  290. return null
  291. }
  292. }
  293. }
  294. function w(A) {
  295. var D = 0, C = 0, z = ("FileReader" in h) ? new FileReader : null;
  296. function B() {
  297. var I, M, K, L, H, J, F, E = s.settings.url;
  298. function G(V) {
  299. var T = 0, N = "----pluploadboundary" + j.guid(), O, P = "--", U = "\r\n", R = "";
  300. q = new XMLHttpRequest;
  301. if (q.upload) {
  302. q.upload.onprogress = function(W) {
  303. u.loaded = Math.min(u.size, C + W.loaded - T);
  304. s.trigger("UploadProgress", u)
  305. }
  306. }
  307. q.onreadystatechange = function() {
  308. var W, Y;
  309. if (q.readyState == 4 && s.state !== j.STOPPED) {
  310. try {
  311. W = q.status
  312. } catch(X) {
  313. W = 0
  314. }
  315. if (W >= 400) {
  316. s.trigger("Error", {code: j.HTTP_ERROR, message: j.translate("HTTP Error."), file: u, status: W})
  317. } else {
  318. if (K) {
  319. Y = {chunk: D, chunks: K, response: q.responseText, status: W};
  320. s.trigger("ChunkUploaded", u, Y);
  321. C += J;
  322. if (Y.cancelled) {
  323. u.status = j.FAILED;
  324. return
  325. }
  326. u.loaded = Math.min(u.size, (D + 1) * H)
  327. } else {
  328. u.loaded = u.size
  329. }
  330. s.trigger("UploadProgress", u);
  331. V = I = O = R = null;
  332. if (!K || ++D >= K) {
  333. u.status = j.DONE;
  334. s.trigger("FileUploaded", u, {response: q.responseText, status: W})
  335. } else {
  336. B()
  337. }
  338. }
  339. }
  340. };
  341. if (s.settings.multipart && n.multipart) {
  342. L.name = u.target_name || u.name;
  343. q.open("post", E, true);
  344. j.each(s.settings.headers, function(X, W) {
  345. q.setRequestHeader(W, X)
  346. });
  347. if (typeof(V) !== "string" && !!h.FormData) {
  348. O = new FormData();
  349. j.each(j.extend(L, s.settings.multipart_params), function(X, W) {
  350. O.append(W, X)
  351. });
  352. O.append(s.settings.file_data_name, V);
  353. q.send(O);
  354. return
  355. }
  356. if (typeof(V) === "string") {
  357. q.setRequestHeader("Content-Type", "multipart/form-data; boundary=" + N);
  358. j.each(j.extend(L, s.settings.multipart_params), function(X, W) {
  359. R += P + N + U + 'Content-Disposition: form-data; name="' + W + '"' + U + U;
  360. R += unescape(encodeURIComponent(X)) + U
  361. });
  362. F = j.mimeTypes[u.name.replace(/^.+\.([^.]+)/, "$1").toLowerCase()] || "application/octet-stream";
  363. R += P + N + U + 'Content-Disposition: form-data; name="' + s.settings.file_data_name + '"; filename="' + unescape(encodeURIComponent(u.name)) + '"' + U + "Content-Type: " + F + U + U + V + U + P + N + P + U;
  364. T = R.length - V.length;
  365. V = R;
  366. if (q.sendAsBinary) {
  367. q.sendAsBinary(V)
  368. } else {
  369. if (n.canSendBinary) {
  370. var S = new Uint8Array(V.length);
  371. for (var Q = 0; Q < V.length; Q++) {
  372. S[Q] = (V.charCodeAt(Q) & 255)
  373. }
  374. q.send(S.buffer)
  375. }
  376. }
  377. return
  378. }
  379. }
  380. E = j.buildUrl(s.settings.url, j.extend(L, s.settings.multipart_params));
  381. q.open("post", E, true);
  382. q.setRequestHeader("Content-Type", "application/octet-stream");
  383. j.each(s.settings.headers, function(X, W) {
  384. q.setRequestHeader(W, X)
  385. });
  386. q.send(V)
  387. }
  388. if (u.status == j.DONE || u.status == j.FAILED || s.state == j.STOPPED) {
  389. return
  390. }
  391. L = {name: u.target_name || u.name};
  392. if (v.chunk_size && u.size > v.chunk_size && (n.chunks || typeof(A) == "string")) {
  393. H = v.chunk_size;
  394. K = Math.ceil(u.size / H);
  395. J = Math.min(H, u.size - (D * H));
  396. if (typeof(A) == "string") {
  397. I = A.substring(D * H, D * H + J)
  398. } else {
  399. I = x(A, D * H, D * H + J)
  400. }
  401. L.chunk = D;
  402. L.chunks = K
  403. } else {
  404. J = u.size;
  405. I = A
  406. }
  407. if (s.settings.multipart && n.multipart && typeof(I) !== "string" && z && n.cantSendBlobInFormData && n.chunks && s.settings.chunk_size) {
  408. z.onload = function() {
  409. G(z.result)
  410. };
  411. z.readAsBinaryString(I)
  412. } else {
  413. G(I)
  414. }
  415. }
  416. B()
  417. }
  418. y = c[u.id];
  419. if (n.jpgresize && s.settings.resize && /\.(png|jpg|jpeg)$/i.test(u.name)) {
  420. d.call(s, u, s.settings.resize, /\.png$/i.test(u.name) ? "image/png" : "image/jpeg", function(z) {
  421. if (z.success) {
  422. u.size = z.data.length;
  423. w(z.data)
  424. } else {
  425. if (n.chunks) {
  426. w(y)
  427. } else {
  428. l(y, w)
  429. }
  430. }
  431. })
  432. } else {
  433. if (!n.chunks && n.jpgresize) {
  434. l(y, w)
  435. } else {
  436. w(y)
  437. }
  438. }
  439. });
  440. p.bind("Destroy", function(s) {
  441. var u, v, t = k.body, w = {inputContainer: s.id + "_html5_container", inputFile: s.id + "_html5", browseButton: s.settings.browse_button, dropElm: s.settings.drop_element};
  442. for (u in w) {
  443. v = k.getElementById(w[u]);
  444. if (v) {
  445. j.removeAllEvents(v, s.id)
  446. }
  447. }
  448. j.removeAllEvents(k.body, s.id);
  449. if (s.settings.container) {
  450. t = k.getElementById(s.settings.container)
  451. }
  452. t.removeChild(k.getElementById(w.inputContainer))
  453. });
  454. r({success: true})
  455. }});
  456. function b() {
  457. var q = false, o;
  458. function r(t, v) {
  459. var s = q ? 0 : -8 * (v - 1), w = 0, u;
  460. for (u = 0; u < v; u++) {
  461. w |= (o.charCodeAt(t + u) << Math.abs(s + u * 8))
  462. }
  463. return w
  464. }
  465. function n(u, s, t) {
  466. var t = arguments.length === 3 ? t : o.length - s - 1;
  467. o = o.substr(0, s) + u + o.substr(t + s)
  468. }
  469. function p(t, u, w) {
  470. var x = "", s = q ? 0 : -8 * (w - 1), v;
  471. for (v = 0; v < w; v++) {
  472. x += String.fromCharCode((u >> Math.abs(s + v * 8)) & 255)
  473. }
  474. n(x, t, w)
  475. }
  476. return{II: function(s) {
  477. if (s === e) {
  478. return q
  479. } else {
  480. q = s
  481. }
  482. }, init: function(s) {
  483. q = false;
  484. o = s
  485. }, SEGMENT: function(s, u, t) {
  486. switch(arguments.length) {
  487. case 1:
  488. return o.substr(s, o.length - s - 1);
  489. case 2:
  490. return o.substr(s, u);
  491. case 3:
  492. n(t, s, u);
  493. break;
  494. default:
  495. return o
  496. }
  497. }, BYTE: function(s) {
  498. return r(s, 1)
  499. }, SHORT: function(s) {
  500. return r(s, 2)
  501. }, LONG: function(s, t) {
  502. if (t === e) {
  503. return r(s, 4)
  504. } else {
  505. p(s, t, 4)
  506. }
  507. }, SLONG: function(s) {
  508. var t = r(s, 4);
  509. return(t > 2147483647 ? t - 4294967296 : t)
  510. }, STRING: function(s, t) {
  511. var u = "";
  512. for (t += s; s < t; s++) {
  513. u += String.fromCharCode(r(s, 1))
  514. }
  515. return u
  516. }}
  517. }
  518. function f(s) {
  519. var u = {65505: {app: "EXIF", name: "APP1", signature: "Exif\0"}, 65506: {app: "ICC", name: "APP2", signature: "ICC_PROFILE\0"}, 65517: {app: "IPTC", name: "APP13", signature: "Photoshop 3.0\0"}}, t = [], r, n, p = e, q = 0, o;
  520. r = new b();
  521. r.init(s);
  522. if (r.SHORT(0) !== 65496) {
  523. return
  524. }
  525. n = 2;
  526. o = Math.min(1048576, s.length);
  527. while (n <= o) {
  528. p = r.SHORT(n);
  529. if (p >= 65488 && p <= 65495) {
  530. n += 2;
  531. continue
  532. }
  533. if (p === 65498 || p === 65497) {
  534. break
  535. }
  536. q = r.SHORT(n + 2) + 2;
  537. if (u[p] && r.STRING(n + 4, u[p].signature.length) === u[p].signature) {
  538. t.push({hex: p, app: u[p].app.toUpperCase(), name: u[p].name.toUpperCase(), start: n, length: q, segment: r.SEGMENT(n, q)})
  539. }
  540. n += q
  541. }
  542. r.init(null);
  543. return{headers: t, restore: function(y) {
  544. r.init(y);
  545. var w = new f(y);
  546. if (!w.headers) {
  547. return false
  548. }
  549. for (var x = w.headers.length; x > 0; x--) {
  550. var z = w.headers[x - 1];
  551. r.SEGMENT(z.start, z.length, "")
  552. }
  553. w.purge();
  554. n = r.SHORT(2) == 65504 ? 4 + r.SHORT(4) : 2;
  555. for (var x = 0, v = t.length; x < v; x++) {
  556. r.SEGMENT(n, 0, t[x].segment);
  557. n += t[x].length
  558. }
  559. return r.SEGMENT()
  560. }, get: function(x) {
  561. var y = [];
  562. for (var w = 0, v = t.length; w < v; w++) {
  563. if (t[w].app === x.toUpperCase()) {
  564. y.push(t[w].segment)
  565. }
  566. }
  567. return y
  568. }, set: function(y, x) {
  569. var z = [];
  570. if (typeof(x) === "string") {
  571. z.push(x)
  572. } else {
  573. z = x
  574. }
  575. for (var w = ii = 0, v = t.length; w < v; w++) {
  576. if (t[w].app === y.toUpperCase()) {
  577. t[w].segment = z[ii];
  578. t[w].length = z[ii].length;
  579. ii++
  580. }
  581. if (ii >= z.length) {
  582. break
  583. }
  584. }
  585. }, purge: function() {
  586. t = [];
  587. r.init(null)
  588. }}
  589. }
  590. function a() {
  591. var q, n, o = {}, t;
  592. q = new b();
  593. n = {tiff: {274: "Orientation", 34665: "ExifIFDPointer", 34853: "GPSInfoIFDPointer"}, exif: {36864: "ExifVersion", 40961: "ColorSpace", 40962: "PixelXDimension", 40963: "PixelYDimension", 36867: "DateTimeOriginal", 33434: "ExposureTime", 33437: "FNumber", 34855: "ISOSpeedRatings", 37377: "ShutterSpeedValue", 37378: "ApertureValue", 37383: "MeteringMode", 37384: "LightSource", 37385: "Flash", 41986: "ExposureMode", 41987: "WhiteBalance", 41990: "SceneCaptureType", 41988: "DigitalZoomRatio", 41992: "Contrast", 41993: "Saturation", 41994: "Sharpness"}, gps: {0: "GPSVersionID", 1: "GPSLatitudeRef", 2: "GPSLatitude", 3: "GPSLongitudeRef", 4: "GPSLongitude"}};
  594. t = {ColorSpace: {1: "sRGB", 0: "Uncalibrated"}, MeteringMode: {0: "Unknown", 1: "Average", 2: "CenterWeightedAverage", 3: "Spot", 4: "MultiSpot", 5: "Pattern", 6: "Partial", 255: "Other"}, LightSource: {1: "Daylight", 2: "Fliorescent", 3: "Tungsten", 4: "Flash", 9: "Fine weather", 10: "Cloudy weather", 11: "Shade", 12: "Daylight fluorescent (D 5700 - 7100K)", 13: "Day white fluorescent (N 4600 -5400K)", 14: "Cool white fluorescent (W 3900 - 4500K)", 15: "White fluorescent (WW 3200 - 3700K)", 17: "Standard light A", 18: "Standard light B", 19: "Standard light C", 20: "D55", 21: "D65", 22: "D75", 23: "D50", 24: "ISO studio tungsten", 255: "Other"}, Flash: {0: "Flash did not fire.", 1: "Flash fired.", 5: "Strobe return light not detected.", 7: "Strobe return light detected.", 9: "Flash fired, compulsory flash mode", 13: "Flash fired, compulsory flash mode, return light not detected", 15: "Flash fired, compulsory flash mode, return light detected", 16: "Flash did not fire, compulsory flash mode", 24: "Flash did not fire, auto mode", 25: "Flash fired, auto mode", 29: "Flash fired, auto mode, return light not detected", 31: "Flash fired, auto mode, return light detected", 32: "No flash function", 65: "Flash fired, red-eye reduction mode", 69: "Flash fired, red-eye reduction mode, return light not detected", 71: "Flash fired, red-eye reduction mode, return light detected", 73: "Flash fired, compulsory flash mode, red-eye reduction mode", 77: "Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected", 79: "Flash fired, compulsory flash mode, red-eye reduction mode, return light detected", 89: "Flash fired, auto mode, red-eye reduction mode", 93: "Flash fired, auto mode, return light not detected, red-eye reduction mode", 95: "Flash fired, auto mode, return light detected, red-eye reduction mode"}, ExposureMode: {0: "Auto exposure", 1: "Manual exposure", 2: "Auto bracket"}, WhiteBalance: {0: "Auto white balance", 1: "Manual white balance"}, SceneCaptureType: {0: "Standard", 1: "Landscape", 2: "Portrait", 3: "Night scene"}, Contrast: {0: "Normal", 1: "Soft", 2: "Hard"}, Saturation: {0: "Normal", 1: "Low saturation", 2: "High saturation"}, Sharpness: {0: "Normal", 1: "Soft", 2: "Hard"}, GPSLatitudeRef: {N: "North latitude", S: "South latitude"}, GPSLongitudeRef: {E: "East longitude", W: "West longitude"}};
  595. function p(u, C) {
  596. var w = q.SHORT(u), z, F, G, B, A, v, x, D, E = [], y = {};
  597. for (z = 0; z < w; z++) {
  598. x = v = u + 12 * z + 2;
  599. G = C[q.SHORT(x)];
  600. if (G === e) {
  601. continue
  602. }
  603. B = q.SHORT(x += 2);
  604. A = q.LONG(x += 2);
  605. x += 4;
  606. E = [];
  607. switch(B) {
  608. case 1:
  609. case 7:
  610. if (A > 4) {
  611. x = q.LONG(x) + o.tiffHeader
  612. }
  613. for (F = 0; F < A; F++) {
  614. E[F] = q.BYTE(x + F)
  615. }
  616. break;
  617. case 2:
  618. if (A > 4) {
  619. x = q.LONG(x) + o.tiffHeader
  620. }
  621. y[G] = q.STRING(x, A - 1);
  622. continue;
  623. case 3:
  624. if (A > 2) {
  625. x = q.LONG(x) + o.tiffHeader
  626. }
  627. for (F = 0; F < A; F++) {
  628. E[F] = q.SHORT(x + F * 2)
  629. }
  630. break;
  631. case 4:
  632. if (A > 1) {
  633. x = q.LONG(x) + o.tiffHeader
  634. }
  635. for (F = 0; F < A; F++) {
  636. E[F] = q.LONG(x + F * 4)
  637. }
  638. break;
  639. case 5:
  640. x = q.LONG(x) + o.tiffHeader;
  641. for (F = 0; F < A; F++) {
  642. E[F] = q.LONG(x + F * 4) / q.LONG(x + F * 4 + 4)
  643. }
  644. break;
  645. case 9:
  646. x = q.LONG(x) + o.tiffHeader;
  647. for (F = 0; F < A; F++) {
  648. E[F] = q.SLONG(x + F * 4)
  649. }
  650. break;
  651. case 10:
  652. x = q.LONG(x) + o.tiffHeader;
  653. for (F = 0; F < A; F++) {
  654. E[F] = q.SLONG(x + F * 4) / q.SLONG(x + F * 4 + 4)
  655. }
  656. break;
  657. default:
  658. continue
  659. }
  660. D = (A == 1 ? E[0] : E);
  661. if (t.hasOwnProperty(G) && typeof D != "object") {
  662. y[G] = t[G][D]
  663. } else {
  664. y[G] = D
  665. }
  666. }
  667. return y
  668. }
  669. function s() {
  670. var v = e, u = o.tiffHeader;
  671. q.II(q.SHORT(u) == 18761);
  672. if (q.SHORT(u += 2) !== 42) {
  673. return false
  674. }
  675. o.IFD0 = o.tiffHeader + q.LONG(u += 2);
  676. v = p(o.IFD0, n.tiff);
  677. o.exifIFD = ("ExifIFDPointer" in v ? o.tiffHeader + v.ExifIFDPointer : e);
  678. o.gpsIFD = ("GPSInfoIFDPointer" in v ? o.tiffHeader + v.GPSInfoIFDPointer : e);
  679. return true
  680. }
  681. function r(w, u, z) {
  682. var B, y, x, A = 0;
  683. if (typeof(u) === "string") {
  684. var v = n[w.toLowerCase()];
  685. for (hex in v) {
  686. if (v[hex] === u) {
  687. u = hex;
  688. break
  689. }
  690. }
  691. }
  692. B = o[w.toLowerCase() + "IFD"];
  693. y = q.SHORT(B);
  694. for (i = 0; i < y; i++) {
  695. x = B + 12 * i + 2;
  696. if (q.SHORT(x) == u) {
  697. A = x + 8;
  698. break
  699. }
  700. }
  701. if (!A) {
  702. return false
  703. }
  704. q.LONG(A, z);
  705. return true
  706. }
  707. return{init: function(u) {
  708. o = {tiffHeader: 10};
  709. if (u === e || !u.length) {
  710. return false
  711. }
  712. q.init(u);
  713. if (q.SHORT(0) === 65505 && q.STRING(4, 5).toUpperCase() === "EXIF\0") {
  714. return s()
  715. }
  716. return false
  717. }, EXIF: function() {
  718. var v;
  719. v = p(o.exifIFD, n.exif);
  720. if (v.ExifVersion && j.typeOf(v.ExifVersion) === "array") {
  721. for (var w = 0, u = ""; w < v.ExifVersion.length; w++) {
  722. u += String.fromCharCode(v.ExifVersion[w])
  723. }
  724. v.ExifVersion = u
  725. }
  726. return v
  727. }, GPS: function() {
  728. var u;
  729. u = p(o.gpsIFD, n.gps);
  730. if (u.GPSVersionID) {
  731. u.GPSVersionID = u.GPSVersionID.join(".")
  732. }
  733. return u
  734. }, setExif: function(u, v) {
  735. if (u !== "PixelXDimension" && u !== "PixelYDimension") {
  736. return false
  737. }
  738. return r("exif", u, v)
  739. }, getBinary: function() {
  740. return q.SEGMENT()
  741. }}
  742. }
  743. })(window, document, plupload);