image editing dialog
authorleon <leon@roojs.com>
Mon, 27 Jun 2022 02:50:54 +0000 (10:50 +0800)
committerleon <leon@roojs.com>
Mon, 27 Jun 2022 02:50:54 +0000 (10:50 +0800)
12 files changed:
-core.js roojs-ui.js > roojs-all.js [new file with mode: 0644]
Roo/Component.js
Roo/dialog/UploadCropbox.js
Roo/dialog/namespace.js [new file with mode: 0644]
Roo/util/Observable.js
buildSDK/dependancy_ui.txt
examples/dialog/test-2.js
examples/dialog/test.html
roojs-all.js
roojs-debug.js
roojs-ui-debug.js
roojs-ui.js

diff --git a/-core.js roojs-ui.js > roojs-all.js b/-core.js roojs-ui.js > roojs-all.js
new file mode 100644 (file)
index 0000000..e07924d
--- /dev/null
@@ -0,0 +1,6983 @@
+\e[1mdiff --git a/Roo/ContentPanel.js b/Roo/ContentPanel.js\e[m
+\e[1mindex 0984532b54..cc1b9d0ce5 100644\e[m
+\e[1m--- a/Roo/ContentPanel.js\e[m
+\e[1m+++ b/Roo/ContentPanel.js\e[m
+\e[36m@@ -41,7 +41,6 @@\e[m
+  */\e[m
+ Roo.ContentPanel = function(el, config, content){\e[m
+     \e[m
+\e[31m-     \e[m
+     /*\e[m
+     if(el.autoCreate || el.xtype){ // xtype is available if this is called from factory\e[m
+         config = el;\e[m
+\e[36m@@ -425,6 +424,14 @@\e[m \e[mlayout.addxtype({\e[m
+      */\e[m
+     \e[m
+     addxtype : function(cfg) {\e[m
+\e[32m+\e[m\e[32m        if(cfg.xtype.match(/^UploadCropbox$/)) {\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m            this.cropbox = new Roo.factory(cfg);\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m            this.cropbox.render(this.el);\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m            return this.cropbox;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+         // add form..\e[m
+         if (cfg.xtype.match(/^Form$/)) {\e[m
+             \e[m
+\e[1mdiff --git a/Roo/dialog/UploadCropbox.js b/Roo/dialog/UploadCropbox.js\e[m
+\e[1mnew file mode 100644\e[m
+\e[1mindex 0000000000..8cf986b2e5\e[m
+\e[1m--- /dev/null\e[m
+\e[1m+++ b/Roo/dialog/UploadCropbox.js\e[m
+\e[36m@@ -0,0 +1,1791 @@\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m/*\e[m
+\e[32m+\e[m\e[32m* Licence: LGPL\e[m
+\e[32m+\e[m\e[32m*/\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m/**\e[m
+\e[32m+\e[m\e[32m * @class Roo.dialog.UploadCropbox\e[m
+\e[32m+\e[m\e[32m * @extends Roo.BoxComponent\e[m
+\e[32m+\e[m\e[32m * Dialog UploadCropbox class\e[m
+\e[32m+\e[m\e[32m * @cfg {String} emptyText show when image has been loaded\e[m
+\e[32m+\e[m\e[32m * @cfg {String} rotateNotify show when image too small to rotate\e[m
+\e[32m+\e[m\e[32m * @cfg {Number} errorTimeout default 3000\e[m
+\e[32m+\e[m\e[32m * @cfg {Number} minWidth default 300\e[m
+\e[32m+\e[m\e[32m * @cfg {Number} minHeight default 300\e[m
+\e[32m+\e[m\e[32m * @cfg {Array} buttons default ['rotateLeft', 'pictureBtn', 'rotateRight']\e[m
+\e[32m+\e[m\e[32m * @cfg {Boolean} isDocument (true|false) default false\e[m
+\e[32m+\e[m\e[32m * @cfg {String} url action url\e[m
+\e[32m+\e[m\e[32m * @cfg {String} paramName default 'imageUpload'\e[m
+\e[32m+\e[m\e[32m * @cfg {String} method default POST\e[m
+\e[32m+\e[m\e[32m * @cfg {Boolean} loadMask (true|false) default true\e[m
+\e[32m+\e[m\e[32m * @cfg {Boolean} loadingText default 'Loading...'\e[m
+\e[32m+\e[m\e[32m *\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m * @constructor\e[m
+\e[32m+\e[m\e[32m * Create a new UploadCropbox\e[m
+\e[32m+\e[m\e[32m * @param {Object} config The config object\e[m
+\e[32m+\e[m\e[32m */\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m Roo.dialog.UploadCropbox = function(config){\e[m
+\e[32m+\e[m\e[32m    Roo.dialog.UploadCropbox.superclass.constructor.call(this, config);\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    this.addEvents({\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event beforeselectfile\e[m
+\e[32m+\e[m\e[32m         * Fire before select file\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "beforeselectfile" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event initial\e[m
+\e[32m+\e[m\e[32m         * Fire after initEvent\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "initial" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event crop\e[m
+\e[32m+\e[m\e[32m         * Fire after initEvent\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         * @param {String} data\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "crop" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event prepare\e[m
+\e[32m+\e[m\e[32m         * Fire when preparing the file data\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         * @param {Object} file\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "prepare" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event exception\e[m
+\e[32m+\e[m\e[32m         * Fire when get exception\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         * @param {XMLHttpRequest} xhr\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "exception" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event beforeloadcanvas\e[m
+\e[32m+\e[m\e[32m         * Fire before load the canvas\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         * @param {String} src\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "beforeloadcanvas" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event trash\e[m
+\e[32m+\e[m\e[32m         * Fire when trash image\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "trash" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event download\e[m
+\e[32m+\e[m\e[32m         * Fire when download the image\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "download" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event footerbuttonclick\e[m
+\e[32m+\e[m\e[32m         * Fire when footerbuttonclick\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         * @param {String} type\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "footerbuttonclick" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event resize\e[m
+\e[32m+\e[m\e[32m         * Fire when resize\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "resize" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event rotate\e[m
+\e[32m+\e[m\e[32m         * Fire when rotate the image\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         * @param {String} pos\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "rotate" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event inspect\e[m
+\e[32m+\e[m\e[32m         * Fire when inspect the file\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         * @param {Object} file\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "inspect" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event upload\e[m
+\e[32m+\e[m\e[32m         * Fire when xhr upload the file\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         * @param {Object} data\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "upload" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event arrange\e[m
+\e[32m+\e[m\e[32m         * Fire when arrange the file data\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         * @param {Object} formData\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "arrange" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event loadcanvas\e[m
+\e[32m+\e[m\e[32m         * Fire after load the canvas\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox}\e[m
+\e[32m+\e[m\e[32m         * @param {Object} imgEl\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "loadcanvas" : true\e[m
+\e[32m+\e[m\e[32m    });\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    this.buttons = this.buttons || Roo.dialog.UploadCropbox.footer.STANDARD;\e[m
+\e[32m+\e[m\e[32m};\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32mRoo.extend(Roo.dialog.UploadCropbox, Roo.Component,  {\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    emptyText : 'Click to upload image',\e[m
+\e[32m+\e[m\e[32m    rotateNotify : 'Image is too small to rotate',\e[m
+\e[32m+\e[m\e[32m    errorTimeout : 3000,\e[m
+\e[32m+\e[m\e[32m    scale : 0,\e[m
+\e[32m+\e[m\e[32m    baseScale : 1,\e[m
+\e[32m+\e[m\e[32m    rotate : 0,\e[m
+\e[32m+\e[m\e[32m    dragable : false,\e[m
+\e[32m+\e[m\e[32m    pinching : false,\e[m
+\e[32m+\e[m\e[32m    mouseX : 0,\e[m
+\e[32m+\e[m\e[32m    mouseY : 0,\e[m
+\e[32m+\e[m\e[32m    cropData : false,\e[m
+\e[32m+\e[m\e[32m    minWidth : 300,\e[m
+\e[32m+\e[m\e[32m    minHeight : 300,\e[m
+\e[32m+\e[m\e[32m    file : false,\e[m
+\e[32m+\e[m\e[32m    exif : {},\e[m
+\e[32m+\e[m\e[32m    baseRotate : 1,\e[m
+\e[32m+\e[m\e[32m    cropType : 'image/jpeg',\e[m
+\e[32m+\e[m\e[32m    buttons : false,\e[m
+\e[32m+\e[m\e[32m    canvasLoaded : false,\e[m
+\e[32m+\e[m\e[32m    isDocument : false,\e[m
+\e[32m+\e[m\e[32m    method : 'POST',\e[m
+\e[32m+\e[m\e[32m    paramName : 'imageUpload',\e[m
+\e[32m+\e[m\e[32m    loadMask : true,\e[m
+\e[32m+\e[m\e[32m    loadingText : 'Loading...',\e[m
+\e[32m+\e[m\e[32m    maskEl : false,\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    getAutoCreate : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var cfg = {\e[m
+\e[32m+\e[m\e[32m            tag : 'div',\e[m
+\e[32m+\e[m\e[32m            cls : 'roo-upload-cropbox',\e[m
+\e[32m+\e[m\e[32m            cn : [\e[m
+\e[32m+\e[m\e[32m                {\e[m
+\e[32m+\e[m\e[32m                    tag : 'input',\e[m
+\e[32m+\e[m\e[32m                    cls : 'roo-upload-cropbox-selector',\e[m
+\e[32m+\e[m\e[32m                    type : 'file'\e[m
+\e[32m+\e[m\e[32m                },\e[m
+\e[32m+\e[m\e[32m                {\e[m
+\e[32m+\e[m\e[32m                    tag : 'div',\e[m
+\e[32m+\e[m\e[32m                    cls : 'roo-upload-cropbox-body',\e[m
+\e[32m+\e[m\e[32m                    style : 'cursor:pointer',\e[m
+\e[32m+\e[m\e[32m                    cn : [\e[m
+\e[32m+\e[m\e[32m                        {\e[m
+\e[32m+\e[m\e[32m                            tag : 'div',\e[m
+\e[32m+\e[m\e[32m                            cls : 'roo-upload-cropbox-preview'\e[m
+\e[32m+\e[m\e[32m                        },\e[m
+\e[32m+\e[m\e[32m                        {\e[m
+\e[32m+\e[m\e[32m                            tag : 'div',\e[m
+\e[32m+\e[m\e[32m                            cls : 'roo-upload-cropbox-thumb'\e[m
+\e[32m+\e[m\e[32m                        },\e[m
+\e[32m+\e[m\e[32m                        {\e[m
+\e[32m+\e[m\e[32m                            tag : 'div',\e[m
+\e[32m+\e[m\e[32m                            cls : 'roo-upload-cropbox-empty-notify',\e[m
+\e[32m+\e[m\e[32m                            html : this.emptyText\e[m
+\e[32m+\e[m\e[32m                        },\e[m
+\e[32m+\e[m\e[32m                        {\e[m
+\e[32m+\e[m\e[32m                            tag : 'div',\e[m
+\e[32m+\e[m\e[32m                            cls : 'roo-upload-cropbox-error-notify alert alert-danger',\e[m
+\e[32m+\e[m\e[32m                            html : this.rotateNotify\e[m
+\e[32m+\e[m\e[32m                        }\e[m
+\e[32m+\e[m\e[32m                    ]\e[m
+\e[32m+\e[m\e[32m                },\e[m
+\e[32m+\e[m\e[32m                {\e[m
+\e[32m+\e[m\e[32m                    tag : 'div',\e[m
+\e[32m+\e[m\e[32m                    cls : 'roo-upload-cropbox-footer',\e[m
+\e[32m+\e[m\e[32m                    cn : {\e[m
+\e[32m+\e[m\e[32m                        tag : 'div',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn-group btn-group-justified roo-upload-cropbox-btn-group',\e[m
+\e[32m+\e[m\e[32m                        cn : []\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[32m            ]\e[m
+\e[32m+\e[m\e[32m        };\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        return cfg;\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onRender : function(ct, position)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        console.log("On Render");\e[m
+\e[32m+\e[m\e[32m        console.log(this);\e[m
+\e[32m+\e[m\e[32m        Roo.dialog.UploadCropbox.superclass.onRender.call(this, ct, position);\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        if(this.el){\e[m
+\e[32m+\e[m\e[32m            if (this.el.attr('xtype')) {\e[m
+\e[32m+\e[m\e[32m                this.el.attr('xtypex', this.el.attr('xtype'));\e[m
+\e[32m+\e[m\e[32m                this.el.dom.removeAttribute('xtype');\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.initEvents();\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        else {\e[m
+\e[32m+\e[m\e[32m            var cfg = Roo.apply({},  this.getAutoCreate());\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m            cfg.id = this.id || Roo.id();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            if (this.cls) {\e[m
+\e[32m+\e[m\e[32m                cfg.cls = (typeof(cfg.cls) == 'undefined' ? this.cls : cfg.cls) + ' ' + this.cls;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            if (this.style) { // fixme needs to support more complex style data.\e[m
+\e[32m+\e[m\e[32m                cfg.style = (typeof(cfg.style) == 'undefined' ? this.style : cfg.style) + '; ' + this.style;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.el = ct.createChild(cfg, position);\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.initEvents();\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if (this.buttons.length) {\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            Roo.each(this.buttons, function(bb) {\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var btn = this.el.select('.roo-upload-cropbox-footer div.roo-upload-cropbox-btn-group').first().createChild(bb);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                btn.on('click', this.onFooterButtonClick.createDelegate(this, [bb.action], true));\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m            }, this);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.loadMask){\e[m
+\e[32m+\e[m\e[32m            this.maskEl = this.el;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    initEvents : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        this.urlAPI = (window.createObjectURL && window) ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                                (window.URL && URL.revokeObjectURL && URL) ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                                (window.webkitURL && webkitURL);\e[m
+\e[32m+\e[m\e[41m                        \e[m
+\e[32m+\e[m\e[32m        this.bodyEl = this.el.select('.roo-upload-cropbox-body', true).first();\e[m
+\e[32m+\e[m\e[32m        this.bodyEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay = 'block';\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.selectorEl = this.el.select('.roo-upload-cropbox-selector', true).first();\e[m
+\e[32m+\e[m\e[32m        this.selectorEl.hide();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.previewEl = this.el.select('.roo-upload-cropbox-preview', true).first();\e[m
+\e[32m+\e[m\e[32m        this.previewEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay = 'block';\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.thumbEl = this.el.select('.roo-upload-cropbox-thumb', true).first();\e[m
+\e[32m+\e[m\e[32m        this.thumbEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay = 'block';\e[m
+\e[32m+\e[m\e[32m        this.thumbEl.hide();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.notifyEl = this.el.select('.roo-upload-cropbox-empty-notify', true).first();\e[m
+\e[32m+\e[m\e[32m        this.notifyEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay = 'block';\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.errorEl = this.el.select('.roo-upload-cropbox-error-notify', true).first();\e[m
+\e[32m+\e[m\e[32m        this.errorEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay = 'block';\e[m
+\e[32m+\e[m\e[32m        this.errorEl.hide();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.footerEl = this.el.select('.roo-upload-cropbox-footer', true).first();\e[m
+\e[32m+\e[m\e[32m        this.footerEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay = 'block';\e[m
+\e[32m+\e[m\e[32m        this.footerEl.hide();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.setThumbBoxSize();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.bind();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.resize();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.fireEvent('initial', this);\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m    bind : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var _this = this;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        window.addEventListener("resize", function() { _this.resize(); } );\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.bodyEl.on('click', this.beforeSelectFile, this);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(Roo.isTouch){\e[m
+\e[32m+\e[m\e[32m            this.bodyEl.on('touchstart', this.onTouchStart, this);\e[m
+\e[32m+\e[m\e[32m            this.bodyEl.on('touchmove', this.onTouchMove, this);\e[m
+\e[32m+\e[m\e[32m            this.bodyEl.on('touchend', this.onTouchEnd, this);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(!Roo.isTouch){\e[m
+\e[32m+\e[m\e[32m            this.bodyEl.on('mousedown', this.onMouseDown, this);\e[m
+\e[32m+\e[m\e[32m            this.bodyEl.on('mousemove', this.onMouseMove, this);\e[m
+\e[32m+\e[m\e[32m            var mousewheel = (/Firefox/i.test(navigator.userAgent))? 'DOMMouseScroll' : 'mousewheel';\e[m
+\e[32m+\e[m\e[32m            this.bodyEl.on(mousewheel, this.onMouseWheel, this);\e[m
+\e[32m+\e[m\e[32m            Roo.get(document).on('mouseup', this.onMouseUp, this);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.selectorEl.on('change', this.onFileSelected, this);\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    reset : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m        this.scale = 0;\e[m
+\e[32m+\e[m\e[32m        this.baseScale = 1;\e[m
+\e[32m+\e[m\e[32m        this.rotate = 0;\e[m
+\e[32m+\e[m\e[32m        this.baseRotate = 1;\e[m
+\e[32m+\e[m\e[32m        this.dragable = false;\e[m
+\e[32m+\e[m\e[32m        this.pinching = false;\e[m
+\e[32m+\e[m\e[32m        this.mouseX = 0;\e[m
+\e[32m+\e[m\e[32m        this.mouseY = 0;\e[m
+\e[32m+\e[m\e[32m        this.cropData = false;\e[m
+\e[32m+\e[m\e[32m        this.notifyEl.dom.innerHTML = this.emptyText;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        // this.selectorEl.dom.value = '';\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    resize : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        if(this.fireEvent('resize', this) != false){\e[m
+\e[32m+\e[m\e[32m            this.setThumbBoxPosition();\e[m
+\e[32m+\e[m\e[32m            this.setCanvasPosition();\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onFooterButtonClick : function(e, el, o, type)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        switch (type) {\e[m
+\e[32m+\e[m\e[32m            case 'rotate-left' :\e[m
+\e[32m+\e[m\e[32m                this.onRotateLeft(e);\e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 'rotate-right' :\e[m
+\e[32m+\e[m\e[32m                this.onRotateRight(e);\e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 'picture' :\e[m
+\e[32m+\e[m\e[32m                this.beforeSelectFile(e);\e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 'trash' :\e[m
+\e[32m+\e[m\e[32m                this.trash(e);\e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 'crop' :\e[m
+\e[32m+\e[m\e[32m                this.crop(e);\e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 'download' :\e[m
+\e[32m+\e[m\e[32m                this.download(e);\e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            default :\e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.fireEvent('footerbuttonclick', this, type);\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    beforeSelectFile : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        e.preventDefault();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.fireEvent('beforeselectfile', this) != false){\e[m
+\e[32m+\e[m\e[32m            this.selectorEl.dom.click();\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onFileSelected : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        e.preventDefault();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(typeof(this.selectorEl.dom.files) == 'undefined' || !this.selectorEl.dom.files.length){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var file = this.selectorEl.dom.files[0];\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.fireEvent('inspect', this, file) != false){\e[m
+\e[32m+\e[m\e[32m            this.prepare(file);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    trash : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        this.fireEvent('trash', this);\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    download : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        this.fireEvent('download', this);\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    loadCanvas : function(src)\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m        if(this.fireEvent('beforeloadcanvas', this, src) != false){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.reset();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.imageEl = document.createElement('img');\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            var _this = this;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.imageEl.addEventListener("load", function(){ _this.onLoadCanvas(); });\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.imageEl.src = src;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onLoadCanvas : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m        this.imageEl.OriginWidth = this.imageEl.naturalWidth || this.imageEl.width;\e[m
+\e[32m+\e[m\e[32m        this.imageEl.OriginHeight = this.imageEl.naturalHeight || this.imageEl.height;\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        if(this.fireEvent('loadcanvas', this, this.imageEl) != false){\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m            this.bodyEl.un('click', this.beforeSelectFile, this);\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.notifyEl.hide();\e[m
+\e[32m+\e[m\e[32m            this.thumbEl.show();\e[m
+\e[32m+\e[m\e[32m            this.footerEl.show();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.baseRotateLevel();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            if(this.isDocument){\e[m
+\e[32m+\e[m\e[32m                this.setThumbBoxSize();\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.setThumbBoxPosition();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.baseScaleLevel();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.draw();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.resize();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.canvasLoaded = true;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.loadMask){\e[m
+\e[32m+\e[m\e[32m            this.maskEl.unmask();\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    setCanvasPosition : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m        if(!this.canvasEl){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var pw = Math.ceil((this.bodyEl.getWidth() - this.canvasEl.width) / 2);\e[m
+\e[32m+\e[m\e[32m        var ph = Math.ceil((this.bodyEl.getHeight() - this.canvasEl.height) / 2);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.previewEl.setLeft(pw);\e[m
+\e[32m+\e[m\e[32m        this.previewEl.setTop(ph);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onMouseDown : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m        e.stopEvent();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.dragable = true;\e[m
+\e[32m+\e[m\e[32m        this.pinching = false;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.isDocument && (this.canvasEl.width < this.thumbEl.getWidth() || this.canvasEl.height < this.thumbEl.getHeight())){\e[m
+\e[32m+\e[m\e[32m            this.dragable = false;\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.mouseX = Roo.isTouch ? e.browserEvent.touches[0].pageX : e.getPageX();\e[m
+\e[32m+\e[m\e[32m        this.mouseY = Roo.isTouch ? e.browserEvent.touches[0].pageY : e.getPageY();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onMouseMove : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m        e.stopEvent();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(!this.canvasLoaded){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if (!this.dragable){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var minX = Math.ceil(this.thumbEl.getLeft(true));\e[m
+\e[32m+\e[m\e[32m        var minY = Math.ceil(this.thumbEl.getTop(true));\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var maxX = Math.ceil(minX + this.thumbEl.getWidth() - this.canvasEl.width);\e[m
+\e[32m+\e[m\e[32m        var maxY = Math.ceil(minY + this.thumbEl.getHeight() - this.canvasEl.height);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var x = Roo.isTouch ? e.browserEvent.touches[0].pageX : e.getPageX();\e[m
+\e[32m+\e[m\e[32m        var y = Roo.isTouch ? e.browserEvent.touches[0].pageY : e.getPageY();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        x = x - this.mouseX;\e[m
+\e[32m+\e[m\e[32m        y = y - this.mouseY;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var bgX = Math.ceil(x + this.previewEl.getLeft(true));\e[m
+\e[32m+\e[m\e[32m        var bgY = Math.ceil(y + this.previewEl.getTop(true));\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        bgX = (minX < bgX) ? minX : ((maxX > bgX) ? maxX : bgX);\e[m
+\e[32m+\e[m\e[32m        bgY = (minY < bgY) ? minY : ((maxY > bgY) ? maxY : bgY);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.previewEl.setLeft(bgX);\e[m
+\e[32m+\e[m\e[32m        this.previewEl.setTop(bgY);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.mouseX = Roo.isTouch ? e.browserEvent.touches[0].pageX : e.getPageX();\e[m
+\e[32m+\e[m\e[32m        this.mouseY = Roo.isTouch ? e.browserEvent.touches[0].pageY : e.getPageY();\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onMouseUp : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m        e.stopEvent();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.dragable = false;\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onMouseWheel : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m        e.stopEvent();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.startScale = this.scale;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.scale = (e.getWheelDelta() == 1) ? (this.scale + 1) : (this.scale - 1);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(!this.zoomable()){\e[m
+\e[32m+\e[m\e[32m            this.scale = this.startScale;\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.draw();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        return;\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    zoomable : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var minScale = this.thumbEl.getWidth() / this.minWidth;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.minWidth < this.minHeight){\e[m
+\e[32m+\e[m\e[32m            minScale = this.thumbEl.getHeight() / this.minHeight;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var width = Math.ceil(this.imageEl.OriginWidth * this.getScaleLevel() / minScale);\e[m
+\e[32m+\e[m\e[32m        var height = Math.ceil(this.imageEl.OriginHeight * this.getScaleLevel() / minScale);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(\e[m
+\e[32m+\e[m\e[32m                this.isDocument &&\e[m
+\e[32m+\e[m\e[32m                (this.rotate == 0 || this.rotate == 180) &&\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                (\e[m
+\e[32m+\e[m\e[32m                    width > this.imageEl.OriginWidth ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                    height > this.imageEl.OriginHeight ||\e[m
+\e[32m+\e[m\e[32m                    (width < this.minWidth && height < this.minHeight)\e[m
+\e[32m+\e[m\e[32m                )\e[m
+\e[32m+\e[m\e[32m        ){\e[m
+\e[32m+\e[m\e[32m            return false;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(\e[m
+\e[32m+\e[m\e[32m                this.isDocument &&\e[m
+\e[32m+\e[m\e[32m                (this.rotate == 90 || this.rotate == 270) &&\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                (\e[m
+\e[32m+\e[m\e[32m                    width > this.imageEl.OriginWidth ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                    height > this.imageEl.OriginHeight ||\e[m
+\e[32m+\e[m\e[32m                    (width < this.minHeight && height < this.minWidth)\e[m
+\e[32m+\e[m\e[32m                )\e[m
+\e[32m+\e[m\e[32m        ){\e[m
+\e[32m+\e[m\e[32m            return false;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(\e[m
+\e[32m+\e[m\e[32m                !this.isDocument &&\e[m
+\e[32m+\e[m\e[32m                (this.rotate == 0 || this.rotate == 180) &&\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                (\e[m
+\e[32m+\e[m\e[32m                    width < this.minWidth ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                    width > this.imageEl.OriginWidth ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                    height < this.minHeight ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                    height > this.imageEl.OriginHeight\e[m
+\e[32m+\e[m\e[32m                )\e[m
+\e[32m+\e[m\e[32m        ){\e[m
+\e[32m+\e[m\e[32m            return false;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(\e[m
+\e[32m+\e[m\e[32m                !this.isDocument &&\e[m
+\e[32m+\e[m\e[32m                (this.rotate == 90 || this.rotate == 270) &&\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                (\e[m
+\e[32m+\e[m\e[32m                    width < this.minHeight ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                    width > this.imageEl.OriginWidth ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                    height < this.minWidth ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                    height > this.imageEl.OriginHeight\e[m
+\e[32m+\e[m\e[32m                )\e[m
+\e[32m+\e[m\e[32m        ){\e[m
+\e[32m+\e[m\e[32m            return false;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        return true;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onRotateLeft : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m        if(!this.isDocument && (this.canvasEl.height < this.thumbEl.getWidth() || this.canvasEl.width < this.thumbEl.getHeight())){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            var minScale = this.thumbEl.getWidth() / this.minWidth;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            var bw = Math.ceil(this.canvasEl.width / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m            var bh = Math.ceil(this.canvasEl.height / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.startScale = this.scale;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            while (this.getScaleLevel() < minScale){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m                this.scale = this.scale + 1;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(!this.zoomable()){\e[m
+\e[32m+\e[m\e[32m                    break;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(\e[m
+\e[32m+\e[m\e[32m                        Math.ceil(bw * this.getScaleLevel()) < this.thumbEl.getHeight() ||\e[m
+\e[32m+\e[m\e[32m                        Math.ceil(bh * this.getScaleLevel()) < this.thumbEl.getWidth()\e[m
+\e[32m+\e[m\e[32m                ){\e[m
+\e[32m+\e[m\e[32m                    continue;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.rotate = (this.rotate < 90) ? 270 : this.rotate - 90;\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                this.draw();\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                return;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.scale = this.startScale;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.onRotateFail();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            return false;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.rotate = (this.rotate < 90) ? 270 : this.rotate - 90;\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        if(this.isDocument){\e[m
+\e[32m+\e[m\e[32m            this.setThumbBoxSize();\e[m
+\e[32m+\e[m\e[32m            this.setThumbBoxPosition();\e[m
+\e[32m+\e[m\e[32m            this.setCanvasPosition();\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.draw();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.fireEvent('rotate', this, 'left');\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onRotateRight : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        if(!this.isDocument && (this.canvasEl.height < this.thumbEl.getWidth() || this.canvasEl.width < this.thumbEl.getHeight())){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            var minScale = this.thumbEl.getWidth() / this.minWidth;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m            var bw = Math.ceil(this.canvasEl.width / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m            var bh = Math.ceil(this.canvasEl.height / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.startScale = this.scale;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            while (this.getScaleLevel() < minScale){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m                this.scale = this.scale + 1;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(!this.zoomable()){\e[m
+\e[32m+\e[m\e[32m                    break;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(\e[m
+\e[32m+\e[m\e[32m                        Math.ceil(bw * this.getScaleLevel()) < this.thumbEl.getHeight() ||\e[m
+\e[32m+\e[m\e[32m                        Math.ceil(bh * this.getScaleLevel()) < this.thumbEl.getWidth()\e[m
+\e[32m+\e[m\e[32m                ){\e[m
+\e[32m+\e[m\e[32m                    continue;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.rotate = (this.rotate > 180) ? 0 : this.rotate + 90;\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                this.draw();\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                return;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.scale = this.startScale;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.onRotateFail();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            return false;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.rotate = (this.rotate > 180) ? 0 : this.rotate + 90;\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        if(this.isDocument){\e[m
+\e[32m+\e[m\e[32m            this.setThumbBoxSize();\e[m
+\e[32m+\e[m\e[32m            this.setThumbBoxPosition();\e[m
+\e[32m+\e[m\e[32m            this.setCanvasPosition();\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.draw();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.fireEvent('rotate', this, 'right');\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onRotateFail : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        this.errorEl.show(true);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var _this = this;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        (function() { _this.errorEl.hide(true); }).defer(this.errorTimeout);\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    draw : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        this.previewEl.dom.innerHTML = '';\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var canvasEl = document.createElement("canvas");\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var contextEl = canvasEl.getContext("2d");\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        canvasEl.width = this.imageEl.OriginWidth * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32m        canvasEl.height = this.imageEl.OriginWidth * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32m        var center = this.imageEl.OriginWidth / 2;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.imageEl.OriginWidth < this.imageEl.OriginHeight){\e[m
+\e[32m+\e[m\e[32m            canvasEl.width = this.imageEl.OriginHeight * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32m            canvasEl.height = this.imageEl.OriginHeight * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32m            center = this.imageEl.OriginHeight / 2;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        contextEl.scale(this.getScaleLevel(), this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        contextEl.translate(center, center);\e[m
+\e[32m+\e[m\e[32m        contextEl.rotate(this.rotate * Math.PI / 180);\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        contextEl.drawImage(this.imageEl, 0, 0, this.imageEl.OriginWidth, this.imageEl.OriginHeight, center * -1, center * -1, this.imageEl.OriginWidth, this.imageEl.OriginHeight);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.canvasEl = document.createElement("canvas");\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.contextEl = this.canvasEl.getContext("2d");\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        switch (this.rotate) {\e[m
+\e[32m+\e[m\e[32m            case 0 :\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.canvasEl.width = this.imageEl.OriginWidth * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32m                this.canvasEl.height = this.imageEl.OriginHeight * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.contextEl.drawImage(canvasEl, 0, 0, this.canvasEl.width, this.canvasEl.height, 0, 0, this.canvasEl.width, this.canvasEl.height);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 90 :\e[m\e[41m \e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.canvasEl.width = this.imageEl.OriginHeight * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32m                this.canvasEl.height = this.imageEl.OriginWidth * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(this.imageEl.OriginWidth > this.imageEl.OriginHeight){\e[m
+\e[32m+\e[m\e[32m                    this.contextEl.drawImage(canvasEl, Math.abs(this.canvasEl.width - this.canvasEl.height), 0, this.canvasEl.width, this.canvasEl.height, 0, 0, this.canvasEl.width, this.canvasEl.height);\e[m
+\e[32m+\e[m\e[32m                    break;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.contextEl.drawImage(canvasEl, 0, 0, this.canvasEl.width, this.canvasEl.height, 0, 0, this.canvasEl.width, this.canvasEl.height);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 180 :\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.canvasEl.width = this.imageEl.OriginWidth * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32m                this.canvasEl.height = this.imageEl.OriginHeight * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(this.imageEl.OriginWidth > this.imageEl.OriginHeight){\e[m
+\e[32m+\e[m\e[32m                    this.contextEl.drawImage(canvasEl, 0, Math.abs(this.canvasEl.width - this.canvasEl.height), this.canvasEl.width, this.canvasEl.height, 0, 0, this.canvasEl.width, this.canvasEl.height);\e[m
+\e[32m+\e[m\e[32m                    break;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.contextEl.drawImage(canvasEl, Math.abs(this.canvasEl.width - this.canvasEl.height), 0, this.canvasEl.width, this.canvasEl.height, 0, 0, this.canvasEl.width, this.canvasEl.height);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 270 :\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.canvasEl.width = this.imageEl.OriginHeight * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32m                this.canvasEl.height = this.imageEl.OriginWidth * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m                if(this.imageEl.OriginWidth > this.imageEl.OriginHeight){\e[m
+\e[32m+\e[m\e[32m                    this.contextEl.drawImage(canvasEl, 0, 0, this.canvasEl.width, this.canvasEl.height, 0, 0, this.canvasEl.width, this.canvasEl.height);\e[m
+\e[32m+\e[m\e[32m                    break;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.contextEl.drawImage(canvasEl, 0, Math.abs(this.canvasEl.width - this.canvasEl.height), this.canvasEl.width, this.canvasEl.height, 0, 0, this.canvasEl.width, this.canvasEl.height);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            default :\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.previewEl.appendChild(this.canvasEl);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.setCanvasPosition();\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    crop : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        if(!this.canvasLoaded){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var imageCanvas = document.createElement("canvas");\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var imageContext = imageCanvas.getContext("2d");\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        imageCanvas.width = (this.imageEl.OriginWidth > this.imageEl.OriginHeight) ? this.imageEl.OriginWidth : this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[32m        imageCanvas.height = (this.imageEl.OriginWidth > this.imageEl.OriginHeight) ? this.imageEl.OriginWidth : this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var center = imageCanvas.width / 2;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        imageContext.translate(center, center);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        imageContext.rotate(this.rotate * Math.PI / 180);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        imageContext.drawImage(this.imageEl, 0, 0, this.imageEl.OriginWidth, this.imageEl.OriginHeight, center * -1, center * -1, this.imageEl.OriginWidth, this.imageEl.OriginHeight);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var canvas = document.createElement("canvas");\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var context = canvas.getContext("2d");\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m        canvas.width = this.minWidth;\e[m
+\e[32m+\e[m\e[32m        canvas.height = this.minHeight;\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        switch (this.rotate) {\e[m
+\e[32m+\e[m\e[32m            case 0 :\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var width = (this.thumbEl.getWidth() / this.getScaleLevel() > this.imageEl.OriginWidth) ? this.imageEl.OriginWidth : (this.thumbEl.getWidth() / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                var height = (this.thumbEl.getHeight() / this.getScaleLevel() > this.imageEl.OriginHeight) ? this.imageEl.OriginHeight : (this.thumbEl.getHeight() / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var x = (this.thumbEl.getLeft(true) > this.previewEl.getLeft(true)) ? 0 : ((this.previewEl.getLeft(true) - this.thumbEl.getLeft(true)) / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                var y = (this.thumbEl.getTop(true) > this.previewEl.getTop(true)) ? 0 : ((this.previewEl.getTop(true) - this.thumbEl.getTop(true)) / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var targetWidth = this.minWidth - 2 * x;\e[m
+\e[32m+\e[m\e[32m                var targetHeight = this.minHeight - 2 * y;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var scale = 1;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if((x == 0 && y == 0) || (x == 0 && y > 0)){\e[m
+\e[32m+\e[m\e[32m                    scale = targetWidth / width;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(x > 0 && y == 0){\e[m
+\e[32m+\e[m\e[32m                    scale = targetHeight / height;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(x > 0 && y > 0){\e[m
+\e[32m+\e[m\e[32m                    scale = targetWidth / width;\e[m
+\e[32m+\e[m\e[41m                    \e[m
+\e[32m+\e[m\e[32m                    if(width < height){\e[m
+\e[32m+\e[m\e[32m                        scale = targetHeight / height;\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                context.scale(scale, scale);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var sx = Math.min(this.canvasEl.width - this.thumbEl.getWidth(), this.thumbEl.getLeft(true) - this.previewEl.getLeft(true));\e[m
+\e[32m+\e[m\e[32m                var sy = Math.min(this.canvasEl.height - this.thumbEl.getHeight(), this.thumbEl.getTop(true) - this.previewEl.getTop(true));\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                sx = sx < 0 ? 0 : (sx / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                sy = sy < 0 ? 0 : (sy / this.getScaleLevel());\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                context.drawImage(imageCanvas, sx, sy, width, height, x, y, width, height);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 90 :\e[m\e[41m \e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var width = (this.thumbEl.getWidth() / this.getScaleLevel() > this.imageEl.OriginHeight) ? this.imageEl.OriginHeight : (this.thumbEl.getWidth() / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                var height = (this.thumbEl.getHeight() / this.getScaleLevel() > this.imageEl.OriginWidth) ? this.imageEl.OriginWidth : (this.thumbEl.getHeight() / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var x = (this.thumbEl.getLeft(true) > this.previewEl.getLeft(true)) ? 0 : ((this.previewEl.getLeft(true) - this.thumbEl.getLeft(true)) / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                var y = (this.thumbEl.getTop(true) > this.previewEl.getTop(true)) ? 0 : ((this.previewEl.getTop(true) - this.thumbEl.getTop(true)) / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var targetWidth = this.minWidth - 2 * x;\e[m
+\e[32m+\e[m\e[32m                var targetHeight = this.minHeight - 2 * y;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var scale = 1;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if((x == 0 && y == 0) || (x == 0 && y > 0)){\e[m
+\e[32m+\e[m\e[32m                    scale = targetWidth / width;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(x > 0 && y == 0){\e[m
+\e[32m+\e[m\e[32m                    scale = targetHeight / height;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(x > 0 && y > 0){\e[m
+\e[32m+\e[m\e[32m                    scale = targetWidth / width;\e[m
+\e[32m+\e[m\e[41m                    \e[m
+\e[32m+\e[m\e[32m                    if(width < height){\e[m
+\e[32m+\e[m\e[32m                        scale = targetHeight / height;\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                context.scale(scale, scale);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var sx = Math.min(this.canvasEl.width - this.thumbEl.getWidth(), this.thumbEl.getLeft(true) - this.previewEl.getLeft(true));\e[m
+\e[32m+\e[m\e[32m                var sy = Math.min(this.canvasEl.height - this.thumbEl.getHeight(), this.thumbEl.getTop(true) - this.previewEl.getTop(true));\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                sx = sx < 0 ? 0 : (sx / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                sy = sy < 0 ? 0 : (sy / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                sx += (this.imageEl.OriginWidth > this.imageEl.OriginHeight) ? Math.abs(this.imageEl.OriginWidth - this.imageEl.OriginHeight) : 0;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                context.drawImage(imageCanvas, sx, sy, width, height, x, y, width, height);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 180 :\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var width = (this.thumbEl.getWidth() / this.getScaleLevel() > this.imageEl.OriginWidth) ? this.imageEl.OriginWidth : (this.thumbEl.getWidth() / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                var height = (this.thumbEl.getHeight() / this.getScaleLevel() > this.imageEl.OriginHeight) ? this.imageEl.OriginHeight : (this.thumbEl.getHeight() / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var x = (this.thumbEl.getLeft(true) > this.previewEl.getLeft(true)) ? 0 : ((this.previewEl.getLeft(true) - this.thumbEl.getLeft(true)) / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                var y = (this.thumbEl.getTop(true) > this.previewEl.getTop(true)) ? 0 : ((this.previewEl.getTop(true) - this.thumbEl.getTop(true)) / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var targetWidth = this.minWidth - 2 * x;\e[m
+\e[32m+\e[m\e[32m                var targetHeight = this.minHeight - 2 * y;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var scale = 1;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if((x == 0 && y == 0) || (x == 0 && y > 0)){\e[m
+\e[32m+\e[m\e[32m                    scale = targetWidth / width;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(x > 0 && y == 0){\e[m
+\e[32m+\e[m\e[32m                    scale = targetHeight / height;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(x > 0 && y > 0){\e[m
+\e[32m+\e[m\e[32m                    scale = targetWidth / width;\e[m
+\e[32m+\e[m\e[41m                    \e[m
+\e[32m+\e[m\e[32m                    if(width < height){\e[m
+\e[32m+\e[m\e[32m                        scale = targetHeight / height;\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                context.scale(scale, scale);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var sx = Math.min(this.canvasEl.width - this.thumbEl.getWidth(), this.thumbEl.getLeft(true) - this.previewEl.getLeft(true));\e[m
+\e[32m+\e[m\e[32m                var sy = Math.min(this.canvasEl.height - this.thumbEl.getHeight(), this.thumbEl.getTop(true) - this.previewEl.getTop(true));\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                sx = sx < 0 ? 0 : (sx / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                sy = sy < 0 ? 0 : (sy / this.getScaleLevel());\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                sx += (this.imageEl.OriginWidth > this.imageEl.OriginHeight) ? 0 : Math.abs(this.imageEl.OriginWidth - this.imageEl.OriginHeight);\e[m
+\e[32m+\e[m\e[32m                sy += (this.imageEl.OriginWidth > this.imageEl.OriginHeight) ? Math.abs(this.imageEl.OriginWidth - this.imageEl.OriginHeight) : 0;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                context.drawImage(imageCanvas, sx, sy, width, height, x, y, width, height);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 270 :\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var width = (this.thumbEl.getWidth() / this.getScaleLevel() > this.imageEl.OriginHeight) ? this.imageEl.OriginHeight : (this.thumbEl.getWidth() / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                var height = (this.thumbEl.getHeight() / this.getScaleLevel() > this.imageEl.OriginWidth) ? this.imageEl.OriginWidth : (this.thumbEl.getHeight() / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var x = (this.thumbEl.getLeft(true) > this.previewEl.getLeft(true)) ? 0 : ((this.previewEl.getLeft(true) - this.thumbEl.getLeft(true)) / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                var y = (this.thumbEl.getTop(true) > this.previewEl.getTop(true)) ? 0 : ((this.previewEl.getTop(true) - this.thumbEl.getTop(true)) / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var targetWidth = this.minWidth - 2 * x;\e[m
+\e[32m+\e[m\e[32m                var targetHeight = this.minHeight - 2 * y;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var scale = 1;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if((x == 0 && y == 0) || (x == 0 && y > 0)){\e[m
+\e[32m+\e[m\e[32m                    scale = targetWidth / width;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(x > 0 && y == 0){\e[m
+\e[32m+\e[m\e[32m                    scale = targetHeight / height;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(x > 0 && y > 0){\e[m
+\e[32m+\e[m\e[32m                    scale = targetWidth / width;\e[m
+\e[32m+\e[m\e[41m                    \e[m
+\e[32m+\e[m\e[32m                    if(width < height){\e[m
+\e[32m+\e[m\e[32m                        scale = targetHeight / height;\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                context.scale(scale, scale);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var sx = Math.min(this.canvasEl.width - this.thumbEl.getWidth(), this.thumbEl.getLeft(true) - this.previewEl.getLeft(true));\e[m
+\e[32m+\e[m\e[32m                var sy = Math.min(this.canvasEl.height - this.thumbEl.getHeight(), this.thumbEl.getTop(true) - this.previewEl.getTop(true));\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                sx = sx < 0 ? 0 : (sx / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                sy = sy < 0 ? 0 : (sy / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                sy += (this.imageEl.OriginWidth > this.imageEl.OriginHeight) ? 0 : Math.abs(this.imageEl.OriginWidth - this.imageEl.OriginHeight);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                context.drawImage(imageCanvas, sx, sy, width, height, x, y, width, height);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            default :\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.cropData = canvas.toDataURL(this.cropType);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.fireEvent('crop', this, this.cropData) !== false){\e[m
+\e[32m+\e[m\e[32m            this.process(this.file, this.cropData);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        return;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    setThumbBoxSize : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var width, height;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.isDocument && typeof(this.imageEl) != 'undefined'){\e[m
+\e[32m+\e[m\e[32m            width = (this.imageEl.OriginWidth > this.imageEl.OriginHeight) ? Math.max(this.minWidth, this.minHeight) : Math.min(this.minWidth, this.minHeight);\e[m
+\e[32m+\e[m\e[32m            height = (this.imageEl.OriginWidth > this.imageEl.OriginHeight) ? Math.min(this.minWidth, this.minHeight) : Math.max(this.minWidth, this.minHeight);\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.minWidth = width;\e[m
+\e[32m+\e[m\e[32m            this.minHeight = height;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            if(this.rotate == 90 || this.rotate == 270){\e[m
+\e[32m+\e[m\e[32m                this.minWidth = height;\e[m
+\e[32m+\e[m\e[32m                this.minHeight = width;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        height = 300;\e[m
+\e[32m+\e[m\e[32m        width = Math.ceil(this.minWidth * height / this.minHeight);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.minWidth > this.minHeight){\e[m
+\e[32m+\e[m\e[32m            width = 300;\e[m
+\e[32m+\e[m\e[32m            height = Math.ceil(this.minHeight * width / this.minWidth);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.thumbEl.setStyle({\e[m
+\e[32m+\e[m\e[32m            width : width + 'px',\e[m
+\e[32m+\e[m\e[32m            height : height + 'px'\e[m
+\e[32m+\e[m\e[32m        });\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        return;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    setThumbBoxPosition : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var x = Math.ceil((this.bodyEl.getWidth() - this.thumbEl.getWidth()) / 2 );\e[m
+\e[32m+\e[m\e[32m        var y = Math.ceil((this.bodyEl.getHeight() - this.thumbEl.getHeight()) / 2);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.thumbEl.setLeft(x);\e[m
+\e[32m+\e[m\e[32m        this.thumbEl.setTop(y);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    baseRotateLevel : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        this.baseRotate = 1;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(\e[m
+\e[32m+\e[m\e[32m                typeof(this.exif) != 'undefined' &&\e[m
+\e[32m+\e[m\e[32m                typeof(this.exif[Roo.dialog.UploadCropbox['tags']['Orientation']]) != 'undefined' &&\e[m
+\e[32m+\e[m\e[32m                [1, 3, 6, 8].indexOf(this.exif[Roo.dialog.UploadCropbox['tags']['Orientation']]) != -1\e[m
+\e[32m+\e[m\e[32m        ){\e[m
+\e[32m+\e[m\e[32m            this.baseRotate = this.exif[Roo.dialog.UploadCropbox['tags']['Orientation']];\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.rotate = Roo.dialog.UploadCropbox['Orientation'][this.baseRotate];\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    baseScaleLevel : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var width, height;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.isDocument){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            if(this.baseRotate == 6 || this.baseRotate == 8){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m                height = this.thumbEl.getHeight();\e[m
+\e[32m+\e[m\e[32m                this.baseScale = height / this.imageEl.OriginWidth;\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                if(this.imageEl.OriginHeight * this.baseScale > this.thumbEl.getWidth()){\e[m
+\e[32m+\e[m\e[32m                    width = this.thumbEl.getWidth();\e[m
+\e[32m+\e[m\e[32m                    this.baseScale = width / this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                return;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m            height = this.thumbEl.getHeight();\e[m
+\e[32m+\e[m\e[32m            this.baseScale = height / this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m            if(this.imageEl.OriginWidth * this.baseScale > this.thumbEl.getWidth()){\e[m
+\e[32m+\e[m\e[32m                width = this.thumbEl.getWidth();\e[m
+\e[32m+\e[m\e[32m                this.baseScale = width / this.imageEl.OriginWidth;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.baseRotate == 6 || this.baseRotate == 8){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            width = this.thumbEl.getHeight();\e[m
+\e[32m+\e[m\e[32m            this.baseScale = width / this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            if(this.imageEl.OriginHeight * this.baseScale < this.thumbEl.getWidth()){\e[m
+\e[32m+\e[m\e[32m                height = this.thumbEl.getWidth();\e[m
+\e[32m+\e[m\e[32m                this.baseScale = height / this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            if(this.imageEl.OriginWidth > this.imageEl.OriginHeight){\e[m
+\e[32m+\e[m\e[32m                height = this.thumbEl.getWidth();\e[m
+\e[32m+\e[m\e[32m                this.baseScale = height / this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(this.imageEl.OriginWidth * this.baseScale < this.thumbEl.getHeight()){\e[m
+\e[32m+\e[m\e[32m                    width = this.thumbEl.getHeight();\e[m
+\e[32m+\e[m\e[32m                    this.baseScale = width / this.imageEl.OriginWidth;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        width = this.thumbEl.getWidth();\e[m
+\e[32m+\e[m\e[32m        this.baseScale = width / this.imageEl.OriginWidth;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.imageEl.OriginHeight * this.baseScale < this.thumbEl.getHeight()){\e[m
+\e[32m+\e[m\e[32m            height = this.thumbEl.getHeight();\e[m
+\e[32m+\e[m\e[32m            this.baseScale = height / this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.imageEl.OriginWidth > this.imageEl.OriginHeight){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            height = this.thumbEl.getHeight();\e[m
+\e[32m+\e[m\e[32m            this.baseScale = height / this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            if(this.imageEl.OriginWidth * this.baseScale < this.thumbEl.getWidth()){\e[m
+\e[32m+\e[m\e[32m                width = this.thumbEl.getWidth();\e[m
+\e[32m+\e[m\e[32m                this.baseScale = width / this.imageEl.OriginWidth;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        return;\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    getScaleLevel : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        return this.baseScale * Math.pow(1.1, this.scale);\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onTouchStart : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        if(!this.canvasLoaded){\e[m
+\e[32m+\e[m\e[32m            this.beforeSelectFile(e);\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var touches = e.browserEvent.touches;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(!touches){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(touches.length == 1){\e[m
+\e[32m+\e[m\e[32m            this.onMouseDown(e);\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(touches.length != 2){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var coords = [];\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        for(var i = 0, finger; finger = touches[i]; i++){\e[m
+\e[32m+\e[m\e[32m            coords.push(finger.pageX, finger.pageY);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var x = Math.pow(coords[0] - coords[2], 2);\e[m
+\e[32m+\e[m\e[32m        var y = Math.pow(coords[1] - coords[3], 2);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.startDistance = Math.sqrt(x + y);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.startScale = this.scale;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.pinching = true;\e[m
+\e[32m+\e[m\e[32m        this.dragable = false;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onTouchMove : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        if(!this.pinching && !this.dragable){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var touches = e.browserEvent.touches;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(!touches){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.dragable){\e[m
+\e[32m+\e[m\e[32m            this.onMouseMove(e);\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var coords = [];\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        for(var i = 0, finger; finger = touches[i]; i++){\e[m
+\e[32m+\e[m\e[32m            coords.push(finger.pageX, finger.pageY);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var x = Math.pow(coords[0] - coords[2], 2);\e[m
+\e[32m+\e[m\e[32m        var y = Math.pow(coords[1] - coords[3], 2);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.endDistance = Math.sqrt(x + y);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.scale = this.startScale + Math.floor(Math.log(this.endDistance / this.startDistance) / Math.log(1.1));\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(!this.zoomable()){\e[m
+\e[32m+\e[m\e[32m            this.scale = this.startScale;\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.draw();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onTouchEnd : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        this.pinching = false;\e[m
+\e[32m+\e[m\e[32m        this.dragable = false;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    process : function(file, crop)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        if(this.loadMask){\e[m
+\e[32m+\e[m\e[32m            this.maskEl.mask(this.loadingText);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.xhr = new XMLHttpRequest();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        file.xhr = this.xhr;\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        this.xhr.open(this.method, this.url, true);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var headers = {\e[m
+\e[32m+\e[m\e[32m            "Accept": "application/json",\e[m
+\e[32m+\e[m\e[32m            "Cache-Control": "no-cache",\e[m
+\e[32m+\e[m\e[32m            "X-Requested-With": "XMLHttpRequest"\e[m
+\e[32m+\e[m\e[32m        };\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        for (var headerName in headers) {\e[m
+\e[32m+\e[m\e[32m            var headerValue = headers[headerName];\e[m
+\e[32m+\e[m\e[32m            if (headerValue) {\e[m
+\e[32m+\e[m\e[32m                this.xhr.setRequestHeader(headerName, headerValue);\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var _this = this;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.xhr.onload = function()\e[m
+\e[32m+\e[m\e[32m        {\e[m
+\e[32m+\e[m\e[32m            _this.xhrOnLoad(_this.xhr);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.xhr.onerror = function()\e[m
+\e[32m+\e[m\e[32m        {\e[m
+\e[32m+\e[m\e[32m            _this.xhrOnError(_this.xhr);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var formData = new FormData();\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        formData.append('returnHTML', 'NO');\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(crop){\e[m
+\e[32m+\e[m\e[32m            formData.append('crop', crop);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(typeof(file) != 'undefined' && (typeof(file.id) == 'undefined' || file.id * 1 < 1)){\e[m
+\e[32m+\e[m\e[32m            formData.append(this.paramName, file, file.name);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(typeof(file.filename) != 'undefined'){\e[m
+\e[32m+\e[m\e[32m            formData.append('filename', file.filename);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(typeof(file.mimetype) != 'undefined'){\e[m
+\e[32m+\e[m\e[32m            formData.append('mimetype', file.mimetype);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.fireEvent('arrange', this, formData) != false){\e[m
+\e[32m+\e[m\e[32m            this.xhr.send(formData);\e[m
+\e[32m+\e[m\e[32m        };\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    xhrOnLoad : function(xhr)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        if(this.loadMask){\e[m
+\e[32m+\e[m\e[32m            this.maskEl.unmask();\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if (xhr.readyState !== 4) {\e[m
+\e[32m+\e[m\e[32m            this.fireEvent('exception', this, xhr);\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        var response = Roo.decode(xhr.responseText);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(!response.success){\e[m
+\e[32m+\e[m\e[32m            this.fireEvent('exception', this, xhr);\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var response = Roo.decode(xhr.responseText);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.fireEvent('upload', this, response);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    xhrOnError : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        if(this.loadMask){\e[m
+\e[32m+\e[m\e[32m            this.maskEl.unmask();\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        Roo.log('xhr on error');\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var response = Roo.decode(xhr.responseText);\e[m
+\e[32m+\e[m\e[41m          \e[m
+\e[32m+\e[m\e[32m        Roo.log(response);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    prepare : function(file)\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m        if(this.loadMask){\e[m
+\e[32m+\e[m\e[32m            this.maskEl.mask(this.loadingText);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.file = false;\e[m
+\e[32m+\e[m\e[32m        this.exif = {};\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(typeof(file) === 'string'){\e[m
+\e[32m+\e[m\e[32m            this.loadCanvas(file);\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(!file || !this.urlAPI){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.file = file;\e[m
+\e[32m+\e[m\e[32m        this.cropType = file.type;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var _this = this;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.fireEvent('prepare', this, this.file) != false){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            var reader = new FileReader();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            reader.onload = function (e) {\e[m
+\e[32m+\e[m\e[32m                if (e.target.error) {\e[m
+\e[32m+\e[m\e[32m                    Roo.log(e.target.error);\e[m
+\e[32m+\e[m\e[32m                    return;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var buffer = e.target.result,\e[m
+\e[32m+\e[m\e[32m                    dataView = new DataView(buffer),\e[m
+\e[32m+\e[m\e[32m                    offset = 2,\e[m
+\e[32m+\e[m\e[32m                    maxOffset = dataView.byteLength - 4,\e[m
+\e[32m+\e[m\e[32m                    markerBytes,\e[m
+\e[32m+\e[m\e[32m                    markerLength;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if (dataView.getUint16(0) === 0xffd8) {\e[m
+\e[32m+\e[m\e[32m                    while (offset < maxOffset) {\e[m
+\e[32m+\e[m\e[32m                        markerBytes = dataView.getUint16(offset);\e[m
+\e[32m+\e[m\e[41m                        \e[m
+\e[32m+\e[m\e[32m                        if ((markerBytes >= 0xffe0 && markerBytes <= 0xffef) || markerBytes === 0xfffe) {\e[m
+\e[32m+\e[m\e[32m                            markerLength = dataView.getUint16(offset + 2) + 2;\e[m
+\e[32m+\e[m\e[32m                            if (offset + markerLength > dataView.byteLength) {\e[m
+\e[32m+\e[m\e[32m                                Roo.log('Invalid meta data: Invalid segment size.');\e[m
+\e[32m+\e[m\e[32m                                break;\e[m
+\e[32m+\e[m\e[32m                            }\e[m
+\e[32m+\e[m\e[41m                            \e[m
+\e[32m+\e[m\e[32m                            if(markerBytes == 0xffe1){\e[m
+\e[32m+\e[m\e[32m                                _this.parseExifData(\e[m
+\e[32m+\e[m\e[32m                                    dataView,\e[m
+\e[32m+\e[m\e[32m                                    offset,\e[m
+\e[32m+\e[m\e[32m                                    markerLength\e[m
+\e[32m+\e[m\e[32m                                );\e[m
+\e[32m+\e[m\e[32m                            }\e[m
+\e[32m+\e[m\e[41m                            \e[m
+\e[32m+\e[m\e[32m                            offset += markerLength;\e[m
+\e[32m+\e[m\e[41m                            \e[m
+\e[32m+\e[m\e[32m                            continue;\e[m
+\e[32m+\e[m\e[32m                        }\e[m
+\e[32m+\e[m\e[41m                        \e[m
+\e[32m+\e[m\e[32m                        break;\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[41m                    \e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var url = _this.urlAPI.createObjectURL(_this.file);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                _this.loadCanvas(url);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                return;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            reader.readAsArrayBuffer(this.file);\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    parseExifData : function(dataView, offset, length)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var tiffOffset = offset + 10,\e[m
+\e[32m+\e[m\e[32m            littleEndian,\e[m
+\e[32m+\e[m\e[32m            dirOffset;\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m        if (dataView.getUint32(offset + 4) !== 0x45786966) {\e[m
+\e[32m+\e[m\e[32m            // No Exif data, might be XMP data instead\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        // Check for the ASCII code for "Exif" (0x45786966):\e[m
+\e[32m+\e[m\e[32m        if (dataView.getUint32(offset + 4) !== 0x45786966) {\e[m
+\e[32m+\e[m\e[32m            // No Exif data, might be XMP data instead\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        if (tiffOffset + 8 > dataView.byteLength) {\e[m
+\e[32m+\e[m\e[32m            Roo.log('Invalid Exif data: Invalid segment size.');\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        // Check for the two null bytes:\e[m
+\e[32m+\e[m\e[32m        if (dataView.getUint16(offset + 8) !== 0x0000) {\e[m
+\e[32m+\e[m\e[32m            Roo.log('Invalid Exif data: Missing byte alignment offset.');\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        // Check the byte alignment:\e[m
+\e[32m+\e[m\e[32m        switch (dataView.getUint16(tiffOffset)) {\e[m
+\e[32m+\e[m\e[32m        case 0x4949:\e[m
+\e[32m+\e[m\e[32m            littleEndian = true;\e[m
+\e[32m+\e[m\e[32m            break;\e[m
+\e[32m+\e[m\e[32m        case 0x4D4D:\e[m
+\e[32m+\e[m\e[32m            littleEndian = false;\e[m
+\e[32m+\e[m\e[32m            break;\e[m
+\e[32m+\e[m\e[32m        default:\e[m
+\e[32m+\e[m\e[32m            Roo.log('Invalid Exif data: Invalid byte alignment marker.');\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        // Check for the TIFF tag marker (0x002A):\e[m
+\e[32m+\e[m\e[32m        if (dataView.getUint16(tiffOffset + 2, littleEndian) !== 0x002A) {\e[m
+\e[32m+\e[m\e[32m            Roo.log('Invalid Exif data: Missing TIFF marker.');\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        // Retrieve the directory offset bytes, usually 0x00000008 or 8 decimal:\e[m
+\e[32m+\e[m\e[32m        dirOffset = dataView.getUint32(tiffOffset + 4, littleEndian);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.parseExifTags(\e[m
+\e[32m+\e[m\e[32m            dataView,\e[m
+\e[32m+\e[m\e[32m            tiffOffset,\e[m
+\e[32m+\e[m\e[32m            tiffOffset + dirOffset,\e[m
+\e[32m+\e[m\e[32m            littleEndian\e[m
+\e[32m+\e[m\e[32m        );\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    parseExifTags : function(dataView, tiffOffset, dirOffset, littleEndian)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var tagsNumber,\e[m
+\e[32m+\e[m\e[32m            dirEndOffset,\e[m
+\e[32m+\e[m\e[32m            i;\e[m
+\e[32m+\e[m\e[32m        if (dirOffset + 6 > dataView.byteLength) {\e[m
+\e[32m+\e[m\e[32m            Roo.log('Invalid Exif data: Invalid directory offset.');\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        tagsNumber = dataView.getUint16(dirOffset, littleEndian);\e[m
+\e[32m+\e[m\e[32m        dirEndOffset = dirOffset + 2 + 12 * tagsNumber;\e[m
+\e[32m+\e[m\e[32m        if (dirEndOffset + 4 > dataView.byteLength) {\e[m
+\e[32m+\e[m\e[32m            Roo.log('Invalid Exif data: Invalid directory size.');\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        for (i = 0; i < tagsNumber; i += 1) {\e[m
+\e[32m+\e[m\e[32m            this.parseExifTag(\e[m
+\e[32m+\e[m\e[32m                dataView,\e[m
+\e[32m+\e[m\e[32m                tiffOffset,\e[m
+\e[32m+\e[m\e[32m                dirOffset + 2 + 12 * i, // tag offset\e[m
+\e[32m+\e[m\e[32m                littleEndian\e[m
+\e[32m+\e[m\e[32m            );\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        // Return the offset to the next directory:\e[m
+\e[32m+\e[m\e[32m        return dataView.getUint32(dirEndOffset, littleEndian);\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    parseExifTag : function (dataView, tiffOffset, offset, littleEndian)\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var tag = dataView.getUint16(offset, littleEndian);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.exif[tag] = this.getExifValue(\e[m
+\e[32m+\e[m\e[32m            dataView,\e[m
+\e[32m+\e[m\e[32m            tiffOffset,\e[m
+\e[32m+\e[m\e[32m            offset,\e[m
+\e[32m+\e[m\e[32m            dataView.getUint16(offset + 2, littleEndian), // tag type\e[m
+\e[32m+\e[m\e[32m            dataView.getUint32(offset + 4, littleEndian), // tag length\e[m
+\e[32m+\e[m\e[32m            littleEndian\e[m
+\e[32m+\e[m\e[32m        );\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    getExifValue : function (dataView, tiffOffset, offset, type, length, littleEndian)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var tagType = Roo.dialog.UploadCropbox.exifTagTypes[type],\e[m
+\e[32m+\e[m\e[32m            tagSize,\e[m
+\e[32m+\e[m\e[32m            dataOffset,\e[m
+\e[32m+\e[m\e[32m            values,\e[m
+\e[32m+\e[m\e[32m            i,\e[m
+\e[32m+\e[m\e[32m            str,\e[m
+\e[32m+\e[m\e[32m            c;\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m        if (!tagType) {\e[m
+\e[32m+\e[m\e[32m            Roo.log('Invalid Exif data: Invalid tag type.');\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        tagSize = tagType.size * length;\e[m
+\e[32m+\e[m\e[32m        // Determine if the value is contained in the dataOffset bytes,\e[m
+\e[32m+\e[m\e[32m        // or if the value at the dataOffset is a pointer to the actual data:\e[m
+\e[32m+\e[m\e[32m        dataOffset = tagSize > 4 ?\e[m
+\e[32m+\e[m\e[32m                tiffOffset + dataView.getUint32(offset + 8, littleEndian) : (offset + 8);\e[m
+\e[32m+\e[m\e[32m        if (dataOffset + tagSize > dataView.byteLength) {\e[m
+\e[32m+\e[m\e[32m            Roo.log('Invalid Exif data: Invalid data offset.');\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        if (length === 1) {\e[m
+\e[32m+\e[m\e[32m            return tagType.getValue(dataView, dataOffset, littleEndian);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        values = [];\e[m
+\e[32m+\e[m\e[32m        for (i = 0; i < length; i += 1) {\e[m
+\e[32m+\e[m\e[32m            values[i] = tagType.getValue(dataView, dataOffset + i * tagType.size, littleEndian);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if (tagType.ascii) {\e[m
+\e[32m+\e[m\e[32m            str = '';\e[m
+\e[32m+\e[m\e[32m            // Concatenate the chars:\e[m
+\e[32m+\e[m\e[32m            for (i = 0; i < values.length; i += 1) {\e[m
+\e[32m+\e[m\e[32m                c = values[i];\e[m
+\e[32m+\e[m\e[32m                // Ignore the terminating NULL byte(s):\e[m
+\e[32m+\e[m\e[32m                if (c === '\u0000') {\e[m
+\e[32m+\e[m\e[32m                    break;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[32m                str += c;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[32m            return str;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        return values;\e[m
+\e[32m+\e[m\e[32m    }\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m});\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32mRoo.apply(Roo.dialog.UploadCropbox, {\e[m
+\e[32m+\e[m\e[32m    tags : {\e[m
+\e[32m+\e[m\e[32m        'Orientation': 0x0112\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    Orientation: {\e[m
+\e[32m+\e[m\e[32m            1: 0, //'top-left',\e[m
+\e[32m+\e[m\e[32m//            2: 'top-right',\e[m
+\e[32m+\e[m\e[32m            3: 180, //'bottom-right',\e[m
+\e[32m+\e[m\e[32m//            4: 'bottom-left',\e[m
+\e[32m+\e[m\e[32m//            5: 'left-top',\e[m
+\e[32m+\e[m\e[32m            6: 90, //'right-top',\e[m
+\e[32m+\e[m\e[32m//            7: 'right-bottom',\e[m
+\e[32m+\e[m\e[32m            8: 270 //'left-bottom'\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    exifTagTypes : {\e[m
+\e[32m+\e[m\e[32m        // byte, 8-bit unsigned int:\e[m
+\e[32m+\e[m\e[32m        1: {\e[m
+\e[32m+\e[m\e[32m            getValue: function (dataView, dataOffset) {\e[m
+\e[32m+\e[m\e[32m                return dataView.getUint8(dataOffset);\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            size: 1\e[m
+\e[32m+\e[m\e[32m        },\e[m
+\e[32m+\e[m\e[32m        // ascii, 8-bit byte:\e[m
+\e[32m+\e[m\e[32m        2: {\e[m
+\e[32m+\e[m\e[32m            getValue: function (dataView, dataOffset) {\e[m
+\e[32m+\e[m\e[32m                return String.fromCharCode(dataView.getUint8(dataOffset));\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            size: 1,\e[m
+\e[32m+\e[m\e[32m            ascii: true\e[m
+\e[32m+\e[m\e[32m        },\e[m
+\e[32m+\e[m\e[32m        // short, 16 bit int:\e[m
+\e[32m+\e[m\e[32m        3: {\e[m
+\e[32m+\e[m\e[32m            getValue: function (dataView, dataOffset, littleEndian) {\e[m
+\e[32m+\e[m\e[32m                return dataView.getUint16(dataOffset, littleEndian);\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            size: 2\e[m
+\e[32m+\e[m\e[32m        },\e[m
+\e[32m+\e[m\e[32m        // long, 32 bit int:\e[m
+\e[32m+\e[m\e[32m        4: {\e[m
+\e[32m+\e[m\e[32m            getValue: function (dataView, dataOffset, littleEndian) {\e[m
+\e[32m+\e[m\e[32m                return dataView.getUint32(dataOffset, littleEndian);\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            size: 4\e[m
+\e[32m+\e[m\e[32m        },\e[m
+\e[32m+\e[m\e[32m        // rational = two long values, first is numerator, second is denominator:\e[m
+\e[32m+\e[m\e[32m        5: {\e[m
+\e[32m+\e[m\e[32m            getValue: function (dataView, dataOffset, littleEndian) {\e[m
+\e[32m+\e[m\e[32m                return dataView.getUint32(dataOffset, littleEndian) /\e[m
+\e[32m+\e[m\e[32m                    dataView.getUint32(dataOffset + 4, littleEndian);\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            size: 8\e[m
+\e[32m+\e[m\e[32m        },\e[m
+\e[32m+\e[m\e[32m        // slong, 32 bit signed int:\e[m
+\e[32m+\e[m\e[32m        9: {\e[m
+\e[32m+\e[m\e[32m            getValue: function (dataView, dataOffset, littleEndian) {\e[m
+\e[32m+\e[m\e[32m                return dataView.getInt32(dataOffset, littleEndian);\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            size: 4\e[m
+\e[32m+\e[m\e[32m        },\e[m
+\e[32m+\e[m\e[32m        // srational, two slongs, first is numerator, second is denominator:\e[m
+\e[32m+\e[m\e[32m        10: {\e[m
+\e[32m+\e[m\e[32m            getValue: function (dataView, dataOffset, littleEndian) {\e[m
+\e[32m+\e[m\e[32m                return dataView.getInt32(dataOffset, littleEndian) /\e[m
+\e[32m+\e[m\e[32m                    dataView.getInt32(dataOffset + 4, littleEndian);\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            size: 8\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    footer : {\e[m
+\e[32m+\e[m\e[32m        STANDARD : [\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-rotate-left',\e[m
+\e[32m+\e[m\e[32m                action : 'rotate-left',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-undo"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-picture',\e[m
+\e[32m+\e[m\e[32m                action : 'picture',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-picture-o"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-rotate-right',\e[m
+\e[32m+\e[m\e[32m                action : 'rotate-right',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-repeat"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[32m        ],\e[m
+\e[32m+\e[m\e[32m        DOCUMENT : [\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-rotate-left',\e[m
+\e[32m+\e[m\e[32m                action : 'rotate-left',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-undo"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-download',\e[m
+\e[32m+\e[m\e[32m                action : 'download',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-download"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-crop',\e[m
+\e[32m+\e[m\e[32m                action : 'crop',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-crop"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-trash',\e[m
+\e[32m+\e[m\e[32m                action : 'trash',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-trash"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-rotate-right',\e[m
+\e[32m+\e[m\e[32m                action : 'rotate-right',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-repeat"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[32m        ],\e[m
+\e[32m+\e[m\e[32m        ROTATOR : [\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-rotate-left',\e[m
+\e[32m+\e[m\e[32m                action : 'rotate-left',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-undo"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-rotate-right',\e[m
+\e[32m+\e[m\e[32m                action : 'rotate-right',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-repeat"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[32m        ]\e[m
+\e[32m+\e[m\e[32m    }\e[m
+\e[32m+\e[m\e[32m});\e[m
+\e[1mdiff --git a/buildSDK/dependancy_ui.txt b/buildSDK/dependancy_ui.txt\e[m
+\e[1mindex 5a8e5a9ac5..f89656e412 100644\e[m
+\e[1m--- a/buildSDK/dependancy_ui.txt\e[m
+\e[1m+++ b/buildSDK/dependancy_ui.txt\e[m
+\e[36m@@ -197,3 +197,6 @@\e[m \e[mRoo.XTemplate\e[m
\e[m
+ // is this ready yet? - is it used?\e[m
+ // Roo.Login\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32mRoo.dialog.namespace\e[m
+\e[32m+\e[m\e[32mRoo.dialog.UploadCropbox\e[m
+\e[1mdiff --git a/css/alert.css b/css/alert.css\e[m
+\e[1mnew file mode 100644\e[m
+\e[1mindex 0000000000..0cc7751f02\e[m
+\e[1m--- /dev/null\e[m
+\e[1m+++ b/css/alert.css\e[m
+\e[36m@@ -0,0 +1,75 @@\e[m
+\e[32m+\e[m\e[32m.alert {\e[m
+\e[32m+\e[m\e[32m  padding: 15px;\e[m
+\e[32m+\e[m\e[32m  margin-bottom: 20px;\e[m
+\e[32m+\e[m\e[32m  border: 1px solid transparent;\e[m
+\e[32m+\e[m\e[32m  border-radius: 4px;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.alert h4 {\e[m
+\e[32m+\e[m\e[32m  margin-top: 0;\e[m
+\e[32m+\e[m\e[32m  color: inherit;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.alert .alert-link {\e[m
+\e[32m+\e[m\e[32m  font-weight: bold;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.alert > p,\e[m
+\e[32m+\e[m\e[32m.alert > ul {\e[m
+\e[32m+\e[m\e[32m  margin-bottom: 0;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.alert > p + p {\e[m
+\e[32m+\e[m\e[32m  margin-top: 5px;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.alert-dismissable,\e[m
+\e[32m+\e[m\e[32m.alert-dismissible {\e[m
+\e[32m+\e[m\e[32m  padding-right: 35px;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.alert-dismissable .close,\e[m
+\e[32m+\e[m\e[32m.alert-dismissible .close {\e[m
+\e[32m+\e[m\e[32m  position: relative;\e[m
+\e[32m+\e[m\e[32m  top: -2px;\e[m
+\e[32m+\e[m\e[32m  right: -21px;\e[m
+\e[32m+\e[m\e[32m  color: inherit;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.alert-success {\e[m
+\e[32m+\e[m\e[32m  background-color: #dff0d8;\e[m
+\e[32m+\e[m\e[32m  border-color: #d6e9c6;\e[m
+\e[32m+\e[m\e[32m  color: #3c763d;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.alert-success hr {\e[m
+\e[32m+\e[m\e[32m  border-top-color: #c9e2b3;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.alert-success .alert-link {\e[m
+\e[32m+\e[m\e[32m  color: #2b542c;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.alert-info {\e[m
+\e[32m+\e[m\e[32m  background-color: #d9edf7;\e[m
+\e[32m+\e[m\e[32m  border-color: #bce8f1;\e[m
+\e[32m+\e[m\e[32m  color: #31708f;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.alert-info hr {\e[m
+\e[32m+\e[m\e[32m  border-top-color: #a6e1ec;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.alert-info .alert-link {\e[m
+\e[32m+\e[m\e[32m  color: #245269;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.alert-warning {\e[m
+\e[32m+\e[m\e[32m  background-color: #fcf8e3;\e[m
+\e[32m+\e[m\e[32m  border-color: #faebcc;\e[m
+\e[32m+\e[m\e[32m  color: #8a6d3b;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.alert-warning hr {\e[m
+\e[32m+\e[m\e[32m  border-top-color: #f7e1b5;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.alert-warning .alert-link {\e[m
+\e[32m+\e[m\e[32m  color: #66512c;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.alert-danger {\e[m
+\e[32m+\e[m\e[32m  background-color: #f2dede;\e[m
+\e[32m+\e[m\e[32m  border-color: #ebccd1;\e[m
+\e[32m+\e[m\e[32m  color: #a94442;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.alert-danger hr {\e[m
+\e[32m+\e[m\e[32m  border-top-color: #e4b9c0;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.alert-danger .alert-link {\e[m
+\e[32m+\e[m\e[32m  color: #843534;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\ No newline at end of file\e[m
+\e[1mdiff --git a/css/button-groups.css b/css/button-groups.css\e[m
+\e[1mnew file mode 100644\e[m
+\e[1mindex 0000000000..b725faf99b\e[m
+\e[1m--- /dev/null\e[m
+\e[1m+++ b/css/button-groups.css\e[m
+\e[36m@@ -0,0 +1,171 @@\e[m
+\e[32m+\e[m\e[32m.btn-group,\e[m
+\e[32m+\e[m\e[32m.btn-group-vertical {\e[m
+\e[32m+\e[m\e[32m  position: relative;\e[m
+\e[32m+\e[m\e[32m  display: inline-block;\e[m
+\e[32m+\e[m\e[32m  vertical-align: middle;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group > .btn,\e[m
+\e[32m+\e[m\e[32m.btn-group-vertical > .btn {\e[m
+\e[32m+\e[m\e[32m  position: relative;\e[m
+\e[32m+\e[m\e[32m  float: left;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group > .btn:hover,\e[m
+\e[32m+\e[m\e[32m.btn-group-vertical > .btn:hover,\e[m
+\e[32m+\e[m\e[32m.btn-group > .btn:focus,\e[m
+\e[32m+\e[m\e[32m.btn-group-vertical > .btn:focus,\e[m
+\e[32m+\e[m\e[32m.btn-group > .btn:active,\e[m
+\e[32m+\e[m\e[32m.btn-group-vertical > .btn:active,\e[m
+\e[32m+\e[m\e[32m.btn-group > .btn.active,\e[m
+\e[32m+\e[m\e[32m.btn-group-vertical > .btn.active {\e[m
+\e[32m+\e[m\e[32m  z-index: 2;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group .btn + .btn,\e[m
+\e[32m+\e[m\e[32m.btn-group .btn + .btn-group,\e[m
+\e[32m+\e[m\e[32m.btn-group .btn-group + .btn,\e[m
+\e[32m+\e[m\e[32m.btn-group .btn-group + .btn-group {\e[m
+\e[32m+\e[m\e[32m  margin-left: -1px;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-toolbar {\e[m
+\e[32m+\e[m\e[32m  margin-left: -5px;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-toolbar .btn,\e[m
+\e[32m+\e[m\e[32m.btn-toolbar .btn-group,\e[m
+\e[32m+\e[m\e[32m.btn-toolbar .input-group {\e[m
+\e[32m+\e[m\e[32m  float: left;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-toolbar > .btn,\e[m
+\e[32m+\e[m\e[32m.btn-toolbar > .btn-group,\e[m
+\e[32m+\e[m\e[32m.btn-toolbar > .input-group {\e[m
+\e[32m+\e[m\e[32m  margin-left: 5px;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\e[m
+\e[32m+\e[m\e[32m  border-radius: 0;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group > .btn:first-child {\e[m
+\e[32m+\e[m\e[32m  margin-left: 0;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\e[m
+\e[32m+\e[m\e[32m  border-bottom-right-radius: 0;\e[m
+\e[32m+\e[m\e[32m  border-top-right-radius: 0;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group > .btn:last-child:not(:first-child),\e[m
+\e[32m+\e[m\e[32m.btn-group > .dropdown-toggle:not(:first-child) {\e[m
+\e[32m+\e[m\e[32m  border-bottom-left-radius: 0;\e[m
+\e[32m+\e[m\e[32m  border-top-left-radius: 0;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group > .btn-group {\e[m
+\e[32m+\e[m\e[32m  float: left;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\e[m
+\e[32m+\e[m\e[32m  border-radius: 0;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\e[m
+\e[32m+\e[m\e[32m.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\e[m
+\e[32m+\e[m\e[32m  border-bottom-right-radius: 0;\e[m
+\e[32m+\e[m\e[32m  border-top-right-radius: 0;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\e[m
+\e[32m+\e[m\e[32m  border-bottom-left-radius: 0;\e[m
+\e[32m+\e[m\e[32m  border-top-left-radius: 0;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group .dropdown-toggle:active,\e[m
+\e[32m+\e[m\e[32m.btn-group.open .dropdown-toggle {\e[m
+\e[32m+\e[m\e[32m  outline: 0;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group > .btn + .dropdown-toggle {\e[m
+\e[32m+\e[m\e[32m  padding-left: 8px;\e[m
+\e[32m+\e[m\e[32m  padding-right: 8px;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group > .btn-lg + .dropdown-toggle {\e[m
+\e[32m+\e[m\e[32m  padding-left: 12px;\e[m
+\e[32m+\e[m\e[32m  padding-right: 12px;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group.open .dropdown-toggle {\e[m
+\e[32m+\e[m\e[32m  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\e[m
+\e[32m+\e[m\e[32m  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group.open .dropdown-toggle.btn-link {\e[m
+\e[32m+\e[m\e[32m  -webkit-box-shadow: none;\e[m
+\e[32m+\e[m\e[32m  box-shadow: none;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn .caret {\e[m
+\e[32m+\e[m\e[32m  margin-left: 0;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-lg .caret {\e[m
+\e[32m+\e[m\e[32m  border-width: 5px 5px 0;\e[m
+\e[32m+\e[m\e[32m  border-bottom-width: 0;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.dropup .btn-lg .caret {\e[m
+\e[32m+\e[m\e[32m  border-width: 0 5px 5px;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group-vertical > .btn,\e[m
+\e[32m+\e[m\e[32m.btn-group-vertical > .btn-group,\e[m
+\e[32m+\e[m\e[32m.btn-group-vertical > .btn-group > .btn {\e[m
+\e[32m+\e[m\e[32m  display: block;\e[m
+\e[32m+\e[m\e[32m  float: none;\e[m
+\e[32m+\e[m\e[32m  width: 100%;\e[m
+\e[32m+\e[m\e[32m  max-width: 100%;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group-vertical > .btn-group > .btn {\e[m
+\e[32m+\e[m\e[32m  float: none;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group-vertical > .btn + .btn,\e[m
+\e[32m+\e[m\e[32m.btn-group-vertical > .btn + .btn-group,\e[m
+\e[32m+\e[m\e[32m.btn-group-vertical > .btn-group + .btn,\e[m
+\e[32m+\e[m\e[32m.btn-group-vertical > .btn-group + .btn-group {\e[m
+\e[32m+\e[m\e[32m  margin-top: -1px;\e[m
+\e[32m+\e[m\e[32m  margin-left: 0;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\e[m
+\e[32m+\e[m\e[32m  border-radius: 0;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group-vertical > .btn:first-child:not(:last-child) {\e[m
+\e[32m+\e[m\e[32m  border-top-right-radius: 4px;\e[m
+\e[32m+\e[m\e[32m  border-top-left-radius: 4px;\e[m
+\e[32m+\e[m\e[32m  border-bottom-right-radius: 0;\e[m
+\e[32m+\e[m\e[32m  border-bottom-left-radius: 0;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group-vertical > .btn:last-child:not(:first-child) {\e[m
+\e[32m+\e[m\e[32m  border-top-right-radius: 0;\e[m
+\e[32m+\e[m\e[32m  border-top-left-radius: 0;\e[m
+\e[32m+\e[m\e[32m  border-bottom-right-radius: 4px;\e[m
+\e[32m+\e[m\e[32m  border-bottom-left-radius: 4px;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\e[m
+\e[32m+\e[m\e[32m  border-radius: 0;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\e[m
+\e[32m+\e[m\e[32m.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\e[m
+\e[32m+\e[m\e[32m  border-bottom-right-radius: 0;\e[m
+\e[32m+\e[m\e[32m  border-bottom-left-radius: 0;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\e[m
+\e[32m+\e[m\e[32m  border-top-right-radius: 0;\e[m
+\e[32m+\e[m\e[32m  border-top-left-radius: 0;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group-justified {\e[m
+\e[32m+\e[m\e[32m  display: table;\e[m
+\e[32m+\e[m\e[32m  width: 100%;\e[m
+\e[32m+\e[m\e[32m  table-layout: fixed;\e[m
+\e[32m+\e[m\e[32m  border-collapse: separate;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group-justified > .btn,\e[m
+\e[32m+\e[m\e[32m.btn-group-justified > .btn-group {\e[m
+\e[32m+\e[m\e[32m  float: none;\e[m
+\e[32m+\e[m\e[32m  display: table-cell;\e[m
+\e[32m+\e[m\e[32m  width: 1%;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group-justified > .btn-group .btn {\e[m
+\e[32m+\e[m\e[32m  width: 100%;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-group-justified > .btn-group .dropdown-menu {\e[m
+\e[32m+\e[m\e[32m  left: auto;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m[data-toggle="buttons"] > .btn input[type="radio"],\e[m
+\e[32m+\e[m\e[32m[data-toggle="buttons"] > .btn-group > .btn input[type="radio"],\e[m
+\e[32m+\e[m\e[32m[data-toggle="buttons"] > .btn input[type="checkbox"],\e[m
+\e[32m+\e[m\e[32m[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {\e[m
+\e[32m+\e[m\e[32m  position: absolute;\e[m
+\e[32m+\e[m\e[32m  clip: rect(0, 0, 0, 0);\e[m
+\e[32m+\e[m\e[32m  pointer-events: none;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\ No newline at end of file\e[m
+\e[1mdiff --git a/css/buttons.css b/css/buttons.css\e[m
+\e[1mnew file mode 100644\e[m
+\e[1mindex 0000000000..42ec098feb\e[m
+\e[1m--- /dev/null\e[m
+\e[1m+++ b/css/buttons.css\e[m
+\e[36m@@ -0,0 +1,463 @@\e[m
+\e[32m+\e[m\e[32m.btn {\e[m
+\e[32m+\e[m\e[32m  display: inline-block;\e[m
+\e[32m+\e[m\e[32m  margin-bottom: 0;\e[m
+\e[32m+\e[m\e[32m  font-weight: normal;\e[m
+\e[32m+\e[m\e[32m  text-align: center;\e[m
+\e[32m+\e[m\e[32m  vertical-align: middle;\e[m
+\e[32m+\e[m\e[32m  touch-action: manipulation;\e[m
+\e[32m+\e[m\e[32m  cursor: pointer;\e[m
+\e[32m+\e[m\e[32m  background-image: none;\e[m
+\e[32m+\e[m\e[32m  border: 1px solid transparent;\e[m
+\e[32m+\e[m\e[32m  white-space: nowrap;\e[m
+\e[32m+\e[m\e[32m  padding: 6px 12px;\e[m
+\e[32m+\e[m\e[32m  font-size: 14px;\e[m
+\e[32m+\e[m\e[32m  line-height: 1.42857143;\e[m
+\e[32m+\e[m\e[32m  border-radius: 4px;\e[m
+\e[32m+\e[m\e[32m  -webkit-user-select: none;\e[m
+\e[32m+\e[m\e[32m  -moz-user-select: none;\e[m
+\e[32m+\e[m\e[32m  -ms-user-select: none;\e[m
+\e[32m+\e[m\e[32m  user-select: none;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn:focus,\e[m
+\e[32m+\e[m\e[32m.btn:active:focus,\e[m
+\e[32m+\e[m\e[32m.btn.active:focus,\e[m
+\e[32m+\e[m\e[32m.btn.focus,\e[m
+\e[32m+\e[m\e[32m.btn:active.focus,\e[m
+\e[32m+\e[m\e[32m.btn.active.focus {\e[m
+\e[32m+\e[m\e[32m  outline: 5px auto -webkit-focus-ring-color;\e[m
+\e[32m+\e[m\e[32m  outline-offset: -2px;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn:hover,\e[m
+\e[32m+\e[m\e[32m.btn:focus,\e[m
+\e[32m+\e[m\e[32m.btn.focus {\e[m
+\e[32m+\e[m\e[32m  color: #333333;\e[m
+\e[32m+\e[m\e[32m  text-decoration: none;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn:active,\e[m
+\e[32m+\e[m\e[32m.btn.active {\e[m
+\e[32m+\e[m\e[32m  outline: 0;\e[m
+\e[32m+\e[m\e[32m  background-image: none;\e[m
+\e[32m+\e[m\e[32m  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\e[m
+\e[32m+\e[m\e[32m  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn.disabled,\e[m
+\e[32m+\e[m\e[32m.btn[disabled],\e[m
+\e[32m+\e[m\e[32mfieldset[disabled] .btn {\e[m
+\e[32m+\e[m\e[32m  cursor: not-allowed;\e[m
+\e[32m+\e[m\e[32m  opacity: 0.65;\e[m
+\e[32m+\e[m\e[32m  filter: alpha(opacity=65);\e[m
+\e[32m+\e[m\e[32m  -webkit-box-shadow: none;\e[m
+\e[32m+\e[m\e[32m  box-shadow: none;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32ma.btn.disabled,\e[m
+\e[32m+\e[m\e[32mfieldset[disabled] a.btn {\e[m
+\e[32m+\e[m\e[32m  pointer-events: none;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-default {\e[m
+\e[32m+\e[m\e[32m  color: #333333;\e[m
+\e[32m+\e[m\e[32m  background-color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  border-color: #cccccc;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-default:focus,\e[m
+\e[32m+\e[m\e[32m.btn-default.focus {\e[m
+\e[32m+\e[m\e[32m  color: #333333;\e[m
+\e[32m+\e[m\e[32m  background-color: #e6e6e6;\e[m
+\e[32m+\e[m\e[32m  border-color: #8c8c8c;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-default:hover {\e[m
+\e[32m+\e[m\e[32m  color: #333333;\e[m
+\e[32m+\e[m\e[32m  background-color: #e6e6e6;\e[m
+\e[32m+\e[m\e[32m  border-color: #adadad;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-default:active,\e[m
+\e[32m+\e[m\e[32m.btn-default.active,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-default {\e[m
+\e[32m+\e[m\e[32m  color: #333333;\e[m
+\e[32m+\e[m\e[32m  background-color: #e6e6e6;\e[m
+\e[32m+\e[m\e[32m  border-color: #adadad;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-default:active:hover,\e[m
+\e[32m+\e[m\e[32m.btn-default.active:hover,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-default:hover,\e[m
+\e[32m+\e[m\e[32m.btn-default:active:focus,\e[m
+\e[32m+\e[m\e[32m.btn-default.active:focus,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-default:focus,\e[m
+\e[32m+\e[m\e[32m.btn-default:active.focus,\e[m
+\e[32m+\e[m\e[32m.btn-default.active.focus,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-default.focus {\e[m
+\e[32m+\e[m\e[32m  color: #333333;\e[m
+\e[32m+\e[m\e[32m  background-color: #d4d4d4;\e[m
+\e[32m+\e[m\e[32m  border-color: #8c8c8c;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-default:active,\e[m
+\e[32m+\e[m\e[32m.btn-default.active,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-default {\e[m
+\e[32m+\e[m\e[32m  background-image: none;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-default.disabled:hover,\e[m
+\e[32m+\e[m\e[32m.btn-default[disabled]:hover,\e[m
+\e[32m+\e[m\e[32mfieldset[disabled] .btn-default:hover,\e[m
+\e[32m+\e[m\e[32m.btn-default.disabled:focus,\e[m
+\e[32m+\e[m\e[32m.btn-default[disabled]:focus,\e[m
+\e[32m+\e[m\e[32mfieldset[disabled] .btn-default:focus,\e[m
+\e[32m+\e[m\e[32m.btn-default.disabled.focus,\e[m
+\e[32m+\e[m\e[32m.btn-default[disabled].focus,\e[m
+\e[32m+\e[m\e[32mfieldset[disabled] .btn-default.focus {\e[m
+\e[32m+\e[m\e[32m  background-color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  border-color: #cccccc;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-default .badge {\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  background-color: #333333;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-primary {\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  background-color: #337ab7;\e[m
+\e[32m+\e[m\e[32m  border-color: #2e6da4;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-primary:focus,\e[m
+\e[32m+\e[m\e[32m.btn-primary.focus {\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  background-color: #286090;\e[m
+\e[32m+\e[m\e[32m  border-color: #122b40;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-primary:hover {\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  background-color: #286090;\e[m
+\e[32m+\e[m\e[32m  border-color: #204d74;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-primary:active,\e[m
+\e[32m+\e[m\e[32m.btn-primary.active,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-primary {\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  background-color: #286090;\e[m
+\e[32m+\e[m\e[32m  border-color: #204d74;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-primary:active:hover,\e[m
+\e[32m+\e[m\e[32m.btn-primary.active:hover,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-primary:hover,\e[m
+\e[32m+\e[m\e[32m.btn-primary:active:focus,\e[m
+\e[32m+\e[m\e[32m.btn-primary.active:focus,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-primary:focus,\e[m
+\e[32m+\e[m\e[32m.btn-primary:active.focus,\e[m
+\e[32m+\e[m\e[32m.btn-primary.active.focus,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-primary.focus {\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  background-color: #204d74;\e[m
+\e[32m+\e[m\e[32m  border-color: #122b40;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-primary:active,\e[m
+\e[32m+\e[m\e[32m.btn-primary.active,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-primary {\e[m
+\e[32m+\e[m\e[32m  background-image: none;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-primary.disabled:hover,\e[m
+\e[32m+\e[m\e[32m.btn-primary[disabled]:hover,\e[m
+\e[32m+\e[m\e[32mfieldset[disabled] .btn-primary:hover,\e[m
+\e[32m+\e[m\e[32m.btn-primary.disabled:focus,\e[m
+\e[32m+\e[m\e[32m.btn-primary[disabled]:focus,\e[m
+\e[32m+\e[m\e[32mfieldset[disabled] .btn-primary:focus,\e[m
+\e[32m+\e[m\e[32m.btn-primary.disabled.focus,\e[m
+\e[32m+\e[m\e[32m.btn-primary[disabled].focus,\e[m
+\e[32m+\e[m\e[32mfieldset[disabled] .btn-primary.focus {\e[m
+\e[32m+\e[m\e[32m  background-color: #337ab7;\e[m
+\e[32m+\e[m\e[32m  border-color: #2e6da4;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-primary .badge {\e[m
+\e[32m+\e[m\e[32m  color: #337ab7;\e[m
+\e[32m+\e[m\e[32m  background-color: #ffffff;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-success {\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  background-color: #5cb85c;\e[m
+\e[32m+\e[m\e[32m  border-color: #4cae4c;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-success:focus,\e[m
+\e[32m+\e[m\e[32m.btn-success.focus {\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  background-color: #449d44;\e[m
+\e[32m+\e[m\e[32m  border-color: #255625;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-success:hover {\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  background-color: #449d44;\e[m
+\e[32m+\e[m\e[32m  border-color: #398439;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-success:active,\e[m
+\e[32m+\e[m\e[32m.btn-success.active,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-success {\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  background-color: #449d44;\e[m
+\e[32m+\e[m\e[32m  border-color: #398439;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-success:active:hover,\e[m
+\e[32m+\e[m\e[32m.btn-success.active:hover,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-success:hover,\e[m
+\e[32m+\e[m\e[32m.btn-success:active:focus,\e[m
+\e[32m+\e[m\e[32m.btn-success.active:focus,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-success:focus,\e[m
+\e[32m+\e[m\e[32m.btn-success:active.focus,\e[m
+\e[32m+\e[m\e[32m.btn-success.active.focus,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-success.focus {\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  background-color: #398439;\e[m
+\e[32m+\e[m\e[32m  border-color: #255625;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-success:active,\e[m
+\e[32m+\e[m\e[32m.btn-success.active,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-success {\e[m
+\e[32m+\e[m\e[32m  background-image: none;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-success.disabled:hover,\e[m
+\e[32m+\e[m\e[32m.btn-success[disabled]:hover,\e[m
+\e[32m+\e[m\e[32mfieldset[disabled] .btn-success:hover,\e[m
+\e[32m+\e[m\e[32m.btn-success.disabled:focus,\e[m
+\e[32m+\e[m\e[32m.btn-success[disabled]:focus,\e[m
+\e[32m+\e[m\e[32mfieldset[disabled] .btn-success:focus,\e[m
+\e[32m+\e[m\e[32m.btn-success.disabled.focus,\e[m
+\e[32m+\e[m\e[32m.btn-success[disabled].focus,\e[m
+\e[32m+\e[m\e[32mfieldset[disabled] .btn-success.focus {\e[m
+\e[32m+\e[m\e[32m  background-color: #5cb85c;\e[m
+\e[32m+\e[m\e[32m  border-color: #4cae4c;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-success .badge {\e[m
+\e[32m+\e[m\e[32m  color: #5cb85c;\e[m
+\e[32m+\e[m\e[32m  background-color: #ffffff;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-info {\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  background-color: #5bc0de;\e[m
+\e[32m+\e[m\e[32m  border-color: #46b8da;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-info:focus,\e[m
+\e[32m+\e[m\e[32m.btn-info.focus {\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  background-color: #31b0d5;\e[m
+\e[32m+\e[m\e[32m  border-color: #1b6d85;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-info:hover {\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  background-color: #31b0d5;\e[m
+\e[32m+\e[m\e[32m  border-color: #269abc;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-info:active,\e[m
+\e[32m+\e[m\e[32m.btn-info.active,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-info {\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  background-color: #31b0d5;\e[m
+\e[32m+\e[m\e[32m  border-color: #269abc;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-info:active:hover,\e[m
+\e[32m+\e[m\e[32m.btn-info.active:hover,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-info:hover,\e[m
+\e[32m+\e[m\e[32m.btn-info:active:focus,\e[m
+\e[32m+\e[m\e[32m.btn-info.active:focus,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-info:focus,\e[m
+\e[32m+\e[m\e[32m.btn-info:active.focus,\e[m
+\e[32m+\e[m\e[32m.btn-info.active.focus,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-info.focus {\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  background-color: #269abc;\e[m
+\e[32m+\e[m\e[32m  border-color: #1b6d85;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-info:active,\e[m
+\e[32m+\e[m\e[32m.btn-info.active,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-info {\e[m
+\e[32m+\e[m\e[32m  background-image: none;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-info.disabled:hover,\e[m
+\e[32m+\e[m\e[32m.btn-info[disabled]:hover,\e[m
+\e[32m+\e[m\e[32mfieldset[disabled] .btn-info:hover,\e[m
+\e[32m+\e[m\e[32m.btn-info.disabled:focus,\e[m
+\e[32m+\e[m\e[32m.btn-info[disabled]:focus,\e[m
+\e[32m+\e[m\e[32mfieldset[disabled] .btn-info:focus,\e[m
+\e[32m+\e[m\e[32m.btn-info.disabled.focus,\e[m
+\e[32m+\e[m\e[32m.btn-info[disabled].focus,\e[m
+\e[32m+\e[m\e[32mfieldset[disabled] .btn-info.focus {\e[m
+\e[32m+\e[m\e[32m  background-color: #5bc0de;\e[m
+\e[32m+\e[m\e[32m  border-color: #46b8da;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-info .badge {\e[m
+\e[32m+\e[m\e[32m  color: #5bc0de;\e[m
+\e[32m+\e[m\e[32m  background-color: #ffffff;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-warning {\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  background-color: #f0ad4e;\e[m
+\e[32m+\e[m\e[32m  border-color: #eea236;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-warning:focus,\e[m
+\e[32m+\e[m\e[32m.btn-warning.focus {\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  background-color: #ec971f;\e[m
+\e[32m+\e[m\e[32m  border-color: #985f0d;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-warning:hover {\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  background-color: #ec971f;\e[m
+\e[32m+\e[m\e[32m  border-color: #d58512;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-warning:active,\e[m
+\e[32m+\e[m\e[32m.btn-warning.active,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-warning {\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  background-color: #ec971f;\e[m
+\e[32m+\e[m\e[32m  border-color: #d58512;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-warning:active:hover,\e[m
+\e[32m+\e[m\e[32m.btn-warning.active:hover,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-warning:hover,\e[m
+\e[32m+\e[m\e[32m.btn-warning:active:focus,\e[m
+\e[32m+\e[m\e[32m.btn-warning.active:focus,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-warning:focus,\e[m
+\e[32m+\e[m\e[32m.btn-warning:active.focus,\e[m
+\e[32m+\e[m\e[32m.btn-warning.active.focus,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-warning.focus {\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  background-color: #d58512;\e[m
+\e[32m+\e[m\e[32m  border-color: #985f0d;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-warning:active,\e[m
+\e[32m+\e[m\e[32m.btn-warning.active,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-warning {\e[m
+\e[32m+\e[m\e[32m  background-image: none;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-warning.disabled:hover,\e[m
+\e[32m+\e[m\e[32m.btn-warning[disabled]:hover,\e[m
+\e[32m+\e[m\e[32mfieldset[disabled] .btn-warning:hover,\e[m
+\e[32m+\e[m\e[32m.btn-warning.disabled:focus,\e[m
+\e[32m+\e[m\e[32m.btn-warning[disabled]:focus,\e[m
+\e[32m+\e[m\e[32mfieldset[disabled] .btn-warning:focus,\e[m
+\e[32m+\e[m\e[32m.btn-warning.disabled.focus,\e[m
+\e[32m+\e[m\e[32m.btn-warning[disabled].focus,\e[m
+\e[32m+\e[m\e[32mfieldset[disabled] .btn-warning.focus {\e[m
+\e[32m+\e[m\e[32m  background-color: #f0ad4e;\e[m
+\e[32m+\e[m\e[32m  border-color: #eea236;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-warning .badge {\e[m
+\e[32m+\e[m\e[32m  color: #f0ad4e;\e[m
+\e[32m+\e[m\e[32m  background-color: #ffffff;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-danger {\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  background-color: #d9534f;\e[m
+\e[32m+\e[m\e[32m  border-color: #d43f3a;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-danger:focus,\e[m
+\e[32m+\e[m\e[32m.btn-danger.focus {\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  background-color: #c9302c;\e[m
+\e[32m+\e[m\e[32m  border-color: #761c19;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-danger:hover {\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  background-color: #c9302c;\e[m
+\e[32m+\e[m\e[32m  border-color: #ac2925;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-danger:active,\e[m
+\e[32m+\e[m\e[32m.btn-danger.active,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-danger {\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  background-color: #c9302c;\e[m
+\e[32m+\e[m\e[32m  border-color: #ac2925;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-danger:active:hover,\e[m
+\e[32m+\e[m\e[32m.btn-danger.active:hover,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-danger:hover,\e[m
+\e[32m+\e[m\e[32m.btn-danger:active:focus,\e[m
+\e[32m+\e[m\e[32m.btn-danger.active:focus,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-danger:focus,\e[m
+\e[32m+\e[m\e[32m.btn-danger:active.focus,\e[m
+\e[32m+\e[m\e[32m.btn-danger.active.focus,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-danger.focus {\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  background-color: #ac2925;\e[m
+\e[32m+\e[m\e[32m  border-color: #761c19;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-danger:active,\e[m
+\e[32m+\e[m\e[32m.btn-danger.active,\e[m
+\e[32m+\e[m\e[32m.open > .dropdown-toggle.btn-danger {\e[m
+\e[32m+\e[m\e[32m  background-image: none;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-danger.disabled:hover,\e[m
+\e[32m+\e[m\e[32m.btn-danger[disabled]:hover,\e[m
+\e[32m+\e[m\e[32mfieldset[disabled] .btn-danger:hover,\e[m
+\e[32m+\e[m\e[32m.btn-danger.disabled:focus,\e[m
+\e[32m+\e[m\e[32m.btn-danger[disabled]:focus,\e[m
+\e[32m+\e[m\e[32mfieldset[disabled] .btn-danger:focus,\e[m
+\e[32m+\e[m\e[32m.btn-danger.disabled.focus,\e[m
+\e[32m+\e[m\e[32m.btn-danger[disabled].focus,\e[m
+\e[32m+\e[m\e[32mfieldset[disabled] .btn-danger.focus {\e[m
+\e[32m+\e[m\e[32m  background-color: #d9534f;\e[m
+\e[32m+\e[m\e[32m  border-color: #d43f3a;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-danger .badge {\e[m
+\e[32m+\e[m\e[32m  color: #d9534f;\e[m
+\e[32m+\e[m\e[32m  background-color: #ffffff;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-link {\e[m
+\e[32m+\e[m\e[32m  color: #337ab7;\e[m
+\e[32m+\e[m\e[32m  font-weight: normal;\e[m
+\e[32m+\e[m\e[32m  border-radius: 0;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-link,\e[m
+\e[32m+\e[m\e[32m.btn-link:active,\e[m
+\e[32m+\e[m\e[32m.btn-link.active,\e[m
+\e[32m+\e[m\e[32m.btn-link[disabled],\e[m
+\e[32m+\e[m\e[32mfieldset[disabled] .btn-link {\e[m
+\e[32m+\e[m\e[32m  background-color: transparent;\e[m
+\e[32m+\e[m\e[32m  -webkit-box-shadow: none;\e[m
+\e[32m+\e[m\e[32m  box-shadow: none;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-link,\e[m
+\e[32m+\e[m\e[32m.btn-link:hover,\e[m
+\e[32m+\e[m\e[32m.btn-link:focus,\e[m
+\e[32m+\e[m\e[32m.btn-link:active {\e[m
+\e[32m+\e[m\e[32m  border-color: transparent;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-link:hover,\e[m
+\e[32m+\e[m\e[32m.btn-link:focus {\e[m
+\e[32m+\e[m\e[32m  color: #23527c;\e[m
+\e[32m+\e[m\e[32m  text-decoration: underline;\e[m
+\e[32m+\e[m\e[32m  background-color: transparent;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-link[disabled]:hover,\e[m
+\e[32m+\e[m\e[32mfieldset[disabled] .btn-link:hover,\e[m
+\e[32m+\e[m\e[32m.btn-link[disabled]:focus,\e[m
+\e[32m+\e[m\e[32mfieldset[disabled] .btn-link:focus {\e[m
+\e[32m+\e[m\e[32m  color: #777777;\e[m
+\e[32m+\e[m\e[32m  text-decoration: none;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-lg,\e[m
+\e[32m+\e[m\e[32m.btn-group-lg > .btn {\e[m
+\e[32m+\e[m\e[32m  padding: 10px 16px;\e[m
+\e[32m+\e[m\e[32m  font-size: 18px;\e[m
+\e[32m+\e[m\e[32m  line-height: 1.3333333;\e[m
+\e[32m+\e[m\e[32m  border-radius: 6px;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-sm,\e[m
+\e[32m+\e[m\e[32m.btn-group-sm > .btn {\e[m
+\e[32m+\e[m\e[32m  padding: 5px 10px;\e[m
+\e[32m+\e[m\e[32m  font-size: 12px;\e[m
+\e[32m+\e[m\e[32m  line-height: 1.5;\e[m
+\e[32m+\e[m\e[32m  border-radius: 3px;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-xs,\e[m
+\e[32m+\e[m\e[32m.btn-group-xs > .btn {\e[m
+\e[32m+\e[m\e[32m  padding: 1px 5px;\e[m
+\e[32m+\e[m\e[32m  font-size: 12px;\e[m
+\e[32m+\e[m\e[32m  line-height: 1.5;\e[m
+\e[32m+\e[m\e[32m  border-radius: 3px;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-block {\e[m
+\e[32m+\e[m\e[32m  display: block;\e[m
+\e[32m+\e[m\e[32m  width: 100%;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.btn-block + .btn-block {\e[m
+\e[32m+\e[m\e[32m  margin-top: 5px;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32minput[type="submit"].btn-block,\e[m
+\e[32m+\e[m\e[32minput[type="reset"].btn-block,\e[m
+\e[32m+\e[m\e[32minput[type="button"].btn-block {\e[m
+\e[32m+\e[m\e[32m  width: 100%;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\ No newline at end of file\e[m
+\e[1mdiff --git a/css/upload-cropbox.css b/css/upload-cropbox.css\e[m
+\e[1mnew file mode 100644\e[m
+\e[1mindex 0000000000..f8500935aa\e[m
+\e[1m--- /dev/null\e[m
+\e[1m+++ b/css/upload-cropbox.css\e[m
+\e[36m@@ -0,0 +1,62 @@\e[m
+\e[32m+\e[m\e[32m.roo-upload-cropbox-selector {\e[m
+\e[32m+\e[m\e[32m  visibility: hidden;\e[m
+\e[32m+\e[m\e[32m  height: 0px;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.roo-upload-cropbox-dialog .modal-header,\e[m
+\e[32m+\e[m\e[32m.roo-upload-cropbox-dialog .modal-footer {\e[m
+\e[32m+\e[m\e[32m  padding-top: 5px;\e[m
+\e[32m+\e[m\e[32m  padding-bottom: 5px;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.roo-upload-cropbox-body {\e[m
+\e[32m+\e[m\e[32m  background-color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  border: 1px solid #777777;\e[m
+\e[32m+\e[m\e[32m  width: 100%;\e[m
+\e[32m+\e[m\e[32m  height: 450px;\e[m
+\e[32m+\e[m\e[32m  max-height: 450px;\e[m
+\e[32m+\e[m\e[32m  position: relative;\e[m
+\e[32m+\e[m\e[32m  overflow: hidden;\e[m
+\e[32m+\e[m\e[32m  cursor: move;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.roo-upload-cropbox-preview {\e[m
+\e[32m+\e[m\e[32m  position: absolute;\e[m
+\e[32m+\e[m\e[32m  top: 0px;\e[m
+\e[32m+\e[m\e[32m  left: 0px;\e[m
+\e[32m+\e[m\e[32m  text-align: center;\e[m
+\e[32m+\e[m\e[32m  margin: 0px;\e[m
+\e[32m+\e[m\e[32m  padding: 0px;\e[m
+\e[32m+\e[m\e[32m  border: none;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.roo-upload-cropbox-body .roo-upload-cropbox-thumb {\e[m
+\e[32m+\e[m\e[32m  position: absolute;\e[m
+\e[32m+\e[m\e[32m  /*    top: 50%;\e[m
+\e[32m+\e[m\e[32m    left: 50%;\e[m
+\e[32m+\e[m\e[32m    transform: translate(-50%, -50%);*/\e[m
+\e[32m+\e[m\e[32m  box-sizing: border-box;\e[m
+\e[32m+\e[m\e[32m  border: 1px solid #777777;\e[m
+\e[32m+\e[m\e[32m  box-shadow: 0 0 0 1000px rgba(0, 0, 0, 0.5);\e[m
+\e[32m+\e[m\e[32m  background: none repeat scroll 0% 0% transparent;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.roo-upload-cropbox-body .roo-upload-cropbox-empty-notify {\e[m
+\e[32m+\e[m\e[32m  height: 100%;\e[m
+\e[32m+\e[m\e[32m  background-color: rgba(0, 0, 0, 0.5);\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  font-weight: bold;\e[m
+\e[32m+\e[m\e[32m  font-size: 24px;\e[m
+\e[32m+\e[m\e[32m  text-align: center;\e[m
+\e[32m+\e[m\e[32m  padding-top: 50px;\e[m
+\e[32m+\e[m\e[32m  font-style: italic;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.roo-upload-cropbox-btn-group button {\e[m
+\e[32m+\e[m\e[32m  background-color: #000000;\e[m
+\e[32m+\e[m\e[32m  color: #ffffff;\e[m
+\e[32m+\e[m\e[32m  border-color: #333333;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m\e[32m.roo-upload-cropbox-error-notify {\e[m
+\e[32m+\e[m\e[32m  border-radius: 0px;\e[m
+\e[32m+\e[m\e[32m  text-align: center;\e[m
+\e[32m+\e[m\e[32m  padding: 0px !important;\e[m
+\e[32m+\e[m\e[32m  margin: 0px !important;\e[m
+\e[32m+\e[m\e[32m  position: absolute;\e[m
+\e[32m+\e[m\e[32m  top: 0;\e[m
+\e[32m+\e[m\e[32m  left: 0;\e[m
+\e[32m+\e[m\e[32m}\e[m
+\ No newline at end of file\e[m
+\e[1mdiff --git a/examples/dialog/hello.html b/examples/dialog/hello.html\e[m
+\e[1mindex ab43ed9999..ec001bf313 100644\e[m
+\e[1m--- a/examples/dialog/hello.html\e[m
+\e[1m+++ b/examples/dialog/hello.html\e[m
+\e[36m@@ -1,27 +1,27 @@\e[m
+\e[31m-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">\e[m\r
+\e[31m-<html>\e[m\r
+\e[31m-<head>\e[m\r
+\e[31m-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">\e[m\r
+\e[31m-<title>Hello World Dialog Example</title>\e[m\r
+\e[32m+\e[m\e[32m<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">\e[m
+\e[32m+\e[m\e[32m<html>\e[m
+\e[32m+\e[m\e[32m<head>\e[m
+\e[32m+\e[m\e[32m<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">\e[m
+\e[32m+\e[m\e[32m<title>Hello World Dialog Example</title>\e[m
+  <link rel="stylesheet" type="text/css" href="../../css/roojs-debug.css"/>\e[m
+     <link rel="stylesheet" type="text/css" href="../../css/xtheme-slate.css"/>\e[m
\e[m
+      <script type="text/javascript" src="../../roojs-debug.js"></script>   \e[m
+\e[31m-  \e[m\r
+\e[31m-     <script language="javascript" src="hello.js"></script>\e[m\r
+\e[31m- \e[m\r
+\e[31m-<!-- Common Styles for the examples -->\e[m\r
+\e[31m-<link rel="stylesheet" type="text/css" href="../examples.css" />\e[m\r
+\e[31m-</head>\e[m\r
+\e[31m-<body>\e[m\r
+\e[31m-<script type="text/javascript" src="../examples.js"></script><!-- EXAMPLES -->\e[m\r
+\e[31m-\e[m\r
+\e[31m-<h1>Hello World Dialog</h1>\e[m\r
+\e[31m-<p>This example shows how to create a very simple modal BasicDialog with "autoTabs".</p>\e[m\r
+\e[31m-<input type="button" id="show-dialog-btn" value="Hello World" /><br /><br />\e[m\r
+\e[32m+\e[m\e[41m  \e[m
+\e[32m+\e[m\e[32m     <script language="javascript" src="hello.js"></script>\e[m
+\e[32m+\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m<!-- Common Styles for the examples -->\e[m
+\e[32m+\e[m\e[32m<link rel="stylesheet" type="text/css" href="../examples.css" />\e[m
+\e[32m+\e[m\e[32m</head>\e[m
+\e[32m+\e[m\e[32m<body>\e[m
+\e[32m+\e[m\e[32m<script type="text/javascript" src="../examples.js"></script><!-- EXAMPLES -->\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m<h1>Hello World Dialog</h1>\e[m
+\e[32m+\e[m\e[32m<p>This example shows how to create a very simple modal BasicDialog with "autoTabs".</p>\e[m
+\e[32m+\e[m\e[32m<input type="button" id="show-dialog-btn" value="Hello World" /><br /><br />\e[m
+ <p>Note that the js is not minified so it is readable. See \e[m
+\e[31m-<button type="button" onclick="RooDocs.viewSource.show('/hello.js')">hello.js</button>for the full source code.</p>\e[m\r
+\e[31m-Here's snapshot of the code that creates the dialog:\e[m\r
+\e[32m+\e[m\e[32m<button type="button" onclick="RooDocs.viewSource.show('/hello.js')">hello.js</button>for the full source code.</p>\e[m
+\e[32m+\e[m\e[32mHere's snapshot of the code that creates the dialog:\e[m
+ <pre class="code"><code>Roo.BLANK_IMAGE_URL  = "../../images/default/s.gif";\e[m
\e[m
\e[m
+\e[36m@@ -121,29 +121,29 @@\e[m \e[mRoo.onReady(function() {\e[m
+     Roo.get('show-dialog-btn').on('click',function () {\e[m
+         HelloWorld.show({ _el : this});\e[m
+     });\e[m
+\e[31m-});\e[m\r
+\e[31m-</code></pre>\e[m\r
+\e[31m-\e[m\r
+\e[31m-    <!-- The dialog is created from existing markup.\e[m\r
+\e[31m-         The inline styles just hide it until it created and should be in a stylesheet -->\e[m\r
+\e[31m-    <div id="hello-dlg" style="visibility:hidden;position:absolute;top:0px;">\e[m\r
+\e[31m-    <div class="x-dlg-hd">Hello Dialog</div>\e[m\r
+\e[31m-    <div class="x-dlg-bd">\e[m\r
+\e[31m-        <!-- Auto create tab 1 -->\e[m\r
+\e[31m-        <div class="x-dlg-tab" title="Hello World 1">\e[m\r
+\e[31m-            <!-- Nested "inner-tab" to safely add padding -->\e[m\r
+\e[31m-            <div class="inner-tab">\e[m\r
+\e[31m-                 Hello...<br><br><br>\e[m\r
+\e[31m-            </div>\e[m\r
+\e[31m-        </div>\e[m\r
+\e[31m-        <!-- Auto create tab 2 -->\e[m\r
+\e[31m-        <div class="x-dlg-tab" title="Hello World 2">\e[m\r
+\e[31m-            <div class="inner-tab">\e[m\r
+\e[31m-            ... World!\e[m\r
+\e[31m-            </div>\e[m\r
+\e[31m-        </div>\e[m\r
+\e[31m-        </div>\e[m\r
+\e[31m-    </div>\e[m\r
+\e[31m-</div>\e[m\r
+\e[31m-</body>\e[m\r
+\e[31m-</html>\e[m\r
+\e[32m+\e[m\e[32m});\e[m
+\e[32m+\e[m\e[32m</code></pre>\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m    <!-- The dialog is created from existing markup.\e[m
+\e[32m+\e[m\e[32m         The inline styles just hide it until it created and should be in a stylesheet -->\e[m
+\e[32m+\e[m\e[32m    <div id="hello-dlg" style="visibility:hidden;position:absolute;top:0px;">\e[m
+\e[32m+\e[m\e[32m    <div class="x-dlg-hd">Hello Dialog</div>\e[m
+\e[32m+\e[m\e[32m    <div class="x-dlg-bd">\e[m
+\e[32m+\e[m\e[32m        <!-- Auto create tab 1 -->\e[m
+\e[32m+\e[m\e[32m        <div class="x-dlg-tab" title="Hello World 1">\e[m
+\e[32m+\e[m\e[32m            <!-- Nested "inner-tab" to safely add padding -->\e[m
+\e[32m+\e[m\e[32m            <div class="inner-tab">\e[m
+\e[32m+\e[m\e[32m                 Hello...<br><br><br>\e[m
+\e[32m+\e[m\e[32m            </div>\e[m
+\e[32m+\e[m\e[32m        </div>\e[m
+\e[32m+\e[m\e[32m        <!-- Auto create tab 2 -->\e[m
+\e[32m+\e[m\e[32m        <div class="x-dlg-tab" title="Hello World 2">\e[m
+\e[32m+\e[m\e[32m            <div class="inner-tab">\e[m
+\e[32m+\e[m\e[32m            ... World!\e[m
+\e[32m+\e[m\e[32m            </div>\e[m
+\e[32m+\e[m\e[32m        </div>\e[m
+\e[32m+\e[m\e[32m        </div>\e[m
+\e[32m+\e[m\e[32m    </div>\e[m
+\e[32m+\e[m\e[32m</div>\e[m
+\e[32m+\e[m\e[32m</body>\e[m
+\e[32m+\e[m\e[32m</html>\e[m
+\e[1mdiff --git a/examples/dialog/test-2.html b/examples/dialog/test-2.html\e[m
+\e[1mnew file mode 100644\e[m
+\e[1mindex 0000000000..e26d6ee586\e[m
+\e[1m--- /dev/null\e[m
+\e[1m+++ b/examples/dialog/test-2.html\e[m
+\e[36m@@ -0,0 +1,30 @@\e[m
+\e[32m+\e[m\e[32m<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">\e[m
+\e[32m+\e[m\e[32m<html>\e[m
+\e[32m+\e[m\e[32m<head>\e[m
+\e[32m+\e[m\e[32m    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">\e[m
+\e[32m+\e[m\e[32m    <title>Upload Cropbox Dialog Example</title>\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m    <link rel="stylesheet" type="text/css" href="../../css/roojs-debug.css"/>\e[m
+\e[32m+\e[m\e[32m    <link rel="stylesheet" type="text/css" href="../../css-bootstrap/font-awesome.css"/>\e[m
+\e[32m+\e[m\e[32m    <link rel="stylesheet" type="text/css" href="../../css/upload-cropbox.css"/>\e[m
+\e[32m+\e[m\e[32m    <link rel="stylesheet" type="text/css" href="../../css/alert.css"/>\e[m
+\e[32m+\e[m\e[32m    <link rel="stylesheet" type="text/css" href="../../css/buttons.css"/>\e[m
+\e[32m+\e[m\e[32m    <link rel="stylesheet" type="text/css" href="../../css/button-groups.css"/>\e[m
+\e[32m+\e[m\e[32m    <link rel="stylesheet" type="text/css" href="../examples.css" />\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m     <script type="text/javascript" src="../../roojs-debug.js"></script>\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m     <script language="javascript" src="test-2.js"></script>\e[m
+\e[32m+\e[m\e[32m     <script type="text/javascript" src="../examples.js"></script>\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m</head>\e[m
+\e[32m+\e[m\e[32m<body>\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m<h1>Upload Cropbox Dialog</h1>\e[m
+\e[32m+\e[m\e[32m<p>This example shows how to create a very simple BasicDialog with "UploadCropbox".</p>\e[m
+\e[32m+\e[m\e[32m<input type="button" id="show-dialog-btn" value="test" /><br /><br />\e[m
+\e[32m+\e[m\e[32m<p>Note that the js is not minified so it is readable. See\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m<button type="button" onclick="RooDocs.viewSource.show('../../../Roo/dialog/UploadCropbox.js')">UploadCropbox.js</button>for the full source code.</p>\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m</div>\e[m
+\e[32m+\e[m\e[32m</body>\e[m
+\e[32m+\e[m\e[32m</html>\e[m
+\e[1mdiff --git a/examples/dialog/test-2.js b/examples/dialog/test-2.js\e[m
+\e[1mnew file mode 100644\e[m
+\e[1mindex 0000000000..c4dcdedd7e\e[m
+\e[1m--- /dev/null\e[m
+\e[1m+++ b/examples/dialog/test-2.js\e[m
+\e[36m@@ -0,0 +1,171 @@\e[m
+\e[32m+\e[m\e[32mvar uploadCropbox = {\e[m
+\e[32m+\e[m\e[32m    dialog : false,\e[m
+\e[32m+\e[m\e[32m    callback : false,\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m    show : function(data, cb)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        if (!this.dialog) {\e[m
+\e[32m+\e[m\e[32m            this.create();\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        this.callback = cb;\e[m
+\e[32m+\e[m\e[32m        this.data = data;\e[m
+\e[32m+\e[m\e[32m        this.dialog.show();\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m    create : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var _this = this;\e[m
+\e[32m+\e[m\e[32m        this.dialog = Roo.factory({\e[m
+\e[32m+\e[m\e[32m            xns : Roo,\e[m
+\e[32m+\e[m\e[32m            xtype : 'LayoutDialog',\e[m
+\e[32m+\e[m\e[32m            width : 800,\e[m
+\e[32m+\e[m\e[32m            height : 600,\e[m
+\e[32m+\e[m\e[32m            center : {\e[m
+\e[32m+\e[m\e[32m                xns : Roo,\e[m
+\e[32m+\e[m\e[32m                xtype : 'LayoutRegion'\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            items : [\e[m
+\e[32m+\e[m\e[32m                {\e[m
+\e[32m+\e[m\e[32m                    xtype: 'ContentPanel',\e[m
+\e[32m+\e[m\e[32m                    xns: Roo,\e[m
+\e[32m+\e[m\e[32m                    region : "center",\e[m
+\e[32m+\e[m\e[32m                    items : [\e[m
+\e[32m+\e[m\e[32m                        {\e[m
+\e[32m+\e[m\e[32m                            xtype : 'UploadCropbox',\e[m
+\e[32m+\e[m\e[32m                            xns : Roo.dialog,\e[m
+\e[32m+\e[m\e[32m                            minWidth : 720,\e[m
+\e[32m+\e[m\e[32m                            minHeight: 480,\e[m
+\e[32m+\e[m\e[32m                            buttons: [],\e[m
+\e[32m+\e[m\e[32m                            listeners : {\e[m
+\e[32m+\e[m\e[32m                                render : function (_self)\e[m
+\e[32m+\e[m\e[32m                                {\e[m
+\e[32m+\e[m\e[32m                                    _this.cropbox = _self;\e[m
+\e[32m+\e[m\e[32m                                },\e[m
+\e[32m+\e[m\e[32m                                loadcanvas : function (_self, imageEl)\e[m
+\e[32m+\e[m\e[32m                                {\e[m
+\e[32m+\e[m\e[32m                                    if(imageEl.OriginWidth < 720) {\e[m
+\e[32m+\e[m\e[32m                                        Roo.Msg.show({\e[m
+\e[32m+\e[m\e[32m                                            title: 'Error',\e[m
+\e[32m+\e[m\e[32m                                            msg: "Image width should be at least 720",\e[m
+\e[32m+\e[m\e[32m                                            buttons: {ok : true},\e[m
+\e[32m+\e[m\e[32m                                            fn: function(res) {\e[m
+\e[32m+\e[m\e[32m                                                _this.cropbox.selectorEl.dom.click();\e[m
+\e[32m+\e[m\e[32m                                            }\e[m
+\e[32m+\e[m\e[32m                                        });\e[m
+\e[32m+\e[m\e[32m                                        return false;\e[m
+\e[32m+\e[m\e[32m                                    }\e[m
+\e[32m+\e[m\e[32m                                }\e[m
+\e[32m+\e[m\e[32m                            }\e[m
+\e[32m+\e[m\e[32m                        }\e[m
+\e[32m+\e[m\e[32m                    ]\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[32m            ],\e[m
+\e[32m+\e[m\e[32m            buttons : [\e[m
+\e[32m+\e[m\e[32m                {\e[m
+\e[32m+\e[m\e[32m                    xtype : 'Button',\e[m
+\e[32m+\e[m\e[32m                    xns : Roo,\e[m
+\e[32m+\e[m\e[32m                    text : 'Save',\e[m
+\e[32m+\e[m\e[32m                    listeners : {\e[m
+\e[32m+\e[m\e[32m                        click : function () {\e[m
+\e[32m+\e[m\e[32m                        }\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                },\e[m
+\e[32m+\e[m\e[32m                {\e[m
+\e[32m+\e[m\e[32m                    xtype : 'Button',\e[m
+\e[32m+\e[m\e[32m                    xns : Roo,\e[m
+\e[32m+\e[m\e[32m                    text : 'Cancel',\e[m
+\e[32m+\e[m\e[32m                    listeners : {\e[m
+\e[32m+\e[m\e[32m                        click : function () {\e[m
+\e[32m+\e[m\e[32m                            _this.dialog.hide()\e[m
+\e[32m+\e[m\e[32m                        }\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[32m            ]\e[m
+\e[32m+\e[m\e[32m        });\e[m
+\e[32m+\e[m\e[32m    }\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32mvar test = {\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m    dialog : false,\e[m
+\e[32m+\e[m\e[32m    callback : false,\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m    show : function(data, cb)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        if (!this.dialog) {\e[m
+\e[32m+\e[m\e[32m            this.create();\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        this.callback = cb;\e[m
+\e[32m+\e[m\e[32m        this.data = data;\e[m
+\e[32m+\e[m\e[32m        this.dialog.show();\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m    create : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var _this = this;\e[m
+\e[32m+\e[m\e[32m        this.dialog = Roo.factory({\e[m
+\e[32m+\e[m\e[32m            xns : Roo,\e[m
+\e[32m+\e[m\e[32m            xtype : 'LayoutDialog',\e[m
+\e[32m+\e[m\e[32m            width : 600,\e[m
+\e[32m+\e[m\e[32m            height : 450,\e[m
+\e[32m+\e[m\e[32m            center : {\e[m
+\e[32m+\e[m\e[32m                xns : Roo,\e[m
+\e[32m+\e[m\e[32m                xtype : 'LayoutRegion'\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            items : [\e[m
+\e[32m+\e[m\e[32m                {\e[m
+\e[32m+\e[m\e[32m                    xns : Roo,\e[m
+\e[32m+\e[m\e[32m                    xtype: 'GridPanel',\e[m
+\e[32m+\e[m\e[32m                    region : "center",\e[m
+\e[32m+\e[m\e[32m                    grid : {\e[m
+\e[32m+\e[m\e[32m                        xns : Roo.grid,\e[m
+\e[32m+\e[m\e[32m                        xtype : 'Grid',\e[m
+\e[32m+\e[m\e[32m                        cm : [\e[m
+\e[32m+\e[m\e[32m                            {\e[m
+\e[32m+\e[m\e[32m                                xns : Roo.grid,\e[m
+\e[32m+\e[m\e[32m                                xtype : 'ColumnModel',\e[m
+\e[32m+\e[m\e[32m                                header : 'test'\e[m
+\e[32m+\e[m\e[32m                            }\e[m
+\e[32m+\e[m\e[32m                        ],\e[m
+\e[32m+\e[m\e[32m                        ds : {\e[m
+\e[32m+\e[m\e[32m                            xns: Roo.data,\e[m
+\e[32m+\e[m\e[32m                            xtype: 'Store'\e[m
+\e[32m+\e[m\e[32m                        },\e[m
+\e[32m+\e[m\e[32m                        toolbar : {\e[m
+\e[32m+\e[m\e[32m                            xns: Roo,\e[m
+\e[32m+\e[m\e[32m                            xtype: 'Toolbar',\e[m
+\e[32m+\e[m\e[32m                            items : [\e[m
+\e[32m+\e[m\e[32m                                {\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                                    xtype : 'Button',\e[m
+\e[32m+\e[m\e[32m                                    text : 'Add',\e[m
+\e[32m+\e[m\e[32m                                    listeners : {\e[m
+\e[32m+\e[m\e[32m                                        click : function () {\e[m
+\e[32m+\e[m\e[32m                                            uploadCropbox.show();\e[m
+\e[32m+\e[m\e[32m                                            document.body.onfocus = function(e) {\e[m
+\e[32m+\e[m\e[32m                                                document.body.onfocus = null;\e[m
+\e[32m+\e[m\e[32m                                                if(!uploadCropbox.cropbox.selectorEl.dom.files.length) {\e[m
+\e[32m+\e[m\e[32m                                                    uploadCropbox.dialog.hide();\e[m
+\e[32m+\e[m\e[32m                                                }\e[m
+\e[32m+\e[m\e[32m                                            }\e[m
+\e[32m+\e[m\e[32m                                            uploadCropbox.cropbox.selectorEl.dom.click();\e[m
+\e[32m+\e[m\e[32m                                        }\e[m
+\e[32m+\e[m\e[32m                                    }\e[m
+\e[32m+\e[m\e[32m                                }\e[m
+\e[32m+\e[m\e[32m                            ]\e[m
+\e[32m+\e[m\e[32m                        }\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[32m            ],\e[m
+\e[32m+\e[m\e[32m        });\e[m
+\e[32m+\e[m\e[32m    }\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32mRoo.onReady(function() {\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    Roo.get('show-dialog-btn').on('click',function () {\e[m
+\e[32m+\e[m\e[32m        test.show({});\e[m
+\e[32m+\e[m\e[32m        console.log(test);\e[m
+\e[32m+\e[m\e[32m    });\e[m
+\e[32m+\e[m\e[32m});\e[m
+\ No newline at end of file\e[m
+\e[1mdiff --git a/examples/dialog/test.html b/examples/dialog/test.html\e[m
+\e[1mnew file mode 100644\e[m
+\e[1mindex 0000000000..ecb2a0afa3\e[m
+\e[1m--- /dev/null\e[m
+\e[1m+++ b/examples/dialog/test.html\e[m
+\e[36m@@ -0,0 +1,29 @@\e[m
+\e[32m+\e[m\e[32m<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">\e[m
+\e[32m+\e[m\e[32m<html>\e[m
+\e[32m+\e[m\e[32m<head>\e[m
+\e[32m+\e[m\e[32m    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">\e[m
+\e[32m+\e[m\e[32m    <title>Upload Cropbox Dialog Example</title>\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m    <link rel="stylesheet" type="text/css" href="../../css/roojs-debug.css"/>\e[m
+\e[32m+\e[m\e[32m    <link rel="stylesheet" type="text/css" href="../../css-bootstrap/bootstrap.css"/>\e[m
+\e[32m+\e[m\e[32m    <link rel="stylesheet" type="text/css" href="../../css-bootstrap/font-awesome.css"/>\e[m
+\e[32m+\e[m\e[32m    <link rel="stylesheet" type="text/css" href="../../css-bootstrap/roojs-bootstrap-debug.css"/>\e[m
+\e[32m+\e[m\e[32m    <link rel="stylesheet" type="text/css" href="../examples.css" />\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m     <script type="text/javascript" src="../../roojs-debug.js"></script>\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m     <script type="text/javascript" src="../../roojs-bootstrap-debug.js"></script>\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m     <script language="javascript" src="test.js"></script>\e[m
+\e[32m+\e[m\e[32m     <script type="text/javascript" src="../examples.js"></script>\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m</head>\e[m
+\e[32m+\e[m\e[32m<body>\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m<h1>Upload Cropbox Bootstrap</h1>\e[m
+\e[32m+\e[m\e[32m<p>This example shows how to create a very simple modal BasicDialog with "autoTabs".</p>\e[m
+\e[32m+\e[m\e[32m<input type="button" id="show-dialog-btn" value="test" /><br /><br />\e[m
+\e[32m+\e[m\e[32m<p>Note that the js is not minified so it is readable. See\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m<button type="button" onclick="RooDocs.viewSource.show('../../../Roo/bootstrap/UploadCropbox.js')">test.js</button>for the full source code.</p>\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m</div>\e[m
+\e[32m+\e[m\e[32m</body>\e[m
+\e[32m+\e[m\e[32m</html>\e[m
+\e[1mdiff --git a/examples/dialog/test.js b/examples/dialog/test.js\e[m
+\e[1mnew file mode 100644\e[m
+\e[1mindex 0000000000..f08db909f3\e[m
+\e[1m--- /dev/null\e[m
+\e[1m+++ b/examples/dialog/test.js\e[m
+\e[36m@@ -0,0 +1,94 @@\e[m
+\e[32m+\e[m\e[32mvar test = {\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m    dialog : false,\e[m
+\e[32m+\e[m\e[32m    callback : false,\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m    show : function(data, cb)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        if (!this.dialog) {\e[m
+\e[32m+\e[m\e[32m            this.create();\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        this.callback = cb;\e[m
+\e[32m+\e[m\e[32m        this.data = data;\e[m
+\e[32m+\e[m\e[32m        this.dialog.show();\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m    create : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var _this = this;\e[m
+\e[32m+\e[m\e[32m        this.dialog = Roo.factory({\e[m
+\e[32m+\e[m\e[32m            xtype : 'Modal',\e[m
+\e[32m+\e[m\e[32m            xns : Roo.bootstrap,\e[m
+\e[32m+\e[m\e[32m            title : 'Upload an Image',\e[m
+\e[32m+\e[m\e[32m            buttons : Roo.bootstrap.Modal.OKCANCEL,\e[m
+\e[32m+\e[m\e[32m            items: [\e[m
+\e[32m+\e[m\e[32m                {\e[m
+\e[32m+\e[m\e[32m                    xtype : 'Row',\e[m
+\e[32m+\e[m\e[32m                    xns : Roo.bootstrap,\e[m
+\e[32m+\e[m\e[32m                    items: [\e[m
+\e[32m+\e[m\e[32m                        {\e[m
+\e[32m+\e[m\e[32m                            xtype : 'Column',\e[m
+\e[32m+\e[m\e[32m                            xns : Roo.bootstrap,\e[m
+\e[32m+\e[m\e[32m                            items: [\e[m
+\e[32m+\e[m\e[32m                                {\e[m
+\e[32m+\e[m\e[32m                                    xtype : 'UploadCropbox',\e[m
+\e[32m+\e[m\e[32m                                    xns : Roo.bootstrap,\e[m
+\e[32m+\e[m\e[32m                                    minWidth : 720,\e[m
+\e[32m+\e[m\e[32m                                    minHeight: 480,\e[m
+\e[32m+\e[m\e[32m                                    listeners : {\e[m
+\e[32m+\e[m\e[32m                                        arrange : function (_self, formData)\e[m
+\e[32m+\e[m\e[32m                                        {\e[m
+\e[32m+\e[m\e[32m                                            console.log("ARRANGE");\e[m
+\e[32m+\e[m\e[32m                                            console.log(formData);\e[m
+\e[32m+\e[m\e[32m                                        },\e[m
+\e[32m+\e[m\e[32m                                        crop : function (_self, data)\e[m
+\e[32m+\e[m\e[32m                                        {\e[m
+\e[32m+\e[m\e[32m                                            console.log("CROP");\e[m
+\e[32m+\e[m\e[32m                                            console.log(data);\e[m
+\e[32m+\e[m\e[32m                                        },\e[m
+\e[32m+\e[m\e[32m                                        resize : function (_self)\e[m
+\e[32m+\e[m\e[32m                                        {\e[m
+\e[32m+\e[m\e[32m                                            console.log("RESIZE");\e[m
+\e[32m+\e[m\e[32m                                        },\e[m
+\e[32m+\e[m\e[32m                                        rotate : function (_self)\e[m
+\e[32m+\e[m\e[32m                                        {\e[m
+\e[32m+\e[m\e[32m                                            console.log("ROTATE");\e[m
+\e[32m+\e[m\e[32m                                        },\e[m
+\e[32m+\e[m\e[32m                                        render : function (_self)\e[m
+\e[32m+\e[m\e[32m                                        {\e[m
+\e[32m+\e[m\e[32m                                            console.log("RENDER");\e[m
+\e[32m+\e[m\e[32m                                            console.log(_self);\e[m
+\e[32m+\e[m\e[32m                                            _this.cropbox = _self;\e[m
+\e[32m+\e[m\e[32m                                        }\e[m
+\e[32m+\e[m\e[41m                        \e[m
+\e[32m+\e[m\e[32m                                    }\e[m
+\e[32m+\e[m\e[32m                                }\e[m
+\e[32m+\e[m\e[32m                            ]\e[m
+\e[32m+\e[m\e[32m                        }\e[m
+\e[32m+\e[m\e[32m                    ]\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[32m            ],\e[m
+\e[32m+\e[m\e[32m            listeners : {\e[m
+\e[32m+\e[m\e[32m                btnclick : function (e)\e[m
+\e[32m+\e[m\e[32m                {\e[m
+\e[32m+\e[m\e[32m                    console.log(e);\e[m
+\e[32m+\e[m\e[32m                    if(e == 'cancel') {\e[m
+\e[32m+\e[m\e[32m                        _this.dialog.hide();\e[m
+\e[32m+\e[m\e[32m                        return;\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                    _this.cropbox.crop();\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[32m        });\e[m
+\e[32m+\e[m\e[32m    }\e[m
+\e[32m+\e[m\e[32m}\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32mRoo.onReady(function() {\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    Roo.get('show-dialog-btn').on('click',function () {\e[m
+\e[32m+\e[m\e[32m        test.show({});\e[m
+\e[32m+\e[m\e[32m        console.log(test);\e[m
+\e[32m+\e[m\e[32m    });\e[m
+\e[32m+\e[m\e[32m});\e[m
+\ No newline at end of file\e[m
+\e[1mdiff --git a/roojs-all.js b/roojs-all.js\e[m
+\e[1mindex 9d9fc1f28f..f98434e789 100644\e[m
+\e[1m--- a/roojs-all.js\e[m
+\e[1m+++ b/roojs-all.js\e[m
+\e[36m@@ -2544,9 +2544,9 @@\e[m \e[mreturn this.el.getUpdateManager();},_handleRefresh:function(A,B,C){if(!C||!this.\e[m
+ te.setWidth(A);}if(this.adjustments){A+=this.adjustments[0];B+=this.adjustments[1];}return {"width":A,"height":B};},setSize:function(A,B){if(this.fitToFrame&&!this.ignoreResize(A,B)){if(this.fitContainer&&this.resizeEl!=this.el){this.el.setSize(A,B);}var C=this.adjustForComponents(A,B);\e[m
+ this.resizeEl.setSize(this.autoWidth?"auto":C.width,this.autoHeight?"auto":C.height);this.fireEvent('resize',this,C.width,C.height);}},getTitle:function(){return this.title;},setTitle:function(A){this.title=A;if(this.region){this.region.updatePanelTitle(this,A);\e[m
+ }},isClosable:function(){return this.closable;},beforeSlide:function(){this.el.clip();this.resizeEl.clip();},afterSlide:function(){this.el.unclip();this.resizeEl.unclip();},refresh:function(){if(this.refreshDelegate){this.loaded=false;this.refreshDelegate();\e[m
+\e[31m-}},destroy:function(){this.el.removeAllListeners();var A=document.createElement("span");A.appendChild(this.el.dom);A.innerHTML="";this.el.remove();this.el=null;},form:false,view:false,addxtype:function(A){if(A.xtype.match(/^Form$/)){var el;el=this.el.createChild();\e[m
+\e[31m-this.form=new Roo.form.Form(A);if(this.form.allItems.length){this.form.render(el.dom);}return this.form;}if(['View','JsonView','DatePicker'].indexOf(A.xtype)>-1){A.el=this.el.appendChild(document.createElement("div"));var B=new Roo.factory(A);B.render&&B.render(false,'');\e[m
+\e[31m-this.view=B;return B;}return false;}});\e[m
+\e[32m+\e[m\e[32m}},destroy:function(){this.el.removeAllListeners();var A=document.createElement("span");A.appendChild(this.el.dom);A.innerHTML="";this.el.remove();this.el=null;},form:false,view:false,addxtype:function(A){if(A.xtype.match(/^UploadCropbox$/)){this.cropbox=new Roo.factory(A);\e[m
+\e[32m+\e[m\e[32mthis.cropbox.render(this.el);return this.cropbox;}if(A.xtype.match(/^Form$/)){var el;el=this.el.createChild();this.form=new Roo.form.Form(A);if(this.form.allItems.length){this.form.render(el.dom);}return this.form;}if(['View','JsonView','DatePicker'].indexOf(A.xtype)>-1){A.el=this.el.appendChild(document.createElement("div"));\e[m
+\e[32m+\e[m\e[32mvar B=new Roo.factory(A);B.render&&B.render(false,'');this.view=B;return B;}return false;}});\e[m
+ // Roo/GridPanel.js\e[m
+ Roo.GridPanel=function(A,B){if(typeof(A.grid)!='undefined'){B=A;A=B.grid;}this.wrapper=Roo.DomHelper.append(document.body,{tag:"div",cls:"x-layout-grid-wrapper x-layout-inactive-content"},true);this.wrapper.dom.appendChild(A.getGridEl().dom);Roo.GridPanel.superclass.constructor.call(this,this.wrapper,B);\e[m
+ if(this.toolbar){this.toolbar.el.insertBefore(this.wrapper.dom.firstChild);}if(this.footer&&!this.footer.el&&this.footer.xtype){this.footer.container=this.grid.getView().getFooterPanel(true);this.footer.dataSource=this.grid.dataSource;this.footer=Roo.factory(this.footer,Roo);\e[m
+\e[36m@@ -2875,3 +2875,103 @@\e[m \e[mF.push("(typeof("+G+") == 'undefined')");});var H='(('+F.join(" || ")+") ? undef\e[m
+ }return "'"+A+H+C+")"+A+"'";};var B;if(Roo.isGecko){B="tpl.compiled = function(values, parent){  with(values) { return '"+tpl.body.replace(/(\r\n|\n)/g,'\\n').replace(/'/g,"\\'").replace(this.re,fn)+"';};};";}else{B=["tpl.compiled = function(values, parent){  with (values) { return ['"];\e[m
+ B.push(tpl.body.replace(/(\r\n|\n)/g,'\\n').replace(/'/g,"\\'").replace(this.re,fn));B.push("'].join('');};};");B=B.join('');}Roo.debug&&Roo.log(B.replace(/\\n/,'\n'));eval(B);return this;},applyTemplate:function(A){return this.master.compiled.call(this,A,{}\e[m
+ );},apply:function(){return this.applyTemplate.apply(this,arguments);}});Roo.XTemplate.from=function(el){el=Roo.getDom(el);return new Roo.XTemplate(el.value||el.innerHTML);};\e[m
+\e[32m+\e[m\e[32m// Roo/dialog/namespace.js\e[m
+\e[32m+\e[m\e[32mRoo.dialog={};\e[m
+\e[32m+\e[m\e[32m// Roo/dialog/UploadCropbox.js\e[m
+\e[32m+\e[m\e[32mRoo.dialog.UploadCropbox=function(A){console.log("Dialog UploadCropbox Constructor");Roo.dialog.UploadCropbox.superclass.constructor.call(this,A);this.addEvents({"beforeselectfile":true,"initial":true,"crop":true,"prepare":true,"exception":true,"beforeloadcanvas":true,"trash":true,"download":true,"footerbuttonclick":true,"resize":true,"rotate":true,"inspect":true,"upload":true,"arrange":true,"loadcanvas":true}\e[m
+\e[32m+\e[m\e[32m);this.buttons=this.buttons||Roo.dialog.UploadCropbox.footer.STANDARD;};Roo.extend(Roo.dialog.UploadCropbox,Roo.Component,{emptyText:'Click to upload image',rotateNotify:'Image is too small to rotate',errorTimeout:3000,scale:0,baseScale:1,rotate:0,dragable:false,pinching:false,mouseX:0,mouseY:0,cropData:false,minWidth:300,minHeight:300,file:false,exif:{}\e[m
+\e[32m+\e[m\e[32m,baseRotate:1,cropType:'image/jpeg',buttons:false,canvasLoaded:false,isDocument:false,method:'POST',paramName:'imageUpload',loadMask:true,loadingText:'Loading...',maskEl:false,getAutoCreate:function(){var A={tag:'div',cls:'roo-upload-cropbox',cn:[{tag:'input',cls:'roo-upload-cropbox-selector',type:'file'}\e[m
+\e[32m+\e[m\e[32m,{tag:'div',cls:'roo-upload-cropbox-body',style:'cursor:pointer',cn:[{tag:'div',cls:'roo-upload-cropbox-preview'},{tag:'div',cls:'roo-upload-cropbox-thumb'},{tag:'div',cls:'roo-upload-cropbox-empty-notify',html:this.emptyText},{tag:'div',cls:'roo-upload-cropbox-error-notify alert alert-danger',html:this.rotateNotify}\e[m
+\e[32m+\e[m\e[32m]},{tag:'div',cls:'roo-upload-cropbox-footer',cn:{tag:'div',cls:'btn-group btn-group-justified roo-upload-cropbox-btn-group',cn:[]}}]};return A;},onRender:function(ct,A){console.log("On Render");console.log(this);Roo.dialog.UploadCropbox.superclass.onRender.call(this,ct,A);\e[m
+\e[32m+\e[m\e[32mif(this.el){if(this.el.attr('xtype')){this.el.attr('xtypex',this.el.attr('xtype'));this.el.dom.removeAttribute('xtype');this.initEvents();}}else{var B=Roo.apply({},this.getAutoCreate());B.id=this.id||Roo.id();if(this.cls){B.cls=(typeof(B.cls)=='undefined'?this.cls:B.cls)+' '+this.cls;\e[m
+\e[32m+\e[m\e[32m}if(this.style){B.style=(typeof(B.style)=='undefined'?this.style:B.style)+'; '+this.style;}this.el=ct.createChild(B,A);this.initEvents();}if(this.buttons.length){Roo.each(this.buttons,function(bb){var C=this.el.select('.roo-upload-cropbox-footer div.roo-upload-cropbox-btn-group').first().createChild(bb);\e[m
+\e[32m+\e[m\e[32mC.on('click',this.onFooterButtonClick.createDelegate(this,[bb.action],true));},this);}if(this.loadMask){this.maskEl=this.el;}},initEvents:function(){this.urlAPI=(window.createObjectURL&&window)||(window.URL&&URL.revokeObjectURL&&URL)||(window.webkitURL&&webkitURL);\e[m
+\e[32m+\e[m\e[32mthis.bodyEl=this.el.select('.roo-upload-cropbox-body',true).first();this.bodyEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay='block';this.selectorEl=this.el.select('.roo-upload-cropbox-selector',true).first();this.selectorEl.hide();this.previewEl=this.el.select('.roo-upload-cropbox-preview',true).first();\e[m
+\e[32m+\e[m\e[32mthis.previewEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay='block';this.thumbEl=this.el.select('.roo-upload-cropbox-thumb',true).first();this.thumbEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay='block';this.thumbEl.hide();this.notifyEl=this.el.select('.roo-upload-cropbox-empty-notify',true).first();\e[m
+\e[32m+\e[m\e[32mthis.notifyEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay='block';this.errorEl=this.el.select('.roo-upload-cropbox-error-notify',true).first();this.errorEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay='block';this.errorEl.hide();this.footerEl=this.el.select('.roo-upload-cropbox-footer',true).first();\e[m
+\e[32m+\e[m\e[32mthis.footerEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay='block';this.footerEl.hide();this.setThumbBoxSize();this.bind();this.resize();this.fireEvent('initial',this);},bind:function(){var A=this;window.addEventListener("resize",function(){A.resize();\e[m
+\e[32m+\e[m\e[32m});this.bodyEl.on('click',this.beforeSelectFile,this);if(Roo.isTouch){this.bodyEl.on('touchstart',this.onTouchStart,this);this.bodyEl.on('touchmove',this.onTouchMove,this);this.bodyEl.on('touchend',this.onTouchEnd,this);}if(!Roo.isTouch){this.bodyEl.on('mousedown',this.onMouseDown,this);\e[m
+\e[32m+\e[m\e[32mthis.bodyEl.on('mousemove',this.onMouseMove,this);var B=(/Firefox/i.test(navigator.userAgent))?'DOMMouseScroll':'mousewheel';this.bodyEl.on(B,this.onMouseWheel,this);Roo.get(document).on('mouseup',this.onMouseUp,this);}this.selectorEl.on('change',this.onFileSelected,this);\e[m
+\e[32m+\e[m\e[32m},reset:function(){this.scale=0;this.baseScale=1;this.rotate=0;this.baseRotate=1;this.dragable=false;this.pinching=false;this.mouseX=0;this.mouseY=0;this.cropData=false;this.notifyEl.dom.innerHTML=this.emptyText;},resize:function(){if(this.fireEvent('resize',this)!=false){this.setThumbBoxPosition();\e[m
+\e[32m+\e[m\e[32mthis.setCanvasPosition();}},onFooterButtonClick:function(e,el,o,A){switch(A){case 'rotate-left':this.onRotateLeft(e);break;case 'rotate-right':this.onRotateRight(e);break;case 'picture':this.beforeSelectFile(e);break;case 'trash':this.trash(e);break;case 'crop':this.crop(e);\e[m
+\e[32m+\e[m\e[32mbreak;case 'download':this.download(e);break;default:break;}this.fireEvent('footerbuttonclick',this,A);},beforeSelectFile:function(e){e.preventDefault();if(this.fireEvent('beforeselectfile',this)!=false){this.selectorEl.dom.click();}},onFileSelected:function(e){e.preventDefault();\e[m
+\e[32m+\e[m\e[32mif(typeof(this.selectorEl.dom.files)=='undefined'||!this.selectorEl.dom.files.length){return;}var A=this.selectorEl.dom.files[0];if(this.fireEvent('inspect',this,A)!=false){this.prepare(A);}},trash:function(e){this.fireEvent('trash',this);},download:function(e){this.fireEvent('download',this);\e[m
+\e[32m+\e[m\e[32m},loadCanvas:function(A){if(this.fireEvent('beforeloadcanvas',this,A)!=false){this.reset();this.imageEl=document.createElement('img');var B=this;this.imageEl.addEventListener("load",function(){B.onLoadCanvas();});this.imageEl.src=A;}},onLoadCanvas:function(){this.imageEl.OriginWidth=this.imageEl.naturalWidth||this.imageEl.width;\e[m
+\e[32m+\e[m\e[32mthis.imageEl.OriginHeight=this.imageEl.naturalHeight||this.imageEl.height;if(this.fireEvent('loadcanvas',this,this.imageEl)!=false){this.bodyEl.un('click',this.beforeSelectFile,this);this.notifyEl.hide();this.thumbEl.show();this.footerEl.show();this.baseRotateLevel();\e[m
+\e[32m+\e[m\e[32mif(this.isDocument){this.setThumbBoxSize();}this.setThumbBoxPosition();this.baseScaleLevel();this.draw();this.resize();this.canvasLoaded=true;}if(this.loadMask){this.maskEl.unmask();}},setCanvasPosition:function(){if(!this.canvasEl){return;}var pw=Math.ceil((this.bodyEl.getWidth()-this.canvasEl.width)/2);\e[m
+\e[32m+\e[m\e[32mvar ph=Math.ceil((this.bodyEl.getHeight()-this.canvasEl.height)/2);this.previewEl.setLeft(pw);this.previewEl.setTop(ph);},onMouseDown:function(e){e.stopEvent();this.dragable=true;this.pinching=false;if(this.isDocument&&(this.canvasEl.width<this.thumbEl.getWidth()||this.canvasEl.height<this.thumbEl.getHeight())){this.dragable=false;\e[m
+\e[32m+\e[m\e[32mreturn;}this.mouseX=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();this.mouseY=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();},onMouseMove:function(e){e.stopEvent();if(!this.canvasLoaded){return;}if(!this.dragable){return;}var A=Math.ceil(this.thumbEl.getLeft(true));\e[m
+\e[32m+\e[m\e[32mvar B=Math.ceil(this.thumbEl.getTop(true));var C=Math.ceil(A+this.thumbEl.getWidth()-this.canvasEl.width);var D=Math.ceil(B+this.thumbEl.getHeight()-this.canvasEl.height);var x=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();var y=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();\e[m
+\e[32m+\e[m\e[32mx=x-this.mouseX;y=y-this.mouseY;var E=Math.ceil(x+this.previewEl.getLeft(true));var F=Math.ceil(y+this.previewEl.getTop(true));E=(A<E)?A:((C>E)?C:E);F=(B<F)?B:((D>F)?D:F);this.previewEl.setLeft(E);this.previewEl.setTop(F);this.mouseX=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();\e[m
+\e[32m+\e[m\e[32mthis.mouseY=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();},onMouseUp:function(e){e.stopEvent();this.dragable=false;},onMouseWheel:function(e){e.stopEvent();this.startScale=this.scale;this.scale=(e.getWheelDelta()==1)?(this.scale+1):(this.scale-1);\e[m
+\e[32m+\e[m\e[32mif(!this.zoomable()){this.scale=this.startScale;return;}this.draw();return;},zoomable:function(){var A=this.thumbEl.getWidth()/this.minWidth;if(this.minWidth<this.minHeight){A=this.thumbEl.getHeight()/this.minHeight;}var B=Math.ceil(this.imageEl.OriginWidth*this.getScaleLevel()/A);\e[m
+\e[32m+\e[m\e[32mvar C=Math.ceil(this.imageEl.OriginHeight*this.getScaleLevel()/A);if(this.isDocument&&(this.rotate==0||this.rotate==180)&&(B>this.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(B<this.minWidth&&C<this.minHeight))){return false;}if(this.isDocument&&(this.rotate==90||this.rotate==270)&&(B>this.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(B<this.minHeight&&C<this.minWidth))){return false;\e[m
+\e[32m+\e[m\e[32m}if(!this.isDocument&&(this.rotate==0||this.rotate==180)&&(B<this.minWidth||B>this.imageEl.OriginWidth||C<this.minHeight||C>this.imageEl.OriginHeight)){return false;}if(!this.isDocument&&(this.rotate==90||this.rotate==270)&&(B<this.minHeight||B>this.imageEl.OriginWidth||C<this.minWidth||C>this.imageEl.OriginHeight)){return false;\e[m
+\e[32m+\e[m\e[32m}return true;},onRotateLeft:function(e){if(!this.isDocument&&(this.canvasEl.height<this.thumbEl.getWidth()||this.canvasEl.width<this.thumbEl.getHeight())){var A=this.thumbEl.getWidth()/this.minWidth;var bw=Math.ceil(this.canvasEl.width/this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32mvar bh=Math.ceil(this.canvasEl.height/this.getScaleLevel());this.startScale=this.scale;while(this.getScaleLevel()<A){this.scale=this.scale+1;if(!this.zoomable()){break;}if(Math.ceil(bw*this.getScaleLevel())<this.thumbEl.getHeight()||Math.ceil(bh*this.getScaleLevel())<this.thumbEl.getWidth()){continue;\e[m
+\e[32m+\e[m\e[32m}this.rotate=(this.rotate<90)?270:this.rotate-90;this.draw();return;}this.scale=this.startScale;this.onRotateFail();return false;}this.rotate=(this.rotate<90)?270:this.rotate-90;if(this.isDocument){this.setThumbBoxSize();this.setThumbBoxPosition();this.setCanvasPosition();\e[m
+\e[32m+\e[m\e[32m}this.draw();this.fireEvent('rotate',this,'left');},onRotateRight:function(e){if(!this.isDocument&&(this.canvasEl.height<this.thumbEl.getWidth()||this.canvasEl.width<this.thumbEl.getHeight())){var A=this.thumbEl.getWidth()/this.minWidth;var bw=Math.ceil(this.canvasEl.width/this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32mvar bh=Math.ceil(this.canvasEl.height/this.getScaleLevel());this.startScale=this.scale;while(this.getScaleLevel()<A){this.scale=this.scale+1;if(!this.zoomable()){break;}if(Math.ceil(bw*this.getScaleLevel())<this.thumbEl.getHeight()||Math.ceil(bh*this.getScaleLevel())<this.thumbEl.getWidth()){continue;\e[m
+\e[32m+\e[m\e[32m}this.rotate=(this.rotate>180)?0:this.rotate+90;this.draw();return;}this.scale=this.startScale;this.onRotateFail();return false;}this.rotate=(this.rotate>180)?0:this.rotate+90;if(this.isDocument){this.setThumbBoxSize();this.setThumbBoxPosition();this.setCanvasPosition();\e[m
+\e[32m+\e[m\e[32m}this.draw();this.fireEvent('rotate',this,'right');},onRotateFail:function(){this.errorEl.show(true);var A=this;(function(){A.errorEl.hide(true);}).defer(this.errorTimeout);},draw:function(){this.previewEl.dom.innerHTML='';var A=document.createElement("canvas");\e[m
+\e[32m+\e[m\e[32mvar B=A.getContext("2d");A.width=this.imageEl.OriginWidth*this.getScaleLevel();A.height=this.imageEl.OriginWidth*this.getScaleLevel();var C=this.imageEl.OriginWidth/2;if(this.imageEl.OriginWidth<this.imageEl.OriginHeight){A.width=this.imageEl.OriginHeight*this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32mA.height=this.imageEl.OriginHeight*this.getScaleLevel();C=this.imageEl.OriginHeight/2;}B.scale(this.getScaleLevel(),this.getScaleLevel());B.translate(C,C);B.rotate(this.rotate*Math.PI/180);B.drawImage(this.imageEl,0,0,this.imageEl.OriginWidth,this.imageEl.OriginHeight,C*-1,C*-1,this.imageEl.OriginWidth,this.imageEl.OriginHeight);\e[m
+\e[32m+\e[m\e[32mthis.canvasEl=document.createElement("canvas");this.contextEl=this.canvasEl.getContext("2d");switch(this.rotate){case 0:this.canvasEl.width=this.imageEl.OriginWidth*this.getScaleLevel();this.canvasEl.height=this.imageEl.OriginHeight*this.getScaleLevel();this.contextEl.drawImage(A,0,0,this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);\e[m
+\e[32m+\e[m\e[32mbreak;case 90:this.canvasEl.width=this.imageEl.OriginHeight*this.getScaleLevel();this.canvasEl.height=this.imageEl.OriginWidth*this.getScaleLevel();if(this.imageEl.OriginWidth>this.imageEl.OriginHeight){this.contextEl.drawImage(A,Math.abs(this.canvasEl.width-this.canvasEl.height),0,this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);\e[m
+\e[32m+\e[m\e[32mbreak;}this.contextEl.drawImage(A,0,0,this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);break;case 180:this.canvasEl.width=this.imageEl.OriginWidth*this.getScaleLevel();this.canvasEl.height=this.imageEl.OriginHeight*this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32mif(this.imageEl.OriginWidth>this.imageEl.OriginHeight){this.contextEl.drawImage(A,0,Math.abs(this.canvasEl.width-this.canvasEl.height),this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);break;}this.contextEl.drawImage(A,Math.abs(this.canvasEl.width-this.canvasEl.height),0,this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);\e[m
+\e[32m+\e[m\e[32mbreak;case 270:this.canvasEl.width=this.imageEl.OriginHeight*this.getScaleLevel();this.canvasEl.height=this.imageEl.OriginWidth*this.getScaleLevel();if(this.imageEl.OriginWidth>this.imageEl.OriginHeight){this.contextEl.drawImage(A,0,0,this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);\e[m
+\e[32m+\e[m\e[32mbreak;}this.contextEl.drawImage(A,0,Math.abs(this.canvasEl.width-this.canvasEl.height),this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);break;default:break;}this.previewEl.appendChild(this.canvasEl);this.setCanvasPosition();\e[m
+\e[32m+\e[m\e[32m},crop:function(){if(!this.canvasLoaded){return;}var A=document.createElement("canvas");var B=A.getContext("2d");A.width=(this.imageEl.OriginWidth>this.imageEl.OriginHeight)?this.imageEl.OriginWidth:this.imageEl.OriginHeight;A.height=(this.imageEl.OriginWidth>this.imageEl.OriginHeight)?this.imageEl.OriginWidth:this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[32mvar C=A.width/2;B.translate(C,C);B.rotate(this.rotate*Math.PI/180);B.drawImage(this.imageEl,0,0,this.imageEl.OriginWidth,this.imageEl.OriginHeight,C*-1,C*-1,this.imageEl.OriginWidth,this.imageEl.OriginHeight);var D=document.createElement("canvas");var E=D.getContext("2d");\e[m
+\e[32m+\e[m\e[32mD.width=this.minWidth;D.height=this.minHeight;switch(this.rotate){case 0:var F=(this.thumbEl.getWidth()/this.getScaleLevel()>this.imageEl.OriginWidth)?this.imageEl.OriginWidth:(this.thumbEl.getWidth()/this.getScaleLevel());var G=(this.thumbEl.getHeight()/this.getScaleLevel()>this.imageEl.OriginHeight)?this.imageEl.OriginHeight:(this.thumbEl.getHeight()/this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32mvar x=(this.thumbEl.getLeft(true)>this.previewEl.getLeft(true))?0:((this.previewEl.getLeft(true)-this.thumbEl.getLeft(true))/this.getScaleLevel());var y=(this.thumbEl.getTop(true)>this.previewEl.getTop(true))?0:((this.previewEl.getTop(true)-this.thumbEl.getTop(true))/this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32mvar H=this.minWidth-2*x;var I=this.minHeight-2*y;var J=1;if((x==0&&y==0)||(x==0&&y>0)){J=H/F;}if(x>0&&y==0){J=I/G;}if(x>0&&y>0){J=H/F;if(F<G){J=I/G;}}E.scale(J,J);var sx=Math.min(this.canvasEl.width-this.thumbEl.getWidth(),this.thumbEl.getLeft(true)-this.previewEl.getLeft(true));\e[m
+\e[32m+\e[m\e[32mvar sy=Math.min(this.canvasEl.height-this.thumbEl.getHeight(),this.thumbEl.getTop(true)-this.previewEl.getTop(true));sx=sx<0?0:(sx/this.getScaleLevel());sy=sy<0?0:(sy/this.getScaleLevel());E.drawImage(A,sx,sy,F,G,x,y,F,G);break;case 90:var F=(this.thumbEl.getWidth()/this.getScaleLevel()>this.imageEl.OriginHeight)?this.imageEl.OriginHeight:(this.thumbEl.getWidth()/this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32mvar G=(this.thumbEl.getHeight()/this.getScaleLevel()>this.imageEl.OriginWidth)?this.imageEl.OriginWidth:(this.thumbEl.getHeight()/this.getScaleLevel());var x=(this.thumbEl.getLeft(true)>this.previewEl.getLeft(true))?0:((this.previewEl.getLeft(true)-this.thumbEl.getLeft(true))/this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32mvar y=(this.thumbEl.getTop(true)>this.previewEl.getTop(true))?0:((this.previewEl.getTop(true)-this.thumbEl.getTop(true))/this.getScaleLevel());var H=this.minWidth-2*x;var I=this.minHeight-2*y;var J=1;if((x==0&&y==0)||(x==0&&y>0)){J=H/F;}if(x>0&&y==0){J=I/G;\e[m
+\e[32m+\e[m\e[32m}if(x>0&&y>0){J=H/F;if(F<G){J=I/G;}}E.scale(J,J);var sx=Math.min(this.canvasEl.width-this.thumbEl.getWidth(),this.thumbEl.getLeft(true)-this.previewEl.getLeft(true));var sy=Math.min(this.canvasEl.height-this.thumbEl.getHeight(),this.thumbEl.getTop(true)-this.previewEl.getTop(true));\e[m
+\e[32m+\e[m\e[32msx=sx<0?0:(sx/this.getScaleLevel());sy=sy<0?0:(sy/this.getScaleLevel());sx+=(this.imageEl.OriginWidth>this.imageEl.OriginHeight)?Math.abs(this.imageEl.OriginWidth-this.imageEl.OriginHeight):0;E.drawImage(A,sx,sy,F,G,x,y,F,G);break;case 180:var F=(this.thumbEl.getWidth()/this.getScaleLevel()>this.imageEl.OriginWidth)?this.imageEl.OriginWidth:(this.thumbEl.getWidth()/this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32mvar G=(this.thumbEl.getHeight()/this.getScaleLevel()>this.imageEl.OriginHeight)?this.imageEl.OriginHeight:(this.thumbEl.getHeight()/this.getScaleLevel());var x=(this.thumbEl.getLeft(true)>this.previewEl.getLeft(true))?0:((this.previewEl.getLeft(true)-this.thumbEl.getLeft(true))/this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32mvar y=(this.thumbEl.getTop(true)>this.previewEl.getTop(true))?0:((this.previewEl.getTop(true)-this.thumbEl.getTop(true))/this.getScaleLevel());var H=this.minWidth-2*x;var I=this.minHeight-2*y;var J=1;if((x==0&&y==0)||(x==0&&y>0)){J=H/F;}if(x>0&&y==0){J=I/G;\e[m
+\e[32m+\e[m\e[32m}if(x>0&&y>0){J=H/F;if(F<G){J=I/G;}}E.scale(J,J);var sx=Math.min(this.canvasEl.width-this.thumbEl.getWidth(),this.thumbEl.getLeft(true)-this.previewEl.getLeft(true));var sy=Math.min(this.canvasEl.height-this.thumbEl.getHeight(),this.thumbEl.getTop(true)-this.previewEl.getTop(true));\e[m
+\e[32m+\e[m\e[32msx=sx<0?0:(sx/this.getScaleLevel());sy=sy<0?0:(sy/this.getScaleLevel());sx+=(this.imageEl.OriginWidth>this.imageEl.OriginHeight)?0:Math.abs(this.imageEl.OriginWidth-this.imageEl.OriginHeight);sy+=(this.imageEl.OriginWidth>this.imageEl.OriginHeight)?Math.abs(this.imageEl.OriginWidth-this.imageEl.OriginHeight):0;\e[m
+\e[32m+\e[m\e[32mE.drawImage(A,sx,sy,F,G,x,y,F,G);break;case 270:var F=(this.thumbEl.getWidth()/this.getScaleLevel()>this.imageEl.OriginHeight)?this.imageEl.OriginHeight:(this.thumbEl.getWidth()/this.getScaleLevel());var G=(this.thumbEl.getHeight()/this.getScaleLevel()>this.imageEl.OriginWidth)?this.imageEl.OriginWidth:(this.thumbEl.getHeight()/this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32mvar x=(this.thumbEl.getLeft(true)>this.previewEl.getLeft(true))?0:((this.previewEl.getLeft(true)-this.thumbEl.getLeft(true))/this.getScaleLevel());var y=(this.thumbEl.getTop(true)>this.previewEl.getTop(true))?0:((this.previewEl.getTop(true)-this.thumbEl.getTop(true))/this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32mvar H=this.minWidth-2*x;var I=this.minHeight-2*y;var J=1;if((x==0&&y==0)||(x==0&&y>0)){J=H/F;}if(x>0&&y==0){J=I/G;}if(x>0&&y>0){J=H/F;if(F<G){J=I/G;}}E.scale(J,J);var sx=Math.min(this.canvasEl.width-this.thumbEl.getWidth(),this.thumbEl.getLeft(true)-this.previewEl.getLeft(true));\e[m
+\e[32m+\e[m\e[32mvar sy=Math.min(this.canvasEl.height-this.thumbEl.getHeight(),this.thumbEl.getTop(true)-this.previewEl.getTop(true));sx=sx<0?0:(sx/this.getScaleLevel());sy=sy<0?0:(sy/this.getScaleLevel());sy+=(this.imageEl.OriginWidth>this.imageEl.OriginHeight)?0:Math.abs(this.imageEl.OriginWidth-this.imageEl.OriginHeight);\e[m
+\e[32m+\e[m\e[32mE.drawImage(A,sx,sy,F,G,x,y,F,G);break;default:break;}this.cropData=D.toDataURL(this.cropType);if(this.fireEvent('crop',this,this.cropData)!==false){this.process(this.file,this.cropData);}return;},setThumbBoxSize:function(){var A,B;if(this.isDocument&&typeof(this.imageEl)!='undefined'){A=(this.imageEl.OriginWidth>this.imageEl.OriginHeight)?Math.max(this.minWidth,this.minHeight):Math.min(this.minWidth,this.minHeight);\e[m
+\e[32m+\e[m\e[32mB=(this.imageEl.OriginWidth>this.imageEl.OriginHeight)?Math.min(this.minWidth,this.minHeight):Math.max(this.minWidth,this.minHeight);this.minWidth=A;this.minHeight=B;if(this.rotate==90||this.rotate==270){this.minWidth=B;this.minHeight=A;}}B=300;A=Math.ceil(this.minWidth*B/this.minHeight);\e[m
+\e[32m+\e[m\e[32mif(this.minWidth>this.minHeight){A=300;B=Math.ceil(this.minHeight*A/this.minWidth);}this.thumbEl.setStyle({width:A+'px',height:B+'px'});return;},setThumbBoxPosition:function(){var x=Math.ceil((this.bodyEl.getWidth()-this.thumbEl.getWidth())/2);var y=Math.ceil((this.bodyEl.getHeight()-this.thumbEl.getHeight())/2);\e[m
+\e[32m+\e[m\e[32mthis.thumbEl.setLeft(x);this.thumbEl.setTop(y);},baseRotateLevel:function(){this.baseRotate=1;if(typeof(this.exif)!='undefined'&&typeof(this.exif[Roo.dialog.UploadCropbox['tags']['Orientation']])!='undefined'&&[1,3,6,8].indexOf(this.exif[Roo.dialog.UploadCropbox['tags']['Orientation']])!=-1){this.baseRotate=this.exif[Roo.dialog.UploadCropbox['tags']['Orientation']];\e[m
+\e[32m+\e[m\e[32m}this.rotate=Roo.dialog.UploadCropbox['Orientation'][this.baseRotate];},baseScaleLevel:function(){var A,B;if(this.isDocument){if(this.baseRotate==6||this.baseRotate==8){B=this.thumbEl.getHeight();this.baseScale=B/this.imageEl.OriginWidth;if(this.imageEl.OriginHeight*this.baseScale>this.thumbEl.getWidth()){A=this.thumbEl.getWidth();\e[m
+\e[32m+\e[m\e[32mthis.baseScale=A/this.imageEl.OriginHeight;}return;}B=this.thumbEl.getHeight();this.baseScale=B/this.imageEl.OriginHeight;if(this.imageEl.OriginWidth*this.baseScale>this.thumbEl.getWidth()){A=this.thumbEl.getWidth();this.baseScale=A/this.imageEl.OriginWidth;\e[m
+\e[32m+\e[m\e[32m}return;}if(this.baseRotate==6||this.baseRotate==8){A=this.thumbEl.getHeight();this.baseScale=A/this.imageEl.OriginHeight;if(this.imageEl.OriginHeight*this.baseScale<this.thumbEl.getWidth()){B=this.thumbEl.getWidth();this.baseScale=B/this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[32m}if(this.imageEl.OriginWidth>this.imageEl.OriginHeight){B=this.thumbEl.getWidth();this.baseScale=B/this.imageEl.OriginHeight;if(this.imageEl.OriginWidth*this.baseScale<this.thumbEl.getHeight()){A=this.thumbEl.getHeight();this.baseScale=A/this.imageEl.OriginWidth;\e[m
+\e[32m+\e[m\e[32m}}return;}A=this.thumbEl.getWidth();this.baseScale=A/this.imageEl.OriginWidth;if(this.imageEl.OriginHeight*this.baseScale<this.thumbEl.getHeight()){B=this.thumbEl.getHeight();this.baseScale=B/this.imageEl.OriginHeight;}if(this.imageEl.OriginWidth>this.imageEl.OriginHeight){B=this.thumbEl.getHeight();\e[m
+\e[32m+\e[m\e[32mthis.baseScale=B/this.imageEl.OriginHeight;if(this.imageEl.OriginWidth*this.baseScale<this.thumbEl.getWidth()){A=this.thumbEl.getWidth();this.baseScale=A/this.imageEl.OriginWidth;}}return;},getScaleLevel:function(){return this.baseScale*Math.pow(1.1,this.scale);\e[m
+\e[32m+\e[m\e[32m},onTouchStart:function(e){if(!this.canvasLoaded){this.beforeSelectFile(e);return;}var A=e.browserEvent.touches;if(!A){return;}if(A.length==1){this.onMouseDown(e);return;}if(A.length!=2){return;}var B=[];for(var i=0,C;C=A[i];i++){B.push(C.pageX,C.pageY);}\e[m
+\e[32m+\e[m\e[32mvar x=Math.pow(B[0]-B[2],2);var y=Math.pow(B[1]-B[3],2);this.startDistance=Math.sqrt(x+y);this.startScale=this.scale;this.pinching=true;this.dragable=false;},onTouchMove:function(e){if(!this.pinching&&!this.dragable){return;}var A=e.browserEvent.touches;if(!A){return;\e[m
+\e[32m+\e[m\e[32m}if(this.dragable){this.onMouseMove(e);return;}var B=[];for(var i=0,C;C=A[i];i++){B.push(C.pageX,C.pageY);}var x=Math.pow(B[0]-B[2],2);var y=Math.pow(B[1]-B[3],2);this.endDistance=Math.sqrt(x+y);this.scale=this.startScale+Math.floor(Math.log(this.endDistance/this.startDistance)/Math.log(1.1));\e[m
+\e[32m+\e[m\e[32mif(!this.zoomable()){this.scale=this.startScale;return;}this.draw();},onTouchEnd:function(e){this.pinching=false;this.dragable=false;},process:function(A,B){if(this.loadMask){this.maskEl.mask(this.loadingText);}this.xhr=new XMLHttpRequest();A.xhr=this.xhr;\e[m
+\e[32m+\e[m\e[32mthis.xhr.open(this.method,this.url,true);var C={"Accept":"application/json","Cache-Control":"no-cache","X-Requested-With":"XMLHttpRequest"};for(var D in C){var E=C[D];if(E){this.xhr.setRequestHeader(D,E);}}var F=this;this.xhr.onload=function(){F.xhrOnLoad(F.xhr);\e[m
+\e[32m+\e[m\e[32m};this.xhr.onerror=function(){F.xhrOnError(F.xhr);};var G=new FormData();G.append('returnHTML','NO');if(B){G.append('crop',B);}if(typeof(A)!='undefined'&&(typeof(A.id)=='undefined'||A.id*1<1)){G.append(this.paramName,A,A.name);}if(typeof(A.filename)!='undefined'){G.append('filename',A.filename);\e[m
+\e[32m+\e[m\e[32m}if(typeof(A.mimetype)!='undefined'){G.append('mimetype',A.mimetype);}if(this.fireEvent('arrange',this,G)!=false){this.xhr.send(G);};},xhrOnLoad:function(A){if(this.loadMask){this.maskEl.unmask();}if(A.readyState!==4){this.fireEvent('exception',this,A);return;\e[m
+\e[32m+\e[m\e[32m}var B=Roo.decode(A.responseText);if(!B.success){this.fireEvent('exception',this,A);return;}var B=Roo.decode(A.responseText);this.fireEvent('upload',this,B);},xhrOnError:function(){if(this.loadMask){this.maskEl.unmask();}Roo.log('xhr on error');var A=Roo.decode(xhr.responseText);\e[m
+\e[32m+\e[m\e[32mRoo.log(A);},prepare:function(A){if(this.loadMask){this.maskEl.mask(this.loadingText);}this.file=false;this.exif={};if(typeof(A)==='string'){this.loadCanvas(A);return;}if(!A||!this.urlAPI){return;}this.file=A;this.cropType=A.type;var B=this;if(this.fireEvent('prepare',this,this.file)!=false){var C=new FileReader();\e[m
+\e[32m+\e[m\e[32mC.onload=function(e){if(e.target.error){Roo.log(e.target.error);return;}var D=e.target.result,E=new DataView(D),F=2,G=E.byteLength-4,H,I;if(E.getUint16(0)===0xffd8){while(F<G){H=E.getUint16(F);if((H>=0xffe0&&H<=0xffef)||H===0xfffe){I=E.getUint16(F+2)+2;if(F+I>E.byteLength){Roo.log('Invalid meta data: Invalid segment size.');\e[m
+\e[32m+\e[m\e[32mbreak;}if(H==0xffe1){B.parseExifData(E,F,I);}F+=I;continue;}break;}}var J=B.urlAPI.createObjectURL(B.file);B.loadCanvas(J);return;};C.readAsArrayBuffer(this.file);}},parseExifData:function(A,B,C){var D=B+10,E,F;if(A.getUint32(B+4)!==0x45786966){return;}if(A.getUint32(B+4)!==0x45786966){return;\e[m
+\e[32m+\e[m\e[32m}if(D+8>A.byteLength){Roo.log('Invalid Exif data: Invalid segment size.');return;}if(A.getUint16(B+8)!==0x0000){Roo.log('Invalid Exif data: Missing byte alignment offset.');return;}switch(A.getUint16(D)){case 0x4949:E=true;break;case 0x4D4D:E=false;break;\e[m
+\e[32m+\e[m\e[32mdefault:Roo.log('Invalid Exif data: Invalid byte alignment marker.');return;}if(A.getUint16(D+2,E)!==0x002A){Roo.log('Invalid Exif data: Missing TIFF marker.');return;}F=A.getUint32(D+4,E);this.parseExifTags(A,D,D+F,E);},parseExifTags:function(A,B,C,D){var E,F,i;\e[m
+\e[32m+\e[m\e[32mif(C+6>A.byteLength){Roo.log('Invalid Exif data: Invalid directory offset.');return;}E=A.getUint16(C,D);F=C+2+12*E;if(F+4>A.byteLength){Roo.log('Invalid Exif data: Invalid directory size.');return;}for(i=0;i<E;i+=1){this.parseExifTag(A,B,C+2+12*i,D);}return A.getUint32(F,D);\e[m
+\e[32m+\e[m\e[32m},parseExifTag:function(A,B,C,D){var E=A.getUint16(C,D);this.exif[E]=this.getExifValue(A,B,C,A.getUint16(C+2,D),A.getUint32(C+4,D),D);},getExifValue:function(A,B,C,D,E,F){var G=Roo.dialog.UploadCropbox.exifTagTypes[D],H,I,J,i,K,c;if(!G){Roo.log('Invalid Exif data: Invalid tag type.');\e[m
+\e[32m+\e[m\e[32mreturn;}H=G.size*E;I=H>4?B+A.getUint32(C+8,F):(C+8);if(I+H>A.byteLength){Roo.log('Invalid Exif data: Invalid data offset.');return;}if(E===1){return G.getValue(A,I,F);}J=[];for(i=0;i<E;i+=1){J[i]=G.getValue(A,I+i*G.size,F);}if(G.ascii){K='';for(i=0;i<J.length;\e[m
+\e[32m+\e[m\e[32mi+=1){c=J[i];if(c==='\u0000'){break;}K+=c;}return K;}return J;}});Roo.apply(Roo.dialog.UploadCropbox,{tags:{'Orientation':0x0112\e[m
+\e[32m+\e[m\e[32m},Orientation:{1:0,3:180,6:90,8:270},exifTagTypes:{1:{getValue:function(A,B){return A.getUint8(B);},size:1},2:{getValue:function(A,B){return String.fromCharCode(A.getUint8(B));\e[m
+\e[32m+\e[m\e[32m},size:1,ascii:true},3:{getValue:function(A,B,C){return A.getUint16(B,C);},size:2},4:{getValue:function(A,B,C){return A.getUint32(B,C);},size:4},5:{getValue:function(A,B,C){return A.getUint32(B,C)/A.getUint32(B+4,C);},size:8},9:{getValue:function(A,B,C){return A.getInt32(B,C);\e[m
+\e[32m+\e[m\e[32m},size:4},10:{getValue:function(A,B,C){return A.getInt32(B,C)/A.getInt32(B+4,C);},size:8}},footer:{STANDARD:[{tag:'div',cls:'btn-group roo-upload-cropbox-rotate-left',action:'rotate-left',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-undo"></i>'}\e[m
+\e[32m+\e[m\e[32m]},{tag:'div',cls:'btn-group roo-upload-cropbox-picture',action:'picture',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-picture-o"></i>'}]},{tag:'div',cls:'btn-group roo-upload-cropbox-rotate-right',action:'rotate-right',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-repeat"></i>'}\e[m
+\e[32m+\e[m\e[32m]}],DOCUMENT:[{tag:'div',cls:'btn-group roo-upload-cropbox-rotate-left',action:'rotate-left',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-undo"></i>'}]},{tag:'div',cls:'btn-group roo-upload-cropbox-download',action:'download',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-download"></i>'}\e[m
+\e[32m+\e[m\e[32m]},{tag:'div',cls:'btn-group roo-upload-cropbox-crop',action:'crop',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-crop"></i>'}]},{tag:'div',cls:'btn-group roo-upload-cropbox-trash',action:'trash',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-trash"></i>'}\e[m
+\e[32m+\e[m\e[32m]},{tag:'div',cls:'btn-group roo-upload-cropbox-rotate-right',action:'rotate-right',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-repeat"></i>'}]}],ROTATOR:[{tag:'div',cls:'btn-group roo-upload-cropbox-rotate-left',action:'rotate-left',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-undo"></i>'}\e[m
+\e[32m+\e[m\e[32m]},{tag:'div',cls:'btn-group roo-upload-cropbox-rotate-right',action:'rotate-right',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-repeat"></i>'}]}]}});\e[m
+\e[1mdiff --git a/roojs-debug.js b/roojs-debug.js\e[m
+\e[1mindex 5e539c7e68..d341c59730 100644\e[m
+\e[1m--- a/roojs-debug.js\e[m
+\e[1m+++ b/roojs-debug.js\e[m
+\e[36m@@ -60414,7 +60414,6 @@\e[m \e[mRoo.LayoutStateManager.prototype = {\e[m
+  */\e[m
+ Roo.ContentPanel = function(el, config, content){\e[m
+     \e[m
+\e[31m-     \e[m
+     /*\e[m
+     if(el.autoCreate || el.xtype){ // xtype is available if this is called from factory\e[m
+         config = el;\e[m
+\e[36m@@ -60798,6 +60797,14 @@\e[m \e[mlayout.addxtype({\e[m
+      */\e[m
+     \e[m
+     addxtype : function(cfg) {\e[m
+\e[32m+\e[m\e[32m        if(cfg.xtype.match(/^UploadCropbox$/)) {\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m            this.cropbox = new Roo.factory(cfg);\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m            this.cropbox.render(this.el);\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m            return this.cropbox;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+         // add form..\e[m
+         if (cfg.xtype.match(/^Form$/)) {\e[m
+             \e[m
+\e[36m@@ -68050,4 +68057,1795 @@\e[m \e[mRoo.extend(Roo.XTemplate, Roo.Template, {\e[m
+ Roo.XTemplate.from = function(el){\e[m
+     el = Roo.getDom(el);\e[m
+     return new Roo.XTemplate(el.value || el.innerHTML);\e[m
+\e[31m-};\e[m
+\ No newline at end of file\e[m
+\e[32m+\e[m\e[32m};Roo.dialog = {};\e[m
+\e[32m+\e[m\e[32m/*\e[m
+\e[32m+\e[m\e[32m* Licence: LGPL\e[m
+\e[32m+\e[m\e[32m*/\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m/**\e[m
+\e[32m+\e[m\e[32m * @class Roo.dialog.UploadCropbox\e[m
+\e[32m+\e[m\e[32m * @extends Roo.BoxComponent\e[m
+\e[32m+\e[m\e[32m * Dialog UploadCropbox class\e[m
+\e[32m+\e[m\e[32m * @cfg {String} emptyText show when image has been loaded\e[m
+\e[32m+\e[m\e[32m * @cfg {String} rotateNotify show when image too small to rotate\e[m
+\e[32m+\e[m\e[32m * @cfg {Number} errorTimeout default 3000\e[m
+\e[32m+\e[m\e[32m * @cfg {Number} minWidth default 300\e[m
+\e[32m+\e[m\e[32m * @cfg {Number} minHeight default 300\e[m
+\e[32m+\e[m\e[32m * @cfg {Array} buttons default ['rotateLeft', 'pictureBtn', 'rotateRight']\e[m
+\e[32m+\e[m\e[32m * @cfg {Boolean} isDocument (true|false) default false\e[m
+\e[32m+\e[m\e[32m * @cfg {String} url action url\e[m
+\e[32m+\e[m\e[32m * @cfg {String} paramName default 'imageUpload'\e[m
+\e[32m+\e[m\e[32m * @cfg {String} method default POST\e[m
+\e[32m+\e[m\e[32m * @cfg {Boolean} loadMask (true|false) default true\e[m
+\e[32m+\e[m\e[32m * @cfg {Boolean} loadingText default 'Loading...'\e[m
+\e[32m+\e[m\e[32m *\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m * @constructor\e[m
+\e[32m+\e[m\e[32m * Create a new UploadCropbox\e[m
+\e[32m+\e[m\e[32m * @param {Object} config The config object\e[m
+\e[32m+\e[m\e[32m */\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m Roo.dialog.UploadCropbox = function(config){\e[m
+\e[32m+\e[m\e[32m    console.log("Dialog UploadCropbox Constructor");\e[m
+\e[32m+\e[m\e[32m    Roo.dialog.UploadCropbox.superclass.constructor.call(this, config);\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    this.addEvents({\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event beforeselectfile\e[m
+\e[32m+\e[m\e[32m         * Fire before select file\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "beforeselectfile" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event initial\e[m
+\e[32m+\e[m\e[32m         * Fire after initEvent\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "initial" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event crop\e[m
+\e[32m+\e[m\e[32m         * Fire after initEvent\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         * @param {String} data\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "crop" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event prepare\e[m
+\e[32m+\e[m\e[32m         * Fire when preparing the file data\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         * @param {Object} file\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "prepare" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event exception\e[m
+\e[32m+\e[m\e[32m         * Fire when get exception\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         * @param {XMLHttpRequest} xhr\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "exception" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event beforeloadcanvas\e[m
+\e[32m+\e[m\e[32m         * Fire before load the canvas\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         * @param {String} src\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "beforeloadcanvas" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event trash\e[m
+\e[32m+\e[m\e[32m         * Fire when trash image\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "trash" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event download\e[m
+\e[32m+\e[m\e[32m         * Fire when download the image\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "download" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event footerbuttonclick\e[m
+\e[32m+\e[m\e[32m         * Fire when footerbuttonclick\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         * @param {String} type\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "footerbuttonclick" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event resize\e[m
+\e[32m+\e[m\e[32m         * Fire when resize\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "resize" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event rotate\e[m
+\e[32m+\e[m\e[32m         * Fire when rotate the image\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         * @param {String} pos\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "rotate" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event inspect\e[m
+\e[32m+\e[m\e[32m         * Fire when inspect the file\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         * @param {Object} file\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "inspect" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event upload\e[m
+\e[32m+\e[m\e[32m         * Fire when xhr upload the file\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         * @param {Object} data\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "upload" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event arrange\e[m
+\e[32m+\e[m\e[32m         * Fire when arrange the file data\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         * @param {Object} formData\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "arrange" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event loadcanvas\e[m
+\e[32m+\e[m\e[32m         * Fire after load the canvas\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox}\e[m
+\e[32m+\e[m\e[32m         * @param {Object} imgEl\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "loadcanvas" : true\e[m
+\e[32m+\e[m\e[32m    });\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    this.buttons = this.buttons || Roo.dialog.UploadCropbox.footer.STANDARD;\e[m
+\e[32m+\e[m\e[32m};\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32mRoo.extend(Roo.dialog.UploadCropbox, Roo.Component,  {\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    emptyText : 'Click to upload image',\e[m
+\e[32m+\e[m\e[32m    rotateNotify : 'Image is too small to rotate',\e[m
+\e[32m+\e[m\e[32m    errorTimeout : 3000,\e[m
+\e[32m+\e[m\e[32m    scale : 0,\e[m
+\e[32m+\e[m\e[32m    baseScale : 1,\e[m
+\e[32m+\e[m\e[32m    rotate : 0,\e[m
+\e[32m+\e[m\e[32m    dragable : false,\e[m
+\e[32m+\e[m\e[32m    pinching : false,\e[m
+\e[32m+\e[m\e[32m    mouseX : 0,\e[m
+\e[32m+\e[m\e[32m    mouseY : 0,\e[m
+\e[32m+\e[m\e[32m    cropData : false,\e[m
+\e[32m+\e[m\e[32m    minWidth : 300,\e[m
+\e[32m+\e[m\e[32m    minHeight : 300,\e[m
+\e[32m+\e[m\e[32m    file : false,\e[m
+\e[32m+\e[m\e[32m    exif : {},\e[m
+\e[32m+\e[m\e[32m    baseRotate : 1,\e[m
+\e[32m+\e[m\e[32m    cropType : 'image/jpeg',\e[m
+\e[32m+\e[m\e[32m    buttons : false,\e[m
+\e[32m+\e[m\e[32m    canvasLoaded : false,\e[m
+\e[32m+\e[m\e[32m    isDocument : false,\e[m
+\e[32m+\e[m\e[32m    method : 'POST',\e[m
+\e[32m+\e[m\e[32m    paramName : 'imageUpload',\e[m
+\e[32m+\e[m\e[32m    loadMask : true,\e[m
+\e[32m+\e[m\e[32m    loadingText : 'Loading...',\e[m
+\e[32m+\e[m\e[32m    maskEl : false,\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    getAutoCreate : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var cfg = {\e[m
+\e[32m+\e[m\e[32m            tag : 'div',\e[m
+\e[32m+\e[m\e[32m            cls : 'roo-upload-cropbox',\e[m
+\e[32m+\e[m\e[32m            cn : [\e[m
+\e[32m+\e[m\e[32m                {\e[m
+\e[32m+\e[m\e[32m                    tag : 'input',\e[m
+\e[32m+\e[m\e[32m                    cls : 'roo-upload-cropbox-selector',\e[m
+\e[32m+\e[m\e[32m                    type : 'file'\e[m
+\e[32m+\e[m\e[32m                },\e[m
+\e[32m+\e[m\e[32m                {\e[m
+\e[32m+\e[m\e[32m                    tag : 'div',\e[m
+\e[32m+\e[m\e[32m                    cls : 'roo-upload-cropbox-body',\e[m
+\e[32m+\e[m\e[32m                    style : 'cursor:pointer',\e[m
+\e[32m+\e[m\e[32m                    cn : [\e[m
+\e[32m+\e[m\e[32m                        {\e[m
+\e[32m+\e[m\e[32m                            tag : 'div',\e[m
+\e[32m+\e[m\e[32m                            cls : 'roo-upload-cropbox-preview'\e[m
+\e[32m+\e[m\e[32m                        },\e[m
+\e[32m+\e[m\e[32m                        {\e[m
+\e[32m+\e[m\e[32m                            tag : 'div',\e[m
+\e[32m+\e[m\e[32m                            cls : 'roo-upload-cropbox-thumb'\e[m
+\e[32m+\e[m\e[32m                        },\e[m
+\e[32m+\e[m\e[32m                        {\e[m
+\e[32m+\e[m\e[32m                            tag : 'div',\e[m
+\e[32m+\e[m\e[32m                            cls : 'roo-upload-cropbox-empty-notify',\e[m
+\e[32m+\e[m\e[32m                            html : this.emptyText\e[m
+\e[32m+\e[m\e[32m                        },\e[m
+\e[32m+\e[m\e[32m                        {\e[m
+\e[32m+\e[m\e[32m                            tag : 'div',\e[m
+\e[32m+\e[m\e[32m                            cls : 'roo-upload-cropbox-error-notify alert alert-danger',\e[m
+\e[32m+\e[m\e[32m                            html : this.rotateNotify\e[m
+\e[32m+\e[m\e[32m                        }\e[m
+\e[32m+\e[m\e[32m                    ]\e[m
+\e[32m+\e[m\e[32m                },\e[m
+\e[32m+\e[m\e[32m                {\e[m
+\e[32m+\e[m\e[32m                    tag : 'div',\e[m
+\e[32m+\e[m\e[32m                    cls : 'roo-upload-cropbox-footer',\e[m
+\e[32m+\e[m\e[32m                    cn : {\e[m
+\e[32m+\e[m\e[32m                        tag : 'div',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn-group btn-group-justified roo-upload-cropbox-btn-group',\e[m
+\e[32m+\e[m\e[32m                        cn : []\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[32m            ]\e[m
+\e[32m+\e[m\e[32m        };\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        return cfg;\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onRender : function(ct, position)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        console.log("On Render");\e[m
+\e[32m+\e[m\e[32m        console.log(this);\e[m
+\e[32m+\e[m\e[32m        Roo.dialog.UploadCropbox.superclass.onRender.call(this, ct, position);\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        if(this.el){\e[m
+\e[32m+\e[m\e[32m            if (this.el.attr('xtype')) {\e[m
+\e[32m+\e[m\e[32m                this.el.attr('xtypex', this.el.attr('xtype'));\e[m
+\e[32m+\e[m\e[32m                this.el.dom.removeAttribute('xtype');\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.initEvents();\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        else {\e[m
+\e[32m+\e[m\e[32m            var cfg = Roo.apply({},  this.getAutoCreate());\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m            cfg.id = this.id || Roo.id();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            if (this.cls) {\e[m
+\e[32m+\e[m\e[32m                cfg.cls = (typeof(cfg.cls) == 'undefined' ? this.cls : cfg.cls) + ' ' + this.cls;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            if (this.style) { // fixme needs to support more complex style data.\e[m
+\e[32m+\e[m\e[32m                cfg.style = (typeof(cfg.style) == 'undefined' ? this.style : cfg.style) + '; ' + this.style;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.el = ct.createChild(cfg, position);\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.initEvents();\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if (this.buttons.length) {\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            Roo.each(this.buttons, function(bb) {\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var btn = this.el.select('.roo-upload-cropbox-footer div.roo-upload-cropbox-btn-group').first().createChild(bb);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                btn.on('click', this.onFooterButtonClick.createDelegate(this, [bb.action], true));\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m            }, this);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.loadMask){\e[m
+\e[32m+\e[m\e[32m            this.maskEl = this.el;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    initEvents : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        this.urlAPI = (window.createObjectURL && window) ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                                (window.URL && URL.revokeObjectURL && URL) ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                                (window.webkitURL && webkitURL);\e[m
+\e[32m+\e[m\e[41m                        \e[m
+\e[32m+\e[m\e[32m        this.bodyEl = this.el.select('.roo-upload-cropbox-body', true).first();\e[m
+\e[32m+\e[m\e[32m        this.bodyEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay = 'block';\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.selectorEl = this.el.select('.roo-upload-cropbox-selector', true).first();\e[m
+\e[32m+\e[m\e[32m        this.selectorEl.hide();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.previewEl = this.el.select('.roo-upload-cropbox-preview', true).first();\e[m
+\e[32m+\e[m\e[32m        this.previewEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay = 'block';\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.thumbEl = this.el.select('.roo-upload-cropbox-thumb', true).first();\e[m
+\e[32m+\e[m\e[32m        this.thumbEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay = 'block';\e[m
+\e[32m+\e[m\e[32m        this.thumbEl.hide();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.notifyEl = this.el.select('.roo-upload-cropbox-empty-notify', true).first();\e[m
+\e[32m+\e[m\e[32m        this.notifyEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay = 'block';\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.errorEl = this.el.select('.roo-upload-cropbox-error-notify', true).first();\e[m
+\e[32m+\e[m\e[32m        this.errorEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay = 'block';\e[m
+\e[32m+\e[m\e[32m        this.errorEl.hide();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.footerEl = this.el.select('.roo-upload-cropbox-footer', true).first();\e[m
+\e[32m+\e[m\e[32m        this.footerEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay = 'block';\e[m
+\e[32m+\e[m\e[32m        this.footerEl.hide();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.setThumbBoxSize();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.bind();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.resize();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.fireEvent('initial', this);\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m    bind : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var _this = this;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        window.addEventListener("resize", function() { _this.resize(); } );\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.bodyEl.on('click', this.beforeSelectFile, this);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(Roo.isTouch){\e[m
+\e[32m+\e[m\e[32m            this.bodyEl.on('touchstart', this.onTouchStart, this);\e[m
+\e[32m+\e[m\e[32m            this.bodyEl.on('touchmove', this.onTouchMove, this);\e[m
+\e[32m+\e[m\e[32m            this.bodyEl.on('touchend', this.onTouchEnd, this);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(!Roo.isTouch){\e[m
+\e[32m+\e[m\e[32m            this.bodyEl.on('mousedown', this.onMouseDown, this);\e[m
+\e[32m+\e[m\e[32m            this.bodyEl.on('mousemove', this.onMouseMove, this);\e[m
+\e[32m+\e[m\e[32m            var mousewheel = (/Firefox/i.test(navigator.userAgent))? 'DOMMouseScroll' : 'mousewheel';\e[m
+\e[32m+\e[m\e[32m            this.bodyEl.on(mousewheel, this.onMouseWheel, this);\e[m
+\e[32m+\e[m\e[32m            Roo.get(document).on('mouseup', this.onMouseUp, this);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.selectorEl.on('change', this.onFileSelected, this);\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    reset : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m        this.scale = 0;\e[m
+\e[32m+\e[m\e[32m        this.baseScale = 1;\e[m
+\e[32m+\e[m\e[32m        this.rotate = 0;\e[m
+\e[32m+\e[m\e[32m        this.baseRotate = 1;\e[m
+\e[32m+\e[m\e[32m        this.dragable = false;\e[m
+\e[32m+\e[m\e[32m        this.pinching = false;\e[m
+\e[32m+\e[m\e[32m        this.mouseX = 0;\e[m
+\e[32m+\e[m\e[32m        this.mouseY = 0;\e[m
+\e[32m+\e[m\e[32m        this.cropData = false;\e[m
+\e[32m+\e[m\e[32m        this.notifyEl.dom.innerHTML = this.emptyText;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        // this.selectorEl.dom.value = '';\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    resize : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        if(this.fireEvent('resize', this) != false){\e[m
+\e[32m+\e[m\e[32m            this.setThumbBoxPosition();\e[m
+\e[32m+\e[m\e[32m            this.setCanvasPosition();\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onFooterButtonClick : function(e, el, o, type)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        switch (type) {\e[m
+\e[32m+\e[m\e[32m            case 'rotate-left' :\e[m
+\e[32m+\e[m\e[32m                this.onRotateLeft(e);\e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 'rotate-right' :\e[m
+\e[32m+\e[m\e[32m                this.onRotateRight(e);\e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 'picture' :\e[m
+\e[32m+\e[m\e[32m                this.beforeSelectFile(e);\e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 'trash' :\e[m
+\e[32m+\e[m\e[32m                this.trash(e);\e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 'crop' :\e[m
+\e[32m+\e[m\e[32m                this.crop(e);\e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 'download' :\e[m
+\e[32m+\e[m\e[32m                this.download(e);\e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            default :\e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.fireEvent('footerbuttonclick', this, type);\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    beforeSelectFile : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        e.preventDefault();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.fireEvent('beforeselectfile', this) != false){\e[m
+\e[32m+\e[m\e[32m            this.selectorEl.dom.click();\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onFileSelected : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        e.preventDefault();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(typeof(this.selectorEl.dom.files) == 'undefined' || !this.selectorEl.dom.files.length){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var file = this.selectorEl.dom.files[0];\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.fireEvent('inspect', this, file) != false){\e[m
+\e[32m+\e[m\e[32m            this.prepare(file);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    trash : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        this.fireEvent('trash', this);\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    download : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        this.fireEvent('download', this);\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    loadCanvas : function(src)\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m        if(this.fireEvent('beforeloadcanvas', this, src) != false){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.reset();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.imageEl = document.createElement('img');\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            var _this = this;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.imageEl.addEventListener("load", function(){ _this.onLoadCanvas(); });\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.imageEl.src = src;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onLoadCanvas : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m        this.imageEl.OriginWidth = this.imageEl.naturalWidth || this.imageEl.width;\e[m
+\e[32m+\e[m\e[32m        this.imageEl.OriginHeight = this.imageEl.naturalHeight || this.imageEl.height;\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        if(this.fireEvent('loadcanvas', this, this.imageEl) != false){\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m            this.bodyEl.un('click', this.beforeSelectFile, this);\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.notifyEl.hide();\e[m
+\e[32m+\e[m\e[32m            this.thumbEl.show();\e[m
+\e[32m+\e[m\e[32m            this.footerEl.show();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.baseRotateLevel();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            if(this.isDocument){\e[m
+\e[32m+\e[m\e[32m                this.setThumbBoxSize();\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.setThumbBoxPosition();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.baseScaleLevel();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.draw();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.resize();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.canvasLoaded = true;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.loadMask){\e[m
+\e[32m+\e[m\e[32m            this.maskEl.unmask();\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    setCanvasPosition : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m        if(!this.canvasEl){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var pw = Math.ceil((this.bodyEl.getWidth() - this.canvasEl.width) / 2);\e[m
+\e[32m+\e[m\e[32m        var ph = Math.ceil((this.bodyEl.getHeight() - this.canvasEl.height) / 2);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.previewEl.setLeft(pw);\e[m
+\e[32m+\e[m\e[32m        this.previewEl.setTop(ph);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onMouseDown : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m        e.stopEvent();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.dragable = true;\e[m
+\e[32m+\e[m\e[32m        this.pinching = false;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.isDocument && (this.canvasEl.width < this.thumbEl.getWidth() || this.canvasEl.height < this.thumbEl.getHeight())){\e[m
+\e[32m+\e[m\e[32m            this.dragable = false;\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.mouseX = Roo.isTouch ? e.browserEvent.touches[0].pageX : e.getPageX();\e[m
+\e[32m+\e[m\e[32m        this.mouseY = Roo.isTouch ? e.browserEvent.touches[0].pageY : e.getPageY();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onMouseMove : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m        e.stopEvent();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(!this.canvasLoaded){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if (!this.dragable){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var minX = Math.ceil(this.thumbEl.getLeft(true));\e[m
+\e[32m+\e[m\e[32m        var minY = Math.ceil(this.thumbEl.getTop(true));\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var maxX = Math.ceil(minX + this.thumbEl.getWidth() - this.canvasEl.width);\e[m
+\e[32m+\e[m\e[32m        var maxY = Math.ceil(minY + this.thumbEl.getHeight() - this.canvasEl.height);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var x = Roo.isTouch ? e.browserEvent.touches[0].pageX : e.getPageX();\e[m
+\e[32m+\e[m\e[32m        var y = Roo.isTouch ? e.browserEvent.touches[0].pageY : e.getPageY();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        x = x - this.mouseX;\e[m
+\e[32m+\e[m\e[32m        y = y - this.mouseY;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var bgX = Math.ceil(x + this.previewEl.getLeft(true));\e[m
+\e[32m+\e[m\e[32m        var bgY = Math.ceil(y + this.previewEl.getTop(true));\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        bgX = (minX < bgX) ? minX : ((maxX > bgX) ? maxX : bgX);\e[m
+\e[32m+\e[m\e[32m        bgY = (minY < bgY) ? minY : ((maxY > bgY) ? maxY : bgY);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.previewEl.setLeft(bgX);\e[m
+\e[32m+\e[m\e[32m        this.previewEl.setTop(bgY);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.mouseX = Roo.isTouch ? e.browserEvent.touches[0].pageX : e.getPageX();\e[m
+\e[32m+\e[m\e[32m        this.mouseY = Roo.isTouch ? e.browserEvent.touches[0].pageY : e.getPageY();\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onMouseUp : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m        e.stopEvent();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.dragable = false;\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onMouseWheel : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m        e.stopEvent();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.startScale = this.scale;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.scale = (e.getWheelDelta() == 1) ? (this.scale + 1) : (this.scale - 1);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(!this.zoomable()){\e[m
+\e[32m+\e[m\e[32m            this.scale = this.startScale;\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.draw();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        return;\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    zoomable : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var minScale = this.thumbEl.getWidth() / this.minWidth;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.minWidth < this.minHeight){\e[m
+\e[32m+\e[m\e[32m            minScale = this.thumbEl.getHeight() / this.minHeight;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var width = Math.ceil(this.imageEl.OriginWidth * this.getScaleLevel() / minScale);\e[m
+\e[32m+\e[m\e[32m        var height = Math.ceil(this.imageEl.OriginHeight * this.getScaleLevel() / minScale);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(\e[m
+\e[32m+\e[m\e[32m                this.isDocument &&\e[m
+\e[32m+\e[m\e[32m                (this.rotate == 0 || this.rotate == 180) &&\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                (\e[m
+\e[32m+\e[m\e[32m                    width > this.imageEl.OriginWidth ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                    height > this.imageEl.OriginHeight ||\e[m
+\e[32m+\e[m\e[32m                    (width < this.minWidth && height < this.minHeight)\e[m
+\e[32m+\e[m\e[32m                )\e[m
+\e[32m+\e[m\e[32m        ){\e[m
+\e[32m+\e[m\e[32m            return false;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(\e[m
+\e[32m+\e[m\e[32m                this.isDocument &&\e[m
+\e[32m+\e[m\e[32m                (this.rotate == 90 || this.rotate == 270) &&\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                (\e[m
+\e[32m+\e[m\e[32m                    width > this.imageEl.OriginWidth ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                    height > this.imageEl.OriginHeight ||\e[m
+\e[32m+\e[m\e[32m                    (width < this.minHeight && height < this.minWidth)\e[m
+\e[32m+\e[m\e[32m                )\e[m
+\e[32m+\e[m\e[32m        ){\e[m
+\e[32m+\e[m\e[32m            return false;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(\e[m
+\e[32m+\e[m\e[32m                !this.isDocument &&\e[m
+\e[32m+\e[m\e[32m                (this.rotate == 0 || this.rotate == 180) &&\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                (\e[m
+\e[32m+\e[m\e[32m                    width < this.minWidth ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                    width > this.imageEl.OriginWidth ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                    height < this.minHeight ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                    height > this.imageEl.OriginHeight\e[m
+\e[32m+\e[m\e[32m                )\e[m
+\e[32m+\e[m\e[32m        ){\e[m
+\e[32m+\e[m\e[32m            return false;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(\e[m
+\e[32m+\e[m\e[32m                !this.isDocument &&\e[m
+\e[32m+\e[m\e[32m                (this.rotate == 90 || this.rotate == 270) &&\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                (\e[m
+\e[32m+\e[m\e[32m                    width < this.minHeight ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                    width > this.imageEl.OriginWidth ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                    height < this.minWidth ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                    height > this.imageEl.OriginHeight\e[m
+\e[32m+\e[m\e[32m                )\e[m
+\e[32m+\e[m\e[32m        ){\e[m
+\e[32m+\e[m\e[32m            return false;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        return true;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onRotateLeft : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m        if(!this.isDocument && (this.canvasEl.height < this.thumbEl.getWidth() || this.canvasEl.width < this.thumbEl.getHeight())){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            var minScale = this.thumbEl.getWidth() / this.minWidth;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            var bw = Math.ceil(this.canvasEl.width / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m            var bh = Math.ceil(this.canvasEl.height / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.startScale = this.scale;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            while (this.getScaleLevel() < minScale){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m                this.scale = this.scale + 1;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(!this.zoomable()){\e[m
+\e[32m+\e[m\e[32m                    break;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(\e[m
+\e[32m+\e[m\e[32m                        Math.ceil(bw * this.getScaleLevel()) < this.thumbEl.getHeight() ||\e[m
+\e[32m+\e[m\e[32m                        Math.ceil(bh * this.getScaleLevel()) < this.thumbEl.getWidth()\e[m
+\e[32m+\e[m\e[32m                ){\e[m
+\e[32m+\e[m\e[32m                    continue;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.rotate = (this.rotate < 90) ? 270 : this.rotate - 90;\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                this.draw();\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                return;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.scale = this.startScale;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.onRotateFail();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            return false;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.rotate = (this.rotate < 90) ? 270 : this.rotate - 90;\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        if(this.isDocument){\e[m
+\e[32m+\e[m\e[32m            this.setThumbBoxSize();\e[m
+\e[32m+\e[m\e[32m            this.setThumbBoxPosition();\e[m
+\e[32m+\e[m\e[32m            this.setCanvasPosition();\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.draw();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.fireEvent('rotate', this, 'left');\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onRotateRight : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        if(!this.isDocument && (this.canvasEl.height < this.thumbEl.getWidth() || this.canvasEl.width < this.thumbEl.getHeight())){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            var minScale = this.thumbEl.getWidth() / this.minWidth;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m            var bw = Math.ceil(this.canvasEl.width / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m            var bh = Math.ceil(this.canvasEl.height / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.startScale = this.scale;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            while (this.getScaleLevel() < minScale){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m                this.scale = this.scale + 1;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(!this.zoomable()){\e[m
+\e[32m+\e[m\e[32m                    break;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(\e[m
+\e[32m+\e[m\e[32m                        Math.ceil(bw * this.getScaleLevel()) < this.thumbEl.getHeight() ||\e[m
+\e[32m+\e[m\e[32m                        Math.ceil(bh * this.getScaleLevel()) < this.thumbEl.getWidth()\e[m
+\e[32m+\e[m\e[32m                ){\e[m
+\e[32m+\e[m\e[32m                    continue;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.rotate = (this.rotate > 180) ? 0 : this.rotate + 90;\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                this.draw();\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                return;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.scale = this.startScale;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.onRotateFail();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            return false;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.rotate = (this.rotate > 180) ? 0 : this.rotate + 90;\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        if(this.isDocument){\e[m
+\e[32m+\e[m\e[32m            this.setThumbBoxSize();\e[m
+\e[32m+\e[m\e[32m            this.setThumbBoxPosition();\e[m
+\e[32m+\e[m\e[32m            this.setCanvasPosition();\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.draw();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.fireEvent('rotate', this, 'right');\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onRotateFail : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        this.errorEl.show(true);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var _this = this;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        (function() { _this.errorEl.hide(true); }).defer(this.errorTimeout);\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    draw : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        this.previewEl.dom.innerHTML = '';\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var canvasEl = document.createElement("canvas");\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var contextEl = canvasEl.getContext("2d");\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        canvasEl.width = this.imageEl.OriginWidth * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32m        canvasEl.height = this.imageEl.OriginWidth * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32m        var center = this.imageEl.OriginWidth / 2;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.imageEl.OriginWidth < this.imageEl.OriginHeight){\e[m
+\e[32m+\e[m\e[32m            canvasEl.width = this.imageEl.OriginHeight * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32m            canvasEl.height = this.imageEl.OriginHeight * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32m            center = this.imageEl.OriginHeight / 2;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        contextEl.scale(this.getScaleLevel(), this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        contextEl.translate(center, center);\e[m
+\e[32m+\e[m\e[32m        contextEl.rotate(this.rotate * Math.PI / 180);\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        contextEl.drawImage(this.imageEl, 0, 0, this.imageEl.OriginWidth, this.imageEl.OriginHeight, center * -1, center * -1, this.imageEl.OriginWidth, this.imageEl.OriginHeight);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.canvasEl = document.createElement("canvas");\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.contextEl = this.canvasEl.getContext("2d");\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        switch (this.rotate) {\e[m
+\e[32m+\e[m\e[32m            case 0 :\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.canvasEl.width = this.imageEl.OriginWidth * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32m                this.canvasEl.height = this.imageEl.OriginHeight * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.contextEl.drawImage(canvasEl, 0, 0, this.canvasEl.width, this.canvasEl.height, 0, 0, this.canvasEl.width, this.canvasEl.height);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 90 :\e[m\e[41m \e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.canvasEl.width = this.imageEl.OriginHeight * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32m                this.canvasEl.height = this.imageEl.OriginWidth * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(this.imageEl.OriginWidth > this.imageEl.OriginHeight){\e[m
+\e[32m+\e[m\e[32m                    this.contextEl.drawImage(canvasEl, Math.abs(this.canvasEl.width - this.canvasEl.height), 0, this.canvasEl.width, this.canvasEl.height, 0, 0, this.canvasEl.width, this.canvasEl.height);\e[m
+\e[32m+\e[m\e[32m                    break;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.contextEl.drawImage(canvasEl, 0, 0, this.canvasEl.width, this.canvasEl.height, 0, 0, this.canvasEl.width, this.canvasEl.height);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 180 :\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.canvasEl.width = this.imageEl.OriginWidth * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32m                this.canvasEl.height = this.imageEl.OriginHeight * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(this.imageEl.OriginWidth > this.imageEl.OriginHeight){\e[m
+\e[32m+\e[m\e[32m                    this.contextEl.drawImage(canvasEl, 0, Math.abs(this.canvasEl.width - this.canvasEl.height), this.canvasEl.width, this.canvasEl.height, 0, 0, this.canvasEl.width, this.canvasEl.height);\e[m
+\e[32m+\e[m\e[32m                    break;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.contextEl.drawImage(canvasEl, Math.abs(this.canvasEl.width - this.canvasEl.height), 0, this.canvasEl.width, this.canvasEl.height, 0, 0, this.canvasEl.width, this.canvasEl.height);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 270 :\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.canvasEl.width = this.imageEl.OriginHeight * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32m                this.canvasEl.height = this.imageEl.OriginWidth * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m                if(this.imageEl.OriginWidth > this.imageEl.OriginHeight){\e[m
+\e[32m+\e[m\e[32m                    this.contextEl.drawImage(canvasEl, 0, 0, this.canvasEl.width, this.canvasEl.height, 0, 0, this.canvasEl.width, this.canvasEl.height);\e[m
+\e[32m+\e[m\e[32m                    break;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.contextEl.drawImage(canvasEl, 0, Math.abs(this.canvasEl.width - this.canvasEl.height), this.canvasEl.width, this.canvasEl.height, 0, 0, this.canvasEl.width, this.canvasEl.height);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            default :\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.previewEl.appendChild(this.canvasEl);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.setCanvasPosition();\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    crop : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        if(!this.canvasLoaded){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var imageCanvas = document.createElement("canvas");\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var imageContext = imageCanvas.getContext("2d");\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        imageCanvas.width = (this.imageEl.OriginWidth > this.imageEl.OriginHeight) ? this.imageEl.OriginWidth : this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[32m        imageCanvas.height = (this.imageEl.OriginWidth > this.imageEl.OriginHeight) ? this.imageEl.OriginWidth : this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var center = imageCanvas.width / 2;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        imageContext.translate(center, center);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        imageContext.rotate(this.rotate * Math.PI / 180);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        imageContext.drawImage(this.imageEl, 0, 0, this.imageEl.OriginWidth, this.imageEl.OriginHeight, center * -1, center * -1, this.imageEl.OriginWidth, this.imageEl.OriginHeight);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var canvas = document.createElement("canvas");\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var context = canvas.getContext("2d");\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m        canvas.width = this.minWidth;\e[m
+\e[32m+\e[m\e[32m        canvas.height = this.minHeight;\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        switch (this.rotate) {\e[m
+\e[32m+\e[m\e[32m            case 0 :\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var width = (this.thumbEl.getWidth() / this.getScaleLevel() > this.imageEl.OriginWidth) ? this.imageEl.OriginWidth : (this.thumbEl.getWidth() / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                var height = (this.thumbEl.getHeight() / this.getScaleLevel() > this.imageEl.OriginHeight) ? this.imageEl.OriginHeight : (this.thumbEl.getHeight() / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var x = (this.thumbEl.getLeft(true) > this.previewEl.getLeft(true)) ? 0 : ((this.previewEl.getLeft(true) - this.thumbEl.getLeft(true)) / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                var y = (this.thumbEl.getTop(true) > this.previewEl.getTop(true)) ? 0 : ((this.previewEl.getTop(true) - this.thumbEl.getTop(true)) / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var targetWidth = this.minWidth - 2 * x;\e[m
+\e[32m+\e[m\e[32m                var targetHeight = this.minHeight - 2 * y;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var scale = 1;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if((x == 0 && y == 0) || (x == 0 && y > 0)){\e[m
+\e[32m+\e[m\e[32m                    scale = targetWidth / width;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(x > 0 && y == 0){\e[m
+\e[32m+\e[m\e[32m                    scale = targetHeight / height;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(x > 0 && y > 0){\e[m
+\e[32m+\e[m\e[32m                    scale = targetWidth / width;\e[m
+\e[32m+\e[m\e[41m                    \e[m
+\e[32m+\e[m\e[32m                    if(width < height){\e[m
+\e[32m+\e[m\e[32m                        scale = targetHeight / height;\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                context.scale(scale, scale);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var sx = Math.min(this.canvasEl.width - this.thumbEl.getWidth(), this.thumbEl.getLeft(true) - this.previewEl.getLeft(true));\e[m
+\e[32m+\e[m\e[32m                var sy = Math.min(this.canvasEl.height - this.thumbEl.getHeight(), this.thumbEl.getTop(true) - this.previewEl.getTop(true));\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                sx = sx < 0 ? 0 : (sx / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                sy = sy < 0 ? 0 : (sy / this.getScaleLevel());\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                context.drawImage(imageCanvas, sx, sy, width, height, x, y, width, height);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 90 :\e[m\e[41m \e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var width = (this.thumbEl.getWidth() / this.getScaleLevel() > this.imageEl.OriginHeight) ? this.imageEl.OriginHeight : (this.thumbEl.getWidth() / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                var height = (this.thumbEl.getHeight() / this.getScaleLevel() > this.imageEl.OriginWidth) ? this.imageEl.OriginWidth : (this.thumbEl.getHeight() / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var x = (this.thumbEl.getLeft(true) > this.previewEl.getLeft(true)) ? 0 : ((this.previewEl.getLeft(true) - this.thumbEl.getLeft(true)) / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                var y = (this.thumbEl.getTop(true) > this.previewEl.getTop(true)) ? 0 : ((this.previewEl.getTop(true) - this.thumbEl.getTop(true)) / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var targetWidth = this.minWidth - 2 * x;\e[m
+\e[32m+\e[m\e[32m                var targetHeight = this.minHeight - 2 * y;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var scale = 1;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if((x == 0 && y == 0) || (x == 0 && y > 0)){\e[m
+\e[32m+\e[m\e[32m                    scale = targetWidth / width;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(x > 0 && y == 0){\e[m
+\e[32m+\e[m\e[32m                    scale = targetHeight / height;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(x > 0 && y > 0){\e[m
+\e[32m+\e[m\e[32m                    scale = targetWidth / width;\e[m
+\e[32m+\e[m\e[41m                    \e[m
+\e[32m+\e[m\e[32m                    if(width < height){\e[m
+\e[32m+\e[m\e[32m                        scale = targetHeight / height;\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                context.scale(scale, scale);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var sx = Math.min(this.canvasEl.width - this.thumbEl.getWidth(), this.thumbEl.getLeft(true) - this.previewEl.getLeft(true));\e[m
+\e[32m+\e[m\e[32m                var sy = Math.min(this.canvasEl.height - this.thumbEl.getHeight(), this.thumbEl.getTop(true) - this.previewEl.getTop(true));\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                sx = sx < 0 ? 0 : (sx / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                sy = sy < 0 ? 0 : (sy / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                sx += (this.imageEl.OriginWidth > this.imageEl.OriginHeight) ? Math.abs(this.imageEl.OriginWidth - this.imageEl.OriginHeight) : 0;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                context.drawImage(imageCanvas, sx, sy, width, height, x, y, width, height);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 180 :\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var width = (this.thumbEl.getWidth() / this.getScaleLevel() > this.imageEl.OriginWidth) ? this.imageEl.OriginWidth : (this.thumbEl.getWidth() / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                var height = (this.thumbEl.getHeight() / this.getScaleLevel() > this.imageEl.OriginHeight) ? this.imageEl.OriginHeight : (this.thumbEl.getHeight() / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var x = (this.thumbEl.getLeft(true) > this.previewEl.getLeft(true)) ? 0 : ((this.previewEl.getLeft(true) - this.thumbEl.getLeft(true)) / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                var y = (this.thumbEl.getTop(true) > this.previewEl.getTop(true)) ? 0 : ((this.previewEl.getTop(true) - this.thumbEl.getTop(true)) / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var targetWidth = this.minWidth - 2 * x;\e[m
+\e[32m+\e[m\e[32m                var targetHeight = this.minHeight - 2 * y;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var scale = 1;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if((x == 0 && y == 0) || (x == 0 && y > 0)){\e[m
+\e[32m+\e[m\e[32m                    scale = targetWidth / width;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(x > 0 && y == 0){\e[m
+\e[32m+\e[m\e[32m                    scale = targetHeight / height;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(x > 0 && y > 0){\e[m
+\e[32m+\e[m\e[32m                    scale = targetWidth / width;\e[m
+\e[32m+\e[m\e[41m                    \e[m
+\e[32m+\e[m\e[32m                    if(width < height){\e[m
+\e[32m+\e[m\e[32m                        scale = targetHeight / height;\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                context.scale(scale, scale);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var sx = Math.min(this.canvasEl.width - this.thumbEl.getWidth(), this.thumbEl.getLeft(true) - this.previewEl.getLeft(true));\e[m
+\e[32m+\e[m\e[32m                var sy = Math.min(this.canvasEl.height - this.thumbEl.getHeight(), this.thumbEl.getTop(true) - this.previewEl.getTop(true));\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                sx = sx < 0 ? 0 : (sx / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                sy = sy < 0 ? 0 : (sy / this.getScaleLevel());\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                sx += (this.imageEl.OriginWidth > this.imageEl.OriginHeight) ? 0 : Math.abs(this.imageEl.OriginWidth - this.imageEl.OriginHeight);\e[m
+\e[32m+\e[m\e[32m                sy += (this.imageEl.OriginWidth > this.imageEl.OriginHeight) ? Math.abs(this.imageEl.OriginWidth - this.imageEl.OriginHeight) : 0;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                context.drawImage(imageCanvas, sx, sy, width, height, x, y, width, height);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 270 :\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var width = (this.thumbEl.getWidth() / this.getScaleLevel() > this.imageEl.OriginHeight) ? this.imageEl.OriginHeight : (this.thumbEl.getWidth() / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                var height = (this.thumbEl.getHeight() / this.getScaleLevel() > this.imageEl.OriginWidth) ? this.imageEl.OriginWidth : (this.thumbEl.getHeight() / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var x = (this.thumbEl.getLeft(true) > this.previewEl.getLeft(true)) ? 0 : ((this.previewEl.getLeft(true) - this.thumbEl.getLeft(true)) / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                var y = (this.thumbEl.getTop(true) > this.previewEl.getTop(true)) ? 0 : ((this.previewEl.getTop(true) - this.thumbEl.getTop(true)) / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var targetWidth = this.minWidth - 2 * x;\e[m
+\e[32m+\e[m\e[32m                var targetHeight = this.minHeight - 2 * y;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var scale = 1;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if((x == 0 && y == 0) || (x == 0 && y > 0)){\e[m
+\e[32m+\e[m\e[32m                    scale = targetWidth / width;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(x > 0 && y == 0){\e[m
+\e[32m+\e[m\e[32m                    scale = targetHeight / height;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(x > 0 && y > 0){\e[m
+\e[32m+\e[m\e[32m                    scale = targetWidth / width;\e[m
+\e[32m+\e[m\e[41m                    \e[m
+\e[32m+\e[m\e[32m                    if(width < height){\e[m
+\e[32m+\e[m\e[32m                        scale = targetHeight / height;\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                context.scale(scale, scale);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var sx = Math.min(this.canvasEl.width - this.thumbEl.getWidth(), this.thumbEl.getLeft(true) - this.previewEl.getLeft(true));\e[m
+\e[32m+\e[m\e[32m                var sy = Math.min(this.canvasEl.height - this.thumbEl.getHeight(), this.thumbEl.getTop(true) - this.previewEl.getTop(true));\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                sx = sx < 0 ? 0 : (sx / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                sy = sy < 0 ? 0 : (sy / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                sy += (this.imageEl.OriginWidth > this.imageEl.OriginHeight) ? 0 : Math.abs(this.imageEl.OriginWidth - this.imageEl.OriginHeight);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                context.drawImage(imageCanvas, sx, sy, width, height, x, y, width, height);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            default :\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.cropData = canvas.toDataURL(this.cropType);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.fireEvent('crop', this, this.cropData) !== false){\e[m
+\e[32m+\e[m\e[32m            this.process(this.file, this.cropData);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        return;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    setThumbBoxSize : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var width, height;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.isDocument && typeof(this.imageEl) != 'undefined'){\e[m
+\e[32m+\e[m\e[32m            width = (this.imageEl.OriginWidth > this.imageEl.OriginHeight) ? Math.max(this.minWidth, this.minHeight) : Math.min(this.minWidth, this.minHeight);\e[m
+\e[32m+\e[m\e[32m            height = (this.imageEl.OriginWidth > this.imageEl.OriginHeight) ? Math.min(this.minWidth, this.minHeight) : Math.max(this.minWidth, this.minHeight);\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.minWidth = width;\e[m
+\e[32m+\e[m\e[32m            this.minHeight = height;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            if(this.rotate == 90 || this.rotate == 270){\e[m
+\e[32m+\e[m\e[32m                this.minWidth = height;\e[m
+\e[32m+\e[m\e[32m                this.minHeight = width;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        height = 300;\e[m
+\e[32m+\e[m\e[32m        width = Math.ceil(this.minWidth * height / this.minHeight);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.minWidth > this.minHeight){\e[m
+\e[32m+\e[m\e[32m            width = 300;\e[m
+\e[32m+\e[m\e[32m            height = Math.ceil(this.minHeight * width / this.minWidth);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.thumbEl.setStyle({\e[m
+\e[32m+\e[m\e[32m            width : width + 'px',\e[m
+\e[32m+\e[m\e[32m            height : height + 'px'\e[m
+\e[32m+\e[m\e[32m        });\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        return;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    setThumbBoxPosition : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var x = Math.ceil((this.bodyEl.getWidth() - this.thumbEl.getWidth()) / 2 );\e[m
+\e[32m+\e[m\e[32m        var y = Math.ceil((this.bodyEl.getHeight() - this.thumbEl.getHeight()) / 2);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.thumbEl.setLeft(x);\e[m
+\e[32m+\e[m\e[32m        this.thumbEl.setTop(y);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    baseRotateLevel : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        this.baseRotate = 1;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(\e[m
+\e[32m+\e[m\e[32m                typeof(this.exif) != 'undefined' &&\e[m
+\e[32m+\e[m\e[32m                typeof(this.exif[Roo.dialog.UploadCropbox['tags']['Orientation']]) != 'undefined' &&\e[m
+\e[32m+\e[m\e[32m                [1, 3, 6, 8].indexOf(this.exif[Roo.dialog.UploadCropbox['tags']['Orientation']]) != -1\e[m
+\e[32m+\e[m\e[32m        ){\e[m
+\e[32m+\e[m\e[32m            this.baseRotate = this.exif[Roo.dialog.UploadCropbox['tags']['Orientation']];\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.rotate = Roo.dialog.UploadCropbox['Orientation'][this.baseRotate];\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    baseScaleLevel : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var width, height;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.isDocument){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            if(this.baseRotate == 6 || this.baseRotate == 8){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m                height = this.thumbEl.getHeight();\e[m
+\e[32m+\e[m\e[32m                this.baseScale = height / this.imageEl.OriginWidth;\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                if(this.imageEl.OriginHeight * this.baseScale > this.thumbEl.getWidth()){\e[m
+\e[32m+\e[m\e[32m                    width = this.thumbEl.getWidth();\e[m
+\e[32m+\e[m\e[32m                    this.baseScale = width / this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                return;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m            height = this.thumbEl.getHeight();\e[m
+\e[32m+\e[m\e[32m            this.baseScale = height / this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m            if(this.imageEl.OriginWidth * this.baseScale > this.thumbEl.getWidth()){\e[m
+\e[32m+\e[m\e[32m                width = this.thumbEl.getWidth();\e[m
+\e[32m+\e[m\e[32m                this.baseScale = width / this.imageEl.OriginWidth;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.baseRotate == 6 || this.baseRotate == 8){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            width = this.thumbEl.getHeight();\e[m
+\e[32m+\e[m\e[32m            this.baseScale = width / this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            if(this.imageEl.OriginHeight * this.baseScale < this.thumbEl.getWidth()){\e[m
+\e[32m+\e[m\e[32m                height = this.thumbEl.getWidth();\e[m
+\e[32m+\e[m\e[32m                this.baseScale = height / this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            if(this.imageEl.OriginWidth > this.imageEl.OriginHeight){\e[m
+\e[32m+\e[m\e[32m                height = this.thumbEl.getWidth();\e[m
+\e[32m+\e[m\e[32m                this.baseScale = height / this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(this.imageEl.OriginWidth * this.baseScale < this.thumbEl.getHeight()){\e[m
+\e[32m+\e[m\e[32m                    width = this.thumbEl.getHeight();\e[m
+\e[32m+\e[m\e[32m                    this.baseScale = width / this.imageEl.OriginWidth;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        width = this.thumbEl.getWidth();\e[m
+\e[32m+\e[m\e[32m        this.baseScale = width / this.imageEl.OriginWidth;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.imageEl.OriginHeight * this.baseScale < this.thumbEl.getHeight()){\e[m
+\e[32m+\e[m\e[32m            height = this.thumbEl.getHeight();\e[m
+\e[32m+\e[m\e[32m            this.baseScale = height / this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.imageEl.OriginWidth > this.imageEl.OriginHeight){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            height = this.thumbEl.getHeight();\e[m
+\e[32m+\e[m\e[32m            this.baseScale = height / this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            if(this.imageEl.OriginWidth * this.baseScale < this.thumbEl.getWidth()){\e[m
+\e[32m+\e[m\e[32m                width = this.thumbEl.getWidth();\e[m
+\e[32m+\e[m\e[32m                this.baseScale = width / this.imageEl.OriginWidth;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        return;\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    getScaleLevel : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        return this.baseScale * Math.pow(1.1, this.scale);\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onTouchStart : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        if(!this.canvasLoaded){\e[m
+\e[32m+\e[m\e[32m            this.beforeSelectFile(e);\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var touches = e.browserEvent.touches;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(!touches){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(touches.length == 1){\e[m
+\e[32m+\e[m\e[32m            this.onMouseDown(e);\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(touches.length != 2){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var coords = [];\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        for(var i = 0, finger; finger = touches[i]; i++){\e[m
+\e[32m+\e[m\e[32m            coords.push(finger.pageX, finger.pageY);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var x = Math.pow(coords[0] - coords[2], 2);\e[m
+\e[32m+\e[m\e[32m        var y = Math.pow(coords[1] - coords[3], 2);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.startDistance = Math.sqrt(x + y);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.startScale = this.scale;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.pinching = true;\e[m
+\e[32m+\e[m\e[32m        this.dragable = false;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onTouchMove : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        if(!this.pinching && !this.dragable){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var touches = e.browserEvent.touches;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(!touches){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.dragable){\e[m
+\e[32m+\e[m\e[32m            this.onMouseMove(e);\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var coords = [];\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        for(var i = 0, finger; finger = touches[i]; i++){\e[m
+\e[32m+\e[m\e[32m            coords.push(finger.pageX, finger.pageY);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var x = Math.pow(coords[0] - coords[2], 2);\e[m
+\e[32m+\e[m\e[32m        var y = Math.pow(coords[1] - coords[3], 2);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.endDistance = Math.sqrt(x + y);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.scale = this.startScale + Math.floor(Math.log(this.endDistance / this.startDistance) / Math.log(1.1));\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(!this.zoomable()){\e[m
+\e[32m+\e[m\e[32m            this.scale = this.startScale;\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.draw();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onTouchEnd : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        this.pinching = false;\e[m
+\e[32m+\e[m\e[32m        this.dragable = false;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    process : function(file, crop)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        if(this.loadMask){\e[m
+\e[32m+\e[m\e[32m            this.maskEl.mask(this.loadingText);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.xhr = new XMLHttpRequest();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        file.xhr = this.xhr;\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        this.xhr.open(this.method, this.url, true);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var headers = {\e[m
+\e[32m+\e[m\e[32m            "Accept": "application/json",\e[m
+\e[32m+\e[m\e[32m            "Cache-Control": "no-cache",\e[m
+\e[32m+\e[m\e[32m            "X-Requested-With": "XMLHttpRequest"\e[m
+\e[32m+\e[m\e[32m        };\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        for (var headerName in headers) {\e[m
+\e[32m+\e[m\e[32m            var headerValue = headers[headerName];\e[m
+\e[32m+\e[m\e[32m            if (headerValue) {\e[m
+\e[32m+\e[m\e[32m                this.xhr.setRequestHeader(headerName, headerValue);\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var _this = this;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.xhr.onload = function()\e[m
+\e[32m+\e[m\e[32m        {\e[m
+\e[32m+\e[m\e[32m            _this.xhrOnLoad(_this.xhr);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.xhr.onerror = function()\e[m
+\e[32m+\e[m\e[32m        {\e[m
+\e[32m+\e[m\e[32m            _this.xhrOnError(_this.xhr);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var formData = new FormData();\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        formData.append('returnHTML', 'NO');\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(crop){\e[m
+\e[32m+\e[m\e[32m            formData.append('crop', crop);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(typeof(file) != 'undefined' && (typeof(file.id) == 'undefined' || file.id * 1 < 1)){\e[m
+\e[32m+\e[m\e[32m            formData.append(this.paramName, file, file.name);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(typeof(file.filename) != 'undefined'){\e[m
+\e[32m+\e[m\e[32m            formData.append('filename', file.filename);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(typeof(file.mimetype) != 'undefined'){\e[m
+\e[32m+\e[m\e[32m            formData.append('mimetype', file.mimetype);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.fireEvent('arrange', this, formData) != false){\e[m
+\e[32m+\e[m\e[32m            this.xhr.send(formData);\e[m
+\e[32m+\e[m\e[32m        };\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    xhrOnLoad : function(xhr)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        if(this.loadMask){\e[m
+\e[32m+\e[m\e[32m            this.maskEl.unmask();\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if (xhr.readyState !== 4) {\e[m
+\e[32m+\e[m\e[32m            this.fireEvent('exception', this, xhr);\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        var response = Roo.decode(xhr.responseText);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(!response.success){\e[m
+\e[32m+\e[m\e[32m            this.fireEvent('exception', this, xhr);\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var response = Roo.decode(xhr.responseText);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.fireEvent('upload', this, response);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    xhrOnError : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        if(this.loadMask){\e[m
+\e[32m+\e[m\e[32m            this.maskEl.unmask();\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        Roo.log('xhr on error');\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var response = Roo.decode(xhr.responseText);\e[m
+\e[32m+\e[m\e[41m          \e[m
+\e[32m+\e[m\e[32m        Roo.log(response);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    prepare : function(file)\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m        if(this.loadMask){\e[m
+\e[32m+\e[m\e[32m            this.maskEl.mask(this.loadingText);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.file = false;\e[m
+\e[32m+\e[m\e[32m        this.exif = {};\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(typeof(file) === 'string'){\e[m
+\e[32m+\e[m\e[32m            this.loadCanvas(file);\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(!file || !this.urlAPI){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.file = file;\e[m
+\e[32m+\e[m\e[32m        this.cropType = file.type;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var _this = this;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.fireEvent('prepare', this, this.file) != false){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            var reader = new FileReader();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            reader.onload = function (e) {\e[m
+\e[32m+\e[m\e[32m                if (e.target.error) {\e[m
+\e[32m+\e[m\e[32m                    Roo.log(e.target.error);\e[m
+\e[32m+\e[m\e[32m                    return;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var buffer = e.target.result,\e[m
+\e[32m+\e[m\e[32m                    dataView = new DataView(buffer),\e[m
+\e[32m+\e[m\e[32m                    offset = 2,\e[m
+\e[32m+\e[m\e[32m                    maxOffset = dataView.byteLength - 4,\e[m
+\e[32m+\e[m\e[32m                    markerBytes,\e[m
+\e[32m+\e[m\e[32m                    markerLength;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if (dataView.getUint16(0) === 0xffd8) {\e[m
+\e[32m+\e[m\e[32m                    while (offset < maxOffset) {\e[m
+\e[32m+\e[m\e[32m                        markerBytes = dataView.getUint16(offset);\e[m
+\e[32m+\e[m\e[41m                        \e[m
+\e[32m+\e[m\e[32m                        if ((markerBytes >= 0xffe0 && markerBytes <= 0xffef) || markerBytes === 0xfffe) {\e[m
+\e[32m+\e[m\e[32m                            markerLength = dataView.getUint16(offset + 2) + 2;\e[m
+\e[32m+\e[m\e[32m                            if (offset + markerLength > dataView.byteLength) {\e[m
+\e[32m+\e[m\e[32m                                Roo.log('Invalid meta data: Invalid segment size.');\e[m
+\e[32m+\e[m\e[32m                                break;\e[m
+\e[32m+\e[m\e[32m                            }\e[m
+\e[32m+\e[m\e[41m                            \e[m
+\e[32m+\e[m\e[32m                            if(markerBytes == 0xffe1){\e[m
+\e[32m+\e[m\e[32m                                _this.parseExifData(\e[m
+\e[32m+\e[m\e[32m                                    dataView,\e[m
+\e[32m+\e[m\e[32m                                    offset,\e[m
+\e[32m+\e[m\e[32m                                    markerLength\e[m
+\e[32m+\e[m\e[32m                                );\e[m
+\e[32m+\e[m\e[32m                            }\e[m
+\e[32m+\e[m\e[41m                            \e[m
+\e[32m+\e[m\e[32m                            offset += markerLength;\e[m
+\e[32m+\e[m\e[41m                            \e[m
+\e[32m+\e[m\e[32m                            continue;\e[m
+\e[32m+\e[m\e[32m                        }\e[m
+\e[32m+\e[m\e[41m                        \e[m
+\e[32m+\e[m\e[32m                        break;\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[41m                    \e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var url = _this.urlAPI.createObjectURL(_this.file);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                _this.loadCanvas(url);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                return;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            reader.readAsArrayBuffer(this.file);\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    parseExifData : function(dataView, offset, length)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var tiffOffset = offset + 10,\e[m
+\e[32m+\e[m\e[32m            littleEndian,\e[m
+\e[32m+\e[m\e[32m            dirOffset;\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m        if (dataView.getUint32(offset + 4) !== 0x45786966) {\e[m
+\e[32m+\e[m\e[32m            // No Exif data, might be XMP data instead\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        // Check for the ASCII code for "Exif" (0x45786966):\e[m
+\e[32m+\e[m\e[32m        if (dataView.getUint32(offset + 4) !== 0x45786966) {\e[m
+\e[32m+\e[m\e[32m            // No Exif data, might be XMP data instead\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        if (tiffOffset + 8 > dataView.byteLength) {\e[m
+\e[32m+\e[m\e[32m            Roo.log('Invalid Exif data: Invalid segment size.');\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        // Check for the two null bytes:\e[m
+\e[32m+\e[m\e[32m        if (dataView.getUint16(offset + 8) !== 0x0000) {\e[m
+\e[32m+\e[m\e[32m            Roo.log('Invalid Exif data: Missing byte alignment offset.');\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        // Check the byte alignment:\e[m
+\e[32m+\e[m\e[32m        switch (dataView.getUint16(tiffOffset)) {\e[m
+\e[32m+\e[m\e[32m        case 0x4949:\e[m
+\e[32m+\e[m\e[32m            littleEndian = true;\e[m
+\e[32m+\e[m\e[32m            break;\e[m
+\e[32m+\e[m\e[32m        case 0x4D4D:\e[m
+\e[32m+\e[m\e[32m            littleEndian = false;\e[m
+\e[32m+\e[m\e[32m            break;\e[m
+\e[32m+\e[m\e[32m        default:\e[m
+\e[32m+\e[m\e[32m            Roo.log('Invalid Exif data: Invalid byte alignment marker.');\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        // Check for the TIFF tag marker (0x002A):\e[m
+\e[32m+\e[m\e[32m        if (dataView.getUint16(tiffOffset + 2, littleEndian) !== 0x002A) {\e[m
+\e[32m+\e[m\e[32m            Roo.log('Invalid Exif data: Missing TIFF marker.');\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        // Retrieve the directory offset bytes, usually 0x00000008 or 8 decimal:\e[m
+\e[32m+\e[m\e[32m        dirOffset = dataView.getUint32(tiffOffset + 4, littleEndian);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.parseExifTags(\e[m
+\e[32m+\e[m\e[32m            dataView,\e[m
+\e[32m+\e[m\e[32m            tiffOffset,\e[m
+\e[32m+\e[m\e[32m            tiffOffset + dirOffset,\e[m
+\e[32m+\e[m\e[32m            littleEndian\e[m
+\e[32m+\e[m\e[32m        );\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    parseExifTags : function(dataView, tiffOffset, dirOffset, littleEndian)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var tagsNumber,\e[m
+\e[32m+\e[m\e[32m            dirEndOffset,\e[m
+\e[32m+\e[m\e[32m            i;\e[m
+\e[32m+\e[m\e[32m        if (dirOffset + 6 > dataView.byteLength) {\e[m
+\e[32m+\e[m\e[32m            Roo.log('Invalid Exif data: Invalid directory offset.');\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        tagsNumber = dataView.getUint16(dirOffset, littleEndian);\e[m
+\e[32m+\e[m\e[32m        dirEndOffset = dirOffset + 2 + 12 * tagsNumber;\e[m
+\e[32m+\e[m\e[32m        if (dirEndOffset + 4 > dataView.byteLength) {\e[m
+\e[32m+\e[m\e[32m            Roo.log('Invalid Exif data: Invalid directory size.');\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        for (i = 0; i < tagsNumber; i += 1) {\e[m
+\e[32m+\e[m\e[32m            this.parseExifTag(\e[m
+\e[32m+\e[m\e[32m                dataView,\e[m
+\e[32m+\e[m\e[32m                tiffOffset,\e[m
+\e[32m+\e[m\e[32m                dirOffset + 2 + 12 * i, // tag offset\e[m
+\e[32m+\e[m\e[32m                littleEndian\e[m
+\e[32m+\e[m\e[32m            );\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        // Return the offset to the next directory:\e[m
+\e[32m+\e[m\e[32m        return dataView.getUint32(dirEndOffset, littleEndian);\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    parseExifTag : function (dataView, tiffOffset, offset, littleEndian)\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var tag = dataView.getUint16(offset, littleEndian);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.exif[tag] = this.getExifValue(\e[m
+\e[32m+\e[m\e[32m            dataView,\e[m
+\e[32m+\e[m\e[32m            tiffOffset,\e[m
+\e[32m+\e[m\e[32m            offset,\e[m
+\e[32m+\e[m\e[32m            dataView.getUint16(offset + 2, littleEndian), // tag type\e[m
+\e[32m+\e[m\e[32m            dataView.getUint32(offset + 4, littleEndian), // tag length\e[m
+\e[32m+\e[m\e[32m            littleEndian\e[m
+\e[32m+\e[m\e[32m        );\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    getExifValue : function (dataView, tiffOffset, offset, type, length, littleEndian)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var tagType = Roo.dialog.UploadCropbox.exifTagTypes[type],\e[m
+\e[32m+\e[m\e[32m            tagSize,\e[m
+\e[32m+\e[m\e[32m            dataOffset,\e[m
+\e[32m+\e[m\e[32m            values,\e[m
+\e[32m+\e[m\e[32m            i,\e[m
+\e[32m+\e[m\e[32m            str,\e[m
+\e[32m+\e[m\e[32m            c;\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m        if (!tagType) {\e[m
+\e[32m+\e[m\e[32m            Roo.log('Invalid Exif data: Invalid tag type.');\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        tagSize = tagType.size * length;\e[m
+\e[32m+\e[m\e[32m        // Determine if the value is contained in the dataOffset bytes,\e[m
+\e[32m+\e[m\e[32m        // or if the value at the dataOffset is a pointer to the actual data:\e[m
+\e[32m+\e[m\e[32m        dataOffset = tagSize > 4 ?\e[m
+\e[32m+\e[m\e[32m                tiffOffset + dataView.getUint32(offset + 8, littleEndian) : (offset + 8);\e[m
+\e[32m+\e[m\e[32m        if (dataOffset + tagSize > dataView.byteLength) {\e[m
+\e[32m+\e[m\e[32m            Roo.log('Invalid Exif data: Invalid data offset.');\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        if (length === 1) {\e[m
+\e[32m+\e[m\e[32m            return tagType.getValue(dataView, dataOffset, littleEndian);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        values = [];\e[m
+\e[32m+\e[m\e[32m        for (i = 0; i < length; i += 1) {\e[m
+\e[32m+\e[m\e[32m            values[i] = tagType.getValue(dataView, dataOffset + i * tagType.size, littleEndian);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if (tagType.ascii) {\e[m
+\e[32m+\e[m\e[32m            str = '';\e[m
+\e[32m+\e[m\e[32m            // Concatenate the chars:\e[m
+\e[32m+\e[m\e[32m            for (i = 0; i < values.length; i += 1) {\e[m
+\e[32m+\e[m\e[32m                c = values[i];\e[m
+\e[32m+\e[m\e[32m                // Ignore the terminating NULL byte(s):\e[m
+\e[32m+\e[m\e[32m                if (c === '\u0000') {\e[m
+\e[32m+\e[m\e[32m                    break;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[32m                str += c;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[32m            return str;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        return values;\e[m
+\e[32m+\e[m\e[32m    }\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m});\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32mRoo.apply(Roo.dialog.UploadCropbox, {\e[m
+\e[32m+\e[m\e[32m    tags : {\e[m
+\e[32m+\e[m\e[32m        'Orientation': 0x0112\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    Orientation: {\e[m
+\e[32m+\e[m\e[32m            1: 0, //'top-left',\e[m
+\e[32m+\e[m\e[32m//            2: 'top-right',\e[m
+\e[32m+\e[m\e[32m            3: 180, //'bottom-right',\e[m
+\e[32m+\e[m\e[32m//            4: 'bottom-left',\e[m
+\e[32m+\e[m\e[32m//            5: 'left-top',\e[m
+\e[32m+\e[m\e[32m            6: 90, //'right-top',\e[m
+\e[32m+\e[m\e[32m//            7: 'right-bottom',\e[m
+\e[32m+\e[m\e[32m            8: 270 //'left-bottom'\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    exifTagTypes : {\e[m
+\e[32m+\e[m\e[32m        // byte, 8-bit unsigned int:\e[m
+\e[32m+\e[m\e[32m        1: {\e[m
+\e[32m+\e[m\e[32m            getValue: function (dataView, dataOffset) {\e[m
+\e[32m+\e[m\e[32m                return dataView.getUint8(dataOffset);\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            size: 1\e[m
+\e[32m+\e[m\e[32m        },\e[m
+\e[32m+\e[m\e[32m        // ascii, 8-bit byte:\e[m
+\e[32m+\e[m\e[32m        2: {\e[m
+\e[32m+\e[m\e[32m            getValue: function (dataView, dataOffset) {\e[m
+\e[32m+\e[m\e[32m                return String.fromCharCode(dataView.getUint8(dataOffset));\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            size: 1,\e[m
+\e[32m+\e[m\e[32m            ascii: true\e[m
+\e[32m+\e[m\e[32m        },\e[m
+\e[32m+\e[m\e[32m        // short, 16 bit int:\e[m
+\e[32m+\e[m\e[32m        3: {\e[m
+\e[32m+\e[m\e[32m            getValue: function (dataView, dataOffset, littleEndian) {\e[m
+\e[32m+\e[m\e[32m                return dataView.getUint16(dataOffset, littleEndian);\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            size: 2\e[m
+\e[32m+\e[m\e[32m        },\e[m
+\e[32m+\e[m\e[32m        // long, 32 bit int:\e[m
+\e[32m+\e[m\e[32m        4: {\e[m
+\e[32m+\e[m\e[32m            getValue: function (dataView, dataOffset, littleEndian) {\e[m
+\e[32m+\e[m\e[32m                return dataView.getUint32(dataOffset, littleEndian);\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            size: 4\e[m
+\e[32m+\e[m\e[32m        },\e[m
+\e[32m+\e[m\e[32m        // rational = two long values, first is numerator, second is denominator:\e[m
+\e[32m+\e[m\e[32m        5: {\e[m
+\e[32m+\e[m\e[32m            getValue: function (dataView, dataOffset, littleEndian) {\e[m
+\e[32m+\e[m\e[32m                return dataView.getUint32(dataOffset, littleEndian) /\e[m
+\e[32m+\e[m\e[32m                    dataView.getUint32(dataOffset + 4, littleEndian);\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            size: 8\e[m
+\e[32m+\e[m\e[32m        },\e[m
+\e[32m+\e[m\e[32m        // slong, 32 bit signed int:\e[m
+\e[32m+\e[m\e[32m        9: {\e[m
+\e[32m+\e[m\e[32m            getValue: function (dataView, dataOffset, littleEndian) {\e[m
+\e[32m+\e[m\e[32m                return dataView.getInt32(dataOffset, littleEndian);\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            size: 4\e[m
+\e[32m+\e[m\e[32m        },\e[m
+\e[32m+\e[m\e[32m        // srational, two slongs, first is numerator, second is denominator:\e[m
+\e[32m+\e[m\e[32m        10: {\e[m
+\e[32m+\e[m\e[32m            getValue: function (dataView, dataOffset, littleEndian) {\e[m
+\e[32m+\e[m\e[32m                return dataView.getInt32(dataOffset, littleEndian) /\e[m
+\e[32m+\e[m\e[32m                    dataView.getInt32(dataOffset + 4, littleEndian);\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            size: 8\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    footer : {\e[m
+\e[32m+\e[m\e[32m        STANDARD : [\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-rotate-left',\e[m
+\e[32m+\e[m\e[32m                action : 'rotate-left',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-undo"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-picture',\e[m
+\e[32m+\e[m\e[32m                action : 'picture',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-picture-o"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-rotate-right',\e[m
+\e[32m+\e[m\e[32m                action : 'rotate-right',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-repeat"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[32m        ],\e[m
+\e[32m+\e[m\e[32m        DOCUMENT : [\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-rotate-left',\e[m
+\e[32m+\e[m\e[32m                action : 'rotate-left',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-undo"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-download',\e[m
+\e[32m+\e[m\e[32m                action : 'download',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-download"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-crop',\e[m
+\e[32m+\e[m\e[32m                action : 'crop',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-crop"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-trash',\e[m
+\e[32m+\e[m\e[32m                action : 'trash',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-trash"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-rotate-right',\e[m
+\e[32m+\e[m\e[32m                action : 'rotate-right',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-repeat"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[32m        ],\e[m
+\e[32m+\e[m\e[32m        ROTATOR : [\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-rotate-left',\e[m
+\e[32m+\e[m\e[32m                action : 'rotate-left',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-undo"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-rotate-right',\e[m
+\e[32m+\e[m\e[32m                action : 'rotate-right',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-repeat"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[32m        ]\e[m
+\e[32m+\e[m\e[32m    }\e[m
+\e[32m+\e[m\e[32m});\e[m
+\e[1mdiff --git a/roojs-ui-debug.js b/roojs-ui-debug.js\e[m
+\e[1mindex 4458d38422..4cc277300f 100644\e[m
+\e[1m--- a/roojs-ui-debug.js\e[m
+\e[1m+++ b/roojs-ui-debug.js\e[m
+\e[36m@@ -35922,7 +35922,6 @@\e[m \e[mRoo.LayoutStateManager.prototype = {\e[m
+  */\e[m
+ Roo.ContentPanel = function(el, config, content){\e[m
+     \e[m
+\e[31m-     \e[m
+     /*\e[m
+     if(el.autoCreate || el.xtype){ // xtype is available if this is called from factory\e[m
+         config = el;\e[m
+\e[36m@@ -36306,6 +36305,14 @@\e[m \e[mlayout.addxtype({\e[m
+      */\e[m
+     \e[m
+     addxtype : function(cfg) {\e[m
+\e[32m+\e[m\e[32m        if(cfg.xtype.match(/^UploadCropbox$/)) {\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m            this.cropbox = new Roo.factory(cfg);\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m            this.cropbox.render(this.el);\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m            return this.cropbox;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+         // add form..\e[m
+         if (cfg.xtype.match(/^Form$/)) {\e[m
+             \e[m
+\e[36m@@ -43558,4 +43565,1795 @@\e[m \e[mRoo.extend(Roo.XTemplate, Roo.Template, {\e[m
+ Roo.XTemplate.from = function(el){\e[m
+     el = Roo.getDom(el);\e[m
+     return new Roo.XTemplate(el.value || el.innerHTML);\e[m
+\e[31m-};\e[m
+\ No newline at end of file\e[m
+\e[32m+\e[m\e[32m};Roo.dialog = {};\e[m
+\e[32m+\e[m\e[32m/*\e[m
+\e[32m+\e[m\e[32m* Licence: LGPL\e[m
+\e[32m+\e[m\e[32m*/\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m/**\e[m
+\e[32m+\e[m\e[32m * @class Roo.dialog.UploadCropbox\e[m
+\e[32m+\e[m\e[32m * @extends Roo.BoxComponent\e[m
+\e[32m+\e[m\e[32m * Dialog UploadCropbox class\e[m
+\e[32m+\e[m\e[32m * @cfg {String} emptyText show when image has been loaded\e[m
+\e[32m+\e[m\e[32m * @cfg {String} rotateNotify show when image too small to rotate\e[m
+\e[32m+\e[m\e[32m * @cfg {Number} errorTimeout default 3000\e[m
+\e[32m+\e[m\e[32m * @cfg {Number} minWidth default 300\e[m
+\e[32m+\e[m\e[32m * @cfg {Number} minHeight default 300\e[m
+\e[32m+\e[m\e[32m * @cfg {Array} buttons default ['rotateLeft', 'pictureBtn', 'rotateRight']\e[m
+\e[32m+\e[m\e[32m * @cfg {Boolean} isDocument (true|false) default false\e[m
+\e[32m+\e[m\e[32m * @cfg {String} url action url\e[m
+\e[32m+\e[m\e[32m * @cfg {String} paramName default 'imageUpload'\e[m
+\e[32m+\e[m\e[32m * @cfg {String} method default POST\e[m
+\e[32m+\e[m\e[32m * @cfg {Boolean} loadMask (true|false) default true\e[m
+\e[32m+\e[m\e[32m * @cfg {Boolean} loadingText default 'Loading...'\e[m
+\e[32m+\e[m\e[32m *\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m * @constructor\e[m
+\e[32m+\e[m\e[32m * Create a new UploadCropbox\e[m
+\e[32m+\e[m\e[32m * @param {Object} config The config object\e[m
+\e[32m+\e[m\e[32m */\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m Roo.dialog.UploadCropbox = function(config){\e[m
+\e[32m+\e[m\e[32m    console.log("Dialog UploadCropbox Constructor");\e[m
+\e[32m+\e[m\e[32m    Roo.dialog.UploadCropbox.superclass.constructor.call(this, config);\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    this.addEvents({\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event beforeselectfile\e[m
+\e[32m+\e[m\e[32m         * Fire before select file\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "beforeselectfile" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event initial\e[m
+\e[32m+\e[m\e[32m         * Fire after initEvent\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "initial" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event crop\e[m
+\e[32m+\e[m\e[32m         * Fire after initEvent\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         * @param {String} data\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "crop" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event prepare\e[m
+\e[32m+\e[m\e[32m         * Fire when preparing the file data\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         * @param {Object} file\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "prepare" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event exception\e[m
+\e[32m+\e[m\e[32m         * Fire when get exception\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         * @param {XMLHttpRequest} xhr\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "exception" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event beforeloadcanvas\e[m
+\e[32m+\e[m\e[32m         * Fire before load the canvas\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         * @param {String} src\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "beforeloadcanvas" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event trash\e[m
+\e[32m+\e[m\e[32m         * Fire when trash image\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "trash" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event download\e[m
+\e[32m+\e[m\e[32m         * Fire when download the image\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "download" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event footerbuttonclick\e[m
+\e[32m+\e[m\e[32m         * Fire when footerbuttonclick\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         * @param {String} type\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "footerbuttonclick" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event resize\e[m
+\e[32m+\e[m\e[32m         * Fire when resize\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "resize" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event rotate\e[m
+\e[32m+\e[m\e[32m         * Fire when rotate the image\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         * @param {String} pos\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "rotate" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event inspect\e[m
+\e[32m+\e[m\e[32m         * Fire when inspect the file\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         * @param {Object} file\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "inspect" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event upload\e[m
+\e[32m+\e[m\e[32m         * Fire when xhr upload the file\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         * @param {Object} data\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "upload" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event arrange\e[m
+\e[32m+\e[m\e[32m         * Fire when arrange the file data\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox} this\e[m
+\e[32m+\e[m\e[32m         * @param {Object} formData\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "arrange" : true,\e[m
+\e[32m+\e[m\e[32m        /**\e[m
+\e[32m+\e[m\e[32m         * @event loadcanvas\e[m
+\e[32m+\e[m\e[32m         * Fire after load the canvas\e[m
+\e[32m+\e[m\e[32m         * @param {Roo.dialog.UploadCropbox}\e[m
+\e[32m+\e[m\e[32m         * @param {Object} imgEl\e[m
+\e[32m+\e[m\e[32m         */\e[m
+\e[32m+\e[m\e[32m        "loadcanvas" : true\e[m
+\e[32m+\e[m\e[32m    });\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    this.buttons = this.buttons || Roo.dialog.UploadCropbox.footer.STANDARD;\e[m
+\e[32m+\e[m\e[32m};\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32mRoo.extend(Roo.dialog.UploadCropbox, Roo.Component,  {\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    emptyText : 'Click to upload image',\e[m
+\e[32m+\e[m\e[32m    rotateNotify : 'Image is too small to rotate',\e[m
+\e[32m+\e[m\e[32m    errorTimeout : 3000,\e[m
+\e[32m+\e[m\e[32m    scale : 0,\e[m
+\e[32m+\e[m\e[32m    baseScale : 1,\e[m
+\e[32m+\e[m\e[32m    rotate : 0,\e[m
+\e[32m+\e[m\e[32m    dragable : false,\e[m
+\e[32m+\e[m\e[32m    pinching : false,\e[m
+\e[32m+\e[m\e[32m    mouseX : 0,\e[m
+\e[32m+\e[m\e[32m    mouseY : 0,\e[m
+\e[32m+\e[m\e[32m    cropData : false,\e[m
+\e[32m+\e[m\e[32m    minWidth : 300,\e[m
+\e[32m+\e[m\e[32m    minHeight : 300,\e[m
+\e[32m+\e[m\e[32m    file : false,\e[m
+\e[32m+\e[m\e[32m    exif : {},\e[m
+\e[32m+\e[m\e[32m    baseRotate : 1,\e[m
+\e[32m+\e[m\e[32m    cropType : 'image/jpeg',\e[m
+\e[32m+\e[m\e[32m    buttons : false,\e[m
+\e[32m+\e[m\e[32m    canvasLoaded : false,\e[m
+\e[32m+\e[m\e[32m    isDocument : false,\e[m
+\e[32m+\e[m\e[32m    method : 'POST',\e[m
+\e[32m+\e[m\e[32m    paramName : 'imageUpload',\e[m
+\e[32m+\e[m\e[32m    loadMask : true,\e[m
+\e[32m+\e[m\e[32m    loadingText : 'Loading...',\e[m
+\e[32m+\e[m\e[32m    maskEl : false,\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    getAutoCreate : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var cfg = {\e[m
+\e[32m+\e[m\e[32m            tag : 'div',\e[m
+\e[32m+\e[m\e[32m            cls : 'roo-upload-cropbox',\e[m
+\e[32m+\e[m\e[32m            cn : [\e[m
+\e[32m+\e[m\e[32m                {\e[m
+\e[32m+\e[m\e[32m                    tag : 'input',\e[m
+\e[32m+\e[m\e[32m                    cls : 'roo-upload-cropbox-selector',\e[m
+\e[32m+\e[m\e[32m                    type : 'file'\e[m
+\e[32m+\e[m\e[32m                },\e[m
+\e[32m+\e[m\e[32m                {\e[m
+\e[32m+\e[m\e[32m                    tag : 'div',\e[m
+\e[32m+\e[m\e[32m                    cls : 'roo-upload-cropbox-body',\e[m
+\e[32m+\e[m\e[32m                    style : 'cursor:pointer',\e[m
+\e[32m+\e[m\e[32m                    cn : [\e[m
+\e[32m+\e[m\e[32m                        {\e[m
+\e[32m+\e[m\e[32m                            tag : 'div',\e[m
+\e[32m+\e[m\e[32m                            cls : 'roo-upload-cropbox-preview'\e[m
+\e[32m+\e[m\e[32m                        },\e[m
+\e[32m+\e[m\e[32m                        {\e[m
+\e[32m+\e[m\e[32m                            tag : 'div',\e[m
+\e[32m+\e[m\e[32m                            cls : 'roo-upload-cropbox-thumb'\e[m
+\e[32m+\e[m\e[32m                        },\e[m
+\e[32m+\e[m\e[32m                        {\e[m
+\e[32m+\e[m\e[32m                            tag : 'div',\e[m
+\e[32m+\e[m\e[32m                            cls : 'roo-upload-cropbox-empty-notify',\e[m
+\e[32m+\e[m\e[32m                            html : this.emptyText\e[m
+\e[32m+\e[m\e[32m                        },\e[m
+\e[32m+\e[m\e[32m                        {\e[m
+\e[32m+\e[m\e[32m                            tag : 'div',\e[m
+\e[32m+\e[m\e[32m                            cls : 'roo-upload-cropbox-error-notify alert alert-danger',\e[m
+\e[32m+\e[m\e[32m                            html : this.rotateNotify\e[m
+\e[32m+\e[m\e[32m                        }\e[m
+\e[32m+\e[m\e[32m                    ]\e[m
+\e[32m+\e[m\e[32m                },\e[m
+\e[32m+\e[m\e[32m                {\e[m
+\e[32m+\e[m\e[32m                    tag : 'div',\e[m
+\e[32m+\e[m\e[32m                    cls : 'roo-upload-cropbox-footer',\e[m
+\e[32m+\e[m\e[32m                    cn : {\e[m
+\e[32m+\e[m\e[32m                        tag : 'div',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn-group btn-group-justified roo-upload-cropbox-btn-group',\e[m
+\e[32m+\e[m\e[32m                        cn : []\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[32m            ]\e[m
+\e[32m+\e[m\e[32m        };\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        return cfg;\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onRender : function(ct, position)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        console.log("On Render");\e[m
+\e[32m+\e[m\e[32m        console.log(this);\e[m
+\e[32m+\e[m\e[32m        Roo.dialog.UploadCropbox.superclass.onRender.call(this, ct, position);\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        if(this.el){\e[m
+\e[32m+\e[m\e[32m            if (this.el.attr('xtype')) {\e[m
+\e[32m+\e[m\e[32m                this.el.attr('xtypex', this.el.attr('xtype'));\e[m
+\e[32m+\e[m\e[32m                this.el.dom.removeAttribute('xtype');\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.initEvents();\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        else {\e[m
+\e[32m+\e[m\e[32m            var cfg = Roo.apply({},  this.getAutoCreate());\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m            cfg.id = this.id || Roo.id();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            if (this.cls) {\e[m
+\e[32m+\e[m\e[32m                cfg.cls = (typeof(cfg.cls) == 'undefined' ? this.cls : cfg.cls) + ' ' + this.cls;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            if (this.style) { // fixme needs to support more complex style data.\e[m
+\e[32m+\e[m\e[32m                cfg.style = (typeof(cfg.style) == 'undefined' ? this.style : cfg.style) + '; ' + this.style;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.el = ct.createChild(cfg, position);\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.initEvents();\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if (this.buttons.length) {\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            Roo.each(this.buttons, function(bb) {\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var btn = this.el.select('.roo-upload-cropbox-footer div.roo-upload-cropbox-btn-group').first().createChild(bb);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                btn.on('click', this.onFooterButtonClick.createDelegate(this, [bb.action], true));\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m            }, this);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.loadMask){\e[m
+\e[32m+\e[m\e[32m            this.maskEl = this.el;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    initEvents : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        this.urlAPI = (window.createObjectURL && window) ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                                (window.URL && URL.revokeObjectURL && URL) ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                                (window.webkitURL && webkitURL);\e[m
+\e[32m+\e[m\e[41m                        \e[m
+\e[32m+\e[m\e[32m        this.bodyEl = this.el.select('.roo-upload-cropbox-body', true).first();\e[m
+\e[32m+\e[m\e[32m        this.bodyEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay = 'block';\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.selectorEl = this.el.select('.roo-upload-cropbox-selector', true).first();\e[m
+\e[32m+\e[m\e[32m        this.selectorEl.hide();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.previewEl = this.el.select('.roo-upload-cropbox-preview', true).first();\e[m
+\e[32m+\e[m\e[32m        this.previewEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay = 'block';\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.thumbEl = this.el.select('.roo-upload-cropbox-thumb', true).first();\e[m
+\e[32m+\e[m\e[32m        this.thumbEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay = 'block';\e[m
+\e[32m+\e[m\e[32m        this.thumbEl.hide();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.notifyEl = this.el.select('.roo-upload-cropbox-empty-notify', true).first();\e[m
+\e[32m+\e[m\e[32m        this.notifyEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay = 'block';\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.errorEl = this.el.select('.roo-upload-cropbox-error-notify', true).first();\e[m
+\e[32m+\e[m\e[32m        this.errorEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay = 'block';\e[m
+\e[32m+\e[m\e[32m        this.errorEl.hide();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.footerEl = this.el.select('.roo-upload-cropbox-footer', true).first();\e[m
+\e[32m+\e[m\e[32m        this.footerEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay = 'block';\e[m
+\e[32m+\e[m\e[32m        this.footerEl.hide();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.setThumbBoxSize();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.bind();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.resize();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.fireEvent('initial', this);\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m    bind : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var _this = this;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        window.addEventListener("resize", function() { _this.resize(); } );\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.bodyEl.on('click', this.beforeSelectFile, this);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(Roo.isTouch){\e[m
+\e[32m+\e[m\e[32m            this.bodyEl.on('touchstart', this.onTouchStart, this);\e[m
+\e[32m+\e[m\e[32m            this.bodyEl.on('touchmove', this.onTouchMove, this);\e[m
+\e[32m+\e[m\e[32m            this.bodyEl.on('touchend', this.onTouchEnd, this);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(!Roo.isTouch){\e[m
+\e[32m+\e[m\e[32m            this.bodyEl.on('mousedown', this.onMouseDown, this);\e[m
+\e[32m+\e[m\e[32m            this.bodyEl.on('mousemove', this.onMouseMove, this);\e[m
+\e[32m+\e[m\e[32m            var mousewheel = (/Firefox/i.test(navigator.userAgent))? 'DOMMouseScroll' : 'mousewheel';\e[m
+\e[32m+\e[m\e[32m            this.bodyEl.on(mousewheel, this.onMouseWheel, this);\e[m
+\e[32m+\e[m\e[32m            Roo.get(document).on('mouseup', this.onMouseUp, this);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.selectorEl.on('change', this.onFileSelected, this);\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    reset : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m        this.scale = 0;\e[m
+\e[32m+\e[m\e[32m        this.baseScale = 1;\e[m
+\e[32m+\e[m\e[32m        this.rotate = 0;\e[m
+\e[32m+\e[m\e[32m        this.baseRotate = 1;\e[m
+\e[32m+\e[m\e[32m        this.dragable = false;\e[m
+\e[32m+\e[m\e[32m        this.pinching = false;\e[m
+\e[32m+\e[m\e[32m        this.mouseX = 0;\e[m
+\e[32m+\e[m\e[32m        this.mouseY = 0;\e[m
+\e[32m+\e[m\e[32m        this.cropData = false;\e[m
+\e[32m+\e[m\e[32m        this.notifyEl.dom.innerHTML = this.emptyText;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        // this.selectorEl.dom.value = '';\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    resize : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        if(this.fireEvent('resize', this) != false){\e[m
+\e[32m+\e[m\e[32m            this.setThumbBoxPosition();\e[m
+\e[32m+\e[m\e[32m            this.setCanvasPosition();\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onFooterButtonClick : function(e, el, o, type)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        switch (type) {\e[m
+\e[32m+\e[m\e[32m            case 'rotate-left' :\e[m
+\e[32m+\e[m\e[32m                this.onRotateLeft(e);\e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 'rotate-right' :\e[m
+\e[32m+\e[m\e[32m                this.onRotateRight(e);\e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 'picture' :\e[m
+\e[32m+\e[m\e[32m                this.beforeSelectFile(e);\e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 'trash' :\e[m
+\e[32m+\e[m\e[32m                this.trash(e);\e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 'crop' :\e[m
+\e[32m+\e[m\e[32m                this.crop(e);\e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 'download' :\e[m
+\e[32m+\e[m\e[32m                this.download(e);\e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            default :\e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.fireEvent('footerbuttonclick', this, type);\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    beforeSelectFile : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        e.preventDefault();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.fireEvent('beforeselectfile', this) != false){\e[m
+\e[32m+\e[m\e[32m            this.selectorEl.dom.click();\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onFileSelected : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        e.preventDefault();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(typeof(this.selectorEl.dom.files) == 'undefined' || !this.selectorEl.dom.files.length){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var file = this.selectorEl.dom.files[0];\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.fireEvent('inspect', this, file) != false){\e[m
+\e[32m+\e[m\e[32m            this.prepare(file);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    trash : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        this.fireEvent('trash', this);\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    download : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        this.fireEvent('download', this);\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    loadCanvas : function(src)\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m        if(this.fireEvent('beforeloadcanvas', this, src) != false){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.reset();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.imageEl = document.createElement('img');\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            var _this = this;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.imageEl.addEventListener("load", function(){ _this.onLoadCanvas(); });\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.imageEl.src = src;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onLoadCanvas : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m        this.imageEl.OriginWidth = this.imageEl.naturalWidth || this.imageEl.width;\e[m
+\e[32m+\e[m\e[32m        this.imageEl.OriginHeight = this.imageEl.naturalHeight || this.imageEl.height;\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        if(this.fireEvent('loadcanvas', this, this.imageEl) != false){\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m            this.bodyEl.un('click', this.beforeSelectFile, this);\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.notifyEl.hide();\e[m
+\e[32m+\e[m\e[32m            this.thumbEl.show();\e[m
+\e[32m+\e[m\e[32m            this.footerEl.show();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.baseRotateLevel();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            if(this.isDocument){\e[m
+\e[32m+\e[m\e[32m                this.setThumbBoxSize();\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.setThumbBoxPosition();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.baseScaleLevel();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.draw();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.resize();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.canvasLoaded = true;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.loadMask){\e[m
+\e[32m+\e[m\e[32m            this.maskEl.unmask();\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    setCanvasPosition : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m        if(!this.canvasEl){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var pw = Math.ceil((this.bodyEl.getWidth() - this.canvasEl.width) / 2);\e[m
+\e[32m+\e[m\e[32m        var ph = Math.ceil((this.bodyEl.getHeight() - this.canvasEl.height) / 2);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.previewEl.setLeft(pw);\e[m
+\e[32m+\e[m\e[32m        this.previewEl.setTop(ph);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onMouseDown : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m        e.stopEvent();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.dragable = true;\e[m
+\e[32m+\e[m\e[32m        this.pinching = false;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.isDocument && (this.canvasEl.width < this.thumbEl.getWidth() || this.canvasEl.height < this.thumbEl.getHeight())){\e[m
+\e[32m+\e[m\e[32m            this.dragable = false;\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.mouseX = Roo.isTouch ? e.browserEvent.touches[0].pageX : e.getPageX();\e[m
+\e[32m+\e[m\e[32m        this.mouseY = Roo.isTouch ? e.browserEvent.touches[0].pageY : e.getPageY();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onMouseMove : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m        e.stopEvent();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(!this.canvasLoaded){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if (!this.dragable){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var minX = Math.ceil(this.thumbEl.getLeft(true));\e[m
+\e[32m+\e[m\e[32m        var minY = Math.ceil(this.thumbEl.getTop(true));\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var maxX = Math.ceil(minX + this.thumbEl.getWidth() - this.canvasEl.width);\e[m
+\e[32m+\e[m\e[32m        var maxY = Math.ceil(minY + this.thumbEl.getHeight() - this.canvasEl.height);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var x = Roo.isTouch ? e.browserEvent.touches[0].pageX : e.getPageX();\e[m
+\e[32m+\e[m\e[32m        var y = Roo.isTouch ? e.browserEvent.touches[0].pageY : e.getPageY();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        x = x - this.mouseX;\e[m
+\e[32m+\e[m\e[32m        y = y - this.mouseY;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var bgX = Math.ceil(x + this.previewEl.getLeft(true));\e[m
+\e[32m+\e[m\e[32m        var bgY = Math.ceil(y + this.previewEl.getTop(true));\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        bgX = (minX < bgX) ? minX : ((maxX > bgX) ? maxX : bgX);\e[m
+\e[32m+\e[m\e[32m        bgY = (minY < bgY) ? minY : ((maxY > bgY) ? maxY : bgY);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.previewEl.setLeft(bgX);\e[m
+\e[32m+\e[m\e[32m        this.previewEl.setTop(bgY);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.mouseX = Roo.isTouch ? e.browserEvent.touches[0].pageX : e.getPageX();\e[m
+\e[32m+\e[m\e[32m        this.mouseY = Roo.isTouch ? e.browserEvent.touches[0].pageY : e.getPageY();\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onMouseUp : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m        e.stopEvent();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.dragable = false;\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onMouseWheel : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m        e.stopEvent();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.startScale = this.scale;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.scale = (e.getWheelDelta() == 1) ? (this.scale + 1) : (this.scale - 1);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(!this.zoomable()){\e[m
+\e[32m+\e[m\e[32m            this.scale = this.startScale;\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.draw();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        return;\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    zoomable : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var minScale = this.thumbEl.getWidth() / this.minWidth;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.minWidth < this.minHeight){\e[m
+\e[32m+\e[m\e[32m            minScale = this.thumbEl.getHeight() / this.minHeight;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var width = Math.ceil(this.imageEl.OriginWidth * this.getScaleLevel() / minScale);\e[m
+\e[32m+\e[m\e[32m        var height = Math.ceil(this.imageEl.OriginHeight * this.getScaleLevel() / minScale);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(\e[m
+\e[32m+\e[m\e[32m                this.isDocument &&\e[m
+\e[32m+\e[m\e[32m                (this.rotate == 0 || this.rotate == 180) &&\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                (\e[m
+\e[32m+\e[m\e[32m                    width > this.imageEl.OriginWidth ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                    height > this.imageEl.OriginHeight ||\e[m
+\e[32m+\e[m\e[32m                    (width < this.minWidth && height < this.minHeight)\e[m
+\e[32m+\e[m\e[32m                )\e[m
+\e[32m+\e[m\e[32m        ){\e[m
+\e[32m+\e[m\e[32m            return false;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(\e[m
+\e[32m+\e[m\e[32m                this.isDocument &&\e[m
+\e[32m+\e[m\e[32m                (this.rotate == 90 || this.rotate == 270) &&\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                (\e[m
+\e[32m+\e[m\e[32m                    width > this.imageEl.OriginWidth ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                    height > this.imageEl.OriginHeight ||\e[m
+\e[32m+\e[m\e[32m                    (width < this.minHeight && height < this.minWidth)\e[m
+\e[32m+\e[m\e[32m                )\e[m
+\e[32m+\e[m\e[32m        ){\e[m
+\e[32m+\e[m\e[32m            return false;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(\e[m
+\e[32m+\e[m\e[32m                !this.isDocument &&\e[m
+\e[32m+\e[m\e[32m                (this.rotate == 0 || this.rotate == 180) &&\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                (\e[m
+\e[32m+\e[m\e[32m                    width < this.minWidth ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                    width > this.imageEl.OriginWidth ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                    height < this.minHeight ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                    height > this.imageEl.OriginHeight\e[m
+\e[32m+\e[m\e[32m                )\e[m
+\e[32m+\e[m\e[32m        ){\e[m
+\e[32m+\e[m\e[32m            return false;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(\e[m
+\e[32m+\e[m\e[32m                !this.isDocument &&\e[m
+\e[32m+\e[m\e[32m                (this.rotate == 90 || this.rotate == 270) &&\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                (\e[m
+\e[32m+\e[m\e[32m                    width < this.minHeight ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                    width > this.imageEl.OriginWidth ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                    height < this.minWidth ||\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                    height > this.imageEl.OriginHeight\e[m
+\e[32m+\e[m\e[32m                )\e[m
+\e[32m+\e[m\e[32m        ){\e[m
+\e[32m+\e[m\e[32m            return false;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        return true;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onRotateLeft : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m        if(!this.isDocument && (this.canvasEl.height < this.thumbEl.getWidth() || this.canvasEl.width < this.thumbEl.getHeight())){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            var minScale = this.thumbEl.getWidth() / this.minWidth;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            var bw = Math.ceil(this.canvasEl.width / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m            var bh = Math.ceil(this.canvasEl.height / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.startScale = this.scale;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            while (this.getScaleLevel() < minScale){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m                this.scale = this.scale + 1;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(!this.zoomable()){\e[m
+\e[32m+\e[m\e[32m                    break;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(\e[m
+\e[32m+\e[m\e[32m                        Math.ceil(bw * this.getScaleLevel()) < this.thumbEl.getHeight() ||\e[m
+\e[32m+\e[m\e[32m                        Math.ceil(bh * this.getScaleLevel()) < this.thumbEl.getWidth()\e[m
+\e[32m+\e[m\e[32m                ){\e[m
+\e[32m+\e[m\e[32m                    continue;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.rotate = (this.rotate < 90) ? 270 : this.rotate - 90;\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                this.draw();\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                return;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.scale = this.startScale;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.onRotateFail();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            return false;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.rotate = (this.rotate < 90) ? 270 : this.rotate - 90;\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        if(this.isDocument){\e[m
+\e[32m+\e[m\e[32m            this.setThumbBoxSize();\e[m
+\e[32m+\e[m\e[32m            this.setThumbBoxPosition();\e[m
+\e[32m+\e[m\e[32m            this.setCanvasPosition();\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.draw();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.fireEvent('rotate', this, 'left');\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onRotateRight : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        if(!this.isDocument && (this.canvasEl.height < this.thumbEl.getWidth() || this.canvasEl.width < this.thumbEl.getHeight())){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            var minScale = this.thumbEl.getWidth() / this.minWidth;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m            var bw = Math.ceil(this.canvasEl.width / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m            var bh = Math.ceil(this.canvasEl.height / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.startScale = this.scale;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            while (this.getScaleLevel() < minScale){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m                this.scale = this.scale + 1;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(!this.zoomable()){\e[m
+\e[32m+\e[m\e[32m                    break;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(\e[m
+\e[32m+\e[m\e[32m                        Math.ceil(bw * this.getScaleLevel()) < this.thumbEl.getHeight() ||\e[m
+\e[32m+\e[m\e[32m                        Math.ceil(bh * this.getScaleLevel()) < this.thumbEl.getWidth()\e[m
+\e[32m+\e[m\e[32m                ){\e[m
+\e[32m+\e[m\e[32m                    continue;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.rotate = (this.rotate > 180) ? 0 : this.rotate + 90;\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                this.draw();\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                return;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.scale = this.startScale;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.onRotateFail();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            return false;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.rotate = (this.rotate > 180) ? 0 : this.rotate + 90;\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        if(this.isDocument){\e[m
+\e[32m+\e[m\e[32m            this.setThumbBoxSize();\e[m
+\e[32m+\e[m\e[32m            this.setThumbBoxPosition();\e[m
+\e[32m+\e[m\e[32m            this.setCanvasPosition();\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.draw();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.fireEvent('rotate', this, 'right');\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onRotateFail : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        this.errorEl.show(true);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var _this = this;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        (function() { _this.errorEl.hide(true); }).defer(this.errorTimeout);\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    draw : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        this.previewEl.dom.innerHTML = '';\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var canvasEl = document.createElement("canvas");\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var contextEl = canvasEl.getContext("2d");\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        canvasEl.width = this.imageEl.OriginWidth * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32m        canvasEl.height = this.imageEl.OriginWidth * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32m        var center = this.imageEl.OriginWidth / 2;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.imageEl.OriginWidth < this.imageEl.OriginHeight){\e[m
+\e[32m+\e[m\e[32m            canvasEl.width = this.imageEl.OriginHeight * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32m            canvasEl.height = this.imageEl.OriginHeight * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32m            center = this.imageEl.OriginHeight / 2;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        contextEl.scale(this.getScaleLevel(), this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        contextEl.translate(center, center);\e[m
+\e[32m+\e[m\e[32m        contextEl.rotate(this.rotate * Math.PI / 180);\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        contextEl.drawImage(this.imageEl, 0, 0, this.imageEl.OriginWidth, this.imageEl.OriginHeight, center * -1, center * -1, this.imageEl.OriginWidth, this.imageEl.OriginHeight);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.canvasEl = document.createElement("canvas");\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.contextEl = this.canvasEl.getContext("2d");\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        switch (this.rotate) {\e[m
+\e[32m+\e[m\e[32m            case 0 :\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.canvasEl.width = this.imageEl.OriginWidth * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32m                this.canvasEl.height = this.imageEl.OriginHeight * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.contextEl.drawImage(canvasEl, 0, 0, this.canvasEl.width, this.canvasEl.height, 0, 0, this.canvasEl.width, this.canvasEl.height);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 90 :\e[m\e[41m \e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.canvasEl.width = this.imageEl.OriginHeight * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32m                this.canvasEl.height = this.imageEl.OriginWidth * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(this.imageEl.OriginWidth > this.imageEl.OriginHeight){\e[m
+\e[32m+\e[m\e[32m                    this.contextEl.drawImage(canvasEl, Math.abs(this.canvasEl.width - this.canvasEl.height), 0, this.canvasEl.width, this.canvasEl.height, 0, 0, this.canvasEl.width, this.canvasEl.height);\e[m
+\e[32m+\e[m\e[32m                    break;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.contextEl.drawImage(canvasEl, 0, 0, this.canvasEl.width, this.canvasEl.height, 0, 0, this.canvasEl.width, this.canvasEl.height);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 180 :\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.canvasEl.width = this.imageEl.OriginWidth * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32m                this.canvasEl.height = this.imageEl.OriginHeight * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(this.imageEl.OriginWidth > this.imageEl.OriginHeight){\e[m
+\e[32m+\e[m\e[32m                    this.contextEl.drawImage(canvasEl, 0, Math.abs(this.canvasEl.width - this.canvasEl.height), this.canvasEl.width, this.canvasEl.height, 0, 0, this.canvasEl.width, this.canvasEl.height);\e[m
+\e[32m+\e[m\e[32m                    break;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.contextEl.drawImage(canvasEl, Math.abs(this.canvasEl.width - this.canvasEl.height), 0, this.canvasEl.width, this.canvasEl.height, 0, 0, this.canvasEl.width, this.canvasEl.height);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 270 :\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.canvasEl.width = this.imageEl.OriginHeight * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32m                this.canvasEl.height = this.imageEl.OriginWidth * this.getScaleLevel();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m                if(this.imageEl.OriginWidth > this.imageEl.OriginHeight){\e[m
+\e[32m+\e[m\e[32m                    this.contextEl.drawImage(canvasEl, 0, 0, this.canvasEl.width, this.canvasEl.height, 0, 0, this.canvasEl.width, this.canvasEl.height);\e[m
+\e[32m+\e[m\e[32m                    break;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                this.contextEl.drawImage(canvasEl, 0, Math.abs(this.canvasEl.width - this.canvasEl.height), this.canvasEl.width, this.canvasEl.height, 0, 0, this.canvasEl.width, this.canvasEl.height);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            default :\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.previewEl.appendChild(this.canvasEl);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.setCanvasPosition();\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    crop : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        if(!this.canvasLoaded){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var imageCanvas = document.createElement("canvas");\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var imageContext = imageCanvas.getContext("2d");\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        imageCanvas.width = (this.imageEl.OriginWidth > this.imageEl.OriginHeight) ? this.imageEl.OriginWidth : this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[32m        imageCanvas.height = (this.imageEl.OriginWidth > this.imageEl.OriginHeight) ? this.imageEl.OriginWidth : this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var center = imageCanvas.width / 2;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        imageContext.translate(center, center);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        imageContext.rotate(this.rotate * Math.PI / 180);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        imageContext.drawImage(this.imageEl, 0, 0, this.imageEl.OriginWidth, this.imageEl.OriginHeight, center * -1, center * -1, this.imageEl.OriginWidth, this.imageEl.OriginHeight);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var canvas = document.createElement("canvas");\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var context = canvas.getContext("2d");\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m        canvas.width = this.minWidth;\e[m
+\e[32m+\e[m\e[32m        canvas.height = this.minHeight;\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        switch (this.rotate) {\e[m
+\e[32m+\e[m\e[32m            case 0 :\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var width = (this.thumbEl.getWidth() / this.getScaleLevel() > this.imageEl.OriginWidth) ? this.imageEl.OriginWidth : (this.thumbEl.getWidth() / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                var height = (this.thumbEl.getHeight() / this.getScaleLevel() > this.imageEl.OriginHeight) ? this.imageEl.OriginHeight : (this.thumbEl.getHeight() / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var x = (this.thumbEl.getLeft(true) > this.previewEl.getLeft(true)) ? 0 : ((this.previewEl.getLeft(true) - this.thumbEl.getLeft(true)) / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                var y = (this.thumbEl.getTop(true) > this.previewEl.getTop(true)) ? 0 : ((this.previewEl.getTop(true) - this.thumbEl.getTop(true)) / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var targetWidth = this.minWidth - 2 * x;\e[m
+\e[32m+\e[m\e[32m                var targetHeight = this.minHeight - 2 * y;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var scale = 1;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if((x == 0 && y == 0) || (x == 0 && y > 0)){\e[m
+\e[32m+\e[m\e[32m                    scale = targetWidth / width;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(x > 0 && y == 0){\e[m
+\e[32m+\e[m\e[32m                    scale = targetHeight / height;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(x > 0 && y > 0){\e[m
+\e[32m+\e[m\e[32m                    scale = targetWidth / width;\e[m
+\e[32m+\e[m\e[41m                    \e[m
+\e[32m+\e[m\e[32m                    if(width < height){\e[m
+\e[32m+\e[m\e[32m                        scale = targetHeight / height;\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                context.scale(scale, scale);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var sx = Math.min(this.canvasEl.width - this.thumbEl.getWidth(), this.thumbEl.getLeft(true) - this.previewEl.getLeft(true));\e[m
+\e[32m+\e[m\e[32m                var sy = Math.min(this.canvasEl.height - this.thumbEl.getHeight(), this.thumbEl.getTop(true) - this.previewEl.getTop(true));\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                sx = sx < 0 ? 0 : (sx / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                sy = sy < 0 ? 0 : (sy / this.getScaleLevel());\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                context.drawImage(imageCanvas, sx, sy, width, height, x, y, width, height);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 90 :\e[m\e[41m \e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var width = (this.thumbEl.getWidth() / this.getScaleLevel() > this.imageEl.OriginHeight) ? this.imageEl.OriginHeight : (this.thumbEl.getWidth() / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                var height = (this.thumbEl.getHeight() / this.getScaleLevel() > this.imageEl.OriginWidth) ? this.imageEl.OriginWidth : (this.thumbEl.getHeight() / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var x = (this.thumbEl.getLeft(true) > this.previewEl.getLeft(true)) ? 0 : ((this.previewEl.getLeft(true) - this.thumbEl.getLeft(true)) / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                var y = (this.thumbEl.getTop(true) > this.previewEl.getTop(true)) ? 0 : ((this.previewEl.getTop(true) - this.thumbEl.getTop(true)) / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var targetWidth = this.minWidth - 2 * x;\e[m
+\e[32m+\e[m\e[32m                var targetHeight = this.minHeight - 2 * y;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var scale = 1;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if((x == 0 && y == 0) || (x == 0 && y > 0)){\e[m
+\e[32m+\e[m\e[32m                    scale = targetWidth / width;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(x > 0 && y == 0){\e[m
+\e[32m+\e[m\e[32m                    scale = targetHeight / height;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(x > 0 && y > 0){\e[m
+\e[32m+\e[m\e[32m                    scale = targetWidth / width;\e[m
+\e[32m+\e[m\e[41m                    \e[m
+\e[32m+\e[m\e[32m                    if(width < height){\e[m
+\e[32m+\e[m\e[32m                        scale = targetHeight / height;\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                context.scale(scale, scale);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var sx = Math.min(this.canvasEl.width - this.thumbEl.getWidth(), this.thumbEl.getLeft(true) - this.previewEl.getLeft(true));\e[m
+\e[32m+\e[m\e[32m                var sy = Math.min(this.canvasEl.height - this.thumbEl.getHeight(), this.thumbEl.getTop(true) - this.previewEl.getTop(true));\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                sx = sx < 0 ? 0 : (sx / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                sy = sy < 0 ? 0 : (sy / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                sx += (this.imageEl.OriginWidth > this.imageEl.OriginHeight) ? Math.abs(this.imageEl.OriginWidth - this.imageEl.OriginHeight) : 0;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                context.drawImage(imageCanvas, sx, sy, width, height, x, y, width, height);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 180 :\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var width = (this.thumbEl.getWidth() / this.getScaleLevel() > this.imageEl.OriginWidth) ? this.imageEl.OriginWidth : (this.thumbEl.getWidth() / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                var height = (this.thumbEl.getHeight() / this.getScaleLevel() > this.imageEl.OriginHeight) ? this.imageEl.OriginHeight : (this.thumbEl.getHeight() / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var x = (this.thumbEl.getLeft(true) > this.previewEl.getLeft(true)) ? 0 : ((this.previewEl.getLeft(true) - this.thumbEl.getLeft(true)) / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                var y = (this.thumbEl.getTop(true) > this.previewEl.getTop(true)) ? 0 : ((this.previewEl.getTop(true) - this.thumbEl.getTop(true)) / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var targetWidth = this.minWidth - 2 * x;\e[m
+\e[32m+\e[m\e[32m                var targetHeight = this.minHeight - 2 * y;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var scale = 1;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if((x == 0 && y == 0) || (x == 0 && y > 0)){\e[m
+\e[32m+\e[m\e[32m                    scale = targetWidth / width;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(x > 0 && y == 0){\e[m
+\e[32m+\e[m\e[32m                    scale = targetHeight / height;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(x > 0 && y > 0){\e[m
+\e[32m+\e[m\e[32m                    scale = targetWidth / width;\e[m
+\e[32m+\e[m\e[41m                    \e[m
+\e[32m+\e[m\e[32m                    if(width < height){\e[m
+\e[32m+\e[m\e[32m                        scale = targetHeight / height;\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                context.scale(scale, scale);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var sx = Math.min(this.canvasEl.width - this.thumbEl.getWidth(), this.thumbEl.getLeft(true) - this.previewEl.getLeft(true));\e[m
+\e[32m+\e[m\e[32m                var sy = Math.min(this.canvasEl.height - this.thumbEl.getHeight(), this.thumbEl.getTop(true) - this.previewEl.getTop(true));\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                sx = sx < 0 ? 0 : (sx / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                sy = sy < 0 ? 0 : (sy / this.getScaleLevel());\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                sx += (this.imageEl.OriginWidth > this.imageEl.OriginHeight) ? 0 : Math.abs(this.imageEl.OriginWidth - this.imageEl.OriginHeight);\e[m
+\e[32m+\e[m\e[32m                sy += (this.imageEl.OriginWidth > this.imageEl.OriginHeight) ? Math.abs(this.imageEl.OriginWidth - this.imageEl.OriginHeight) : 0;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                context.drawImage(imageCanvas, sx, sy, width, height, x, y, width, height);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            case 270 :\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var width = (this.thumbEl.getWidth() / this.getScaleLevel() > this.imageEl.OriginHeight) ? this.imageEl.OriginHeight : (this.thumbEl.getWidth() / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                var height = (this.thumbEl.getHeight() / this.getScaleLevel() > this.imageEl.OriginWidth) ? this.imageEl.OriginWidth : (this.thumbEl.getHeight() / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var x = (this.thumbEl.getLeft(true) > this.previewEl.getLeft(true)) ? 0 : ((this.previewEl.getLeft(true) - this.thumbEl.getLeft(true)) / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                var y = (this.thumbEl.getTop(true) > this.previewEl.getTop(true)) ? 0 : ((this.previewEl.getTop(true) - this.thumbEl.getTop(true)) / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var targetWidth = this.minWidth - 2 * x;\e[m
+\e[32m+\e[m\e[32m                var targetHeight = this.minHeight - 2 * y;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var scale = 1;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if((x == 0 && y == 0) || (x == 0 && y > 0)){\e[m
+\e[32m+\e[m\e[32m                    scale = targetWidth / width;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(x > 0 && y == 0){\e[m
+\e[32m+\e[m\e[32m                    scale = targetHeight / height;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(x > 0 && y > 0){\e[m
+\e[32m+\e[m\e[32m                    scale = targetWidth / width;\e[m
+\e[32m+\e[m\e[41m                    \e[m
+\e[32m+\e[m\e[32m                    if(width < height){\e[m
+\e[32m+\e[m\e[32m                        scale = targetHeight / height;\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                context.scale(scale, scale);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var sx = Math.min(this.canvasEl.width - this.thumbEl.getWidth(), this.thumbEl.getLeft(true) - this.previewEl.getLeft(true));\e[m
+\e[32m+\e[m\e[32m                var sy = Math.min(this.canvasEl.height - this.thumbEl.getHeight(), this.thumbEl.getTop(true) - this.previewEl.getTop(true));\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                sx = sx < 0 ? 0 : (sx / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32m                sy = sy < 0 ? 0 : (sy / this.getScaleLevel());\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                sy += (this.imageEl.OriginWidth > this.imageEl.OriginHeight) ? 0 : Math.abs(this.imageEl.OriginWidth - this.imageEl.OriginHeight);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                context.drawImage(imageCanvas, sx, sy, width, height, x, y, width, height);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m            default :\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m                break;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.cropData = canvas.toDataURL(this.cropType);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.fireEvent('crop', this, this.cropData) !== false){\e[m
+\e[32m+\e[m\e[32m            this.process(this.file, this.cropData);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        return;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    setThumbBoxSize : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var width, height;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.isDocument && typeof(this.imageEl) != 'undefined'){\e[m
+\e[32m+\e[m\e[32m            width = (this.imageEl.OriginWidth > this.imageEl.OriginHeight) ? Math.max(this.minWidth, this.minHeight) : Math.min(this.minWidth, this.minHeight);\e[m
+\e[32m+\e[m\e[32m            height = (this.imageEl.OriginWidth > this.imageEl.OriginHeight) ? Math.min(this.minWidth, this.minHeight) : Math.max(this.minWidth, this.minHeight);\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            this.minWidth = width;\e[m
+\e[32m+\e[m\e[32m            this.minHeight = height;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            if(this.rotate == 90 || this.rotate == 270){\e[m
+\e[32m+\e[m\e[32m                this.minWidth = height;\e[m
+\e[32m+\e[m\e[32m                this.minHeight = width;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        height = 300;\e[m
+\e[32m+\e[m\e[32m        width = Math.ceil(this.minWidth * height / this.minHeight);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.minWidth > this.minHeight){\e[m
+\e[32m+\e[m\e[32m            width = 300;\e[m
+\e[32m+\e[m\e[32m            height = Math.ceil(this.minHeight * width / this.minWidth);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.thumbEl.setStyle({\e[m
+\e[32m+\e[m\e[32m            width : width + 'px',\e[m
+\e[32m+\e[m\e[32m            height : height + 'px'\e[m
+\e[32m+\e[m\e[32m        });\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        return;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    setThumbBoxPosition : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var x = Math.ceil((this.bodyEl.getWidth() - this.thumbEl.getWidth()) / 2 );\e[m
+\e[32m+\e[m\e[32m        var y = Math.ceil((this.bodyEl.getHeight() - this.thumbEl.getHeight()) / 2);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.thumbEl.setLeft(x);\e[m
+\e[32m+\e[m\e[32m        this.thumbEl.setTop(y);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    baseRotateLevel : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        this.baseRotate = 1;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(\e[m
+\e[32m+\e[m\e[32m                typeof(this.exif) != 'undefined' &&\e[m
+\e[32m+\e[m\e[32m                typeof(this.exif[Roo.dialog.UploadCropbox['tags']['Orientation']]) != 'undefined' &&\e[m
+\e[32m+\e[m\e[32m                [1, 3, 6, 8].indexOf(this.exif[Roo.dialog.UploadCropbox['tags']['Orientation']]) != -1\e[m
+\e[32m+\e[m\e[32m        ){\e[m
+\e[32m+\e[m\e[32m            this.baseRotate = this.exif[Roo.dialog.UploadCropbox['tags']['Orientation']];\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.rotate = Roo.dialog.UploadCropbox['Orientation'][this.baseRotate];\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    baseScaleLevel : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var width, height;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.isDocument){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            if(this.baseRotate == 6 || this.baseRotate == 8){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m                height = this.thumbEl.getHeight();\e[m
+\e[32m+\e[m\e[32m                this.baseScale = height / this.imageEl.OriginWidth;\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                if(this.imageEl.OriginHeight * this.baseScale > this.thumbEl.getWidth()){\e[m
+\e[32m+\e[m\e[32m                    width = this.thumbEl.getWidth();\e[m
+\e[32m+\e[m\e[32m                    this.baseScale = width / this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m                return;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m            height = this.thumbEl.getHeight();\e[m
+\e[32m+\e[m\e[32m            this.baseScale = height / this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m            if(this.imageEl.OriginWidth * this.baseScale > this.thumbEl.getWidth()){\e[m
+\e[32m+\e[m\e[32m                width = this.thumbEl.getWidth();\e[m
+\e[32m+\e[m\e[32m                this.baseScale = width / this.imageEl.OriginWidth;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.baseRotate == 6 || this.baseRotate == 8){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            width = this.thumbEl.getHeight();\e[m
+\e[32m+\e[m\e[32m            this.baseScale = width / this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            if(this.imageEl.OriginHeight * this.baseScale < this.thumbEl.getWidth()){\e[m
+\e[32m+\e[m\e[32m                height = this.thumbEl.getWidth();\e[m
+\e[32m+\e[m\e[32m                this.baseScale = height / this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            if(this.imageEl.OriginWidth > this.imageEl.OriginHeight){\e[m
+\e[32m+\e[m\e[32m                height = this.thumbEl.getWidth();\e[m
+\e[32m+\e[m\e[32m                this.baseScale = height / this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if(this.imageEl.OriginWidth * this.baseScale < this.thumbEl.getHeight()){\e[m
+\e[32m+\e[m\e[32m                    width = this.thumbEl.getHeight();\e[m
+\e[32m+\e[m\e[32m                    this.baseScale = width / this.imageEl.OriginWidth;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        width = this.thumbEl.getWidth();\e[m
+\e[32m+\e[m\e[32m        this.baseScale = width / this.imageEl.OriginWidth;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.imageEl.OriginHeight * this.baseScale < this.thumbEl.getHeight()){\e[m
+\e[32m+\e[m\e[32m            height = this.thumbEl.getHeight();\e[m
+\e[32m+\e[m\e[32m            this.baseScale = height / this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.imageEl.OriginWidth > this.imageEl.OriginHeight){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            height = this.thumbEl.getHeight();\e[m
+\e[32m+\e[m\e[32m            this.baseScale = height / this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            if(this.imageEl.OriginWidth * this.baseScale < this.thumbEl.getWidth()){\e[m
+\e[32m+\e[m\e[32m                width = this.thumbEl.getWidth();\e[m
+\e[32m+\e[m\e[32m                this.baseScale = width / this.imageEl.OriginWidth;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        return;\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    getScaleLevel : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        return this.baseScale * Math.pow(1.1, this.scale);\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onTouchStart : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        if(!this.canvasLoaded){\e[m
+\e[32m+\e[m\e[32m            this.beforeSelectFile(e);\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var touches = e.browserEvent.touches;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(!touches){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(touches.length == 1){\e[m
+\e[32m+\e[m\e[32m            this.onMouseDown(e);\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(touches.length != 2){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var coords = [];\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        for(var i = 0, finger; finger = touches[i]; i++){\e[m
+\e[32m+\e[m\e[32m            coords.push(finger.pageX, finger.pageY);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var x = Math.pow(coords[0] - coords[2], 2);\e[m
+\e[32m+\e[m\e[32m        var y = Math.pow(coords[1] - coords[3], 2);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.startDistance = Math.sqrt(x + y);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.startScale = this.scale;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.pinching = true;\e[m
+\e[32m+\e[m\e[32m        this.dragable = false;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onTouchMove : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        if(!this.pinching && !this.dragable){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var touches = e.browserEvent.touches;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(!touches){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.dragable){\e[m
+\e[32m+\e[m\e[32m            this.onMouseMove(e);\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var coords = [];\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        for(var i = 0, finger; finger = touches[i]; i++){\e[m
+\e[32m+\e[m\e[32m            coords.push(finger.pageX, finger.pageY);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var x = Math.pow(coords[0] - coords[2], 2);\e[m
+\e[32m+\e[m\e[32m        var y = Math.pow(coords[1] - coords[3], 2);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.endDistance = Math.sqrt(x + y);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.scale = this.startScale + Math.floor(Math.log(this.endDistance / this.startDistance) / Math.log(1.1));\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(!this.zoomable()){\e[m
+\e[32m+\e[m\e[32m            this.scale = this.startScale;\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.draw();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    onTouchEnd : function(e)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        this.pinching = false;\e[m
+\e[32m+\e[m\e[32m        this.dragable = false;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    process : function(file, crop)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        if(this.loadMask){\e[m
+\e[32m+\e[m\e[32m            this.maskEl.mask(this.loadingText);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.xhr = new XMLHttpRequest();\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        file.xhr = this.xhr;\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        this.xhr.open(this.method, this.url, true);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var headers = {\e[m
+\e[32m+\e[m\e[32m            "Accept": "application/json",\e[m
+\e[32m+\e[m\e[32m            "Cache-Control": "no-cache",\e[m
+\e[32m+\e[m\e[32m            "X-Requested-With": "XMLHttpRequest"\e[m
+\e[32m+\e[m\e[32m        };\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        for (var headerName in headers) {\e[m
+\e[32m+\e[m\e[32m            var headerValue = headers[headerName];\e[m
+\e[32m+\e[m\e[32m            if (headerValue) {\e[m
+\e[32m+\e[m\e[32m                this.xhr.setRequestHeader(headerName, headerValue);\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var _this = this;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.xhr.onload = function()\e[m
+\e[32m+\e[m\e[32m        {\e[m
+\e[32m+\e[m\e[32m            _this.xhrOnLoad(_this.xhr);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.xhr.onerror = function()\e[m
+\e[32m+\e[m\e[32m        {\e[m
+\e[32m+\e[m\e[32m            _this.xhrOnError(_this.xhr);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var formData = new FormData();\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        formData.append('returnHTML', 'NO');\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(crop){\e[m
+\e[32m+\e[m\e[32m            formData.append('crop', crop);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(typeof(file) != 'undefined' && (typeof(file.id) == 'undefined' || file.id * 1 < 1)){\e[m
+\e[32m+\e[m\e[32m            formData.append(this.paramName, file, file.name);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(typeof(file.filename) != 'undefined'){\e[m
+\e[32m+\e[m\e[32m            formData.append('filename', file.filename);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(typeof(file.mimetype) != 'undefined'){\e[m
+\e[32m+\e[m\e[32m            formData.append('mimetype', file.mimetype);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.fireEvent('arrange', this, formData) != false){\e[m
+\e[32m+\e[m\e[32m            this.xhr.send(formData);\e[m
+\e[32m+\e[m\e[32m        };\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    xhrOnLoad : function(xhr)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        if(this.loadMask){\e[m
+\e[32m+\e[m\e[32m            this.maskEl.unmask();\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if (xhr.readyState !== 4) {\e[m
+\e[32m+\e[m\e[32m            this.fireEvent('exception', this, xhr);\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32m        var response = Roo.decode(xhr.responseText);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(!response.success){\e[m
+\e[32m+\e[m\e[32m            this.fireEvent('exception', this, xhr);\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var response = Roo.decode(xhr.responseText);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.fireEvent('upload', this, response);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    xhrOnError : function()\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        if(this.loadMask){\e[m
+\e[32m+\e[m\e[32m            this.maskEl.unmask();\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        Roo.log('xhr on error');\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var response = Roo.decode(xhr.responseText);\e[m
+\e[32m+\e[m\e[41m          \e[m
+\e[32m+\e[m\e[32m        Roo.log(response);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    prepare : function(file)\e[m
+\e[32m+\e[m\e[32m    {\e[m\e[41m   \e[m
+\e[32m+\e[m\e[32m        if(this.loadMask){\e[m
+\e[32m+\e[m\e[32m            this.maskEl.mask(this.loadingText);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.file = false;\e[m
+\e[32m+\e[m\e[32m        this.exif = {};\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(typeof(file) === 'string'){\e[m
+\e[32m+\e[m\e[32m            this.loadCanvas(file);\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(!file || !this.urlAPI){\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.file = file;\e[m
+\e[32m+\e[m\e[32m        this.cropType = file.type;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        var _this = this;\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if(this.fireEvent('prepare', this, this.file) != false){\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            var reader = new FileReader();\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            reader.onload = function (e) {\e[m
+\e[32m+\e[m\e[32m                if (e.target.error) {\e[m
+\e[32m+\e[m\e[32m                    Roo.log(e.target.error);\e[m
+\e[32m+\e[m\e[32m                    return;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var buffer = e.target.result,\e[m
+\e[32m+\e[m\e[32m                    dataView = new DataView(buffer),\e[m
+\e[32m+\e[m\e[32m                    offset = 2,\e[m
+\e[32m+\e[m\e[32m                    maxOffset = dataView.byteLength - 4,\e[m
+\e[32m+\e[m\e[32m                    markerBytes,\e[m
+\e[32m+\e[m\e[32m                    markerLength;\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                if (dataView.getUint16(0) === 0xffd8) {\e[m
+\e[32m+\e[m\e[32m                    while (offset < maxOffset) {\e[m
+\e[32m+\e[m\e[32m                        markerBytes = dataView.getUint16(offset);\e[m
+\e[32m+\e[m\e[41m                        \e[m
+\e[32m+\e[m\e[32m                        if ((markerBytes >= 0xffe0 && markerBytes <= 0xffef) || markerBytes === 0xfffe) {\e[m
+\e[32m+\e[m\e[32m                            markerLength = dataView.getUint16(offset + 2) + 2;\e[m
+\e[32m+\e[m\e[32m                            if (offset + markerLength > dataView.byteLength) {\e[m
+\e[32m+\e[m\e[32m                                Roo.log('Invalid meta data: Invalid segment size.');\e[m
+\e[32m+\e[m\e[32m                                break;\e[m
+\e[32m+\e[m\e[32m                            }\e[m
+\e[32m+\e[m\e[41m                            \e[m
+\e[32m+\e[m\e[32m                            if(markerBytes == 0xffe1){\e[m
+\e[32m+\e[m\e[32m                                _this.parseExifData(\e[m
+\e[32m+\e[m\e[32m                                    dataView,\e[m
+\e[32m+\e[m\e[32m                                    offset,\e[m
+\e[32m+\e[m\e[32m                                    markerLength\e[m
+\e[32m+\e[m\e[32m                                );\e[m
+\e[32m+\e[m\e[32m                            }\e[m
+\e[32m+\e[m\e[41m                            \e[m
+\e[32m+\e[m\e[32m                            offset += markerLength;\e[m
+\e[32m+\e[m\e[41m                            \e[m
+\e[32m+\e[m\e[32m                            continue;\e[m
+\e[32m+\e[m\e[32m                        }\e[m
+\e[32m+\e[m\e[41m                        \e[m
+\e[32m+\e[m\e[32m                        break;\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[41m                    \e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                var url = _this.urlAPI.createObjectURL(_this.file);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                _this.loadCanvas(url);\e[m
+\e[32m+\e[m\e[41m                \e[m
+\e[32m+\e[m\e[32m                return;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m            reader.readAsArrayBuffer(this.file);\e[m
+\e[32m+\e[m\e[41m            \e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    parseExifData : function(dataView, offset, length)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var tiffOffset = offset + 10,\e[m
+\e[32m+\e[m\e[32m            littleEndian,\e[m
+\e[32m+\e[m\e[32m            dirOffset;\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m        if (dataView.getUint32(offset + 4) !== 0x45786966) {\e[m
+\e[32m+\e[m\e[32m            // No Exif data, might be XMP data instead\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        // Check for the ASCII code for "Exif" (0x45786966):\e[m
+\e[32m+\e[m\e[32m        if (dataView.getUint32(offset + 4) !== 0x45786966) {\e[m
+\e[32m+\e[m\e[32m            // No Exif data, might be XMP data instead\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        if (tiffOffset + 8 > dataView.byteLength) {\e[m
+\e[32m+\e[m\e[32m            Roo.log('Invalid Exif data: Invalid segment size.');\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        // Check for the two null bytes:\e[m
+\e[32m+\e[m\e[32m        if (dataView.getUint16(offset + 8) !== 0x0000) {\e[m
+\e[32m+\e[m\e[32m            Roo.log('Invalid Exif data: Missing byte alignment offset.');\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        // Check the byte alignment:\e[m
+\e[32m+\e[m\e[32m        switch (dataView.getUint16(tiffOffset)) {\e[m
+\e[32m+\e[m\e[32m        case 0x4949:\e[m
+\e[32m+\e[m\e[32m            littleEndian = true;\e[m
+\e[32m+\e[m\e[32m            break;\e[m
+\e[32m+\e[m\e[32m        case 0x4D4D:\e[m
+\e[32m+\e[m\e[32m            littleEndian = false;\e[m
+\e[32m+\e[m\e[32m            break;\e[m
+\e[32m+\e[m\e[32m        default:\e[m
+\e[32m+\e[m\e[32m            Roo.log('Invalid Exif data: Invalid byte alignment marker.');\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        // Check for the TIFF tag marker (0x002A):\e[m
+\e[32m+\e[m\e[32m        if (dataView.getUint16(tiffOffset + 2, littleEndian) !== 0x002A) {\e[m
+\e[32m+\e[m\e[32m            Roo.log('Invalid Exif data: Missing TIFF marker.');\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        // Retrieve the directory offset bytes, usually 0x00000008 or 8 decimal:\e[m
+\e[32m+\e[m\e[32m        dirOffset = dataView.getUint32(tiffOffset + 4, littleEndian);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.parseExifTags(\e[m
+\e[32m+\e[m\e[32m            dataView,\e[m
+\e[32m+\e[m\e[32m            tiffOffset,\e[m
+\e[32m+\e[m\e[32m            tiffOffset + dirOffset,\e[m
+\e[32m+\e[m\e[32m            littleEndian\e[m
+\e[32m+\e[m\e[32m        );\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    parseExifTags : function(dataView, tiffOffset, dirOffset, littleEndian)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var tagsNumber,\e[m
+\e[32m+\e[m\e[32m            dirEndOffset,\e[m
+\e[32m+\e[m\e[32m            i;\e[m
+\e[32m+\e[m\e[32m        if (dirOffset + 6 > dataView.byteLength) {\e[m
+\e[32m+\e[m\e[32m            Roo.log('Invalid Exif data: Invalid directory offset.');\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        tagsNumber = dataView.getUint16(dirOffset, littleEndian);\e[m
+\e[32m+\e[m\e[32m        dirEndOffset = dirOffset + 2 + 12 * tagsNumber;\e[m
+\e[32m+\e[m\e[32m        if (dirEndOffset + 4 > dataView.byteLength) {\e[m
+\e[32m+\e[m\e[32m            Roo.log('Invalid Exif data: Invalid directory size.');\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        for (i = 0; i < tagsNumber; i += 1) {\e[m
+\e[32m+\e[m\e[32m            this.parseExifTag(\e[m
+\e[32m+\e[m\e[32m                dataView,\e[m
+\e[32m+\e[m\e[32m                tiffOffset,\e[m
+\e[32m+\e[m\e[32m                dirOffset + 2 + 12 * i, // tag offset\e[m
+\e[32m+\e[m\e[32m                littleEndian\e[m
+\e[32m+\e[m\e[32m            );\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        // Return the offset to the next directory:\e[m
+\e[32m+\e[m\e[32m        return dataView.getUint32(dirEndOffset, littleEndian);\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    parseExifTag : function (dataView, tiffOffset, offset, littleEndian)\e[m\e[41m \e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var tag = dataView.getUint16(offset, littleEndian);\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        this.exif[tag] = this.getExifValue(\e[m
+\e[32m+\e[m\e[32m            dataView,\e[m
+\e[32m+\e[m\e[32m            tiffOffset,\e[m
+\e[32m+\e[m\e[32m            offset,\e[m
+\e[32m+\e[m\e[32m            dataView.getUint16(offset + 2, littleEndian), // tag type\e[m
+\e[32m+\e[m\e[32m            dataView.getUint32(offset + 4, littleEndian), // tag length\e[m
+\e[32m+\e[m\e[32m            littleEndian\e[m
+\e[32m+\e[m\e[32m        );\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    getExifValue : function (dataView, tiffOffset, offset, type, length, littleEndian)\e[m
+\e[32m+\e[m\e[32m    {\e[m
+\e[32m+\e[m\e[32m        var tagType = Roo.dialog.UploadCropbox.exifTagTypes[type],\e[m
+\e[32m+\e[m\e[32m            tagSize,\e[m
+\e[32m+\e[m\e[32m            dataOffset,\e[m
+\e[32m+\e[m\e[32m            values,\e[m
+\e[32m+\e[m\e[32m            i,\e[m
+\e[32m+\e[m\e[32m            str,\e[m
+\e[32m+\e[m\e[32m            c;\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m        if (!tagType) {\e[m
+\e[32m+\e[m\e[32m            Roo.log('Invalid Exif data: Invalid tag type.');\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        tagSize = tagType.size * length;\e[m
+\e[32m+\e[m\e[32m        // Determine if the value is contained in the dataOffset bytes,\e[m
+\e[32m+\e[m\e[32m        // or if the value at the dataOffset is a pointer to the actual data:\e[m
+\e[32m+\e[m\e[32m        dataOffset = tagSize > 4 ?\e[m
+\e[32m+\e[m\e[32m                tiffOffset + dataView.getUint32(offset + 8, littleEndian) : (offset + 8);\e[m
+\e[32m+\e[m\e[32m        if (dataOffset + tagSize > dataView.byteLength) {\e[m
+\e[32m+\e[m\e[32m            Roo.log('Invalid Exif data: Invalid data offset.');\e[m
+\e[32m+\e[m\e[32m            return;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        if (length === 1) {\e[m
+\e[32m+\e[m\e[32m            return tagType.getValue(dataView, dataOffset, littleEndian);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        values = [];\e[m
+\e[32m+\e[m\e[32m        for (i = 0; i < length; i += 1) {\e[m
+\e[32m+\e[m\e[32m            values[i] = tagType.getValue(dataView, dataOffset + i * tagType.size, littleEndian);\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[41m        \e[m
+\e[32m+\e[m\e[32m        if (tagType.ascii) {\e[m
+\e[32m+\e[m\e[32m            str = '';\e[m
+\e[32m+\e[m\e[32m            // Concatenate the chars:\e[m
+\e[32m+\e[m\e[32m            for (i = 0; i < values.length; i += 1) {\e[m
+\e[32m+\e[m\e[32m                c = values[i];\e[m
+\e[32m+\e[m\e[32m                // Ignore the terminating NULL byte(s):\e[m
+\e[32m+\e[m\e[32m                if (c === '\u0000') {\e[m
+\e[32m+\e[m\e[32m                    break;\e[m
+\e[32m+\e[m\e[32m                }\e[m
+\e[32m+\e[m\e[32m                str += c;\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[32m            return str;\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m        return values;\e[m
+\e[32m+\e[m\e[32m    }\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m});\e[m
+\e[32m+\e[m
+\e[32m+\e[m\e[32mRoo.apply(Roo.dialog.UploadCropbox, {\e[m
+\e[32m+\e[m\e[32m    tags : {\e[m
+\e[32m+\e[m\e[32m        'Orientation': 0x0112\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    Orientation: {\e[m
+\e[32m+\e[m\e[32m            1: 0, //'top-left',\e[m
+\e[32m+\e[m\e[32m//            2: 'top-right',\e[m
+\e[32m+\e[m\e[32m            3: 180, //'bottom-right',\e[m
+\e[32m+\e[m\e[32m//            4: 'bottom-left',\e[m
+\e[32m+\e[m\e[32m//            5: 'left-top',\e[m
+\e[32m+\e[m\e[32m            6: 90, //'right-top',\e[m
+\e[32m+\e[m\e[32m//            7: 'right-bottom',\e[m
+\e[32m+\e[m\e[32m            8: 270 //'left-bottom'\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    exifTagTypes : {\e[m
+\e[32m+\e[m\e[32m        // byte, 8-bit unsigned int:\e[m
+\e[32m+\e[m\e[32m        1: {\e[m
+\e[32m+\e[m\e[32m            getValue: function (dataView, dataOffset) {\e[m
+\e[32m+\e[m\e[32m                return dataView.getUint8(dataOffset);\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            size: 1\e[m
+\e[32m+\e[m\e[32m        },\e[m
+\e[32m+\e[m\e[32m        // ascii, 8-bit byte:\e[m
+\e[32m+\e[m\e[32m        2: {\e[m
+\e[32m+\e[m\e[32m            getValue: function (dataView, dataOffset) {\e[m
+\e[32m+\e[m\e[32m                return String.fromCharCode(dataView.getUint8(dataOffset));\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            size: 1,\e[m
+\e[32m+\e[m\e[32m            ascii: true\e[m
+\e[32m+\e[m\e[32m        },\e[m
+\e[32m+\e[m\e[32m        // short, 16 bit int:\e[m
+\e[32m+\e[m\e[32m        3: {\e[m
+\e[32m+\e[m\e[32m            getValue: function (dataView, dataOffset, littleEndian) {\e[m
+\e[32m+\e[m\e[32m                return dataView.getUint16(dataOffset, littleEndian);\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            size: 2\e[m
+\e[32m+\e[m\e[32m        },\e[m
+\e[32m+\e[m\e[32m        // long, 32 bit int:\e[m
+\e[32m+\e[m\e[32m        4: {\e[m
+\e[32m+\e[m\e[32m            getValue: function (dataView, dataOffset, littleEndian) {\e[m
+\e[32m+\e[m\e[32m                return dataView.getUint32(dataOffset, littleEndian);\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            size: 4\e[m
+\e[32m+\e[m\e[32m        },\e[m
+\e[32m+\e[m\e[32m        // rational = two long values, first is numerator, second is denominator:\e[m
+\e[32m+\e[m\e[32m        5: {\e[m
+\e[32m+\e[m\e[32m            getValue: function (dataView, dataOffset, littleEndian) {\e[m
+\e[32m+\e[m\e[32m                return dataView.getUint32(dataOffset, littleEndian) /\e[m
+\e[32m+\e[m\e[32m                    dataView.getUint32(dataOffset + 4, littleEndian);\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            size: 8\e[m
+\e[32m+\e[m\e[32m        },\e[m
+\e[32m+\e[m\e[32m        // slong, 32 bit signed int:\e[m
+\e[32m+\e[m\e[32m        9: {\e[m
+\e[32m+\e[m\e[32m            getValue: function (dataView, dataOffset, littleEndian) {\e[m
+\e[32m+\e[m\e[32m                return dataView.getInt32(dataOffset, littleEndian);\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            size: 4\e[m
+\e[32m+\e[m\e[32m        },\e[m
+\e[32m+\e[m\e[32m        // srational, two slongs, first is numerator, second is denominator:\e[m
+\e[32m+\e[m\e[32m        10: {\e[m
+\e[32m+\e[m\e[32m            getValue: function (dataView, dataOffset, littleEndian) {\e[m
+\e[32m+\e[m\e[32m                return dataView.getInt32(dataOffset, littleEndian) /\e[m
+\e[32m+\e[m\e[32m                    dataView.getInt32(dataOffset + 4, littleEndian);\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            size: 8\e[m
+\e[32m+\e[m\e[32m        }\e[m
+\e[32m+\e[m\e[32m    },\e[m
+\e[32m+\e[m\e[41m    \e[m
+\e[32m+\e[m\e[32m    footer : {\e[m
+\e[32m+\e[m\e[32m        STANDARD : [\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-rotate-left',\e[m
+\e[32m+\e[m\e[32m                action : 'rotate-left',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-undo"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-picture',\e[m
+\e[32m+\e[m\e[32m                action : 'picture',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-picture-o"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-rotate-right',\e[m
+\e[32m+\e[m\e[32m                action : 'rotate-right',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-repeat"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[32m        ],\e[m
+\e[32m+\e[m\e[32m        DOCUMENT : [\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-rotate-left',\e[m
+\e[32m+\e[m\e[32m                action : 'rotate-left',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-undo"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-download',\e[m
+\e[32m+\e[m\e[32m                action : 'download',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-download"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-crop',\e[m
+\e[32m+\e[m\e[32m                action : 'crop',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-crop"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-trash',\e[m
+\e[32m+\e[m\e[32m                action : 'trash',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-trash"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-rotate-right',\e[m
+\e[32m+\e[m\e[32m                action : 'rotate-right',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-repeat"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[32m        ],\e[m
+\e[32m+\e[m\e[32m        ROTATOR : [\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-rotate-left',\e[m
+\e[32m+\e[m\e[32m                action : 'rotate-left',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-undo"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            },\e[m
+\e[32m+\e[m\e[32m            {\e[m
+\e[32m+\e[m\e[32m                tag : 'div',\e[m
+\e[32m+\e[m\e[32m                cls : 'btn-group roo-upload-cropbox-rotate-right',\e[m
+\e[32m+\e[m\e[32m                action : 'rotate-right',\e[m
+\e[32m+\e[m\e[32m                cn : [\e[m
+\e[32m+\e[m\e[32m                    {\e[m
+\e[32m+\e[m\e[32m                        tag : 'button',\e[m
+\e[32m+\e[m\e[32m                        cls : 'btn btn-default',\e[m
+\e[32m+\e[m\e[32m                        html : '<i class="fa fa-repeat"></i>'\e[m
+\e[32m+\e[m\e[32m                    }\e[m
+\e[32m+\e[m\e[32m                ]\e[m
+\e[32m+\e[m\e[32m            }\e[m
+\e[32m+\e[m\e[32m        ]\e[m
+\e[32m+\e[m\e[32m    }\e[m
+\e[32m+\e[m\e[32m});\e[m
+\e[1mdiff --git a/roojs-ui.js b/roojs-ui.js\e[m
+\e[1mindex 98443d0ddf..0cc67d83a4 100644\e[m
+\e[1m--- a/roojs-ui.js\e[m
+\e[1m+++ b/roojs-ui.js\e[m
+\e[36m@@ -1598,9 +1598,9 @@\e[m \e[mreturn this.el.getUpdateManager();},_handleRefresh:function(A,B,C){if(!C||!this.\e[m
+ te.setWidth(A);}if(this.adjustments){A+=this.adjustments[0];B+=this.adjustments[1];}return {"width":A,"height":B};},setSize:function(A,B){if(this.fitToFrame&&!this.ignoreResize(A,B)){if(this.fitContainer&&this.resizeEl!=this.el){this.el.setSize(A,B);}var C=this.adjustForComponents(A,B);\e[m
+ this.resizeEl.setSize(this.autoWidth?"auto":C.width,this.autoHeight?"auto":C.height);this.fireEvent('resize',this,C.width,C.height);}},getTitle:function(){return this.title;},setTitle:function(A){this.title=A;if(this.region){this.region.updatePanelTitle(this,A);\e[m
+ }},isClosable:function(){return this.closable;},beforeSlide:function(){this.el.clip();this.resizeEl.clip();},afterSlide:function(){this.el.unclip();this.resizeEl.unclip();},refresh:function(){if(this.refreshDelegate){this.loaded=false;this.refreshDelegate();\e[m
+\e[31m-}},destroy:function(){this.el.removeAllListeners();var A=document.createElement("span");A.appendChild(this.el.dom);A.innerHTML="";this.el.remove();this.el=null;},form:false,view:false,addxtype:function(A){if(A.xtype.match(/^Form$/)){var el;el=this.el.createChild();\e[m
+\e[31m-this.form=new Roo.form.Form(A);if(this.form.allItems.length){this.form.render(el.dom);}return this.form;}if(['View','JsonView','DatePicker'].indexOf(A.xtype)>-1){A.el=this.el.appendChild(document.createElement("div"));var B=new Roo.factory(A);B.render&&B.render(false,'');\e[m
+\e[31m-this.view=B;return B;}return false;}});\e[m
+\e[32m+\e[m\e[32m}},destroy:function(){this.el.removeAllListeners();var A=document.createElement("span");A.appendChild(this.el.dom);A.innerHTML="";this.el.remove();this.el=null;},form:false,view:false,addxtype:function(A){if(A.xtype.match(/^UploadCropbox$/)){this.cropbox=new Roo.factory(A);\e[m
+\e[32m+\e[m\e[32mthis.cropbox.render(this.el);return this.cropbox;}if(A.xtype.match(/^Form$/)){var el;el=this.el.createChild();this.form=new Roo.form.Form(A);if(this.form.allItems.length){this.form.render(el.dom);}return this.form;}if(['View','JsonView','DatePicker'].indexOf(A.xtype)>-1){A.el=this.el.appendChild(document.createElement("div"));\e[m
+\e[32m+\e[m\e[32mvar B=new Roo.factory(A);B.render&&B.render(false,'');this.view=B;return B;}return false;}});\e[m
+ // Roo/GridPanel.js\e[m
+ Roo.GridPanel=function(A,B){if(typeof(A.grid)!='undefined'){B=A;A=B.grid;}this.wrapper=Roo.DomHelper.append(document.body,{tag:"div",cls:"x-layout-grid-wrapper x-layout-inactive-content"},true);this.wrapper.dom.appendChild(A.getGridEl().dom);Roo.GridPanel.superclass.constructor.call(this,this.wrapper,B);\e[m
+ if(this.toolbar){this.toolbar.el.insertBefore(this.wrapper.dom.firstChild);}if(this.footer&&!this.footer.el&&this.footer.xtype){this.footer.container=this.grid.getView().getFooterPanel(true);this.footer.dataSource=this.grid.dataSource;this.footer=Roo.factory(this.footer,Roo);\e[m
+\e[36m@@ -1929,3 +1929,103 @@\e[m \e[mF.push("(typeof("+G+") == 'undefined')");});var H='(('+F.join(" || ")+") ? undef\e[m
+ }return "'"+A+H+C+")"+A+"'";};var B;if(Roo.isGecko){B="tpl.compiled = function(values, parent){  with(values) { return '"+tpl.body.replace(/(\r\n|\n)/g,'\\n').replace(/'/g,"\\'").replace(this.re,fn)+"';};};";}else{B=["tpl.compiled = function(values, parent){  with (values) { return ['"];\e[m
+ B.push(tpl.body.replace(/(\r\n|\n)/g,'\\n').replace(/'/g,"\\'").replace(this.re,fn));B.push("'].join('');};};");B=B.join('');}Roo.debug&&Roo.log(B.replace(/\\n/,'\n'));eval(B);return this;},applyTemplate:function(A){return this.master.compiled.call(this,A,{}\e[m
+ );},apply:function(){return this.applyTemplate.apply(this,arguments);}});Roo.XTemplate.from=function(el){el=Roo.getDom(el);return new Roo.XTemplate(el.value||el.innerHTML);};\e[m
+\e[32m+\e[m\e[32m// Roo/dialog/namespace.js\e[m
+\e[32m+\e[m\e[32mRoo.dialog={};\e[m
+\e[32m+\e[m\e[32m// Roo/dialog/UploadCropbox.js\e[m
+\e[32m+\e[m\e[32mRoo.dialog.UploadCropbox=function(A){console.log("Dialog UploadCropbox Constructor");Roo.dialog.UploadCropbox.superclass.constructor.call(this,A);this.addEvents({"beforeselectfile":true,"initial":true,"crop":true,"prepare":true,"exception":true,"beforeloadcanvas":true,"trash":true,"download":true,"footerbuttonclick":true,"resize":true,"rotate":true,"inspect":true,"upload":true,"arrange":true,"loadcanvas":true}\e[m
+\e[32m+\e[m\e[32m);this.buttons=this.buttons||Roo.dialog.UploadCropbox.footer.STANDARD;};Roo.extend(Roo.dialog.UploadCropbox,Roo.Component,{emptyText:'Click to upload image',rotateNotify:'Image is too small to rotate',errorTimeout:3000,scale:0,baseScale:1,rotate:0,dragable:false,pinching:false,mouseX:0,mouseY:0,cropData:false,minWidth:300,minHeight:300,file:false,exif:{}\e[m
+\e[32m+\e[m\e[32m,baseRotate:1,cropType:'image/jpeg',buttons:false,canvasLoaded:false,isDocument:false,method:'POST',paramName:'imageUpload',loadMask:true,loadingText:'Loading...',maskEl:false,getAutoCreate:function(){var A={tag:'div',cls:'roo-upload-cropbox',cn:[{tag:'input',cls:'roo-upload-cropbox-selector',type:'file'}\e[m
+\e[32m+\e[m\e[32m,{tag:'div',cls:'roo-upload-cropbox-body',style:'cursor:pointer',cn:[{tag:'div',cls:'roo-upload-cropbox-preview'},{tag:'div',cls:'roo-upload-cropbox-thumb'},{tag:'div',cls:'roo-upload-cropbox-empty-notify',html:this.emptyText},{tag:'div',cls:'roo-upload-cropbox-error-notify alert alert-danger',html:this.rotateNotify}\e[m
+\e[32m+\e[m\e[32m]},{tag:'div',cls:'roo-upload-cropbox-footer',cn:{tag:'div',cls:'btn-group btn-group-justified roo-upload-cropbox-btn-group',cn:[]}}]};return A;},onRender:function(ct,A){console.log("On Render");console.log(this);Roo.dialog.UploadCropbox.superclass.onRender.call(this,ct,A);\e[m
+\e[32m+\e[m\e[32mif(this.el){if(this.el.attr('xtype')){this.el.attr('xtypex',this.el.attr('xtype'));this.el.dom.removeAttribute('xtype');this.initEvents();}}else{var B=Roo.apply({},this.getAutoCreate());B.id=this.id||Roo.id();if(this.cls){B.cls=(typeof(B.cls)=='undefined'?this.cls:B.cls)+' '+this.cls;\e[m
+\e[32m+\e[m\e[32m}if(this.style){B.style=(typeof(B.style)=='undefined'?this.style:B.style)+'; '+this.style;}this.el=ct.createChild(B,A);this.initEvents();}if(this.buttons.length){Roo.each(this.buttons,function(bb){var C=this.el.select('.roo-upload-cropbox-footer div.roo-upload-cropbox-btn-group').first().createChild(bb);\e[m
+\e[32m+\e[m\e[32mC.on('click',this.onFooterButtonClick.createDelegate(this,[bb.action],true));},this);}if(this.loadMask){this.maskEl=this.el;}},initEvents:function(){this.urlAPI=(window.createObjectURL&&window)||(window.URL&&URL.revokeObjectURL&&URL)||(window.webkitURL&&webkitURL);\e[m
+\e[32m+\e[m\e[32mthis.bodyEl=this.el.select('.roo-upload-cropbox-body',true).first();this.bodyEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay='block';this.selectorEl=this.el.select('.roo-upload-cropbox-selector',true).first();this.selectorEl.hide();this.previewEl=this.el.select('.roo-upload-cropbox-preview',true).first();\e[m
+\e[32m+\e[m\e[32mthis.previewEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay='block';this.thumbEl=this.el.select('.roo-upload-cropbox-thumb',true).first();this.thumbEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay='block';this.thumbEl.hide();this.notifyEl=this.el.select('.roo-upload-cropbox-empty-notify',true).first();\e[m
+\e[32m+\e[m\e[32mthis.notifyEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay='block';this.errorEl=this.el.select('.roo-upload-cropbox-error-notify',true).first();this.errorEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay='block';this.errorEl.hide();this.footerEl=this.el.select('.roo-upload-cropbox-footer',true).first();\e[m
+\e[32m+\e[m\e[32mthis.footerEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay='block';this.footerEl.hide();this.setThumbBoxSize();this.bind();this.resize();this.fireEvent('initial',this);},bind:function(){var A=this;window.addEventListener("resize",function(){A.resize();\e[m
+\e[32m+\e[m\e[32m});this.bodyEl.on('click',this.beforeSelectFile,this);if(Roo.isTouch){this.bodyEl.on('touchstart',this.onTouchStart,this);this.bodyEl.on('touchmove',this.onTouchMove,this);this.bodyEl.on('touchend',this.onTouchEnd,this);}if(!Roo.isTouch){this.bodyEl.on('mousedown',this.onMouseDown,this);\e[m
+\e[32m+\e[m\e[32mthis.bodyEl.on('mousemove',this.onMouseMove,this);var B=(/Firefox/i.test(navigator.userAgent))?'DOMMouseScroll':'mousewheel';this.bodyEl.on(B,this.onMouseWheel,this);Roo.get(document).on('mouseup',this.onMouseUp,this);}this.selectorEl.on('change',this.onFileSelected,this);\e[m
+\e[32m+\e[m\e[32m},reset:function(){this.scale=0;this.baseScale=1;this.rotate=0;this.baseRotate=1;this.dragable=false;this.pinching=false;this.mouseX=0;this.mouseY=0;this.cropData=false;this.notifyEl.dom.innerHTML=this.emptyText;},resize:function(){if(this.fireEvent('resize',this)!=false){this.setThumbBoxPosition();\e[m
+\e[32m+\e[m\e[32mthis.setCanvasPosition();}},onFooterButtonClick:function(e,el,o,A){switch(A){case 'rotate-left':this.onRotateLeft(e);break;case 'rotate-right':this.onRotateRight(e);break;case 'picture':this.beforeSelectFile(e);break;case 'trash':this.trash(e);break;case 'crop':this.crop(e);\e[m
+\e[32m+\e[m\e[32mbreak;case 'download':this.download(e);break;default:break;}this.fireEvent('footerbuttonclick',this,A);},beforeSelectFile:function(e){e.preventDefault();if(this.fireEvent('beforeselectfile',this)!=false){this.selectorEl.dom.click();}},onFileSelected:function(e){e.preventDefault();\e[m
+\e[32m+\e[m\e[32mif(typeof(this.selectorEl.dom.files)=='undefined'||!this.selectorEl.dom.files.length){return;}var A=this.selectorEl.dom.files[0];if(this.fireEvent('inspect',this,A)!=false){this.prepare(A);}},trash:function(e){this.fireEvent('trash',this);},download:function(e){this.fireEvent('download',this);\e[m
+\e[32m+\e[m\e[32m},loadCanvas:function(A){if(this.fireEvent('beforeloadcanvas',this,A)!=false){this.reset();this.imageEl=document.createElement('img');var B=this;this.imageEl.addEventListener("load",function(){B.onLoadCanvas();});this.imageEl.src=A;}},onLoadCanvas:function(){this.imageEl.OriginWidth=this.imageEl.naturalWidth||this.imageEl.width;\e[m
+\e[32m+\e[m\e[32mthis.imageEl.OriginHeight=this.imageEl.naturalHeight||this.imageEl.height;if(this.fireEvent('loadcanvas',this,this.imageEl)!=false){this.bodyEl.un('click',this.beforeSelectFile,this);this.notifyEl.hide();this.thumbEl.show();this.footerEl.show();this.baseRotateLevel();\e[m
+\e[32m+\e[m\e[32mif(this.isDocument){this.setThumbBoxSize();}this.setThumbBoxPosition();this.baseScaleLevel();this.draw();this.resize();this.canvasLoaded=true;}if(this.loadMask){this.maskEl.unmask();}},setCanvasPosition:function(){if(!this.canvasEl){return;}var pw=Math.ceil((this.bodyEl.getWidth()-this.canvasEl.width)/2);\e[m
+\e[32m+\e[m\e[32mvar ph=Math.ceil((this.bodyEl.getHeight()-this.canvasEl.height)/2);this.previewEl.setLeft(pw);this.previewEl.setTop(ph);},onMouseDown:function(e){e.stopEvent();this.dragable=true;this.pinching=false;if(this.isDocument&&(this.canvasEl.width<this.thumbEl.getWidth()||this.canvasEl.height<this.thumbEl.getHeight())){this.dragable=false;\e[m
+\e[32m+\e[m\e[32mreturn;}this.mouseX=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();this.mouseY=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();},onMouseMove:function(e){e.stopEvent();if(!this.canvasLoaded){return;}if(!this.dragable){return;}var A=Math.ceil(this.thumbEl.getLeft(true));\e[m
+\e[32m+\e[m\e[32mvar B=Math.ceil(this.thumbEl.getTop(true));var C=Math.ceil(A+this.thumbEl.getWidth()-this.canvasEl.width);var D=Math.ceil(B+this.thumbEl.getHeight()-this.canvasEl.height);var x=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();var y=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();\e[m
+\e[32m+\e[m\e[32mx=x-this.mouseX;y=y-this.mouseY;var E=Math.ceil(x+this.previewEl.getLeft(true));var F=Math.ceil(y+this.previewEl.getTop(true));E=(A<E)?A:((C>E)?C:E);F=(B<F)?B:((D>F)?D:F);this.previewEl.setLeft(E);this.previewEl.setTop(F);this.mouseX=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();\e[m
+\e[32m+\e[m\e[32mthis.mouseY=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();},onMouseUp:function(e){e.stopEvent();this.dragable=false;},onMouseWheel:function(e){e.stopEvent();this.startScale=this.scale;this.scale=(e.getWheelDelta()==1)?(this.scale+1):(this.scale-1);\e[m
+\e[32m+\e[m\e[32mif(!this.zoomable()){this.scale=this.startScale;return;}this.draw();return;},zoomable:function(){var A=this.thumbEl.getWidth()/this.minWidth;if(this.minWidth<this.minHeight){A=this.thumbEl.getHeight()/this.minHeight;}var B=Math.ceil(this.imageEl.OriginWidth*this.getScaleLevel()/A);\e[m
+\e[32m+\e[m\e[32mvar C=Math.ceil(this.imageEl.OriginHeight*this.getScaleLevel()/A);if(this.isDocument&&(this.rotate==0||this.rotate==180)&&(B>this.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(B<this.minWidth&&C<this.minHeight))){return false;}if(this.isDocument&&(this.rotate==90||this.rotate==270)&&(B>this.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(B<this.minHeight&&C<this.minWidth))){return false;\e[m
+\e[32m+\e[m\e[32m}if(!this.isDocument&&(this.rotate==0||this.rotate==180)&&(B<this.minWidth||B>this.imageEl.OriginWidth||C<this.minHeight||C>this.imageEl.OriginHeight)){return false;}if(!this.isDocument&&(this.rotate==90||this.rotate==270)&&(B<this.minHeight||B>this.imageEl.OriginWidth||C<this.minWidth||C>this.imageEl.OriginHeight)){return false;\e[m
+\e[32m+\e[m\e[32m}return true;},onRotateLeft:function(e){if(!this.isDocument&&(this.canvasEl.height<this.thumbEl.getWidth()||this.canvasEl.width<this.thumbEl.getHeight())){var A=this.thumbEl.getWidth()/this.minWidth;var bw=Math.ceil(this.canvasEl.width/this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32mvar bh=Math.ceil(this.canvasEl.height/this.getScaleLevel());this.startScale=this.scale;while(this.getScaleLevel()<A){this.scale=this.scale+1;if(!this.zoomable()){break;}if(Math.ceil(bw*this.getScaleLevel())<this.thumbEl.getHeight()||Math.ceil(bh*this.getScaleLevel())<this.thumbEl.getWidth()){continue;\e[m
+\e[32m+\e[m\e[32m}this.rotate=(this.rotate<90)?270:this.rotate-90;this.draw();return;}this.scale=this.startScale;this.onRotateFail();return false;}this.rotate=(this.rotate<90)?270:this.rotate-90;if(this.isDocument){this.setThumbBoxSize();this.setThumbBoxPosition();this.setCanvasPosition();\e[m
+\e[32m+\e[m\e[32m}this.draw();this.fireEvent('rotate',this,'left');},onRotateRight:function(e){if(!this.isDocument&&(this.canvasEl.height<this.thumbEl.getWidth()||this.canvasEl.width<this.thumbEl.getHeight())){var A=this.thumbEl.getWidth()/this.minWidth;var bw=Math.ceil(this.canvasEl.width/this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32mvar bh=Math.ceil(this.canvasEl.height/this.getScaleLevel());this.startScale=this.scale;while(this.getScaleLevel()<A){this.scale=this.scale+1;if(!this.zoomable()){break;}if(Math.ceil(bw*this.getScaleLevel())<this.thumbEl.getHeight()||Math.ceil(bh*this.getScaleLevel())<this.thumbEl.getWidth()){continue;\e[m
+\e[32m+\e[m\e[32m}this.rotate=(this.rotate>180)?0:this.rotate+90;this.draw();return;}this.scale=this.startScale;this.onRotateFail();return false;}this.rotate=(this.rotate>180)?0:this.rotate+90;if(this.isDocument){this.setThumbBoxSize();this.setThumbBoxPosition();this.setCanvasPosition();\e[m
+\e[32m+\e[m\e[32m}this.draw();this.fireEvent('rotate',this,'right');},onRotateFail:function(){this.errorEl.show(true);var A=this;(function(){A.errorEl.hide(true);}).defer(this.errorTimeout);},draw:function(){this.previewEl.dom.innerHTML='';var A=document.createElement("canvas");\e[m
+\e[32m+\e[m\e[32mvar B=A.getContext("2d");A.width=this.imageEl.OriginWidth*this.getScaleLevel();A.height=this.imageEl.OriginWidth*this.getScaleLevel();var C=this.imageEl.OriginWidth/2;if(this.imageEl.OriginWidth<this.imageEl.OriginHeight){A.width=this.imageEl.OriginHeight*this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32mA.height=this.imageEl.OriginHeight*this.getScaleLevel();C=this.imageEl.OriginHeight/2;}B.scale(this.getScaleLevel(),this.getScaleLevel());B.translate(C,C);B.rotate(this.rotate*Math.PI/180);B.drawImage(this.imageEl,0,0,this.imageEl.OriginWidth,this.imageEl.OriginHeight,C*-1,C*-1,this.imageEl.OriginWidth,this.imageEl.OriginHeight);\e[m
+\e[32m+\e[m\e[32mthis.canvasEl=document.createElement("canvas");this.contextEl=this.canvasEl.getContext("2d");switch(this.rotate){case 0:this.canvasEl.width=this.imageEl.OriginWidth*this.getScaleLevel();this.canvasEl.height=this.imageEl.OriginHeight*this.getScaleLevel();this.contextEl.drawImage(A,0,0,this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);\e[m
+\e[32m+\e[m\e[32mbreak;case 90:this.canvasEl.width=this.imageEl.OriginHeight*this.getScaleLevel();this.canvasEl.height=this.imageEl.OriginWidth*this.getScaleLevel();if(this.imageEl.OriginWidth>this.imageEl.OriginHeight){this.contextEl.drawImage(A,Math.abs(this.canvasEl.width-this.canvasEl.height),0,this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);\e[m
+\e[32m+\e[m\e[32mbreak;}this.contextEl.drawImage(A,0,0,this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);break;case 180:this.canvasEl.width=this.imageEl.OriginWidth*this.getScaleLevel();this.canvasEl.height=this.imageEl.OriginHeight*this.getScaleLevel();\e[m
+\e[32m+\e[m\e[32mif(this.imageEl.OriginWidth>this.imageEl.OriginHeight){this.contextEl.drawImage(A,0,Math.abs(this.canvasEl.width-this.canvasEl.height),this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);break;}this.contextEl.drawImage(A,Math.abs(this.canvasEl.width-this.canvasEl.height),0,this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);\e[m
+\e[32m+\e[m\e[32mbreak;case 270:this.canvasEl.width=this.imageEl.OriginHeight*this.getScaleLevel();this.canvasEl.height=this.imageEl.OriginWidth*this.getScaleLevel();if(this.imageEl.OriginWidth>this.imageEl.OriginHeight){this.contextEl.drawImage(A,0,0,this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);\e[m
+\e[32m+\e[m\e[32mbreak;}this.contextEl.drawImage(A,0,Math.abs(this.canvasEl.width-this.canvasEl.height),this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);break;default:break;}this.previewEl.appendChild(this.canvasEl);this.setCanvasPosition();\e[m
+\e[32m+\e[m\e[32m},crop:function(){if(!this.canvasLoaded){return;}var A=document.createElement("canvas");var B=A.getContext("2d");A.width=(this.imageEl.OriginWidth>this.imageEl.OriginHeight)?this.imageEl.OriginWidth:this.imageEl.OriginHeight;A.height=(this.imageEl.OriginWidth>this.imageEl.OriginHeight)?this.imageEl.OriginWidth:this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[32mvar C=A.width/2;B.translate(C,C);B.rotate(this.rotate*Math.PI/180);B.drawImage(this.imageEl,0,0,this.imageEl.OriginWidth,this.imageEl.OriginHeight,C*-1,C*-1,this.imageEl.OriginWidth,this.imageEl.OriginHeight);var D=document.createElement("canvas");var E=D.getContext("2d");\e[m
+\e[32m+\e[m\e[32mD.width=this.minWidth;D.height=this.minHeight;switch(this.rotate){case 0:var F=(this.thumbEl.getWidth()/this.getScaleLevel()>this.imageEl.OriginWidth)?this.imageEl.OriginWidth:(this.thumbEl.getWidth()/this.getScaleLevel());var G=(this.thumbEl.getHeight()/this.getScaleLevel()>this.imageEl.OriginHeight)?this.imageEl.OriginHeight:(this.thumbEl.getHeight()/this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32mvar x=(this.thumbEl.getLeft(true)>this.previewEl.getLeft(true))?0:((this.previewEl.getLeft(true)-this.thumbEl.getLeft(true))/this.getScaleLevel());var y=(this.thumbEl.getTop(true)>this.previewEl.getTop(true))?0:((this.previewEl.getTop(true)-this.thumbEl.getTop(true))/this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32mvar H=this.minWidth-2*x;var I=this.minHeight-2*y;var J=1;if((x==0&&y==0)||(x==0&&y>0)){J=H/F;}if(x>0&&y==0){J=I/G;}if(x>0&&y>0){J=H/F;if(F<G){J=I/G;}}E.scale(J,J);var sx=Math.min(this.canvasEl.width-this.thumbEl.getWidth(),this.thumbEl.getLeft(true)-this.previewEl.getLeft(true));\e[m
+\e[32m+\e[m\e[32mvar sy=Math.min(this.canvasEl.height-this.thumbEl.getHeight(),this.thumbEl.getTop(true)-this.previewEl.getTop(true));sx=sx<0?0:(sx/this.getScaleLevel());sy=sy<0?0:(sy/this.getScaleLevel());E.drawImage(A,sx,sy,F,G,x,y,F,G);break;case 90:var F=(this.thumbEl.getWidth()/this.getScaleLevel()>this.imageEl.OriginHeight)?this.imageEl.OriginHeight:(this.thumbEl.getWidth()/this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32mvar G=(this.thumbEl.getHeight()/this.getScaleLevel()>this.imageEl.OriginWidth)?this.imageEl.OriginWidth:(this.thumbEl.getHeight()/this.getScaleLevel());var x=(this.thumbEl.getLeft(true)>this.previewEl.getLeft(true))?0:((this.previewEl.getLeft(true)-this.thumbEl.getLeft(true))/this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32mvar y=(this.thumbEl.getTop(true)>this.previewEl.getTop(true))?0:((this.previewEl.getTop(true)-this.thumbEl.getTop(true))/this.getScaleLevel());var H=this.minWidth-2*x;var I=this.minHeight-2*y;var J=1;if((x==0&&y==0)||(x==0&&y>0)){J=H/F;}if(x>0&&y==0){J=I/G;\e[m
+\e[32m+\e[m\e[32m}if(x>0&&y>0){J=H/F;if(F<G){J=I/G;}}E.scale(J,J);var sx=Math.min(this.canvasEl.width-this.thumbEl.getWidth(),this.thumbEl.getLeft(true)-this.previewEl.getLeft(true));var sy=Math.min(this.canvasEl.height-this.thumbEl.getHeight(),this.thumbEl.getTop(true)-this.previewEl.getTop(true));\e[m
+\e[32m+\e[m\e[32msx=sx<0?0:(sx/this.getScaleLevel());sy=sy<0?0:(sy/this.getScaleLevel());sx+=(this.imageEl.OriginWidth>this.imageEl.OriginHeight)?Math.abs(this.imageEl.OriginWidth-this.imageEl.OriginHeight):0;E.drawImage(A,sx,sy,F,G,x,y,F,G);break;case 180:var F=(this.thumbEl.getWidth()/this.getScaleLevel()>this.imageEl.OriginWidth)?this.imageEl.OriginWidth:(this.thumbEl.getWidth()/this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32mvar G=(this.thumbEl.getHeight()/this.getScaleLevel()>this.imageEl.OriginHeight)?this.imageEl.OriginHeight:(this.thumbEl.getHeight()/this.getScaleLevel());var x=(this.thumbEl.getLeft(true)>this.previewEl.getLeft(true))?0:((this.previewEl.getLeft(true)-this.thumbEl.getLeft(true))/this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32mvar y=(this.thumbEl.getTop(true)>this.previewEl.getTop(true))?0:((this.previewEl.getTop(true)-this.thumbEl.getTop(true))/this.getScaleLevel());var H=this.minWidth-2*x;var I=this.minHeight-2*y;var J=1;if((x==0&&y==0)||(x==0&&y>0)){J=H/F;}if(x>0&&y==0){J=I/G;\e[m
+\e[32m+\e[m\e[32m}if(x>0&&y>0){J=H/F;if(F<G){J=I/G;}}E.scale(J,J);var sx=Math.min(this.canvasEl.width-this.thumbEl.getWidth(),this.thumbEl.getLeft(true)-this.previewEl.getLeft(true));var sy=Math.min(this.canvasEl.height-this.thumbEl.getHeight(),this.thumbEl.getTop(true)-this.previewEl.getTop(true));\e[m
+\e[32m+\e[m\e[32msx=sx<0?0:(sx/this.getScaleLevel());sy=sy<0?0:(sy/this.getScaleLevel());sx+=(this.imageEl.OriginWidth>this.imageEl.OriginHeight)?0:Math.abs(this.imageEl.OriginWidth-this.imageEl.OriginHeight);sy+=(this.imageEl.OriginWidth>this.imageEl.OriginHeight)?Math.abs(this.imageEl.OriginWidth-this.imageEl.OriginHeight):0;\e[m
+\e[32m+\e[m\e[32mE.drawImage(A,sx,sy,F,G,x,y,F,G);break;case 270:var F=(this.thumbEl.getWidth()/this.getScaleLevel()>this.imageEl.OriginHeight)?this.imageEl.OriginHeight:(this.thumbEl.getWidth()/this.getScaleLevel());var G=(this.thumbEl.getHeight()/this.getScaleLevel()>this.imageEl.OriginWidth)?this.imageEl.OriginWidth:(this.thumbEl.getHeight()/this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32mvar x=(this.thumbEl.getLeft(true)>this.previewEl.getLeft(true))?0:((this.previewEl.getLeft(true)-this.thumbEl.getLeft(true))/this.getScaleLevel());var y=(this.thumbEl.getTop(true)>this.previewEl.getTop(true))?0:((this.previewEl.getTop(true)-this.thumbEl.getTop(true))/this.getScaleLevel());\e[m
+\e[32m+\e[m\e[32mvar H=this.minWidth-2*x;var I=this.minHeight-2*y;var J=1;if((x==0&&y==0)||(x==0&&y>0)){J=H/F;}if(x>0&&y==0){J=I/G;}if(x>0&&y>0){J=H/F;if(F<G){J=I/G;}}E.scale(J,J);var sx=Math.min(this.canvasEl.width-this.thumbEl.getWidth(),this.thumbEl.getLeft(true)-this.previewEl.getLeft(true));\e[m
+\e[32m+\e[m\e[32mvar sy=Math.min(this.canvasEl.height-this.thumbEl.getHeight(),this.thumbEl.getTop(true)-this.previewEl.getTop(true));sx=sx<0?0:(sx/this.getScaleLevel());sy=sy<0?0:(sy/this.getScaleLevel());sy+=(this.imageEl.OriginWidth>this.imageEl.OriginHeight)?0:Math.abs(this.imageEl.OriginWidth-this.imageEl.OriginHeight);\e[m
+\e[32m+\e[m\e[32mE.drawImage(A,sx,sy,F,G,x,y,F,G);break;default:break;}this.cropData=D.toDataURL(this.cropType);if(this.fireEvent('crop',this,this.cropData)!==false){this.process(this.file,this.cropData);}return;},setThumbBoxSize:function(){var A,B;if(this.isDocument&&typeof(this.imageEl)!='undefined'){A=(this.imageEl.OriginWidth>this.imageEl.OriginHeight)?Math.max(this.minWidth,this.minHeight):Math.min(this.minWidth,this.minHeight);\e[m
+\e[32m+\e[m\e[32mB=(this.imageEl.OriginWidth>this.imageEl.OriginHeight)?Math.min(this.minWidth,this.minHeight):Math.max(this.minWidth,this.minHeight);this.minWidth=A;this.minHeight=B;if(this.rotate==90||this.rotate==270){this.minWidth=B;this.minHeight=A;}}B=300;A=Math.ceil(this.minWidth*B/this.minHeight);\e[m
+\e[32m+\e[m\e[32mif(this.minWidth>this.minHeight){A=300;B=Math.ceil(this.minHeight*A/this.minWidth);}this.thumbEl.setStyle({width:A+'px',height:B+'px'});return;},setThumbBoxPosition:function(){var x=Math.ceil((this.bodyEl.getWidth()-this.thumbEl.getWidth())/2);var y=Math.ceil((this.bodyEl.getHeight()-this.thumbEl.getHeight())/2);\e[m
+\e[32m+\e[m\e[32mthis.thumbEl.setLeft(x);this.thumbEl.setTop(y);},baseRotateLevel:function(){this.baseRotate=1;if(typeof(this.exif)!='undefined'&&typeof(this.exif[Roo.dialog.UploadCropbox['tags']['Orientation']])!='undefined'&&[1,3,6,8].indexOf(this.exif[Roo.dialog.UploadCropbox['tags']['Orientation']])!=-1){this.baseRotate=this.exif[Roo.dialog.UploadCropbox['tags']['Orientation']];\e[m
+\e[32m+\e[m\e[32m}this.rotate=Roo.dialog.UploadCropbox['Orientation'][this.baseRotate];},baseScaleLevel:function(){var A,B;if(this.isDocument){if(this.baseRotate==6||this.baseRotate==8){B=this.thumbEl.getHeight();this.baseScale=B/this.imageEl.OriginWidth;if(this.imageEl.OriginHeight*this.baseScale>this.thumbEl.getWidth()){A=this.thumbEl.getWidth();\e[m
+\e[32m+\e[m\e[32mthis.baseScale=A/this.imageEl.OriginHeight;}return;}B=this.thumbEl.getHeight();this.baseScale=B/this.imageEl.OriginHeight;if(this.imageEl.OriginWidth*this.baseScale>this.thumbEl.getWidth()){A=this.thumbEl.getWidth();this.baseScale=A/this.imageEl.OriginWidth;\e[m
+\e[32m+\e[m\e[32m}return;}if(this.baseRotate==6||this.baseRotate==8){A=this.thumbEl.getHeight();this.baseScale=A/this.imageEl.OriginHeight;if(this.imageEl.OriginHeight*this.baseScale<this.thumbEl.getWidth()){B=this.thumbEl.getWidth();this.baseScale=B/this.imageEl.OriginHeight;\e[m
+\e[32m+\e[m\e[32m}if(this.imageEl.OriginWidth>this.imageEl.OriginHeight){B=this.thumbEl.getWidth();this.baseScale=B/this.imageEl.OriginHeight;if(this.imageEl.OriginWidth*this.baseScale<this.thumbEl.getHeight()){A=this.thumbEl.getHeight();this.baseScale=A/this.imageEl.OriginWidth;\e[m
+\e[32m+\e[m\e[32m}}return;}A=this.thumbEl.getWidth();this.baseScale=A/this.imageEl.OriginWidth;if(this.imageEl.OriginHeight*this.baseScale<this.thumbEl.getHeight()){B=this.thumbEl.getHeight();this.baseScale=B/this.imageEl.OriginHeight;}if(this.imageEl.OriginWidth>this.imageEl.OriginHeight){B=this.thumbEl.getHeight();\e[m
+\e[32m+\e[m\e[32mthis.baseScale=B/this.imageEl.OriginHeight;if(this.imageEl.OriginWidth*this.baseScale<this.thumbEl.getWidth()){A=this.thumbEl.getWidth();this.baseScale=A/this.imageEl.OriginWidth;}}return;},getScaleLevel:function(){return this.baseScale*Math.pow(1.1,this.scale);\e[m
+\e[32m+\e[m\e[32m},onTouchStart:function(e){if(!this.canvasLoaded){this.beforeSelectFile(e);return;}var A=e.browserEvent.touches;if(!A){return;}if(A.length==1){this.onMouseDown(e);return;}if(A.length!=2){return;}var B=[];for(var i=0,C;C=A[i];i++){B.push(C.pageX,C.pageY);}\e[m
+\e[32m+\e[m\e[32mvar x=Math.pow(B[0]-B[2],2);var y=Math.pow(B[1]-B[3],2);this.startDistance=Math.sqrt(x+y);this.startScale=this.scale;this.pinching=true;this.dragable=false;},onTouchMove:function(e){if(!this.pinching&&!this.dragable){return;}var A=e.browserEvent.touches;if(!A){return;\e[m
+\e[32m+\e[m\e[32m}if(this.dragable){this.onMouseMove(e);return;}var B=[];for(var i=0,C;C=A[i];i++){B.push(C.pageX,C.pageY);}var x=Math.pow(B[0]-B[2],2);var y=Math.pow(B[1]-B[3],2);this.endDistance=Math.sqrt(x+y);this.scale=this.startScale+Math.floor(Math.log(this.endDistance/this.startDistance)/Math.log(1.1));\e[m
+\e[32m+\e[m\e[32mif(!this.zoomable()){this.scale=this.startScale;return;}this.draw();},onTouchEnd:function(e){this.pinching=false;this.dragable=false;},process:function(A,B){if(this.loadMask){this.maskEl.mask(this.loadingText);}this.xhr=new XMLHttpRequest();A.xhr=this.xhr;\e[m
+\e[32m+\e[m\e[32mthis.xhr.open(this.method,this.url,true);var C={"Accept":"application/json","Cache-Control":"no-cache","X-Requested-With":"XMLHttpRequest"};for(var D in C){var E=C[D];if(E){this.xhr.setRequestHeader(D,E);}}var F=this;this.xhr.onload=function(){F.xhrOnLoad(F.xhr);\e[m
+\e[32m+\e[m\e[32m};this.xhr.onerror=function(){F.xhrOnError(F.xhr);};var G=new FormData();G.append('returnHTML','NO');if(B){G.append('crop',B);}if(typeof(A)!='undefined'&&(typeof(A.id)=='undefined'||A.id*1<1)){G.append(this.paramName,A,A.name);}if(typeof(A.filename)!='undefined'){G.append('filename',A.filename);\e[m
+\e[32m+\e[m\e[32m}if(typeof(A.mimetype)!='undefined'){G.append('mimetype',A.mimetype);}if(this.fireEvent('arrange',this,G)!=false){this.xhr.send(G);};},xhrOnLoad:function(A){if(this.loadMask){this.maskEl.unmask();}if(A.readyState!==4){this.fireEvent('exception',this,A);return;\e[m
+\e[32m+\e[m\e[32m}var B=Roo.decode(A.responseText);if(!B.success){this.fireEvent('exception',this,A);return;}var B=Roo.decode(A.responseText);this.fireEvent('upload',this,B);},xhrOnError:function(){if(this.loadMask){this.maskEl.unmask();}Roo.log('xhr on error');var A=Roo.decode(xhr.responseText);\e[m
+\e[32m+\e[m\e[32mRoo.log(A);},prepare:function(A){if(this.loadMask){this.maskEl.mask(this.loadingText);}this.file=false;this.exif={};if(typeof(A)==='string'){this.loadCanvas(A);return;}if(!A||!this.urlAPI){return;}this.file=A;this.cropType=A.type;var B=this;if(this.fireEvent('prepare',this,this.file)!=false){var C=new FileReader();\e[m
+\e[32m+\e[m\e[32mC.onload=function(e){if(e.target.error){Roo.log(e.target.error);return;}var D=e.target.result,E=new DataView(D),F=2,G=E.byteLength-4,H,I;if(E.getUint16(0)===0xffd8){while(F<G){H=E.getUint16(F);if((H>=0xffe0&&H<=0xffef)||H===0xfffe){I=E.getUint16(F+2)+2;if(F+I>E.byteLength){Roo.log('Invalid meta data: Invalid segment size.');\e[m
+\e[32m+\e[m\e[32mbreak;}if(H==0xffe1){B.parseExifData(E,F,I);}F+=I;continue;}break;}}var J=B.urlAPI.createObjectURL(B.file);B.loadCanvas(J);return;};C.readAsArrayBuffer(this.file);}},parseExifData:function(A,B,C){var D=B+10,E,F;if(A.getUint32(B+4)!==0x45786966){return;}if(A.getUint32(B+4)!==0x45786966){return;\e[m
+\e[32m+\e[m\e[32m}if(D+8>A.byteLength){Roo.log('Invalid Exif data: Invalid segment size.');return;}if(A.getUint16(B+8)!==0x0000){Roo.log('Invalid Exif data: Missing byte alignment offset.');return;}switch(A.getUint16(D)){case 0x4949:E=true;break;case 0x4D4D:E=false;break;\e[m
+\e[32m+\e[m\e[32mdefault:Roo.log('Invalid Exif data: Invalid byte alignment marker.');return;}if(A.getUint16(D+2,E)!==0x002A){Roo.log('Invalid Exif data: Missing TIFF marker.');return;}F=A.getUint32(D+4,E);this.parseExifTags(A,D,D+F,E);},parseExifTags:function(A,B,C,D){var E,F,i;\e[m
+\e[32m+\e[m\e[32mif(C+6>A.byteLength){Roo.log('Invalid Exif data: Invalid directory offset.');return;}E=A.getUint16(C,D);F=C+2+12*E;if(F+4>A.byteLength){Roo.log('Invalid Exif data: Invalid directory size.');return;}for(i=0;i<E;i+=1){this.parseExifTag(A,B,C+2+12*i,D);}return A.getUint32(F,D);\e[m
+\e[32m+\e[m\e[32m},parseExifTag:function(A,B,C,D){var E=A.getUint16(C,D);this.exif[E]=this.getExifValue(A,B,C,A.getUint16(C+2,D),A.getUint32(C+4,D),D);},getExifValue:function(A,B,C,D,E,F){var G=Roo.dialog.UploadCropbox.exifTagTypes[D],H,I,J,i,K,c;if(!G){Roo.log('Invalid Exif data: Invalid tag type.');\e[m
+\e[32m+\e[m\e[32mreturn;}H=G.size*E;I=H>4?B+A.getUint32(C+8,F):(C+8);if(I+H>A.byteLength){Roo.log('Invalid Exif data: Invalid data offset.');return;}if(E===1){return G.getValue(A,I,F);}J=[];for(i=0;i<E;i+=1){J[i]=G.getValue(A,I+i*G.size,F);}if(G.ascii){K='';for(i=0;i<J.length;\e[m
+\e[32m+\e[m\e[32mi+=1){c=J[i];if(c==='\u0000'){break;}K+=c;}return K;}return J;}});Roo.apply(Roo.dialog.UploadCropbox,{tags:{'Orientation':0x0112\e[m
+\e[32m+\e[m\e[32m},Orientation:{1:0,3:180,6:90,8:270},exifTagTypes:{1:{getValue:function(A,B){return A.getUint8(B);},size:1},2:{getValue:function(A,B){return String.fromCharCode(A.getUint8(B));\e[m
+\e[32m+\e[m\e[32m},size:1,ascii:true},3:{getValue:function(A,B,C){return A.getUint16(B,C);},size:2},4:{getValue:function(A,B,C){return A.getUint32(B,C);},size:4},5:{getValue:function(A,B,C){return A.getUint32(B,C)/A.getUint32(B+4,C);},size:8},9:{getValue:function(A,B,C){return A.getInt32(B,C);\e[m
+\e[32m+\e[m\e[32m},size:4},10:{getValue:function(A,B,C){return A.getInt32(B,C)/A.getInt32(B+4,C);},size:8}},footer:{STANDARD:[{tag:'div',cls:'btn-group roo-upload-cropbox-rotate-left',action:'rotate-left',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-undo"></i>'}\e[m
+\e[32m+\e[m\e[32m]},{tag:'div',cls:'btn-group roo-upload-cropbox-picture',action:'picture',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-picture-o"></i>'}]},{tag:'div',cls:'btn-group roo-upload-cropbox-rotate-right',action:'rotate-right',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-repeat"></i>'}\e[m
+\e[32m+\e[m\e[32m]}],DOCUMENT:[{tag:'div',cls:'btn-group roo-upload-cropbox-rotate-left',action:'rotate-left',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-undo"></i>'}]},{tag:'div',cls:'btn-group roo-upload-cropbox-download',action:'download',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-download"></i>'}\e[m
+\e[32m+\e[m\e[32m]},{tag:'div',cls:'btn-group roo-upload-cropbox-crop',action:'crop',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-crop"></i>'}]},{tag:'div',cls:'btn-group roo-upload-cropbox-trash',action:'trash',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-trash"></i>'}\e[m
+\e[32m+\e[m\e[32m]},{tag:'div',cls:'btn-group roo-upload-cropbox-rotate-right',action:'rotate-right',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-repeat"></i>'}]}],ROTATOR:[{tag:'div',cls:'btn-group roo-upload-cropbox-rotate-left',action:'rotate-left',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-undo"></i>'}\e[m
+\e[32m+\e[m\e[32m]},{tag:'div',cls:'btn-group roo-upload-cropbox-rotate-right',action:'rotate-right',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-repeat"></i>'}]}]}});\e[m
index 15d9ae2..7f78933 100644 (file)
@@ -23,7 +23,6 @@
  * and is used as the component id.  Otherwise, it is assumed to be a standard config object and is applied to the component.
  */
 Roo.Component = function(config){
-    console.log("COMPONENT CONSTRUCTOR");
     config = config || {};
     if(config.tagName || config.dom || typeof config == "string"){ // element object
         config = {el: config, id: config.id || config};
index 88058ec..a5d3e5c 100644 (file)
@@ -26,7 +26,6 @@
  */
 
  Roo.dialog.UploadCropbox = function(config){
-    console.log("Dialog UploadCropbox Constructor");
     Roo.dialog.UploadCropbox.superclass.constructor.call(this, config);
     
     this.addEvents({
@@ -339,8 +338,7 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component,  {
         this.cropData = false;
         this.notifyEl.dom.innerHTML = this.emptyText;
         
-        console.log("RESET SELECTOR EL")
-        this.selectorEl.dom.value = '';
+        // this.selectorEl.dom.value = '';
         
     },
     
@@ -548,9 +546,9 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component,  {
         e.stopEvent();
         
         this.startScale = this.scale;
-        
+        console.log("START SCALE: " + this.scale);
         this.scale = (e.getWheelDelta() == 1) ? (this.scale + 1) : (this.scale - 1);
-        
+        console.log("END SCALE: " + this.scale);
         if(!this.zoomable()){
             this.scale = this.startScale;
             return;
@@ -563,14 +561,34 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component,  {
     
     zoomable : function()
     {
+        console.log("THUMBEL");
+        console.log(this.thumbEl);
         var minScale = this.thumbEl.getWidth() / this.minWidth;
         
         if(this.minWidth < this.minHeight){
             minScale = this.thumbEl.getHeight() / this.minHeight;
         }
+
+        console.log("MINSCALE: " + minScale);
         
         var width = Math.ceil(this.imageEl.OriginWidth * this.getScaleLevel() / minScale);
         var height = Math.ceil(this.imageEl.OriginHeight * this.getScaleLevel() / minScale);
+
+        var maxWidth = this.imageEl.OriginWidth;
+        var maxHeight = this.imageEl.OriginHeight;
+
+        if(this.imageEl.OriginWidth / this.imageEl.OriginHeight  > this.minWidth / this.minHeight && this.imageEl.OriginHeight < this.minHeight) {
+            maxHeight = this.minHeight;
+            maxWidth = this.imageEl.OriginWidth / this.imageEl.OriginHeight * this.minHeight;
+        }
+        if(this.imageEl.OriginWidth / this.imageEl.OriginHeight  < this.minWidth / this.minHeight && this.imageEl.OriginWidth < this.minWidth) {
+            maxWidth = this.minWidth;
+            maxHeight = this.imageEl.OriginHeight /this.imageEl.OriginWidth * this.minWidth;
+        }
+
+        console.log("GETSCALELEVEL: " + this.getScaleLevel());
+        console.log("width: " + width);
+        console.log("height: " + height);
         
         if(
                 this.isDocument &&
@@ -600,10 +618,10 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component,  {
                 !this.isDocument &&
                 (this.rotate == 0 || this.rotate == 180) && 
                 (
-                    width < this.minWidth || 
-                    width > this.imageEl.OriginWidth || 
-                    height < this.minHeight || 
-                    height > this.imageEl.OriginHeight
+                    (this.imageEl.OriginWidth / this.imageEl.OriginHeight  > this.minWidth / this.minHeight && width < this.minWidth) || 
+                    width > maxWidth || 
+                    (this.imageEl.OriginWidth / this.imageEl.OriginHeight  < this.minWidth / this.minHeight && height < this.minHeight) || 
+                    height > maxHeight
                 )
         ){
             return false;
@@ -1176,7 +1194,8 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component,  {
     
     getScaleLevel : function()
     {
-        return this.baseScale * Math.pow(1.1, this.scale);
+        console.log("BASESCALE: " + this.baseScale);
+        return this.baseScale * Math.pow(1.02, this.scale);
     },
     
     onTouchStart : function(e)
diff --git a/Roo/dialog/namespace.js b/Roo/dialog/namespace.js
new file mode 100644 (file)
index 0000000..b047375
--- /dev/null
@@ -0,0 +1 @@
+Roo.dialog = {};
\ No newline at end of file
index 11e39c5..1735439 100644 (file)
@@ -28,7 +28,6 @@
  */
 
 Roo.util.Observable = function(cfg){
-    console.log("UTIL OBSERVABLE CONSTRUCTOR");
     
     cfg = cfg|| {};
     this.addEvents(cfg.events || {});
index 5a8e5a9..f89656e 100644 (file)
@@ -197,3 +197,6 @@ Roo.XTemplate
 
 // is this ready yet? - is it used?
 // Roo.Login
+
+Roo.dialog.namespace
+Roo.dialog.UploadCropbox
index 08c28d1..b8efe82 100644 (file)
@@ -36,35 +36,25 @@ var uploadCropbox = {
                             xns : Roo.dialog,
                             minWidth : 720,
                             minHeight: 480,
-                            buttons: [
-                                {
-                                    tag : 'div',
-                                    cls : 'btn-group roo-upload-cropbox-picture',
-                                    action : 'picture',
-                                    cn : [
-                                        {
-                                            tag : 'button',
-                                            cls : 'btn btn-default',
-                                            html : '<i class="fa fa-picture-o"></i>'
-                                        }
-                                    ]
-                                }
-                            ],
+                            buttons: [],
                             listeners : {
                                 render : function (_self)
                                 {
-                                    console.log("RENDER");
                                     _this.cropbox = _self;
                                 },
                                 loadcanvas : function (_self, imageEl)
                                 {
-                                    console.log("LOADCANVAS");
-                                    console.log(_self);
-                                    console.log(imageEl);
-                                    if(imageEl.OriginWidth < 720) {
-                                        console.log("Image width should be at least 720");
-                                        return false;
-                                    }
+                                    // if(imageEl.OriginWidth < 720) {
+                                    //     Roo.Msg.show({
+                                    //         title: 'Error',
+                                    //         msg: "Image width should be at least 720",
+                                    //         buttons: {ok : true},
+                                    //         fn: function(res) {
+                                    //             _this.cropbox.selectorEl.dom.click();
+                                    //         }
+                                    //     });
+                                    //     return false;
+                                    // }
                                 }
                             }
                         }
index 4e2ba88..ecb2a0a 100644 (file)
@@ -18,7 +18,7 @@
 </head>
 <body>
 
-<h1>Upload Cropbox Dialog</h1>
+<h1>Upload Cropbox Bootstrap</h1>
 <p>This example shows how to create a very simple modal BasicDialog with "autoTabs".</p>
 <input type="button" id="show-dialog-btn" value="test" /><br /><br />
 <p>Note that the js is not minified so it is readable. See 
index 6102914..7209230 100644 (file)
@@ -2530,7 +2530,7 @@ var r=A.getRegion(E);if(r&&F){if(F.size){r.resizeTo(F.size);}if(F.collapsed==tru
 A.on("regionexpanded",this.onRegionExpanded,this);},storeState:function(){this.provider.set(this.layout.id+"-layout-state",this.state);},onRegionResized:function(A,B){this.state[A.getPosition()].size=B;this.storeState();},onRegionCollapsed:function(A){this.state[A.getPosition()].collapsed=true;
 this.storeState();},onRegionExpanded:function(A){this.state[A.getPosition()].collapsed=false;this.storeState();}};
 // Roo/ContentPanel.js
-Roo.ContentPanel=function(el,A,B){console.log("ContentPanel Constructor");if(el.autoCreate){A=el;el=Roo.id();}this.el=Roo.get(el);if(!this.el&&A&&A.autoCreate){if(typeof A.autoCreate=="object"){if(!A.autoCreate.id){A.autoCreate.id=A.id||el;}this.el=Roo.DomHelper.append(document.body,A.autoCreate,true);
+Roo.ContentPanel=function(el,A,B){if(el.autoCreate){A=el;el=Roo.id();}this.el=Roo.get(el);if(!this.el&&A&&A.autoCreate){if(typeof A.autoCreate=="object"){if(!A.autoCreate.id){A.autoCreate.id=A.id||el;}this.el=Roo.DomHelper.append(document.body,A.autoCreate,true);
 }else{this.el=Roo.DomHelper.append(document.body,{tag:"div",cls:"x-layout-inactive-content",id:A.id||el},true);}}this.closable=false;this.loaded=false;this.active=false;if(typeof A=="string"){this.title=A;}else{Roo.apply(this,A);}if(this.toolbar&&!this.toolbar.el&&this.toolbar.xtype){this.wrapEl=this.el.wrap();
 this.toolbar.container=this.el.insertSibling(false,'before');this.toolbar=new Roo.Toolbar(this.toolbar);}if(this.footer&&!this.footer.el&&this.footer.xtype){if(!this.wrapEl){this.wrapEl=this.el.wrap();}this.footer.container=this.wrapEl.createChild();this.footer=Roo.factory(this.footer,Roo);
 }if(this.resizeEl){this.resizeEl=Roo.get(this.resizeEl,true);}else{this.resizeEl=this.el;}this.addEvents({"activate":true,"deactivate":true,"resize":true,"render":true});if(this.autoScroll){this.resizeEl.setStyle("overflow","auto");}else{this.el.on('scroll',function(){Roo.log('fix random scolling');
@@ -2878,7 +2878,7 @@ B.push(tpl.body.replace(/(\r\n|\n)/g,'\\n').replace(/'/g,"\\'").replace(this.re,
 // Roo/dialog/namespace.js
 Roo.dialog={};
 // Roo/dialog/UploadCropbox.js
-Roo.dialog.UploadCropbox=function(A){console.log("Dialog UploadCropbox Constructor");Roo.dialog.UploadCropbox.superclass.constructor.call(this,A);this.addEvents({"beforeselectfile":true,"initial":true,"crop":true,"prepare":true,"exception":true,"beforeloadcanvas":true,"trash":true,"download":true,"footerbuttonclick":true,"resize":true,"rotate":true,"inspect":true,"upload":true,"arrange":true,"loadcanvas":true}
+Roo.dialog.UploadCropbox=function(A){Roo.dialog.UploadCropbox.superclass.constructor.call(this,A);this.addEvents({"beforeselectfile":true,"initial":true,"crop":true,"prepare":true,"exception":true,"beforeloadcanvas":true,"trash":true,"download":true,"footerbuttonclick":true,"resize":true,"rotate":true,"inspect":true,"upload":true,"arrange":true,"loadcanvas":true}
 );this.buttons=this.buttons||Roo.dialog.UploadCropbox.footer.STANDARD;};Roo.extend(Roo.dialog.UploadCropbox,Roo.Component,{emptyText:'Click to upload image',rotateNotify:'Image is too small to rotate',errorTimeout:3000,scale:0,baseScale:1,rotate:0,dragable:false,pinching:false,mouseX:0,mouseY:0,cropData:false,minWidth:300,minHeight:300,file:false,exif:{}
 ,baseRotate:1,cropType:'image/jpeg',buttons:false,canvasLoaded:false,isDocument:false,method:'POST',paramName:'imageUpload',loadMask:true,loadingText:'Loading...',maskEl:false,getAutoCreate:function(){var A={tag:'div',cls:'roo-upload-cropbox',cn:[{tag:'input',cls:'roo-upload-cropbox-selector',type:'file'}
 ,{tag:'div',cls:'roo-upload-cropbox-body',style:'cursor:pointer',cn:[{tag:'div',cls:'roo-upload-cropbox-preview'},{tag:'div',cls:'roo-upload-cropbox-thumb'},{tag:'div',cls:'roo-upload-cropbox-empty-notify',html:this.emptyText},{tag:'div',cls:'roo-upload-cropbox-error-notify alert alert-danger',html:this.rotateNotify}
@@ -2892,7 +2892,7 @@ this.notifyEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay='block';thi
 this.footerEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay='block';this.footerEl.hide();this.setThumbBoxSize();this.bind();this.resize();this.fireEvent('initial',this);},bind:function(){var A=this;window.addEventListener("resize",function(){A.resize();
 });this.bodyEl.on('click',this.beforeSelectFile,this);if(Roo.isTouch){this.bodyEl.on('touchstart',this.onTouchStart,this);this.bodyEl.on('touchmove',this.onTouchMove,this);this.bodyEl.on('touchend',this.onTouchEnd,this);}if(!Roo.isTouch){this.bodyEl.on('mousedown',this.onMouseDown,this);
 this.bodyEl.on('mousemove',this.onMouseMove,this);var B=(/Firefox/i.test(navigator.userAgent))?'DOMMouseScroll':'mousewheel';this.bodyEl.on(B,this.onMouseWheel,this);Roo.get(document).on('mouseup',this.onMouseUp,this);}this.selectorEl.on('change',this.onFileSelected,this);
-},reset:function(){this.scale=0;this.baseScale=1;this.rotate=0;this.baseRotate=1;this.dragable=false;this.pinching=false;this.mouseX=0;this.mouseY=0;this.cropData=false;this.notifyEl.dom.innerHTML=this.emptyText;this.selectorEl.dom.value='';},resize:function(){if(this.fireEvent('resize',this)!=false){this.setThumbBoxPosition();
+},reset:function(){this.scale=0;this.baseScale=1;this.rotate=0;this.baseRotate=1;this.dragable=false;this.pinching=false;this.mouseX=0;this.mouseY=0;this.cropData=false;this.notifyEl.dom.innerHTML=this.emptyText;},resize:function(){if(this.fireEvent('resize',this)!=false){this.setThumbBoxPosition();
 this.setCanvasPosition();}},onFooterButtonClick:function(e,el,o,A){switch(A){case 'rotate-left':this.onRotateLeft(e);break;case 'rotate-right':this.onRotateRight(e);break;case 'picture':this.beforeSelectFile(e);break;case 'trash':this.trash(e);break;case 'crop':this.crop(e);
 break;case 'download':this.download(e);break;default:break;}this.fireEvent('footerbuttonclick',this,A);},beforeSelectFile:function(e){e.preventDefault();if(this.fireEvent('beforeselectfile',this)!=false){this.selectorEl.dom.click();}},onFileSelected:function(e){e.preventDefault();
 if(typeof(this.selectorEl.dom.files)=='undefined'||!this.selectorEl.dom.files.length){return;}var A=this.selectorEl.dom.files[0];if(this.fireEvent('inspect',this,A)!=false){this.prepare(A);}},trash:function(e){this.fireEvent('trash',this);},download:function(e){this.fireEvent('download',this);
@@ -2903,12 +2903,14 @@ var ph=Math.ceil((this.bodyEl.getHeight()-this.canvasEl.height)/2);this.previewE
 return;}this.mouseX=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();this.mouseY=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();},onMouseMove:function(e){e.stopEvent();if(!this.canvasLoaded){return;}if(!this.dragable){return;}var A=Math.ceil(this.thumbEl.getLeft(true));
 var B=Math.ceil(this.thumbEl.getTop(true));var C=Math.ceil(A+this.thumbEl.getWidth()-this.canvasEl.width);var D=Math.ceil(B+this.thumbEl.getHeight()-this.canvasEl.height);var x=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();var y=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();
 x=x-this.mouseX;y=y-this.mouseY;var E=Math.ceil(x+this.previewEl.getLeft(true));var F=Math.ceil(y+this.previewEl.getTop(true));E=(A<E)?A:((C>E)?C:E);F=(B<F)?B:((D>F)?D:F);this.previewEl.setLeft(E);this.previewEl.setTop(F);this.mouseX=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();
-this.mouseY=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();},onMouseUp:function(e){e.stopEvent();this.dragable=false;},onMouseWheel:function(e){e.stopEvent();this.startScale=this.scale;this.scale=(e.getWheelDelta()==1)?(this.scale+1):(this.scale-1);
-if(!this.zoomable()){this.scale=this.startScale;return;}this.draw();return;},zoomable:function(){var A=this.thumbEl.getWidth()/this.minWidth;if(this.minWidth<this.minHeight){A=this.thumbEl.getHeight()/this.minHeight;}var B=Math.ceil(this.imageEl.OriginWidth*this.getScaleLevel()/A);
-var C=Math.ceil(this.imageEl.OriginHeight*this.getScaleLevel()/A);if(this.isDocument&&(this.rotate==0||this.rotate==180)&&(B>this.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(B<this.minWidth&&C<this.minHeight))){return false;}if(this.isDocument&&(this.rotate==90||this.rotate==270)&&(B>this.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(B<this.minHeight&&C<this.minWidth))){return false;
-}if(!this.isDocument&&(this.rotate==0||this.rotate==180)&&(B<this.minWidth||B>this.imageEl.OriginWidth||C<this.minHeight||C>this.imageEl.OriginHeight)){return false;}if(!this.isDocument&&(this.rotate==90||this.rotate==270)&&(B<this.minHeight||B>this.imageEl.OriginWidth||C<this.minWidth||C>this.imageEl.OriginHeight)){return false;
-}return true;},onRotateLeft:function(e){if(!this.isDocument&&(this.canvasEl.height<this.thumbEl.getWidth()||this.canvasEl.width<this.thumbEl.getHeight())){var A=this.thumbEl.getWidth()/this.minWidth;var bw=Math.ceil(this.canvasEl.width/this.getScaleLevel());
-var bh=Math.ceil(this.canvasEl.height/this.getScaleLevel());this.startScale=this.scale;while(this.getScaleLevel()<A){this.scale=this.scale+1;if(!this.zoomable()){break;}if(Math.ceil(bw*this.getScaleLevel())<this.thumbEl.getHeight()||Math.ceil(bh*this.getScaleLevel())<this.thumbEl.getWidth()){continue;
+this.mouseY=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();},onMouseUp:function(e){e.stopEvent();this.dragable=false;},onMouseWheel:function(e){e.stopEvent();this.startScale=this.scale;console.log("START SCALE: "+this.scale);this.scale=(e.getWheelDelta()==1)?(this.scale+1):(this.scale-1);
+console.log("END SCALE: "+this.scale);if(!this.zoomable()){this.scale=this.startScale;return;}this.draw();return;},zoomable:function(){console.log("THUMBEL");console.log(this.thumbEl);var A=this.thumbEl.getWidth()/this.minWidth;if(this.minWidth<this.minHeight){A=this.thumbEl.getHeight()/this.minHeight;
+}console.log("MINSCALE: "+A);var B=Math.ceil(this.imageEl.OriginWidth*this.getScaleLevel()/A);var C=Math.ceil(this.imageEl.OriginHeight*this.getScaleLevel()/A);var D=this.imageEl.OriginWidth;var E=this.imageEl.OriginHeight;if(this.imageEl.OriginWidth/this.imageEl.OriginHeight>this.minWidth/this.minHeight&&this.imageEl.OriginHeight<this.minHeight){E=this.minHeight;
+D=this.imageEl.OriginWidth/this.imageEl.OriginHeight*this.minHeight;}if(this.imageEl.OriginWidth/this.imageEl.OriginHeight<this.minWidth/this.minHeight&&this.imageEl.OriginWidth<this.minWidth){D=this.minWidth;E=this.imageEl.OriginHeight/this.imageEl.OriginWidth*this.minWidth;
+}console.log("GETSCALELEVEL: "+this.getScaleLevel());console.log("width: "+B);console.log("height: "+C);if(this.isDocument&&(this.rotate==0||this.rotate==180)&&(B>this.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(B<this.minWidth&&C<this.minHeight))){return false;
+}if(this.isDocument&&(this.rotate==90||this.rotate==270)&&(B>this.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(B<this.minHeight&&C<this.minWidth))){return false;}if(!this.isDocument&&(this.rotate==0||this.rotate==180)&&((this.imageEl.OriginWidth/this.imageEl.OriginHeight>this.minWidth/this.minHeight&&B<this.minWidth)||B>D||(this.imageEl.OriginWidth/this.imageEl.OriginHeight<this.minWidth/this.minHeight&&C<this.minHeight)||C>E)){return false;
+}if(!this.isDocument&&(this.rotate==90||this.rotate==270)&&(B<this.minHeight||B>this.imageEl.OriginWidth||C<this.minWidth||C>this.imageEl.OriginHeight)){return false;}return true;},onRotateLeft:function(e){if(!this.isDocument&&(this.canvasEl.height<this.thumbEl.getWidth()||this.canvasEl.width<this.thumbEl.getHeight())){var A=this.thumbEl.getWidth()/this.minWidth;
+var bw=Math.ceil(this.canvasEl.width/this.getScaleLevel());var bh=Math.ceil(this.canvasEl.height/this.getScaleLevel());this.startScale=this.scale;while(this.getScaleLevel()<A){this.scale=this.scale+1;if(!this.zoomable()){break;}if(Math.ceil(bw*this.getScaleLevel())<this.thumbEl.getHeight()||Math.ceil(bh*this.getScaleLevel())<this.thumbEl.getWidth()){continue;
 }this.rotate=(this.rotate<90)?270:this.rotate-90;this.draw();return;}this.scale=this.startScale;this.onRotateFail();return false;}this.rotate=(this.rotate<90)?270:this.rotate-90;if(this.isDocument){this.setThumbBoxSize();this.setThumbBoxPosition();this.setCanvasPosition();
 }this.draw();this.fireEvent('rotate',this,'left');},onRotateRight:function(e){if(!this.isDocument&&(this.canvasEl.height<this.thumbEl.getWidth()||this.canvasEl.width<this.thumbEl.getHeight())){var A=this.thumbEl.getWidth()/this.minWidth;var bw=Math.ceil(this.canvasEl.width/this.getScaleLevel());
 var bh=Math.ceil(this.canvasEl.height/this.getScaleLevel());this.startScale=this.scale;while(this.getScaleLevel()<A){this.scale=this.scale+1;if(!this.zoomable()){break;}if(Math.ceil(bw*this.getScaleLevel())<this.thumbEl.getHeight()||Math.ceil(bh*this.getScaleLevel())<this.thumbEl.getWidth()){continue;
@@ -2949,10 +2951,10 @@ this.baseScale=A/this.imageEl.OriginHeight;}return;}B=this.thumbEl.getHeight();t
 }return;}if(this.baseRotate==6||this.baseRotate==8){A=this.thumbEl.getHeight();this.baseScale=A/this.imageEl.OriginHeight;if(this.imageEl.OriginHeight*this.baseScale<this.thumbEl.getWidth()){B=this.thumbEl.getWidth();this.baseScale=B/this.imageEl.OriginHeight;
 }if(this.imageEl.OriginWidth>this.imageEl.OriginHeight){B=this.thumbEl.getWidth();this.baseScale=B/this.imageEl.OriginHeight;if(this.imageEl.OriginWidth*this.baseScale<this.thumbEl.getHeight()){A=this.thumbEl.getHeight();this.baseScale=A/this.imageEl.OriginWidth;
 }}return;}A=this.thumbEl.getWidth();this.baseScale=A/this.imageEl.OriginWidth;if(this.imageEl.OriginHeight*this.baseScale<this.thumbEl.getHeight()){B=this.thumbEl.getHeight();this.baseScale=B/this.imageEl.OriginHeight;}if(this.imageEl.OriginWidth>this.imageEl.OriginHeight){B=this.thumbEl.getHeight();
-this.baseScale=B/this.imageEl.OriginHeight;if(this.imageEl.OriginWidth*this.baseScale<this.thumbEl.getWidth()){A=this.thumbEl.getWidth();this.baseScale=A/this.imageEl.OriginWidth;}}return;},getScaleLevel:function(){return this.baseScale*Math.pow(1.1,this.scale);
-},onTouchStart:function(e){if(!this.canvasLoaded){this.beforeSelectFile(e);return;}var A=e.browserEvent.touches;if(!A){return;}if(A.length==1){this.onMouseDown(e);return;}if(A.length!=2){return;}var B=[];for(var i=0,C;C=A[i];i++){B.push(C.pageX,C.pageY);}
-var x=Math.pow(B[0]-B[2],2);var y=Math.pow(B[1]-B[3],2);this.startDistance=Math.sqrt(x+y);this.startScale=this.scale;this.pinching=true;this.dragable=false;},onTouchMove:function(e){if(!this.pinching&&!this.dragable){return;}var A=e.browserEvent.touches;if(!A){return;
-}if(this.dragable){this.onMouseMove(e);return;}var B=[];for(var i=0,C;C=A[i];i++){B.push(C.pageX,C.pageY);}var x=Math.pow(B[0]-B[2],2);var y=Math.pow(B[1]-B[3],2);this.endDistance=Math.sqrt(x+y);this.scale=this.startScale+Math.floor(Math.log(this.endDistance/this.startDistance)/Math.log(1.1));
+this.baseScale=B/this.imageEl.OriginHeight;if(this.imageEl.OriginWidth*this.baseScale<this.thumbEl.getWidth()){A=this.thumbEl.getWidth();this.baseScale=A/this.imageEl.OriginWidth;}}return;},getScaleLevel:function(){console.log("BASESCALE: "+this.baseScale);
+return this.baseScale*Math.pow(1.02,this.scale);},onTouchStart:function(e){if(!this.canvasLoaded){this.beforeSelectFile(e);return;}var A=e.browserEvent.touches;if(!A){return;}if(A.length==1){this.onMouseDown(e);return;}if(A.length!=2){return;}var B=[];for(var i=0,C;
+C=A[i];i++){B.push(C.pageX,C.pageY);}var x=Math.pow(B[0]-B[2],2);var y=Math.pow(B[1]-B[3],2);this.startDistance=Math.sqrt(x+y);this.startScale=this.scale;this.pinching=true;this.dragable=false;},onTouchMove:function(e){if(!this.pinching&&!this.dragable){return;
+}var A=e.browserEvent.touches;if(!A){return;}if(this.dragable){this.onMouseMove(e);return;}var B=[];for(var i=0,C;C=A[i];i++){B.push(C.pageX,C.pageY);}var x=Math.pow(B[0]-B[2],2);var y=Math.pow(B[1]-B[3],2);this.endDistance=Math.sqrt(x+y);this.scale=this.startScale+Math.floor(Math.log(this.endDistance/this.startDistance)/Math.log(1.1));
 if(!this.zoomable()){this.scale=this.startScale;return;}this.draw();},onTouchEnd:function(e){this.pinching=false;this.dragable=false;},process:function(A,B){if(this.loadMask){this.maskEl.mask(this.loadingText);}this.xhr=new XMLHttpRequest();A.xhr=this.xhr;
 this.xhr.open(this.method,this.url,true);var C={"Accept":"application/json","Cache-Control":"no-cache","X-Requested-With":"XMLHttpRequest"};for(var D in C){var E=C[D];if(E){this.xhr.setRequestHeader(D,E);}}var F=this;this.xhr.onload=function(){F.xhrOnLoad(F.xhr);
 };this.xhr.onerror=function(){F.xhrOnError(F.xhr);};var G=new FormData();G.append('returnHTML','NO');if(B){G.append('crop',B);}if(typeof(A)!='undefined'&&(typeof(A.id)=='undefined'||A.id*1<1)){G.append(this.paramName,A,A.name);}if(typeof(A.filename)!='undefined'){G.append('filename',A.filename);
index 90e7b37..c34cc0a 100644 (file)
@@ -60414,7 +60414,6 @@ Roo.LayoutStateManager.prototype = {
  */
 Roo.ContentPanel = function(el, config, content){
     
-    console.log("ContentPanel Constructor");
     /*
     if(el.autoCreate || el.xtype){ // xtype is available if this is called from factory
         config = el;
@@ -68086,7 +68085,6 @@ Roo.XTemplate.from = function(el){
  */
 
  Roo.dialog.UploadCropbox = function(config){
-    console.log("Dialog UploadCropbox Constructor");
     Roo.dialog.UploadCropbox.superclass.constructor.call(this, config);
     
     this.addEvents({
@@ -68399,7 +68397,7 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component,  {
         this.cropData = false;
         this.notifyEl.dom.innerHTML = this.emptyText;
         
-        this.selectorEl.dom.value = '';
+        // this.selectorEl.dom.value = '';
         
     },
     
@@ -68607,9 +68605,9 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component,  {
         e.stopEvent();
         
         this.startScale = this.scale;
-        
+        console.log("START SCALE: " + this.scale);
         this.scale = (e.getWheelDelta() == 1) ? (this.scale + 1) : (this.scale - 1);
-        
+        console.log("END SCALE: " + this.scale);
         if(!this.zoomable()){
             this.scale = this.startScale;
             return;
@@ -68622,14 +68620,34 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component,  {
     
     zoomable : function()
     {
+        console.log("THUMBEL");
+        console.log(this.thumbEl);
         var minScale = this.thumbEl.getWidth() / this.minWidth;
         
         if(this.minWidth < this.minHeight){
             minScale = this.thumbEl.getHeight() / this.minHeight;
         }
+
+        console.log("MINSCALE: " + minScale);
         
         var width = Math.ceil(this.imageEl.OriginWidth * this.getScaleLevel() / minScale);
         var height = Math.ceil(this.imageEl.OriginHeight * this.getScaleLevel() / minScale);
+
+        var maxWidth = this.imageEl.OriginWidth;
+        var maxHeight = this.imageEl.OriginHeight;
+
+        if(this.imageEl.OriginWidth / this.imageEl.OriginHeight  > this.minWidth / this.minHeight && this.imageEl.OriginHeight < this.minHeight) {
+            maxHeight = this.minHeight;
+            maxWidth = this.imageEl.OriginWidth / this.imageEl.OriginHeight * this.minHeight;
+        }
+        if(this.imageEl.OriginWidth / this.imageEl.OriginHeight  < this.minWidth / this.minHeight && this.imageEl.OriginWidth < this.minWidth) {
+            maxWidth = this.minWidth;
+            maxHeight = this.imageEl.OriginHeight /this.imageEl.OriginWidth * this.minWidth;
+        }
+
+        console.log("GETSCALELEVEL: " + this.getScaleLevel());
+        console.log("width: " + width);
+        console.log("height: " + height);
         
         if(
                 this.isDocument &&
@@ -68659,10 +68677,10 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component,  {
                 !this.isDocument &&
                 (this.rotate == 0 || this.rotate == 180) && 
                 (
-                    width < this.minWidth || 
-                    width > this.imageEl.OriginWidth || 
-                    height < this.minHeight || 
-                    height > this.imageEl.OriginHeight
+                    (this.imageEl.OriginWidth / this.imageEl.OriginHeight  > this.minWidth / this.minHeight && width < this.minWidth) || 
+                    width > maxWidth || 
+                    (this.imageEl.OriginWidth / this.imageEl.OriginHeight  < this.minWidth / this.minHeight && height < this.minHeight) || 
+                    height > maxHeight
                 )
         ){
             return false;
@@ -69235,7 +69253,8 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component,  {
     
     getScaleLevel : function()
     {
-        return this.baseScale * Math.pow(1.1, this.scale);
+        console.log("BASESCALE: " + this.baseScale);
+        return this.baseScale * Math.pow(1.02, this.scale);
     },
     
     onTouchStart : function(e)
index 464233f..d855221 100644 (file)
@@ -35922,7 +35922,6 @@ Roo.LayoutStateManager.prototype = {
  */
 Roo.ContentPanel = function(el, config, content){
     
-    console.log("ContentPanel Constructor");
     /*
     if(el.autoCreate || el.xtype){ // xtype is available if this is called from factory
         config = el;
@@ -43594,7 +43593,6 @@ Roo.XTemplate.from = function(el){
  */
 
  Roo.dialog.UploadCropbox = function(config){
-    console.log("Dialog UploadCropbox Constructor");
     Roo.dialog.UploadCropbox.superclass.constructor.call(this, config);
     
     this.addEvents({
@@ -43907,7 +43905,7 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component,  {
         this.cropData = false;
         this.notifyEl.dom.innerHTML = this.emptyText;
         
-        this.selectorEl.dom.value = '';
+        // this.selectorEl.dom.value = '';
         
     },
     
@@ -44115,9 +44113,9 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component,  {
         e.stopEvent();
         
         this.startScale = this.scale;
-        
+        console.log("START SCALE: " + this.scale);
         this.scale = (e.getWheelDelta() == 1) ? (this.scale + 1) : (this.scale - 1);
-        
+        console.log("END SCALE: " + this.scale);
         if(!this.zoomable()){
             this.scale = this.startScale;
             return;
@@ -44130,14 +44128,34 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component,  {
     
     zoomable : function()
     {
+        console.log("THUMBEL");
+        console.log(this.thumbEl);
         var minScale = this.thumbEl.getWidth() / this.minWidth;
         
         if(this.minWidth < this.minHeight){
             minScale = this.thumbEl.getHeight() / this.minHeight;
         }
+
+        console.log("MINSCALE: " + minScale);
         
         var width = Math.ceil(this.imageEl.OriginWidth * this.getScaleLevel() / minScale);
         var height = Math.ceil(this.imageEl.OriginHeight * this.getScaleLevel() / minScale);
+
+        var maxWidth = this.imageEl.OriginWidth;
+        var maxHeight = this.imageEl.OriginHeight;
+
+        if(this.imageEl.OriginWidth / this.imageEl.OriginHeight  > this.minWidth / this.minHeight && this.imageEl.OriginHeight < this.minHeight) {
+            maxHeight = this.minHeight;
+            maxWidth = this.imageEl.OriginWidth / this.imageEl.OriginHeight * this.minHeight;
+        }
+        if(this.imageEl.OriginWidth / this.imageEl.OriginHeight  < this.minWidth / this.minHeight && this.imageEl.OriginWidth < this.minWidth) {
+            maxWidth = this.minWidth;
+            maxHeight = this.imageEl.OriginHeight /this.imageEl.OriginWidth * this.minWidth;
+        }
+
+        console.log("GETSCALELEVEL: " + this.getScaleLevel());
+        console.log("width: " + width);
+        console.log("height: " + height);
         
         if(
                 this.isDocument &&
@@ -44167,10 +44185,10 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component,  {
                 !this.isDocument &&
                 (this.rotate == 0 || this.rotate == 180) && 
                 (
-                    width < this.minWidth || 
-                    width > this.imageEl.OriginWidth || 
-                    height < this.minHeight || 
-                    height > this.imageEl.OriginHeight
+                    (this.imageEl.OriginWidth / this.imageEl.OriginHeight  > this.minWidth / this.minHeight && width < this.minWidth) || 
+                    width > maxWidth || 
+                    (this.imageEl.OriginWidth / this.imageEl.OriginHeight  < this.minWidth / this.minHeight && height < this.minHeight) || 
+                    height > maxHeight
                 )
         ){
             return false;
@@ -44743,7 +44761,8 @@ Roo.extend(Roo.dialog.UploadCropbox, Roo.Component,  {
     
     getScaleLevel : function()
     {
-        return this.baseScale * Math.pow(1.1, this.scale);
+        console.log("BASESCALE: " + this.baseScale);
+        return this.baseScale * Math.pow(1.02, this.scale);
     },
     
     onTouchStart : function(e)
index 9323b6b..2409d8a 100644 (file)
@@ -1584,7 +1584,7 @@ var r=A.getRegion(E);if(r&&F){if(F.size){r.resizeTo(F.size);}if(F.collapsed==tru
 A.on("regionexpanded",this.onRegionExpanded,this);},storeState:function(){this.provider.set(this.layout.id+"-layout-state",this.state);},onRegionResized:function(A,B){this.state[A.getPosition()].size=B;this.storeState();},onRegionCollapsed:function(A){this.state[A.getPosition()].collapsed=true;
 this.storeState();},onRegionExpanded:function(A){this.state[A.getPosition()].collapsed=false;this.storeState();}};
 // Roo/ContentPanel.js
-Roo.ContentPanel=function(el,A,B){console.log("ContentPanel Constructor");if(el.autoCreate){A=el;el=Roo.id();}this.el=Roo.get(el);if(!this.el&&A&&A.autoCreate){if(typeof A.autoCreate=="object"){if(!A.autoCreate.id){A.autoCreate.id=A.id||el;}this.el=Roo.DomHelper.append(document.body,A.autoCreate,true);
+Roo.ContentPanel=function(el,A,B){if(el.autoCreate){A=el;el=Roo.id();}this.el=Roo.get(el);if(!this.el&&A&&A.autoCreate){if(typeof A.autoCreate=="object"){if(!A.autoCreate.id){A.autoCreate.id=A.id||el;}this.el=Roo.DomHelper.append(document.body,A.autoCreate,true);
 }else{this.el=Roo.DomHelper.append(document.body,{tag:"div",cls:"x-layout-inactive-content",id:A.id||el},true);}}this.closable=false;this.loaded=false;this.active=false;if(typeof A=="string"){this.title=A;}else{Roo.apply(this,A);}if(this.toolbar&&!this.toolbar.el&&this.toolbar.xtype){this.wrapEl=this.el.wrap();
 this.toolbar.container=this.el.insertSibling(false,'before');this.toolbar=new Roo.Toolbar(this.toolbar);}if(this.footer&&!this.footer.el&&this.footer.xtype){if(!this.wrapEl){this.wrapEl=this.el.wrap();}this.footer.container=this.wrapEl.createChild();this.footer=Roo.factory(this.footer,Roo);
 }if(this.resizeEl){this.resizeEl=Roo.get(this.resizeEl,true);}else{this.resizeEl=this.el;}this.addEvents({"activate":true,"deactivate":true,"resize":true,"render":true});if(this.autoScroll){this.resizeEl.setStyle("overflow","auto");}else{this.el.on('scroll',function(){Roo.log('fix random scolling');
@@ -1932,7 +1932,7 @@ B.push(tpl.body.replace(/(\r\n|\n)/g,'\\n').replace(/'/g,"\\'").replace(this.re,
 // Roo/dialog/namespace.js
 Roo.dialog={};
 // Roo/dialog/UploadCropbox.js
-Roo.dialog.UploadCropbox=function(A){console.log("Dialog UploadCropbox Constructor");Roo.dialog.UploadCropbox.superclass.constructor.call(this,A);this.addEvents({"beforeselectfile":true,"initial":true,"crop":true,"prepare":true,"exception":true,"beforeloadcanvas":true,"trash":true,"download":true,"footerbuttonclick":true,"resize":true,"rotate":true,"inspect":true,"upload":true,"arrange":true,"loadcanvas":true}
+Roo.dialog.UploadCropbox=function(A){Roo.dialog.UploadCropbox.superclass.constructor.call(this,A);this.addEvents({"beforeselectfile":true,"initial":true,"crop":true,"prepare":true,"exception":true,"beforeloadcanvas":true,"trash":true,"download":true,"footerbuttonclick":true,"resize":true,"rotate":true,"inspect":true,"upload":true,"arrange":true,"loadcanvas":true}
 );this.buttons=this.buttons||Roo.dialog.UploadCropbox.footer.STANDARD;};Roo.extend(Roo.dialog.UploadCropbox,Roo.Component,{emptyText:'Click to upload image',rotateNotify:'Image is too small to rotate',errorTimeout:3000,scale:0,baseScale:1,rotate:0,dragable:false,pinching:false,mouseX:0,mouseY:0,cropData:false,minWidth:300,minHeight:300,file:false,exif:{}
 ,baseRotate:1,cropType:'image/jpeg',buttons:false,canvasLoaded:false,isDocument:false,method:'POST',paramName:'imageUpload',loadMask:true,loadingText:'Loading...',maskEl:false,getAutoCreate:function(){var A={tag:'div',cls:'roo-upload-cropbox',cn:[{tag:'input',cls:'roo-upload-cropbox-selector',type:'file'}
 ,{tag:'div',cls:'roo-upload-cropbox-body',style:'cursor:pointer',cn:[{tag:'div',cls:'roo-upload-cropbox-preview'},{tag:'div',cls:'roo-upload-cropbox-thumb'},{tag:'div',cls:'roo-upload-cropbox-empty-notify',html:this.emptyText},{tag:'div',cls:'roo-upload-cropbox-error-notify alert alert-danger',html:this.rotateNotify}
@@ -1946,7 +1946,7 @@ this.notifyEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay='block';thi
 this.footerEl.setVisibilityMode(Roo.Element.DISPLAY).originalDisplay='block';this.footerEl.hide();this.setThumbBoxSize();this.bind();this.resize();this.fireEvent('initial',this);},bind:function(){var A=this;window.addEventListener("resize",function(){A.resize();
 });this.bodyEl.on('click',this.beforeSelectFile,this);if(Roo.isTouch){this.bodyEl.on('touchstart',this.onTouchStart,this);this.bodyEl.on('touchmove',this.onTouchMove,this);this.bodyEl.on('touchend',this.onTouchEnd,this);}if(!Roo.isTouch){this.bodyEl.on('mousedown',this.onMouseDown,this);
 this.bodyEl.on('mousemove',this.onMouseMove,this);var B=(/Firefox/i.test(navigator.userAgent))?'DOMMouseScroll':'mousewheel';this.bodyEl.on(B,this.onMouseWheel,this);Roo.get(document).on('mouseup',this.onMouseUp,this);}this.selectorEl.on('change',this.onFileSelected,this);
-},reset:function(){this.scale=0;this.baseScale=1;this.rotate=0;this.baseRotate=1;this.dragable=false;this.pinching=false;this.mouseX=0;this.mouseY=0;this.cropData=false;this.notifyEl.dom.innerHTML=this.emptyText;this.selectorEl.dom.value='';},resize:function(){if(this.fireEvent('resize',this)!=false){this.setThumbBoxPosition();
+},reset:function(){this.scale=0;this.baseScale=1;this.rotate=0;this.baseRotate=1;this.dragable=false;this.pinching=false;this.mouseX=0;this.mouseY=0;this.cropData=false;this.notifyEl.dom.innerHTML=this.emptyText;},resize:function(){if(this.fireEvent('resize',this)!=false){this.setThumbBoxPosition();
 this.setCanvasPosition();}},onFooterButtonClick:function(e,el,o,A){switch(A){case 'rotate-left':this.onRotateLeft(e);break;case 'rotate-right':this.onRotateRight(e);break;case 'picture':this.beforeSelectFile(e);break;case 'trash':this.trash(e);break;case 'crop':this.crop(e);
 break;case 'download':this.download(e);break;default:break;}this.fireEvent('footerbuttonclick',this,A);},beforeSelectFile:function(e){e.preventDefault();if(this.fireEvent('beforeselectfile',this)!=false){this.selectorEl.dom.click();}},onFileSelected:function(e){e.preventDefault();
 if(typeof(this.selectorEl.dom.files)=='undefined'||!this.selectorEl.dom.files.length){return;}var A=this.selectorEl.dom.files[0];if(this.fireEvent('inspect',this,A)!=false){this.prepare(A);}},trash:function(e){this.fireEvent('trash',this);},download:function(e){this.fireEvent('download',this);
@@ -1957,12 +1957,14 @@ var ph=Math.ceil((this.bodyEl.getHeight()-this.canvasEl.height)/2);this.previewE
 return;}this.mouseX=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();this.mouseY=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();},onMouseMove:function(e){e.stopEvent();if(!this.canvasLoaded){return;}if(!this.dragable){return;}var A=Math.ceil(this.thumbEl.getLeft(true));
 var B=Math.ceil(this.thumbEl.getTop(true));var C=Math.ceil(A+this.thumbEl.getWidth()-this.canvasEl.width);var D=Math.ceil(B+this.thumbEl.getHeight()-this.canvasEl.height);var x=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();var y=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();
 x=x-this.mouseX;y=y-this.mouseY;var E=Math.ceil(x+this.previewEl.getLeft(true));var F=Math.ceil(y+this.previewEl.getTop(true));E=(A<E)?A:((C>E)?C:E);F=(B<F)?B:((D>F)?D:F);this.previewEl.setLeft(E);this.previewEl.setTop(F);this.mouseX=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();
-this.mouseY=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();},onMouseUp:function(e){e.stopEvent();this.dragable=false;},onMouseWheel:function(e){e.stopEvent();this.startScale=this.scale;this.scale=(e.getWheelDelta()==1)?(this.scale+1):(this.scale-1);
-if(!this.zoomable()){this.scale=this.startScale;return;}this.draw();return;},zoomable:function(){var A=this.thumbEl.getWidth()/this.minWidth;if(this.minWidth<this.minHeight){A=this.thumbEl.getHeight()/this.minHeight;}var B=Math.ceil(this.imageEl.OriginWidth*this.getScaleLevel()/A);
-var C=Math.ceil(this.imageEl.OriginHeight*this.getScaleLevel()/A);if(this.isDocument&&(this.rotate==0||this.rotate==180)&&(B>this.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(B<this.minWidth&&C<this.minHeight))){return false;}if(this.isDocument&&(this.rotate==90||this.rotate==270)&&(B>this.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(B<this.minHeight&&C<this.minWidth))){return false;
-}if(!this.isDocument&&(this.rotate==0||this.rotate==180)&&(B<this.minWidth||B>this.imageEl.OriginWidth||C<this.minHeight||C>this.imageEl.OriginHeight)){return false;}if(!this.isDocument&&(this.rotate==90||this.rotate==270)&&(B<this.minHeight||B>this.imageEl.OriginWidth||C<this.minWidth||C>this.imageEl.OriginHeight)){return false;
-}return true;},onRotateLeft:function(e){if(!this.isDocument&&(this.canvasEl.height<this.thumbEl.getWidth()||this.canvasEl.width<this.thumbEl.getHeight())){var A=this.thumbEl.getWidth()/this.minWidth;var bw=Math.ceil(this.canvasEl.width/this.getScaleLevel());
-var bh=Math.ceil(this.canvasEl.height/this.getScaleLevel());this.startScale=this.scale;while(this.getScaleLevel()<A){this.scale=this.scale+1;if(!this.zoomable()){break;}if(Math.ceil(bw*this.getScaleLevel())<this.thumbEl.getHeight()||Math.ceil(bh*this.getScaleLevel())<this.thumbEl.getWidth()){continue;
+this.mouseY=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();},onMouseUp:function(e){e.stopEvent();this.dragable=false;},onMouseWheel:function(e){e.stopEvent();this.startScale=this.scale;console.log("START SCALE: "+this.scale);this.scale=(e.getWheelDelta()==1)?(this.scale+1):(this.scale-1);
+console.log("END SCALE: "+this.scale);if(!this.zoomable()){this.scale=this.startScale;return;}this.draw();return;},zoomable:function(){console.log("THUMBEL");console.log(this.thumbEl);var A=this.thumbEl.getWidth()/this.minWidth;if(this.minWidth<this.minHeight){A=this.thumbEl.getHeight()/this.minHeight;
+}console.log("MINSCALE: "+A);var B=Math.ceil(this.imageEl.OriginWidth*this.getScaleLevel()/A);var C=Math.ceil(this.imageEl.OriginHeight*this.getScaleLevel()/A);var D=this.imageEl.OriginWidth;var E=this.imageEl.OriginHeight;if(this.imageEl.OriginWidth/this.imageEl.OriginHeight>this.minWidth/this.minHeight&&this.imageEl.OriginHeight<this.minHeight){E=this.minHeight;
+D=this.imageEl.OriginWidth/this.imageEl.OriginHeight*this.minHeight;}if(this.imageEl.OriginWidth/this.imageEl.OriginHeight<this.minWidth/this.minHeight&&this.imageEl.OriginWidth<this.minWidth){D=this.minWidth;E=this.imageEl.OriginHeight/this.imageEl.OriginWidth*this.minWidth;
+}console.log("GETSCALELEVEL: "+this.getScaleLevel());console.log("width: "+B);console.log("height: "+C);if(this.isDocument&&(this.rotate==0||this.rotate==180)&&(B>this.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(B<this.minWidth&&C<this.minHeight))){return false;
+}if(this.isDocument&&(this.rotate==90||this.rotate==270)&&(B>this.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(B<this.minHeight&&C<this.minWidth))){return false;}if(!this.isDocument&&(this.rotate==0||this.rotate==180)&&((this.imageEl.OriginWidth/this.imageEl.OriginHeight>this.minWidth/this.minHeight&&B<this.minWidth)||B>D||(this.imageEl.OriginWidth/this.imageEl.OriginHeight<this.minWidth/this.minHeight&&C<this.minHeight)||C>E)){return false;
+}if(!this.isDocument&&(this.rotate==90||this.rotate==270)&&(B<this.minHeight||B>this.imageEl.OriginWidth||C<this.minWidth||C>this.imageEl.OriginHeight)){return false;}return true;},onRotateLeft:function(e){if(!this.isDocument&&(this.canvasEl.height<this.thumbEl.getWidth()||this.canvasEl.width<this.thumbEl.getHeight())){var A=this.thumbEl.getWidth()/this.minWidth;
+var bw=Math.ceil(this.canvasEl.width/this.getScaleLevel());var bh=Math.ceil(this.canvasEl.height/this.getScaleLevel());this.startScale=this.scale;while(this.getScaleLevel()<A){this.scale=this.scale+1;if(!this.zoomable()){break;}if(Math.ceil(bw*this.getScaleLevel())<this.thumbEl.getHeight()||Math.ceil(bh*this.getScaleLevel())<this.thumbEl.getWidth()){continue;
 }this.rotate=(this.rotate<90)?270:this.rotate-90;this.draw();return;}this.scale=this.startScale;this.onRotateFail();return false;}this.rotate=(this.rotate<90)?270:this.rotate-90;if(this.isDocument){this.setThumbBoxSize();this.setThumbBoxPosition();this.setCanvasPosition();
 }this.draw();this.fireEvent('rotate',this,'left');},onRotateRight:function(e){if(!this.isDocument&&(this.canvasEl.height<this.thumbEl.getWidth()||this.canvasEl.width<this.thumbEl.getHeight())){var A=this.thumbEl.getWidth()/this.minWidth;var bw=Math.ceil(this.canvasEl.width/this.getScaleLevel());
 var bh=Math.ceil(this.canvasEl.height/this.getScaleLevel());this.startScale=this.scale;while(this.getScaleLevel()<A){this.scale=this.scale+1;if(!this.zoomable()){break;}if(Math.ceil(bw*this.getScaleLevel())<this.thumbEl.getHeight()||Math.ceil(bh*this.getScaleLevel())<this.thumbEl.getWidth()){continue;
@@ -2003,10 +2005,10 @@ this.baseScale=A/this.imageEl.OriginHeight;}return;}B=this.thumbEl.getHeight();t
 }return;}if(this.baseRotate==6||this.baseRotate==8){A=this.thumbEl.getHeight();this.baseScale=A/this.imageEl.OriginHeight;if(this.imageEl.OriginHeight*this.baseScale<this.thumbEl.getWidth()){B=this.thumbEl.getWidth();this.baseScale=B/this.imageEl.OriginHeight;
 }if(this.imageEl.OriginWidth>this.imageEl.OriginHeight){B=this.thumbEl.getWidth();this.baseScale=B/this.imageEl.OriginHeight;if(this.imageEl.OriginWidth*this.baseScale<this.thumbEl.getHeight()){A=this.thumbEl.getHeight();this.baseScale=A/this.imageEl.OriginWidth;
 }}return;}A=this.thumbEl.getWidth();this.baseScale=A/this.imageEl.OriginWidth;if(this.imageEl.OriginHeight*this.baseScale<this.thumbEl.getHeight()){B=this.thumbEl.getHeight();this.baseScale=B/this.imageEl.OriginHeight;}if(this.imageEl.OriginWidth>this.imageEl.OriginHeight){B=this.thumbEl.getHeight();
-this.baseScale=B/this.imageEl.OriginHeight;if(this.imageEl.OriginWidth*this.baseScale<this.thumbEl.getWidth()){A=this.thumbEl.getWidth();this.baseScale=A/this.imageEl.OriginWidth;}}return;},getScaleLevel:function(){return this.baseScale*Math.pow(1.1,this.scale);
-},onTouchStart:function(e){if(!this.canvasLoaded){this.beforeSelectFile(e);return;}var A=e.browserEvent.touches;if(!A){return;}if(A.length==1){this.onMouseDown(e);return;}if(A.length!=2){return;}var B=[];for(var i=0,C;C=A[i];i++){B.push(C.pageX,C.pageY);}
-var x=Math.pow(B[0]-B[2],2);var y=Math.pow(B[1]-B[3],2);this.startDistance=Math.sqrt(x+y);this.startScale=this.scale;this.pinching=true;this.dragable=false;},onTouchMove:function(e){if(!this.pinching&&!this.dragable){return;}var A=e.browserEvent.touches;if(!A){return;
-}if(this.dragable){this.onMouseMove(e);return;}var B=[];for(var i=0,C;C=A[i];i++){B.push(C.pageX,C.pageY);}var x=Math.pow(B[0]-B[2],2);var y=Math.pow(B[1]-B[3],2);this.endDistance=Math.sqrt(x+y);this.scale=this.startScale+Math.floor(Math.log(this.endDistance/this.startDistance)/Math.log(1.1));
+this.baseScale=B/this.imageEl.OriginHeight;if(this.imageEl.OriginWidth*this.baseScale<this.thumbEl.getWidth()){A=this.thumbEl.getWidth();this.baseScale=A/this.imageEl.OriginWidth;}}return;},getScaleLevel:function(){console.log("BASESCALE: "+this.baseScale);
+return this.baseScale*Math.pow(1.02,this.scale);},onTouchStart:function(e){if(!this.canvasLoaded){this.beforeSelectFile(e);return;}var A=e.browserEvent.touches;if(!A){return;}if(A.length==1){this.onMouseDown(e);return;}if(A.length!=2){return;}var B=[];for(var i=0,C;
+C=A[i];i++){B.push(C.pageX,C.pageY);}var x=Math.pow(B[0]-B[2],2);var y=Math.pow(B[1]-B[3],2);this.startDistance=Math.sqrt(x+y);this.startScale=this.scale;this.pinching=true;this.dragable=false;},onTouchMove:function(e){if(!this.pinching&&!this.dragable){return;
+}var A=e.browserEvent.touches;if(!A){return;}if(this.dragable){this.onMouseMove(e);return;}var B=[];for(var i=0,C;C=A[i];i++){B.push(C.pageX,C.pageY);}var x=Math.pow(B[0]-B[2],2);var y=Math.pow(B[1]-B[3],2);this.endDistance=Math.sqrt(x+y);this.scale=this.startScale+Math.floor(Math.log(this.endDistance/this.startDistance)/Math.log(1.1));
 if(!this.zoomable()){this.scale=this.startScale;return;}this.draw();},onTouchEnd:function(e){this.pinching=false;this.dragable=false;},process:function(A,B){if(this.loadMask){this.maskEl.mask(this.loadingText);}this.xhr=new XMLHttpRequest();A.xhr=this.xhr;
 this.xhr.open(this.method,this.url,true);var C={"Accept":"application/json","Cache-Control":"no-cache","X-Requested-With":"XMLHttpRequest"};for(var D in C){var E=C[D];if(E){this.xhr.setRequestHeader(D,E);}}var F=this;this.xhr.onload=function(){F.xhrOnLoad(F.xhr);
 };this.xhr.onerror=function(){F.xhrOnError(F.xhr);};var G=new FormData();G.append('returnHTML','NO');if(B){G.append('crop',B);}if(typeof(A)!='undefined'&&(typeof(A.id)=='undefined'||A.id*1<1)){G.append(this.paramName,A,A.name);}if(typeof(A.filename)!='undefined'){G.append('filename',A.filename);