diff --git a/croppic.js b/croppic.js index 8d0fe1a..c0136a2 100644 --- a/croppic.js +++ b/croppic.js @@ -20,6 +20,7 @@ cropUrl:'', cropData:{}, outputUrlId:'', + //styles imgEyecandy:true, imgEyecandyOpacity:0.2, @@ -51,7 +52,7 @@ }; // OVERWRITE DEFAULT OPTIONS - for (i in options) that.options[i] = options[i]; + for(i in options) that.options[i] = options[i]; // INIT THE WHOLE DAMN THING!!! that.init(); @@ -78,20 +79,20 @@ imgEyecandy:{}, form:{}, iframeform: {}, - iframeobj: {}, + iframeobj: {}, cropControlsUpload:{}, cropControlsCrop:{}, cropControlZoomMuchIn:{}, cropControlZoomMuchOut:{}, cropControlZoomIn:{}, - cropControlZoomOut:{}, - cropControlCrop:{}, + cropControlZoomOut:{}, + cropControlCrop:{}, cropControlReset:{}, cropControlRemoveCroppedImage:{}, modal:{}, loader:{}, - init: function () { + init: function(){ var that = this; that.objW = that.obj.width(); @@ -100,67 +101,76 @@ // reset rotation that.actualRotation = 0; - if( $.isEmptyObject(that.defaultImg)){ that.defaultImg = that.obj.find('img'); } + if($.isEmptyObject(that.defaultImg)){ + that.defaultImg = that.obj.find('img'); + } that.createImgUploadControls(); - if( $.isEmptyObject(that.options.loadPicture)){ + if($.isEmptyObject(that.options.loadPicture)){ that.bindImgUploadControl(); - }else{ + } else { that.loadExistingImage(); } }, + createImgUploadControls: function(){ var that = this; var cropControlUpload = ''; - if(that.options.customUploadButtonId ===''){ cropControlUpload = ''; } + if(that.options.customUploadButtonId ===''){ + cropControlUpload = ''; + } var cropControlRemoveCroppedImage = ''; - if( $.isEmptyObject(that.croppedImg)){ cropControlRemoveCroppedImage=''; } - if( !$.isEmptyObject(that.options.loadPicture)){ cropControlUpload='';} + if($.isEmptyObject(that.croppedImg)){ cropControlRemoveCroppedImage=''; } + if(!$.isEmptyObject(that.options.loadPicture)){ cropControlUpload='';} - var html = '
' + cropControlUpload + cropControlRemoveCroppedImage + '
'; + var html = '
' + cropControlUpload + cropControlRemoveCroppedImage + '
'; that.outputDiv.append(html); that.cropControlsUpload = that.outputDiv.find('.cropControlsUpload'); - if(that.options.customUploadButtonId ===''){ that.imgUploadControl = that.outputDiv.find('.cropControlUpload'); } - else{ that.imgUploadControl = $('#'+that.options.customUploadButtonId); that.imgUploadControl.show(); } + if(that.options.customUploadButtonId ===''){ + that.imgUploadControl = that.outputDiv.find('.cropControlUpload'); + } else{ + that.imgUploadControl = $('#'+that.options.customUploadButtonId); + that.imgUploadControl.show(); + } - if( !$.isEmptyObject(that.croppedImg)){ + if(!$.isEmptyObject(that.croppedImg)){ that.cropControlRemoveCroppedImage = that.outputDiv.find('.cropControlRemoveCroppedImage'); } }, + bindImgUploadControl: function(){ - var that = this; // CREATE UPLOAD IMG FORM - var formHtml = ''; + var formHtml = ''; that.outputDiv.append(formHtml); that.form = that.outputDiv.find('.'+that.id+'_imgUploadForm'); // CREATE FALLBACK IE9 IFRAME - var fileUploadId = that.CreateFallbackIframe(); + var fileUploadId = that.CreateFallbackIframe(); that.imgUploadControl.off('click'); that.imgUploadControl.on('click',function(){ if (fileUploadId === "") { - that.form.find('input[type="file"]').trigger('click'); - } else { - //Trigger iframe file input click, otherwise access restriction error - that.iframeform.find('input[type="file"]').trigger('click'); - } - }); + that.form.find('input[type="file"]').trigger('click'); + } else { + //Trigger iframe file input click, otherwise access restriction error + that.iframeform.find('input[type="file"]').trigger('click'); + } + }); - if( !$.isEmptyObject(that.croppedImg)){ + if(!$.isEmptyObject(that.croppedImg)){ - that.cropControlRemoveCroppedImage.on('click',function(){ - if (typeof (that.options.onBeforeRemoveCroppedImg) === typeof(Function)) { + that.cropControlRemoveCroppedImage.on('click', function(){ + if(typeof (that.options.onBeforeRemoveCroppedImg) === typeof(Function)){ that.options.onBeforeRemoveCroppedImg.call(that); } @@ -168,62 +178,62 @@ that.croppedImg = {}; $(this).hide(); - if (typeof (that.options.onAfterRemoveCroppedImg) === typeof(Function)) { + if(typeof (that.options.onAfterRemoveCroppedImg) === typeof(Function)) { that.options.onAfterRemoveCroppedImg.call(that); } - if( !$.isEmptyObject(that.defaultImg)){ + if(!$.isEmptyObject(that.defaultImg)){ that.obj.append(that.defaultImg); } - if(that.options.outputUrlId !== ''){ $('#'+that.options.outputUrlId).val(''); } - - }); + if(that.options.outputUrlId !== ''){ + $('#'+that.options.outputUrlId).val(''); + } + }); } - + that.form.find('input[type="file"]').change(function(){ - if (that.options.onBeforeImgUpload) that.options.onBeforeImgUpload.call(that); + if(that.options.onBeforeImgUpload) that.options.onBeforeImgUpload.call(that); that.showLoader(); that.imgUploadControl.hide(); - if(that.options.processInline){ - + if(that.options.processInline){ + var reader = new FileReader(); - reader.onload = function (e) { + reader.onload = function (e){ var image = new Image(); image.src = e.target.result; image.onload = function(){ that.imgInitW = that.imgW = image.width; that.imgInitH = that.imgH = image.height; - if(that.options.modal){ that.createModal(); } - if( !$.isEmptyObject(that.croppedImg)){ that.croppedImg.remove(); } + if(that.options.modal){ that.createModal(); } + if(!$.isEmptyObject(that.croppedImg)){ that.croppedImg.remove(); } - that.imgUrl=image.src; + that.imgUrl = image.src; that.obj.append(''); that.initCropper(); that.hideLoader(); - if (that.options.onAfterImgUpload) that.options.onAfterImgUpload.call(that); - + if(that.options.onAfterImgUpload) that.options.onAfterImgUpload.call(that); } }; reader.readAsDataURL(that.form.find('input[type="file"]')[0].files[0]); - } else { - + } else { + formData = new FormData(that.form[0]); - for (var key in that.options.uploadData) { - if( that.options.uploadData.hasOwnProperty(key) ) { - formData.append( key , that.options.uploadData[key] ); + for(var key in that.options.uploadData){ + if(that.options.uploadData.hasOwnProperty(key)){ + formData.append(key , that.options.uploadData[key]); } - } + } $.ajax({ url: that.options.uploadUrl, @@ -233,22 +243,23 @@ contentType: false, processData: false, type: 'POST' - }).always(function (data) { + }).always(function(data){ that.afterUpload(data); }); } - }); + }); + + }, - }, loadExistingImage: function(){ var that = this; - if( $.isEmptyObject(that.croppedImg)){ - if (that.options.onBeforeImgUpload) that.options.onBeforeImgUpload.call(that); + if($.isEmptyObject(that.croppedImg)){ + if(that.options.onBeforeImgUpload) that.options.onBeforeImgUpload.call(that); that.showLoader(); - if(that.options.modal){ that.createModal(); } - if( !$.isEmptyObject(that.croppedImg)){ that.croppedImg.remove(); } + if(that.options.modal){ that.createModal(); } + if(!$.isEmptyObject(that.croppedImg)){ that.croppedImg.remove(); } that.imgUrl=that.options.loadPicture ; @@ -262,38 +273,39 @@ if (that.options.onAfterImgUpload) that.options.onAfterImgUpload.call(that); }); - }else{ + } else { that.cropControlRemoveCroppedImage.on('click',function(){ that.croppedImg.remove(); $(this).hide(); - if( !$.isEmptyObject(that.defaultImg)){ + if(!$.isEmptyObject(that.defaultImg)){ that.obj.append(that.defaultImg); - } - if(that.options.outputUrlId !== ''){ $('#'+that.options.outputUrlId).val(''); } + } + + if(that.options.outputUrlId !== ''){$('#'+that.options.outputUrlId).val(''); } that.croppedImg = ''; that.reset(); - }); + }); } }, + afterUpload: function(data){ - var that = this; + var that = this; - response = typeof data =='object' ? data : jQuery.parseJSON(data); + response = typeof data =='object' ? data : jQuery.parseJSON(data); - - if (response.status == 'success') { + if(response.status == 'success'){ - that.imgInitW = that.imgW = response.width; - that.imgInitH = that.imgH = response.height; + that.imgInitW = that.imgW = response.width; + that.imgInitH = that.imgH = response.height; - if (that.options.modal) { that.createModal(); } - if (!$.isEmptyObject(that.croppedImg)) { that.croppedImg.remove(); } + if(that.options.modal){ that.createModal(); } + if(!$.isEmptyObject(that.croppedImg)){ that.croppedImg.remove(); } - that.imgUrl = response.url; + that.imgUrl = response.url; - var img = $('') + var img = $('') that.obj.append(img); @@ -302,17 +314,17 @@ that.hideLoader(); if (that.options.onAfterImgUpload) that.options.onAfterImgUpload.call(that); }); - - if (that.options.onAfterImgUpload) that.options.onAfterImgUpload.call(that); - } + if(that.options.onAfterImgUpload) that.options.onAfterImgUpload.call(that); - if (response.status == 'error') { - if (that.options.onError) that.options.onError.call(that,response.message); + } + + if(response.status == 'error'){ + if(that.options.onError) that.options.onError.call(that,response.message); that.hideLoader(); - setTimeout( function(){ that.reset(); },2000) - } - }, + setTimeout(function(){ that.reset(); },2000) + } + }, createModal: function(){ var that = this; @@ -325,8 +337,8 @@ that.modal = $('#croppicModal'); that.obj = $('#croppicModalObj'); - }, + destroyModal: function(){ var that = this; @@ -334,6 +346,7 @@ that.modal.remove(); that.modal = {}; }, + initCropper: function(){ var that = this; @@ -348,32 +361,48 @@ that.initDrag(); that.initialScaleImg(); }, + createEyecandy: function(){ var that = this; that.imgEyecandy = that.img.clone(); - that.imgEyecandy.css({'z-index':'0','opacity':that.options.imgEyecandyOpacity}).appendTo(that.obj); + that.imgEyecandy.css({ + 'z-index':'0', + 'opacity':that.options.imgEyecandyOpacity + }).appendTo(that.obj); }, + destroyEyecandy: function(){ var that = this; that.imgEyecandy.remove(); }, - initialScaleImg:function(){ + + initialScaleImg: function(){ var that = this; that.zoom(-that.imgInitW); that.zoom(40); // Adding mousewheel zoom capabilities if (that.options.enableMousescroll){ - that.img.on('mousewheel', function(event) { + that.img.on('mousewheel', function(event){ event.preventDefault(); - that.zoom(that.options.zoomFactor*event.deltaY); + that.zoom(that.options.zoomFactor*event.deltaY); }); } + // initial center image - - that.img.css({'left': -(that.imgW -that.objW)/2, 'top': -(that.imgH -that.objH)/2, 'position':'relative'}); - if(that.options.imgEyecandy){ that.imgEyecandy.css({'left': -(that.imgW -that.objW)/2, 'top': -(that.imgH -that.objH)/2, 'position':'relative'}); } + that.img.css({ + 'left': -(that.imgW -that.objW)/2, + 'top': -(that.imgH -that.objH)/2, + 'position':'relative' + }); + if(that.options.imgEyecandy){ + that.imgEyecandy.css({ + 'left': -(that.imgW -that.objW)/2, + 'top': -(that.imgH -that.objH)/2, + 'position':'relative' + }); + } }, @@ -386,12 +415,10 @@ var cropControlZoomOut = ''; var cropControlZoomMuchOut = ''; var cropControlRotateLeft = ''; - var cropControlRotateRight = ''; - var cropControlCrop = ''; + var cropControlRotateRight = ''; + var cropControlCrop = ''; var cropControlReset = ''; - var html; - if(that.options.doubleZoomControls){ cropControlZoomMuchIn = ''; cropControlZoomMuchOut = ''; @@ -401,7 +428,7 @@ cropControlRotateRight = ''; } - html = '
'+ cropControlZoomMuchIn + cropControlZoomIn + cropControlZoomOut + cropControlZoomMuchOut + cropControlRotateLeft + cropControlRotateRight + cropControlCrop + cropControlReset + '
'; + var html = '
'+ cropControlZoomMuchIn + cropControlZoomIn + cropControlZoomOut + cropControlZoomMuchOut + cropControlRotateLeft + cropControlRotateRight + cropControlCrop + cropControlReset + '
'; that.obj.append(html); @@ -410,67 +437,86 @@ // CACHE AND BIND CONTROLS if(that.options.doubleZoomControls){ that.cropControlZoomMuchIn = that.cropControlsCrop.find('.cropControlZoomMuchIn'); - that.cropControlZoomMuchIn.on('click',function(){ that.zoom( that.options.zoomFactor*10 ); }); + that.cropControlZoomMuchIn.on('click', function(){ + that.zoom(that.options.zoomFactor*10); + }); that.cropControlZoomMuchOut = that.cropControlsCrop.find('.cropControlZoomMuchOut'); - that.cropControlZoomMuchOut.on('click',function(){ that.zoom(-that.options.zoomFactor*10); }); + that.cropControlZoomMuchOut.on('click', function(){ + that.zoom(-that.options.zoomFactor*10); + }); } that.cropControlZoomIn = that.cropControlsCrop.find('.cropControlZoomIn'); - that.cropControlZoomIn.on('click',function(){ that.zoom(that.options.zoomFactor); }); + that.cropControlZoomIn.on('click', function(){ + that.zoom(that.options.zoomFactor); + }); that.cropControlZoomOut = that.cropControlsCrop.find('.cropControlZoomOut'); - that.cropControlZoomOut.on('click',function(){ that.zoom(-that.options.zoomFactor); }); + that.cropControlZoomOut.on('click', function(){ + that.zoom(-that.options.zoomFactor); + }); that.cropControlZoomIn = that.cropControlsCrop.find('.cropControlRotateLeft'); - that.cropControlZoomIn.on('click', function() { that.rotate(-that.options.rotateFactor); }); - - that.cropControlZoomOut = that.cropControlsCrop.find('.cropControlRotateRight'); - that.cropControlZoomOut.on('click', function() { that.rotate(that.options.rotateFactor); }); - - that.cropControlCrop = that.cropControlsCrop.find('.cropControlCrop'); - that.cropControlCrop.on('click',function(){ that.crop(); }); + that.cropControlZoomIn.on('click', function(){ + that.rotate(-that.options.rotateFactor); + }); + + that.cropControlZoomOut = that.cropControlsCrop.find('.cropControlRotateRight'); + that.cropControlZoomOut.on('click', function(){ + that.rotate(that.options.rotateFactor); + }); + + that.cropControlCrop = that.cropControlsCrop.find('.cropControlCrop'); + that.cropControlCrop.on('click', function(){ + that.crop(); + }); that.cropControlReset = that.cropControlsCrop.find('.cropControlReset'); - that.cropControlReset.on('click',function(){ that.reset(); }); - + that.cropControlReset.on('click', function(){ + that.reset(); + }); }, - initDrag:function(){ + + initDrag: function(){ var that = this; + + var isMobile = function(e){ + return userAgent.match(/iPad/i) || userAgent.match(/iPhone/i) || userAgent.match(/android/i) || (e.pageY && e.pageX) == undefined + }; that.img.on("mousedown touchstart", function(e) { e.preventDefault(); // disable selection var pageX; - var pageY; - var userAgent = window.navigator.userAgent; - if (userAgent.match(/iPad/i) || userAgent.match(/iPhone/i) || userAgent.match(/android/i) || (e.pageY && e.pageX) == undefined) { - pageX = e.originalEvent.touches[0].pageX; - pageY = e.originalEvent.touches[0].pageY; - } else { - pageX = e.pageX; - pageY = e.pageY; - } - - var z_idx = that.img.css('z-index'), - drg_h = that.img.outerHeight(), - drg_w = that.img.outerWidth(), - pos_y = that.img.offset().top + drg_h - pageY, - pos_x = that.img.offset().left + drg_w - pageX; + var pageY; + var userAgent = window.navigator.userAgent; + if(isMobile(e)){ + pageX = e.originalEvent.touches[0].pageX; + pageY = e.originalEvent.touches[0].pageY; + } else { + pageX = e.pageX; + pageY = e.pageY; + } + + var z_idx = that.img.css('z-index'); + var drg_h = that.img.outerHeight(); + var drg_w = that.img.outerWidth(); + var pos_y = that.img.offset().top + drg_h - pageY; + var pos_x = that.img.offset().left + drg_w - pageX; - that.img.css('z-index', 1000).on("mousemove touchmove", function(e) { - + that.img.css('z-index', 1000).on("mousemove touchmove", function(e){ var imgTop; var imgLeft; - if (userAgent.match(/iPad/i) || userAgent.match(/iPhone/i) || userAgent.match(/android/i) || (e.pageY && e.pageX) == undefined) { - imgTop = e.originalEvent.touches[0].pageY + pos_y - drg_h; - imgLeft = e.originalEvent.touches[0].pageX + pos_x - drg_w; - } else { - imgTop = e.pageY + pos_y - drg_h; - imgLeft = e.pageX + pos_x - drg_w; - } + if (isMobile(e)) { + imgTop = e.originalEvent.touches[0].pageY + pos_y - drg_h; + imgLeft = e.originalEvent.touches[0].pageX + pos_x - drg_w; + } else { + imgTop = e.pageY + pos_y - drg_h; + imgLeft = e.pageX + pos_x - drg_w; + } that.img.offset({ top:imgTop, @@ -481,83 +527,132 @@ if(that.options.imgEyecandy){ that.imgEyecandy.offset({ top:imgTop, left:imgLeft }); } - if (that.objH < that.imgH) { - if (parseInt(that.img.css('top')) > 0) { that.img.css('top', 0); if (that.options.imgEyecandy) { that.imgEyecandy.css('top', 0);}} - var maxTop = -( that.imgH - that.objH); if (parseInt(that.img.css('top')) < maxTop) { that.img.css('top', maxTop); if (that.options.imgEyecandy) { that.imgEyecandy.css('top', maxTop); }} - }else{ - if (parseInt(that.img.css('top')) < 0) { that.img.css('top', 0); if (that.options.imgEyecandy) { that.imgEyecandy.css('top', 0); }} - var maxTop = that.objH - that.imgH; if (parseInt(that.img.css('top')) > maxTop) { that.img.css('top', maxTop);if (that.options.imgEyecandy) {that.imgEyecandy.css('top', maxTop); }} + if(that.objH < that.imgH){ + if(parseInt(that.img.css('top')) > 0){ + that.img.css('top', 0); + + if(that.options.imgEyecandy){ + that.imgEyecandy.css('top', 0); + } + } + + var maxTop = -(that.imgH - that.objH); + if(parseInt(that.img.css('top')) < maxTop){ + that.img.css('top', maxTop); + if(that.options.imgEyecandy){ + that.imgEyecandy.css('top', maxTop); + } + } + } else { + if(parseInt(that.img.css('top')) < 0){ + that.img.css('top', 0); + + if(that.options.imgEyecandy){ + that.imgEyecandy.css('top', 0); + } + } + + var maxTop = that.objH - that.imgH; + if(parseInt(that.img.css('top')) > maxTop){ + that.img.css('top', maxTop); + + if(that.options.imgEyecandy){ + that.imgEyecandy.css('top', maxTop); + } + } } - if (that.objW < that.imgW) { - if( parseInt( that.img.css('left')) > 0 ){ that.img.css('left',0); if(that.options.imgEyecandy){ that.imgEyecandy.css('left', 0); }} - var maxLeft = -( that.imgW-that.objW); if( parseInt( that.img.css('left')) < maxLeft){ that.img.css('left', maxLeft); if(that.options.imgEyecandy){ that.imgEyecandy.css('left', maxLeft); } } - }else{ - if( parseInt( that.img.css('left')) < 0 ){ that.img.css('left',0); if(that.options.imgEyecandy){ that.imgEyecandy.css('left', 0); }} - var maxLeft = ( that.objW - that.imgW); if( parseInt( that.img.css('left')) > maxLeft){ that.img.css('left', maxLeft); if(that.options.imgEyecandy){ that.imgEyecandy.css('left', maxLeft); } } + if(that.objW < that.imgW){ + if(parseInt(that.img.css('left')) > 0 ){ + that.img.css('left',0); + if(that.options.imgEyecandy){ + that.imgEyecandy.css('left', 0); + } + } + + var maxLeft = -(that.imgW-that.objW); + if(parseInt(that.img.css('left')) < maxLeft){ + that.img.css('left', maxLeft); + if(that.options.imgEyecandy){ + that.imgEyecandy.css('left', maxLeft); + } + } + } else { + if(parseInt(that.img.css('left')) < 0){ + that.img.css('left', 0); + if(that.options.imgEyecandy){ + that.imgEyecandy.css('left', 0); + } + } + var maxLeft = (that.objW - that.imgW); + if(parseInt(that.img.css('left')) > maxLeft){ + that.img.css('left', maxLeft); + if(that.options.imgEyecandy){ + that.imgEyecandy.css('left', maxLeft); + } + } } - if (that.options.onImgDrag) that.options.onImgDrag.call(that); - + + if(that.options.onImgDrag) that.options.onImgDrag.call(that); }); - - }).on("mouseup", function() { + + }).on("mouseup", function(){ that.img.off("mousemove"); - }).on("mouseout", function() { + }).on("mouseout", function(){ that.img.off("mousemove"); }); }, - rotate: function(x) { - var that = this; - that.actualRotation += x; - that.img.css({ - '-webkit-transform': 'rotate(' + that.actualRotation + 'deg)', - '-moz-transform': 'rotate(' + that.actualRotation + 'deg)', - 'transform': 'rotate(' + that.actualRotation + 'deg)', - }); - if(that.options.imgEyecandy) { - that.imgEyecandy.css({ - '-webkit-transform': 'rotate(' + that.actualRotation + 'deg)', - '-moz-transform': 'rotate(' + that.actualRotation + 'deg)', - 'transform': 'rotate(' + that.actualRotation + 'deg)', - }); - } - if (typeof that.options.onImgRotate == 'function') - that.options.onImgRotate.call(that); - }, - zoom :function(x){ + + rotate: function(x){ + var that = this; + that.actualRotation += x; + that.img.css({ + '-webkit-transform': 'rotate(' + that.actualRotation + 'deg)', + '-moz-transform': 'rotate(' + that.actualRotation + 'deg)', + 'transform': 'rotate(' + that.actualRotation + 'deg)', + }); + + if(that.options.imgEyecandy) { + that.imgEyecandy.css({ + '-webkit-transform': 'rotate(' + that.actualRotation + 'deg)', + '-moz-transform': 'rotate(' + that.actualRotation + 'deg)', + 'transform': 'rotate(' + that.actualRotation + 'deg)', + }); + } + + if(typeof that.options.onImgRotate == 'function') that.options.onImgRotate.call(that); + }, + + zoom: function(x){ var that = this; var ratio = that.imgW / that.imgH; var newWidth = that.imgW+x; var newHeight = newWidth/ratio; var doPositioning = true; - if( newWidth < that.objW || newHeight < that.objH){ - - if( newWidth - that.objW < newHeight - that.objH ){ + if(newWidth < that.objW || newHeight < that.objH){ + if(newWidth - that.objW < newHeight - that.objH ){ newWidth = that.objW; newHeight = newWidth/ratio; - }else{ + } else { newHeight = that.objH; newWidth = ratio * newHeight; } doPositioning = false; - } if(!that.options.scaleToFill && (newWidth > that.imgInitW || newHeight > that.imgInitH)){ - - if( newWidth - that.imgInitW < newHeight - that.imgInitH ){ + if(newWidth - that.imgInitW < newHeight - that.imgInitH){ newWidth = that.imgInitW; newHeight = newWidth/ratio; - }else{ + } else { newHeight = that.imgInitH; newWidth = ratio * newHeight; } doPositioning = false; - } that.imgW = newWidth; @@ -566,50 +661,53 @@ that.imgH = newHeight; that.img.height(newHeight); - var newTop = parseInt( that.img.css('top') ) - x/2; - var newLeft = parseInt( that.img.css('left') ) - x/2; + var newTop = parseInt(that.img.css('top') ) - x/2; + var newLeft = parseInt(that.img.css('left') ) - x/2; - if( newTop>0 ){ newTop=0;} - if( newLeft>0 ){ newLeft=0;} + if(newTop > 0) newTop=0; + if(newLeft > 0) newLeft=0; - var maxTop = -( newHeight-that.objH); if( newTop < maxTop){ newTop = maxTop; } - var maxLeft = -( newWidth-that.objW); if( newLeft < maxLeft){ newLeft = maxLeft; } + var maxTop = -(newHeight-that.objH); + if(newTop < maxTop) newTop = maxTop; + + var maxLeft = -(newWidth-that.objW); + if(newLeft < maxLeft) newLeft = maxLeft; - if( doPositioning ){ + if(doPositioning){ that.img.css({'top':newTop, 'left':newLeft}); } if(that.options.imgEyecandy){ that.imgEyecandy.width(newWidth); that.imgEyecandy.height(newHeight); - if( doPositioning ){ + if(doPositioning){ that.imgEyecandy.css({'top':newTop, 'left':newLeft}); } - } + } - if (that.options.onImgZoom) that.options.onImgZoom.call(that); + if(that.options.onImgZoom) that.options.onImgZoom.call(that); }, - crop:function(){ + crop: function(){ var that = this; - if (that.options.onBeforeImgCrop) that.options.onBeforeImgCrop.call(that); + if(that.options.onBeforeImgCrop) that.options.onBeforeImgCrop.call(that); that.cropControlsCrop.hide(); that.showLoader(); var cropData = { - imgUrl:that.imgUrl, - imgInitW:that.imgInitW, - imgInitH:that.imgInitH, - imgW:that.imgW, - imgH:that.imgH, - imgY1:Math.abs( parseInt( that.img.css('top') ) ), - imgX1:Math.abs( parseInt( that.img.css('left') ) ), - cropH:that.objH, - cropW:that.objW, - rotation:that.actualRotation - }; + imgUrl: that.imgUrl, + imgInitW: that.imgInitW, + imgInitH: that.imgInitH, + imgW: that.imgW, + imgH: that.imgH, + imgY1: Math.abs(parseInt(that.img.css('top'))), + imgX1: Math.abs(parseInt(that.img.css('left'))), + cropH: that.objH, + cropW: that.objW, + rotation: that.actualRotation + }; var formData; @@ -618,20 +716,21 @@ var urlEncodedData = ""; var urlEncodedDataPairs = []; - for(var key in cropData) { + for(var key in cropData){ urlEncodedDataPairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(cropData[key])); } - for(var key in that.options.cropData) { + + for(var key in that.options.cropData){ urlEncodedDataPairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(that.options.cropData[key])); } + urlEncodedData = urlEncodedDataPairs.join('&').replace(/%20/g, '+'); - XHR.addEventListener('error', function(event) { - if (that.options.onError) that.options.onError.call(that,"XHR Request failed"); + XHR.addEventListener('error', function(event){ + if(that.options.onError) that.options.onError.call(that,"XHR Request failed"); }); - XHR.onreadystatechange=function(){ - if (XHR.readyState==4 && XHR.status==200) - { + XHR.onreadystatechange = function(){ + if(XHR.readyState == 4 && XHR.status == 200){ that.afterCrop(XHR.responseText); } } @@ -642,211 +741,214 @@ XHR.send(urlEncodedData); - }else{ + } else { formData = new FormData(); - for (var key in cropData) { - if( cropData.hasOwnProperty(key) ) { - formData.append( key , cropData[key] ); + for (var key in cropData){ + if(cropData.hasOwnProperty(key)){ + formData.append(key , cropData[key]); } } - for (var key in that.options.cropData) { - if( that.options.cropData.hasOwnProperty(key) ) { - formData.append( key , that.options.cropData[key] ); + for(var key in that.options.cropData){ + if(that.options.cropData.hasOwnProperty(key)){ + formData.append(key, that.options.cropData[key]); } } $.ajax({ - url: that.options.cropUrl, - data: formData, - context: document.body, - cache: false, + url: that.options.cropUrl, + data: formData, + context: document.body, + cache: false, contentType: false, processData: false, - type: 'POST' - }).always(function (data) { - + type: 'POST' + }).always(function(data){ that.afterCrop(data); - }); } - - // - }, - afterCrop: function (data) { - var that = this; + }, + + afterCrop: function(data){ + var that = this; try { - response = jQuery.parseJSON(data); - } - catch(err) { + response = jQuery.parseJSON(data); + } catch(err){ response = typeof data =='object' ? data : jQuery.parseJSON(data); - } + } - if (response.status == 'success') { + if(response.status == 'success'){ + if(that.options.imgEyecandy) that.imgEyecandy.hide(); - if (that.options.imgEyecandy) - that.imgEyecandy.hide(); + that.destroy(); - that.destroy(); - - that.obj.append(''); - if (that.options.outputUrlId !== '') { $('#' + that.options.outputUrlId).val(response.url); } + that.obj.append(''); - that.croppedImg = that.obj.find('.croppedImg'); - - that.init(); + if(that.options.outputUrlId !== ''){ + $('#' + that.options.outputUrlId).val(response.url); + } - that.hideLoader(); - } - if (response.status == 'error') { - if (that.options.onError) that.options.onError.call(that,response.message); + that.croppedImg = that.obj.find('.croppedImg'); + that.init(); that.hideLoader(); - setTimeout( function(){ that.reset(); },2000) - } + } + if(response.status == 'error'){ + if(that.options.onError) that.options.onError.call(that,response.message); + that.hideLoader(); + setTimeout(function(){ that.reset(); }, 2000); + } - if (that.options.onAfterImgCrop) that.options.onAfterImgCrop.call(that); - }, - showLoader:function(){ + if(that.options.onAfterImgCrop) that.options.onAfterImgCrop.call(that); + }, + + showLoader: function(){ var that = this; that.obj.append(that.options.loaderHtml); that.loader = that.obj.find('.loader'); }, - hideLoader:function(){ + + hideLoader: function(){ var that = this; - that.loader.remove(); + that.loader.remove(); }, - reset:function(){ + + reset: function(){ var that = this; that.destroy(); that.init(); - if( !$.isEmptyObject(that.croppedImg)){ + if(!$.isEmptyObject(that.croppedImg)){ that.obj.append(that.croppedImg); - if(that.options.outputUrlId !== ''){ $('#'+that.options.outputUrlId).val(that.croppedImg.attr('url')); } + + if(that.options.outputUrlId !== ''){ + $('#'+that.options.outputUrlId).val(that.croppedImg.attr('url')); + } } - if (typeof that.options.onReset == 'function') - that.options.onReset.call(that); + if(typeof that.options.onReset == 'function') that.options.onReset.call(that); }, - destroy:function(){ + + destroy: function(){ var that = this; - if(that.options.modal && !$.isEmptyObject(that.modal) ){ that.destroyModal(); } - if(that.options.imgEyecandy && !$.isEmptyObject(that.imgEyecandy) ){ that.destroyEyecandy(); } - if( !$.isEmptyObject( that.cropControlsUpload ) ){ that.cropControlsUpload.remove(); } - if( !$.isEmptyObject( that.cropControlsCrop ) ){ that.cropControlsCrop.remove(); } - if( !$.isEmptyObject( that.loader ) ){ that.loader.remove(); } - if( !$.isEmptyObject( that.form ) ){ that.form.remove(); } + if(that.options.modal && !$.isEmptyObject(that.modal)) that.destroyModal(); + if(that.options.imgEyecandy && !$.isEmptyObject(that.imgEyecandy)) that.destroyEyecandy(); + if(!$.isEmptyObject(that.cropControlsUpload)) that.cropControlsUpload.remove(); + if(!$.isEmptyObject(that.cropControlsCrop)) that.cropControlsCrop.remove(); + if(!$.isEmptyObject(that.loader)) that.loader.remove(); + if(!$.isEmptyObject(that.form)) that.form.remove(); that.obj.html(''); }, + isAjaxUploadSupported: function () { - var input = document.createElement("input"); - input.type = "file"; - - return ( - "multiple" in input && - typeof File != "undefined" && - typeof FormData != "undefined" && - typeof (new XMLHttpRequest()).upload != "undefined"); - }, - CreateFallbackIframe: function () { - var that = this; - - if (!that.isAjaxUploadSupported()) { - - if (jQuery.isEmptyObject(that.iframeobj)) { - var iframe = document.createElement("iframe"); - iframe.setAttribute("id", that.id + "_upload_iframe"); - iframe.setAttribute("name", that.id + "_upload_iframe"); - iframe.setAttribute("width", "0"); - iframe.setAttribute("height", "0"); - iframe.setAttribute("border", "0"); - iframe.setAttribute("src", "javascript:false;"); - iframe.style.display = "none"; - document.body.appendChild(iframe); - } else { - iframe = that.iframeobj[0]; - } - - var myContent = '' - + 'Uploading File' - + '' - + '
' - + $("#" + that.id + '_imgUploadField')[0].outerHTML - + '
'; - - iframe.contentWindow.document.open('text/htmlreplace'); - iframe.contentWindow.document.write(myContent); - iframe.contentWindow.document.close(); - - that.iframeobj = $("#" + that.id + "_upload_iframe"); - that.iframeform = that.iframeobj.contents().find("html").find("." + that.id + "_upload_iframe_form"); - - that.iframeform.on("change", "input", function () { + var input = document.createElement("input"); + input.type = "file"; + + return ( + "multiple" in input && + typeof File != "undefined" && + typeof FormData != "undefined" && + typeof (new XMLHttpRequest()).upload != "undefined" + ); + }, + + CreateFallbackIframe: function(){ + var that = this; + + if(!that.isAjaxUploadSupported()){ + + if (jQuery.isEmptyObject(that.iframeobj)) { + var iframe = document.createElement("iframe"); + iframe.setAttribute("id", that.id + "_upload_iframe"); + iframe.setAttribute("name", that.id + "_upload_iframe"); + iframe.setAttribute("width", "0"); + iframe.setAttribute("height", "0"); + iframe.setAttribute("border", "0"); + iframe.setAttribute("src", "javascript:false;"); + iframe.style.display = "none"; + document.body.appendChild(iframe); + } else { + iframe = that.iframeobj[0]; + } + + var myContent = '' + + 'Uploading File' + + '' + + '
' + + $("#" + that.id + '_imgUploadField')[0].outerHTML + + '
'; + + iframe.contentWindow.document.open('text/htmlreplace'); + iframe.contentWindow.document.write(myContent); + iframe.contentWindow.document.close(); + + that.iframeobj = $("#" + that.id + "_upload_iframe"); + that.iframeform = that.iframeobj.contents().find("html").find("." + that.id + "_upload_iframe_form"); + + that.iframeform.on("change", "input", function(){ that.SubmitFallbackIframe(that); - }); - that.iframeform.find("input")[0].attachEvent("onchange", function () { - that.SubmitFallbackIframe(that); - }); - - var eventHandlermyFile = function () { - if (iframe.detachEvent) - iframe.detachEvent("onload", eventHandlermyFile); - else - iframe.removeEventListener("load", eventHandlermyFile, false); - - var response = that.getIframeContentJSON(iframe); - - if (jQuery.isEmptyObject(that.modal)) { - that.afterUpload(response); - } - } - - if (iframe.addEventListener) - iframe.addEventListener("load", eventHandlermyFile, true); - if (iframe.attachEvent) - iframe.attachEvent("onload", eventHandlermyFile); - - return "#" + that.id + '_imgUploadField'; - - } else { - return ""; - } - - }, - SubmitFallbackIframe: function (that) { - that.showLoader(); + }); + + that.iframeform.find("input")[0].attachEvent("onchange", function(){ + that.SubmitFallbackIframe(that); + }); + + var eventHandlermyFile = function () { + if(iframe.detachEvent){ + iframe.detachEvent("onload", eventHandlermyFile); + } else { + iframe.removeEventListener("load", eventHandlermyFile, false); + } + + var response = that.getIframeContentJSON(iframe); + + if(jQuery.isEmptyObject(that.modal)) that.afterUpload(response); + } + + if(iframe.addEventListener) iframe.addEventListener("load", eventHandlermyFile, true); + if(iframe.attachEvent) iframe.attachEvent("onload", eventHandlermyFile); + + return "#" + that.id + '_imgUploadField'; + } else { + return ""; + } + + }, + + SubmitFallbackIframe: function(that){ + that.showLoader(); if(that.options.processInline && !that.options.uploadUrl){ - if (that.options.onError){ + if(that.options.onError){ that.options.onError.call(that,"processInline is not supported by your browser "); that.hideLoader(); } - }else{ - if (that.options.onBeforeImgUpload) that.options.onBeforeImgUpload.call(that); + } else { + if(that.options.onBeforeImgUpload) that.options.onBeforeImgUpload.call(that); that.iframeform[0].submit(); - } - }, - getIframeContentJSON: function (iframe) { - try { - var doc = iframe.contentDocument ? iframe.contentDocument : iframe.contentWindow.document, - response; - - var innerHTML = doc.body.innerHTML; - if (innerHTML.slice(0, 5).toLowerCase() == "
" && innerHTML.slice(-6).toLowerCase() == "
") { - innerHTML = doc.body.firstChild.firstChild.nodeValue; - } - response = jQuery.parseJSON(innerHTML); - } catch (err) { - response = { success: false }; - } - - return response; - } + } + }, + + getIframeContentJSON: function(iframe){ + try{ + var doc = iframe.contentDocument ? iframe.contentDocument : iframe.contentWindow.document; + var response; + + var innerHTML = doc.body.innerHTML; + if(innerHTML.slice(0, 5).toLowerCase() == "
" && innerHTML.slice(-6).toLowerCase() == "
"){ + innerHTML = doc.body.firstChild.firstChild.nodeValue; + } + response = jQuery.parseJSON(innerHTML); + } catch(err){ + response = { success: false }; + } + + return response; + } }; })(window, document);