Matho/refinerycms-photo-gallery

View on GitHub
app/assets/javascripts/refinery/photo_gallery/admin/plupload/plupload.html5.js

Summary

Maintainability
F
2 mos
Test Coverage
(function (h, k, j, e) {
    var c = {}, g;

    function m(o, p) {
        var n;
        if ("FileReader" in h) {
            n = new FileReader();
            n.readAsDataURL(o);
            n.onload = function () {
                p(n.result)
            }
        } else {
            return p(o.getAsDataURL())
        }
    }

    function l(o, p) {
        var n;
        if ("FileReader" in h) {
            n = new FileReader();
            n.readAsBinaryString(o);
            n.onload = function () {
                p(n.result)
            }
        } else {
            return p(o.getAsBinary())
        }
    }

    function d(r, p, n, v) {
        var q, o, u, s, t = this;
        m(c[r.id], function (w) {
            q = k.createElement("canvas");
            q.style.display = "none";
            k.body.appendChild(q);
            o = q.getContext("2d");
            u = new Image();
            u.onerror = u.onabort = function () {
                v({success:false})
            };
            u.onload = function () {
                var B, x, z, y, A;
                if (!p.width) {
                    p.width = u.width
                }
                if (!p.height) {
                    p.height = u.height
                }
                s = Math.min(p.width / u.width, p.height / u.height);
                if (s < 1 || (s === 1 && n === "image/jpeg")) {
                    B = Math.round(u.width * s);
                    x = Math.round(u.height * s);
                    q.width = B;
                    q.height = x;
                    o.drawImage(u, 0, 0, B, x);
                    if (n === "image/jpeg") {
                        y = new f(atob(w.substring(w.indexOf("base64,") + 7)));
                        if (y.headers && y.headers.length) {
                            A = new a();
                            if (A.init(y.get("exif")[0])) {
                                A.setExif("PixelXDimension", B);
                                A.setExif("PixelYDimension", x);
                                y.set("exif", A.getBinary());
                                if (t.hasEventListener("ExifData")) {
                                    t.trigger("ExifData", r, A.EXIF())
                                }
                                if (t.hasEventListener("GpsData")) {
                                    t.trigger("GpsData", r, A.GPS())
                                }
                            }
                        }
                        if (p.quality) {
                            try {
                                w = q.toDataURL(n, p.quality / 100)
                            } catch (C) {
                                w = q.toDataURL(n)
                            }
                        }
                    } else {
                        w = q.toDataURL(n)
                    }
                    w = w.substring(w.indexOf("base64,") + 7);
                    w = atob(w);
                    if (y && y.headers && y.headers.length) {
                        w = y.restore(w);
                        y.purge()
                    }
                    q.parentNode.removeChild(q);
                    v({success:true, data:w})
                } else {
                    v({success:false})
                }
            };
            u.src = w
        })
    }

    j.runtimes.Html5 = j.addRuntime("html5", {getFeatures:function () {
        var s, o, r, q, p, n;
        o = r = p = n = false;
        if (h.XMLHttpRequest) {
            s = new XMLHttpRequest();
            r = !!s.upload;
            o = !!(s.sendAsBinary || s.upload)
        }
        if (o) {
            q = !!(s.sendAsBinary || (h.Uint8Array && h.ArrayBuffer));
            p = !!(File && (File.prototype.getAsDataURL || h.FileReader) && q);
            n = !!(File && (File.prototype.mozSlice || File.prototype.webkitSlice || File.prototype.slice))
        }
        g = j.ua.safari && j.ua.windows;
        return{html5:o, dragdrop:(function () {
            var t = k.createElement("div");
            return("draggable" in t) || ("ondragstart" in t && "ondrop" in t)
        }()), 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)}
    }, init:function (p, r) {
        var n, q;

        function o(w) {
            var u, t, v = [], x, s = {};
            for (t = 0; t < w.length; t++) {
                u = w[t];
                if (s[u.name]) {
                    continue
                }
                s[u.name] = true;
                x = j.guid();
                c[x] = u;
                v.push(new j.File(x, u.fileName || u.name, u.fileSize || u.size))
            }
            if (v.length) {
                p.trigger("FilesAdded", v)
            }
        }

        n = this.getFeatures();
        if (!n.html5) {
            r({success:false});
            return
        }
        p.bind("Init", function (w) {
            var G, F, C = [], v, D, t = w.settings.filters, u, B, s = k.body, E;
            G = k.createElement("div");
            G.id = w.id + "_html5_container";
            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});
            G.className = "plupload html5";
            if (p.settings.container) {
                s = k.getElementById(p.settings.container);
                if (j.getStyle(s, "position") === "static") {
                    s.style.position = "relative"
                }
            }
            s.appendChild(G);
            no_type_restriction:for (v = 0; v < t.length; v++) {
                u = t[v].extensions.split(/,/);
                for (D = 0; D < u.length; D++) {
                    if (u[D] === "*") {
                        C = [];
                        break no_type_restriction
                    }
                    B = j.mimeTypes[u[D]];
                    if (B && j.inArray(B, C) === -1) {
                        C.push(B)
                    }
                }
            }
            G.innerHTML = '<input id="' + p.id + '_html5"  style="font-size:999px" type="file" ' + (p.settings.multi_selection && p.features.multi_selection ? 'multiple="multiple"' : "") + " />";
            G.scrollTop = 100;
            E = k.getElementById(p.id + "_html5");
            if (w.features.triggerDialog) {
                j.extend(E.style, {position:"absolute", width:"100%", height:"100%"})
            } else {
                j.extend(E.style, {cssFloat:"right", styleFloat:"right"})
            }
            E.onchange = function () {
                o(this.files);
                this.value = ""
            };
            F = k.getElementById(w.settings.browse_button);
            if (F) {
                var z = w.settings.browse_button_hover, A = w.settings.browse_button_active, x = w.features.triggerDialog ? F : G;
                if (z) {
                    j.addEvent(x, "mouseover", function () {
                        j.addClass(F, z)
                    }, w.id);
                    j.addEvent(x, "mouseout", function () {
                        j.removeClass(F, z)
                    }, w.id)
                }
                if (A) {
                    j.addEvent(x, "mousedown", function () {
                        j.addClass(F, A)
                    }, w.id);
                    j.addEvent(k.body, "mouseup", function () {
                        j.removeClass(F, A)
                    }, w.id)
                }
                if (w.features.triggerDialog) {
                    j.addEvent(F, "click", function (H) {
                        var y = k.getElementById(w.id + "_html5");
                        if (y && !y.disabled) {
                            y.click()
                        }
                        H.preventDefault()
                    }, w.id)
                }
            }
        });
        p.bind("PostInit", function () {
            var s = k.getElementById(p.settings.drop_element);
            if (s) {
                if (g) {
                    j.addEvent(s, "dragenter", function (w) {
                        var v, t, u;
                        v = k.getElementById(p.id + "_drop");
                        if (!v) {
                            v = k.createElement("input");
                            v.setAttribute("type", "file");
                            v.setAttribute("id", p.id + "_drop");
                            v.setAttribute("multiple", "multiple");
                            j.addEvent(v, "change", function () {
                                o(this.files);
                                j.removeEvent(v, "change", p.id);
                                v.parentNode.removeChild(v)
                            }, p.id);
                            s.appendChild(v)
                        }
                        t = j.getPos(s, k.getElementById(p.settings.container));
                        u = j.getSize(s);
                        if (j.getStyle(s, "position") === "static") {
                            j.extend(s.style, {position:"relative"})
                        }
                        j.extend(v.style, {position:"absolute", display:"block", top:0, left:0, width:u.w + "px", height:u.h + "px", opacity:0})
                    }, p.id);
                    return
                }
                j.addEvent(s, "dragover", function (t) {
                    t.preventDefault()
                }, p.id);
                j.addEvent(s, "drop", function (u) {
                    var t = u.dataTransfer;
                    if (t && t.files) {
                        o(t.files)
                    }
                    u.preventDefault()
                }, p.id)
            }
        });
        p.bind("Refresh", function (s) {
            var t, u, v, x, w;
            t = k.getElementById(p.settings.browse_button);
            if (t) {
                u = j.getPos(t, k.getElementById(s.settings.container));
                v = j.getSize(t);
                x = k.getElementById(p.id + "_html5_container");
                j.extend(x.style, {top:u.y + "px", left:u.x + "px", width:v.w + "px", height:v.h + "px"});
                if (p.features.triggerDialog) {
                    if (j.getStyle(t, "position") === "static") {
                        j.extend(t.style, {position:"relative"})
                    }
                    w = parseInt(j.getStyle(t, "z-index"), 10);
                    if (isNaN(w)) {
                        w = 0
                    }
                    j.extend(t.style, {zIndex:w});
                    j.extend(x.style, {zIndex:w - 1})
                }
            }
        });
        p.bind("DisableBrowse", function (s, u) {
            var t = k.getElementById(s.id + "_html5");
            if (t) {
                t.disabled = u
            }
        });
        p.bind("CancelUpload", function () {
            if (q && q.abort) {
                q.abort()
            }
        });
        p.bind("UploadFile", function (s, u) {
            var v = s.settings, y, t;

            function x(A, D, z) {
                var B;
                if (File.prototype.slice) {
                    try {
                        A.slice();
                        return A.slice(D, z)
                    } catch (C) {
                        return A.slice(D, z - D)
                    }
                } else {
                    if (B = File.prototype.webkitSlice || File.prototype.mozSlice) {
                        return B.call(A, D, z)
                    } else {
                        return null
                    }
                }
            }

            function w(A) {
                var D = 0, C = 0, z = ("FileReader" in h) ? new FileReader : null;

                function B() {
                    var I, M, K, L, H, J, F, E = s.settings.url;

                    function G(V) {
                        var T = 0, N = "----pluploadboundary" + j.guid(), O, P = "--", U = "\r\n", R = "";
                        q = new XMLHttpRequest;
                        if (q.upload) {
                            q.upload.onprogress = function (W) {
                                u.loaded = Math.min(u.size, C + W.loaded - T);
                                s.trigger("UploadProgress", u)
                            }
                        }
                        q.onreadystatechange = function () {
                            var W, Y;
                            if (q.readyState == 4 && s.state !== j.STOPPED) {
                                try {
                                    W = q.status
                                } catch (X) {
                                    W = 0
                                }
                                if (W >= 400) {
                                    s.trigger("Error", {code:j.HTTP_ERROR, message:j.translate("HTTP Error."), file:u, status:W})
                                } else {
                                    if (K) {
                                        Y = {chunk:D, chunks:K, response:q.responseText, status:W};
                                        s.trigger("ChunkUploaded", u, Y);
                                        C += J;
                                        if (Y.cancelled) {
                                            u.status = j.FAILED;
                                            return
                                        }
                                        u.loaded = Math.min(u.size, (D + 1) * H)
                                    } else {
                                        u.loaded = u.size
                                    }
                                    s.trigger("UploadProgress", u);
                                    V = I = O = R = null;
                                    if (!K || ++D >= K) {
                                        u.status = j.DONE;
                                        s.trigger("FileUploaded", u, {response:q.responseText, status:W})
                                    } else {
                                        B()
                                    }
                                }
                            }
                        };
                        if (s.settings.multipart && n.multipart) {
                            L.name = u.target_name || u.name;
                            q.open("post", E, true);
                            j.each(s.settings.headers, function (X, W) {
                                q.setRequestHeader(W, X)
                            });
                            if (typeof(V) !== "string" && !!h.FormData) {
                                O = new FormData();
                                j.each(j.extend(L, s.settings.multipart_params), function (X, W) {
                                    O.append(W, X)
                                });
                                O.append(s.settings.file_data_name, V);
                                q.send(O);
                                return
                            }
                            if (typeof(V) === "string") {
                                q.setRequestHeader("Content-Type", "multipart/form-data; boundary=" + N);
                                j.each(j.extend(L, s.settings.multipart_params), function (X, W) {
                                    R += P + N + U + 'Content-Disposition: form-data; name="' + W + '"' + U + U;
                                    R += unescape(encodeURIComponent(X)) + U
                                });
                                F = j.mimeTypes[u.name.replace(/^.+\.([^.]+)/, "$1").toLowerCase()] || "application/octet-stream";
                                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;
                                T = R.length - V.length;
                                V = R;
                                if (q.sendAsBinary) {
                                    q.sendAsBinary(V)
                                } else {
                                    if (n.canSendBinary) {
                                        var S = new Uint8Array(V.length);
                                        for (var Q = 0; Q < V.length; Q++) {
                                            S[Q] = (V.charCodeAt(Q) & 255)
                                        }
                                        q.send(S.buffer)
                                    }
                                }
                                return
                            }
                        }
                        E = j.buildUrl(s.settings.url, j.extend(L, s.settings.multipart_params));
                        q.open("post", E, true);
                        q.setRequestHeader("Content-Type", "application/octet-stream");
                        j.each(s.settings.headers, function (X, W) {
                            q.setRequestHeader(W, X)
                        });
                        q.send(V)
                    }

                    if (u.status == j.DONE || u.status == j.FAILED || s.state == j.STOPPED) {
                        return
                    }
                    L = {name:u.target_name || u.name};
                    if (v.chunk_size && u.size > v.chunk_size && (n.chunks || typeof(A) == "string")) {
                        H = v.chunk_size;
                        K = Math.ceil(u.size / H);
                        J = Math.min(H, u.size - (D * H));
                        if (typeof(A) == "string") {
                            I = A.substring(D * H, D * H + J)
                        } else {
                            I = x(A, D * H, D * H + J)
                        }
                        L.chunk = D;
                        L.chunks = K
                    } else {
                        J = u.size;
                        I = A
                    }
                    if (s.settings.multipart && n.multipart && typeof(I) !== "string" && z && n.cantSendBlobInFormData && n.chunks && s.settings.chunk_size) {
                        z.onload = function () {
                            G(z.result)
                        };
                        z.readAsBinaryString(I)
                    } else {
                        G(I)
                    }
                }

                B()
            }

            y = c[u.id];
            if (n.jpgresize && s.settings.resize && /\.(png|jpg|jpeg)$/i.test(u.name)) {
                d.call(s, u, s.settings.resize, /\.png$/i.test(u.name) ? "image/png" : "image/jpeg", function (z) {
                    if (z.success) {
                        u.size = z.data.length;
                        w(z.data)
                    } else {
                        if (n.chunks) {
                            w(y)
                        } else {
                            l(y, w)
                        }
                    }
                })
            } else {
                if (!n.chunks && n.jpgresize) {
                    l(y, w)
                } else {
                    w(y)
                }
            }
        });
        p.bind("Destroy", function (s) {
            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};
            for (u in w) {
                v = k.getElementById(w[u]);
                if (v) {
                    j.removeAllEvents(v, s.id)
                }
            }
            j.removeAllEvents(k.body, s.id);
            if (s.settings.container) {
                t = k.getElementById(s.settings.container)
            }
            t.removeChild(k.getElementById(w.inputContainer))
        });
        r({success:true})
    }});
    function b() {
        var q = false, o;

        function r(t, v) {
            var s = q ? 0 : -8 * (v - 1), w = 0, u;
            for (u = 0; u < v; u++) {
                w |= (o.charCodeAt(t + u) << Math.abs(s + u * 8))
            }
            return w
        }

        function n(u, s, t) {
            var t = arguments.length === 3 ? t : o.length - s - 1;
            o = o.substr(0, s) + u + o.substr(t + s)
        }

        function p(t, u, w) {
            var x = "", s = q ? 0 : -8 * (w - 1), v;
            for (v = 0; v < w; v++) {
                x += String.fromCharCode((u >> Math.abs(s + v * 8)) & 255)
            }
            n(x, t, w)
        }

        return{II:function (s) {
            if (s === e) {
                return q
            } else {
                q = s
            }
        }, init:function (s) {
            q = false;
            o = s
        }, SEGMENT:function (s, u, t) {
            switch (arguments.length) {
                case 1:
                    return o.substr(s, o.length - s - 1);
                case 2:
                    return o.substr(s, u);
                case 3:
                    n(t, s, u);
                    break;
                default:
                    return o
            }
        }, BYTE:function (s) {
            return r(s, 1)
        }, SHORT:function (s) {
            return r(s, 2)
        }, LONG:function (s, t) {
            if (t === e) {
                return r(s, 4)
            } else {
                p(s, t, 4)
            }
        }, SLONG:function (s) {
            var t = r(s, 4);
            return(t > 2147483647 ? t - 4294967296 : t)
        }, STRING:function (s, t) {
            var u = "";
            for (t += s; s < t; s++) {
                u += String.fromCharCode(r(s, 1))
            }
            return u
        }}
    }

    function f(s) {
        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;
        r = new b();
        r.init(s);
        if (r.SHORT(0) !== 65496) {
            return
        }
        n = 2;
        o = Math.min(1048576, s.length);
        while (n <= o) {
            p = r.SHORT(n);
            if (p >= 65488 && p <= 65495) {
                n += 2;
                continue
            }
            if (p === 65498 || p === 65497) {
                break
            }
            q = r.SHORT(n + 2) + 2;
            if (u[p] && r.STRING(n + 4, u[p].signature.length) === u[p].signature) {
                t.push({hex:p, app:u[p].app.toUpperCase(), name:u[p].name.toUpperCase(), start:n, length:q, segment:r.SEGMENT(n, q)})
            }
            n += q
        }
        r.init(null);
        return{headers:t, restore:function (y) {
            r.init(y);
            var w = new f(y);
            if (!w.headers) {
                return false
            }
            for (var x = w.headers.length; x > 0; x--) {
                var z = w.headers[x - 1];
                r.SEGMENT(z.start, z.length, "")
            }
            w.purge();
            n = r.SHORT(2) == 65504 ? 4 + r.SHORT(4) : 2;
            for (var x = 0, v = t.length; x < v; x++) {
                r.SEGMENT(n, 0, t[x].segment);
                n += t[x].length
            }
            return r.SEGMENT()
        }, get:function (x) {
            var y = [];
            for (var w = 0, v = t.length; w < v; w++) {
                if (t[w].app === x.toUpperCase()) {
                    y.push(t[w].segment)
                }
            }
            return y
        }, set:function (y, x) {
            var z = [];
            if (typeof(x) === "string") {
                z.push(x)
            } else {
                z = x
            }
            for (var w = ii = 0, v = t.length; w < v; w++) {
                if (t[w].app === y.toUpperCase()) {
                    t[w].segment = z[ii];
                    t[w].length = z[ii].length;
                    ii++
                }
                if (ii >= z.length) {
                    break
                }
            }
        }, purge:function () {
            t = [];
            r.init(null)
        }}
    }

    function a() {
        var q, n, o = {}, t;
        q = new b();
        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"}};
        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"}};
        function p(u, C) {
            var w = q.SHORT(u), z, F, G, B, A, v, x, D, E = [], y = {};
            for (z = 0; z < w; z++) {
                x = v = u + 12 * z + 2;
                G = C[q.SHORT(x)];
                if (G === e) {
                    continue
                }
                B = q.SHORT(x += 2);
                A = q.LONG(x += 2);
                x += 4;
                E = [];
                switch (B) {
                    case 1:
                    case 7:
                        if (A > 4) {
                            x = q.LONG(x) + o.tiffHeader
                        }
                        for (F = 0; F < A; F++) {
                            E[F] = q.BYTE(x + F)
                        }
                        break;
                    case 2:
                        if (A > 4) {
                            x = q.LONG(x) + o.tiffHeader
                        }
                        y[G] = q.STRING(x, A - 1);
                        continue;
                    case 3:
                        if (A > 2) {
                            x = q.LONG(x) + o.tiffHeader
                        }
                        for (F = 0; F < A; F++) {
                            E[F] = q.SHORT(x + F * 2)
                        }
                        break;
                    case 4:
                        if (A > 1) {
                            x = q.LONG(x) + o.tiffHeader
                        }
                        for (F = 0; F < A; F++) {
                            E[F] = q.LONG(x + F * 4)
                        }
                        break;
                    case 5:
                        x = q.LONG(x) + o.tiffHeader;
                        for (F = 0; F < A; F++) {
                            E[F] = q.LONG(x + F * 4) / q.LONG(x + F * 4 + 4)
                        }
                        break;
                    case 9:
                        x = q.LONG(x) + o.tiffHeader;
                        for (F = 0; F < A; F++) {
                            E[F] = q.SLONG(x + F * 4)
                        }
                        break;
                    case 10:
                        x = q.LONG(x) + o.tiffHeader;
                        for (F = 0; F < A; F++) {
                            E[F] = q.SLONG(x + F * 4) / q.SLONG(x + F * 4 + 4)
                        }
                        break;
                    default:
                        continue
                }
                D = (A == 1 ? E[0] : E);
                if (t.hasOwnProperty(G) && typeof D != "object") {
                    y[G] = t[G][D]
                } else {
                    y[G] = D
                }
            }
            return y
        }

        function s() {
            var v = e, u = o.tiffHeader;
            q.II(q.SHORT(u) == 18761);
            if (q.SHORT(u += 2) !== 42) {
                return false
            }
            o.IFD0 = o.tiffHeader + q.LONG(u += 2);
            v = p(o.IFD0, n.tiff);
            o.exifIFD = ("ExifIFDPointer" in v ? o.tiffHeader + v.ExifIFDPointer : e);
            o.gpsIFD = ("GPSInfoIFDPointer" in v ? o.tiffHeader + v.GPSInfoIFDPointer : e);
            return true
        }

        function r(w, u, z) {
            var B, y, x, A = 0;
            if (typeof(u) === "string") {
                var v = n[w.toLowerCase()];
                for (hex in v) {
                    if (v[hex] === u) {
                        u = hex;
                        break
                    }
                }
            }
            B = o[w.toLowerCase() + "IFD"];
            y = q.SHORT(B);
            for (i = 0; i < y; i++) {
                x = B + 12 * i + 2;
                if (q.SHORT(x) == u) {
                    A = x + 8;
                    break
                }
            }
            if (!A) {
                return false
            }
            q.LONG(A, z);
            return true
        }

        return{init:function (u) {
            o = {tiffHeader:10};
            if (u === e || !u.length) {
                return false
            }
            q.init(u);
            if (q.SHORT(0) === 65505 && q.STRING(4, 5).toUpperCase() === "EXIF\0") {
                return s()
            }
            return false
        }, EXIF:function () {
            var v;
            v = p(o.exifIFD, n.exif);
            if (v.ExifVersion && j.typeOf(v.ExifVersion) === "array") {
                for (var w = 0, u = ""; w < v.ExifVersion.length; w++) {
                    u += String.fromCharCode(v.ExifVersion[w])
                }
                v.ExifVersion = u
            }
            return v
        }, GPS:function () {
            var u;
            u = p(o.gpsIFD, n.gps);
            if (u.GPSVersionID) {
                u.GPSVersionID = u.GPSVersionID.join(".")
            }
            return u
        }, setExif:function (u, v) {
            if (u !== "PixelXDimension" && u !== "PixelYDimension") {
                return false
            }
            return r("exif", u, v)
        }, getBinary:function () {
            return q.SEGMENT()
        }}
    }
})(window, document, plupload);