/*
* CROPPIC
* dependancy: jQuery
* author: Ognjen "Zmaj Džedaj" Božičković and Mat Steinlin
*/
(function (window, document) {
Croppic = function (id, options) {
var that = this;
that.id = id;
that.obj = $('#' + id);
that.outputDiv = that.obj;
that.imgUrl="";
that.saveImgUrl="";
that.imgBackground="";
// DEFAULT OPTIONS
that.options = {
uploadUrl:'',
uploadData:{},
cropUrl:'',
cropData:{},
outputUrlId:'',
//styles
imgEyecandy:true,
imgEyecandyOpacity:0.2,
initialZoom:40,
zoomFactor:10,
rotateFactor:5,
doubleZoomControls:true,
rotateControls: true,
modal:false,
customUploadButtonId:'',
customSaveButtonId:'',
loaderHtml:'',
scaleToFill: true,
processInline: false,
loadPicture:'',
onReset: null,
enableMousescroll: false,
colorAbsorption:false,
//callbacks
onBeforeImgUpload: null,
onAfterImgUpload: null,
onImgDrag: null,
onImgZoom: null,
onImgRotate: null,
onBeforeImgCrop: null,
onAfterImgCrop: null,
onBeforeRemoveCroppedImg: null,
onAfterRemoveCroppedImg: null,
onError: null,
};
// OVERWRITE DEFAULT OPTIONS
for (i in options) that.options[i] = options[i];
// INIT THE WHOLE DAMN THING!!!
that.init();
};
Croppic.prototype = {
id:'',
imgInitW:0,
imgInitH:0,
imgW:0,
imgH:0,
actualRotationImgW:0,
actualRotationImgH:0,
objW:0,
objH:0,
actualRotation: 0,
windowW:0,
windowH:$(window).height(),
obj:{},
outputDiv:{},
outputUrlObj:{},
img:{},
defaultImg:{},
croppedImg:{},
imgEyecandy:{},
form:{},
iframeform: {},
iframeobj: {},
cropControlsUpload:{},
cropControlsCrop:{},
cropControlZoomMuchIn:{},
cropControlZoomMuchOut:{},
cropControlZoomIn:{},
cropControlZoomOut:{},
cropControlCrop:{},
cropControlReset:{},
cropControlRemoveCroppedImage:{},
cropControlOriginal:{},
modal:{},
loader:{},
cropSaveControl:{},
init: function () {
var that = this;
that.objW = that.obj.width();
that.objH = that.obj.height();
// reset rotation
that.actualRotation = 0;
that.actualRotationImgH=0;
that.actualRotationImgW=0;
that.colorAbsorption=false;
that.imgBackground="";
if( $.isEmptyObject(that.defaultImg)){ that.defaultImg = that.obj.find('img'); }
that.createImgUploadControls();
if( $.isEmptyObject(that.options.loadPicture)){
that.bindImgUploadControl();
}else{
that.loadExistingImage();
}
},
createImgUploadControls: function(){
var that = this;
var cropControlUpload = '';
if(that.options.customUploadButtonId ===''){ cropControlUpload = ''; }
var cropControlRemoveCroppedImage = '';
var cropControlOriginal = '';
if( $.isEmptyObject(that.croppedImg))
{
cropControlRemoveCroppedImage='';
cropControlOriginal='';
}
if( !$.isEmptyObject(that.options.loadPicture)){ cropControlUpload='';}
var html = '
' + cropControlUpload + cropControlOriginal + 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.customSaveButtonId !==''){
that.cropSaveControl= $('#'+that.options.customSaveButtonId); that.cropSaveControl.hide();
}
if( !$.isEmptyObject(that.croppedImg)){
that.cropControlRemoveCroppedImage = that.outputDiv.find('.cropControlRemoveCroppedImage');
that.cropControlOriginal = that.outputDiv.find('.cropControlOriginal');
}
},
bindImgUploadControl: function(){
var that = this;
// CREATE UPLOAD IMG FORM
var formHtml = '';
that.outputDiv.append(formHtml);
that.form = that.outputDiv.find('.'+that.id+'_imgUploadForm');
// CREATE FALLBACK IE9 IFRAME
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.cropSaveControl.off('click');
that.cropSaveControl.on('click',function(){
// var res = confirm('您确定要使用编辑好的图片吗?\n\r' +
// '[确认]使用图片\n\r' +
// '[取消]继续编辑');
// if (res) {
// that.destroy();
// window.location.href="https://wwww.croppic.com?"+that.saveImgUrl;
// }
that.destroy();
window.location.href="https://wwww.croppic.com?"+that.saveImgUrl;
});
if( !$.isEmptyObject(that.croppedImg)){
that.cropControlRemoveCroppedImage.on('click',function(){
if (typeof (that.options.onBeforeRemoveCroppedImg) === typeof(Function)) {
that.options.onBeforeRemoveCroppedImg.call(that);
}
var res = confirm('您是要使用当前图片还是重新选择图片?\n\r' +
'[确认]使用当前图片\n\r' +
'[取消]重新选择图片');
var width= that.imgInitW;
var height= that.imgInitH;
that.croppedImg.remove();
that.croppedImg = {};
$(this).hide();
that.cropSaveControl.hide();
that.cropControlOriginal.hide();
if (typeof (that.options.onAfterRemoveCroppedImg) === typeof(Function)) {
that.options.onAfterRemoveCroppedImg.call(that);
}
if( !$.isEmptyObject(that.defaultImg)){
that.obj.append(that.defaultImg);
}
if(that.options.outputUrlId !== ''){ $('#'+that.options.outputUrlId).val(''); }
that.imgUploadControl.show();
if (res) {
that.showLoader();
that.imgUploadControl.hide();
if( !$.isEmptyObject(that.croppedImg)){ that.croppedImg.remove(); }
that.imgInitW = that.imgW = width;
that.imgInitH = that.imgH = height;
that.saveImgUrl="";
that.obj.append('
');
that.initCropper();
that.hideLoader();
}
});
that.cropControlOriginal.on('click',function(){
if (that.imgUrl=='')
{
alert('请选择图片' );
return;
}
var res = confirm('您确定要使用原图吗?\n\r' +
'[确认]使用原图\n\r' +
'[取消]继续编辑');
if (res) {
that.destroy();
window.location.href="https://wwww.croppic.com?"+that.imgUrl;
}
});
}
that.form.find('input[type="file"]').change(function(){
if (that.options.onBeforeImgUpload) that.options.onBeforeImgUpload.call(that);
that.showLoader();
that.imgUploadControl.hide();
if(that.options.processInline){
// Checking Browser Support for FileReader API
if (typeof FileReader == "undefined"){
if (that.options.onError) that.options.onError.call(that,"processInline is not supported by your Browser");
that.reset();
}else{
var filePath=that.form.find('input[type="file"]')[0].files[0];
if( !$.isEmptyObject(that.croppedImg)){
that.destroy();
}
var reader = new FileReader();
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(); }
that.imgUrl=image.src;
that.saveImgUrl="";
that.obj.append('
');
that.initCropper();
that.hideLoader();
if (that.options.onAfterImgUpload) that.options.onAfterImgUpload.call(that);
}
};
reader.readAsDataURL(filePath);
}
} else {
try {
// other modern browsers
formData = new FormData(that.form[0]);
} catch(e) {
// IE10 MUST have all form items appended as individual form key / value pairs
formData = new FormData();
formData.append('img', that.form.find("input[type=file]")[0].files[0]);
}
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,
data: formData,
context: document.body,
cache: false,
contentType: false,
processData: false,
type: 'POST'
}).always(function (data) {
that.afterUpload(data);
});
}
});
},
loadExistingImage: function(){
var that = this;
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(); }
that.imgUrl=that.options.loadPicture ;
var img =$('
');
that.obj.append(img);
img.load(function() {
that.imgInitW = that.imgW = this.width;
that.imgInitH = that.imgH = this.height;
that.initCropper();
that.hideLoader();
if (that.options.onAfterImgUpload) that.options.onAfterImgUpload.call(that);
});
}else{
that.cropControlRemoveCroppedImage.on('click',function(){
var res = confirm('您是要使用当前图片还是重新选择图片?\n\r' +
'[确认]使用当前图片\n\r' +
'[取消]重新选择图片');
var width= that.imgInitW;
var height= that.imgInitH;
that.croppedImg.remove();
$(this).hide();
that.cropSaveControl.hide();
that.cropControlOriginal.hide();
if( !$.isEmptyObject(that.defaultImg)){
that.obj.append(that.defaultImg);
}
if(that.options.outputUrlId !== ''){ $('#'+that.options.outputUrlId).val(''); }
that.croppedImg = '';
that.reset();
if (res) {
that.showLoader();
that.imgUploadControl.hide();
if( !$.isEmptyObject(that.croppedImg)){ that.croppedImg.remove(); }
that.imgInitW = that.imgW = width;
that.imgInitH = that.imgH = height;
that.saveImgUrl="";
that.obj.append('
');
that.initCropper();
that.hideLoader();
}
});
}
},
afterUpload: function(data){
var that = this;
response = typeof data =='object' ? data : jQuery.parseJSON(data);
if (response.status == 'success') {
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(); }
that.imgUrl = response.url;
var img = $('
')
that.obj.append(img);
img.load(function(){
that.initCropper();
that.hideLoader();
if (that.options.onAfterImgUpload) that.options.onAfterImgUpload.call(that);
});
if (that.options.onAfterImgUpload) that.options.onAfterImgUpload.call(that);
}
if (response.status == 'error') {
alert(response.message);
if (that.options.onError) that.options.onError.call(that,response.message);
that.hideLoader();
// setTimeout( function(){ that.reset(); },2000)
}
},
createModal: function(){
var that = this;
var marginTop = that.windowH/2-that.objH/2;
var modalHTML = '';
$('body').append(modalHTML);
that.modal = $('#croppicModal');
that.obj = $('#croppicModalObj');
},
destroyModal: function(){
var that = this;
that.obj = that.outputDiv;
that.modal.remove();
that.modal = {};
},
initCropper: function(){
var that = this;
/*SET UP SOME VARS*/
that.img = that.obj.find('img');
that.img.wrap('');
/*INIT DRAGGING*/
that.createCropControls();
if(that.options.imgEyecandy){ that.createEyecandy(); }
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);
},
destroyEyecandy: function(){
var that = this;
that.imgEyecandy.remove();
},
initialScaleImg:function(){
var that = this;
that.zoom(0);
that.zoom(that.options.initialZoom);
// Adding mousewheel zoom capabilities
if (that.options.enableMousescroll){
that.img.on('mousewheel', function(event) {
event.preventDefault();
if (that.colorAbsorption)
{
return;
}
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'}); }
},
createCropControls: function(){
var that = this;
// CREATE CONTROLS
var cropControlZoomMuchIn = '';
var cropControlZoomIn = '';
var cropControlZoomOut = '';
var cropControlZoomMuchOut = '';
var cropControlRotateLeft = '';
var cropControlRotateRight = '';
var cropControlRotateMuchLeft = '';
var cropControlRotateMuchRight = '';
var cropControlCrop = '';
var cropControlReset = '';
var cropControlOriginal = '';
var cropControlXiColor = '';
var cropControlXiColor2 = '';
var cropControlSetColor = '';
var html;
if(that.options.doubleZoomControls){
cropControlZoomMuchIn = '';
cropControlZoomMuchOut = '';
}
if(that.options.rotateControls){
cropControlRotateLeft = '';
cropControlRotateRight = '';
cropControlRotateMuchLeft = '';
cropControlRotateMuchRight = '';
}
html = ''+ cropControlZoomMuchIn + cropControlZoomIn + cropControlZoomOut + cropControlZoomMuchOut
+ cropControlRotateMuchLeft+ cropControlRotateLeft + cropControlRotateRight + cropControlRotateMuchRight + cropControlCrop + '
';
that.obj.append(html);
html = '' + cropControlXiColor2 + cropControlXiColor+ cropControlSetColor + cropControlOriginal + cropControlReset + '
';
that.obj.append(html);
that.cropControlsCrop = that.obj.find('.cropControlsCrop');
// 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.cropControlZoomMuchOut = that.cropControlsCrop.find('.cropControlZoomMuchOut');
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.cropControlZoomOut = that.cropControlsCrop.find('.cropControlZoomOut');
that.cropControlZoomOut.on('click',function(){ that.zoom(-that.options.zoomFactor); });
that.cropControlRotateLeft = that.cropControlsCrop.find('.cropControlRotateLeft');
that.cropControlRotateLeft.on('click', function() { that.rotate(-1);});
that.cropControlRotateMuchLeft = that.cropControlsCrop.find('.cropControlRotateMuchLeft');
that.cropControlRotateMuchLeft.on('click', function() { that.rotate(-10);});
that.cropControlRotateRight = that.cropControlsCrop.find('.cropControlRotateRight');
that.cropControlRotateRight.on('click', function() {that.rotate(1);});
that.cropControlRotateMuchRight = that.cropControlsCrop.find('.cropControlRotateMuchRight');
that.cropControlRotateMuchRight.on('click', function() {that.rotate(10);});
that.cropControlCrop = that.cropControlsCrop.find('.cropControlCrop');
that.cropControlCrop.on('click',function(){ that.crop(); });
that.cropControlReset = that.cropControlsCrop.find('.cropControlReset');
that.cropControlReset.on('click',function(){
var res = confirm('您是要使用当前图片还是重新选择图片?\n\r' +
'[确认]使用当前图片\n\r' +
'[取消]重新选择图片');
var width= that.imgInitW;
var height= that.imgInitH;
that.reset();
if (res) {
that.showLoader();
that.imgUploadControl.hide();
if( !$.isEmptyObject(that.croppedImg)){ that.croppedImg.remove(); }
that.imgInitW = that.imgW = width;
that.imgInitH = that.imgH = height;
that.saveImgUrl="";
that.obj.append('
');
that.initCropper();
that.hideLoader();
}
});
that.cropControlOriginal = that.cropControlsCrop.find('.cropControlOriginal');
that.cropControlOriginal.on('click',function(){
if (that.imgUrl=='')
{
alert('请选择图片' );
return;
}
var res = confirm('您确定要使用原图吗?\n\r' +
'[确认]使用原图\n\r' +
'[取消]继续编辑');
if (res) {
that.destroy();
window.location.href="https://wwww.croppic.com?"+that.imgUrl;
}
});
that.cropControlXiColor = that.cropControlsCrop.find('.cropControlXiColor');
that.cropControlXiColor.on('click',function(){that.colorOnClick(false);});
that.cropControlXiColor2 = that.cropControlsCrop.find('.cropControlXiColor2');
that.cropControlXiColor2.on('click',function(){that.colorOnClick(false);});
that.cropControlSetColor= that.cropControlsCrop.find('.cropControlSetColor');
that.cropControlSetColor.on('click',function(){that.colorOnClick(true);});
that.colpick=that.cropControlSetColor.colpick({
onSubmit:function(hsb,hex,rgb,el) {
var background="rgb("+rgb.r+","+rgb.g+","+rgb.b+")";
that.obj.find('.cropImgWrapper').css('background',background);
$(el).colpickHide();
that.imgBackground=background;
}
});
},
colorOnClick:function(input)
{
var that = this;
if (that.colorAbsorption||input)
{
that.cropControlsCrop.find('.cropControlXiColor').css("display","block");
that.cropControlsCrop.find('.cropControlXiColor2').css("display","none");
that.colorAbsorption=false;
}else {
that.cropControlsCrop.find('.cropControlXiColor').css("display","none");
that.cropControlsCrop.find('.cropControlXiColor2').css("display","block");
that.colorAbsorption=true;
}
},
initDrag:function(){
var that = this;
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;
if (that.colorAbsorption)
{
var imgWidth = that.img.width();
var imhHeight = that.img.height();
var x = that.imgInitW * parseInt(imgWidth-pos_x-that.actualRotationImgW) / imgWidth;
var y = that.imgInitH * parseInt(imhHeight-pos_y-that.actualRotationImgH) / imhHeight;
if (!(x<0||x>that.imgInitW||y<0||y>that.imgInitH))
{
var canvas = document.createElement("canvas");
if (!canvas.getContext) {
alert("很遗憾,您浏览器版本太老了,无法使用我们的小工具 !");
return;
}
var ctx = canvas.getContext("2d");
var newImg = new Image();
newImg.onload = function(){
canvas.width = newImg.width;
canvas.height = newImg.height;
ctx.drawImage(newImg, 0, 0);
var imgData = ctx.getImageData(x, y, 1, 1);
var rgb = {r:imgData.data[0],g:imgData.data[1],b:imgData.data[2]};
var background="rgb("+rgb.r+","+rgb.g+","+rgb.b+")";
that.obj.find('.cropImgWrapper').css("background",background);
that.imgBackground=background;
that.cropControlSetColor.colpickSetColor(rgb);
}
newImg.src = that.imgUrl;
return;
}
}
that.img.css('z-index', 1000).on("mousemove touchmove", function(e) {
if (that.colorAbsorption)
{
return;
}
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;
}
that.img.offset({
top:imgTop,
left:imgLeft
}).on("mouseup", function() {
$(this).removeClass('draggable').css('z-index', z_idx);
});
if(that.options.imgEyecandy){ that.imgEyecandy.offset({ top:imgTop, left:imgLeft }); }
var top=that.actualRotationImgH;
var left=that.actualRotationImgW;
// var top=0;
// var left=0;
if (that.objH < that.imgH+top*2) {
if (parseInt(that.img.css('top')) > top) { that.img.css('top', top); if (that.options.imgEyecandy) { that.imgEyecandy.css('top', top);}}
var maxTop = -( that.imgH - that.objH+top); 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')) < -top) { that.img.css('top', -top); if (that.options.imgEyecandy) { that.imgEyecandy.css('top', top); }}
var maxTop = that.objH - that.imgH+top; 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+2*left) {
if( parseInt( that.img.css('left')) > left ){ that.img.css('left',left); if(that.options.imgEyecandy){ that.imgEyecandy.css('left', left); }}
var maxLeft = -( that.imgW-that.objW+left); 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')) < -left ){ that.img.css('left',-left); if(that.options.imgEyecandy){ that.imgEyecandy.css('left', 0); }}
var maxLeft = ( that.objW - that.imgW+left); 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);
});
}).on("mouseup", function() {
that.img.off("mousemove");
}).on("mouseout", function() {
that.img.off("mousemove");
});
},
rotate: function(x) {
var that = this;
that.colorOnClick(true);
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)',
});
}
that.actualRotationImgH=0;
that.actualRotationImgW=0;
if (that.actualRotation!=0)
{
var actualRotation=that.actualRotation;
if (actualRotation<0)
{
actualRotation=0-actualRotation;
}
if (actualRotation==90||actualRotation==270)
{
if(that.imgH>that.imgW)
{
that.actualRotationImgW=parseInt((that.imgH-that.imgW)/2);
}else if(that.imgH180)
{
actualRotation=actualRotation-180;
}
if (actualRotation>90)
{
actualRotation=180-actualRotation;
}
var radian = Math.sin(actualRotation * Math.PI / 180);
that.actualRotationImgW=parseInt(radian*(that.imgH)/2);
that.actualRotationImgH=parseInt(radian*(that.imgW)/2);
}
}
if (typeof that.options.onImgRotate == 'function')
that.options.onImgRotate.call(that);
},
zoom :function(x){
var that = this;
that.colorOnClick(true);
var ratio = that.imgW / that.imgH;
var newWidth = that.imgW+x;
var newHeight = newWidth/ratio;
var doPositioning = true;
if (x==0)
{
if( newWidth - that.objW < newHeight - that.objH ){
newWidth = that.objW;
newHeight = newWidth/ratio;
}else{
newHeight = that.objH;
newWidth = ratio * newHeight;
}
}
if( newWidth < that.objW || newHeight < that.objH){
doPositioning = false;
}
if(!that.options.scaleToFill && (newWidth > that.imgInitW || newHeight > that.imgInitH)){
doPositioning = false;
}
that.imgW = newWidth;
that.img.width(newWidth);
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;
that.actualRotationImgH=0;
that.actualRotationImgW=0;
if (that.actualRotation!=0)
{
var actualRotation=that.actualRotation;
if (actualRotation<0)
{
actualRotation=0-actualRotation;
}
if (actualRotation==90||actualRotation==270)
{
if(that.imgH>that.imgW)
{
that.actualRotationImgW=parseInt((that.imgH-that.imgW)/2);
}else if(that.imgH180)
{
actualRotation=actualRotation-180;
}
if (actualRotation>90)
{
actualRotation=180-actualRotation;
}
var radian = Math.sin(actualRotation * Math.PI / 180);
that.actualRotationImgW=parseInt(radian*(that.imgH)/2);
that.actualRotationImgH=parseInt(radian*(that.imgW)/2);
}
}
if( newTop>-that.actualRotationImgH ){ newTop=-that.actualRotationImgH;}
if( newLeft>-that.actualRotationImgW ){ newLeft=-that.actualRotationImgW;}
var maxTop = -( newHeight-that.objH+that.actualRotationImgH); if( newTop < maxTop){ newTop = maxTop; }
var maxLeft = -( newWidth-that.objW+that.actualRotationImgW); if( newLeft < maxLeft){ newLeft = maxLeft; }
if( doPositioning ){
that.img.css({'top':newTop, 'left':newLeft});
}
if(that.options.imgEyecandy){
that.imgEyecandy.width(newWidth);
that.imgEyecandy.height(newHeight);
if( doPositioning ){
that.imgEyecandy.css({'top':newTop, 'left':newLeft});
}
}
if (that.options.onImgZoom) that.options.onImgZoom.call(that);
},
crop:function(){
var that = this;
that.colorOnClick(true);
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:parseInt( that.img.css('top') ),
imgX1: parseInt( that.img.css('left')),
cropH:that.objH,
cropW:that.objW,
rotation:that.actualRotation,
imgBackground:that.imgBackground
};
var formData;
if(typeof FormData == 'undefined'){
var XHR = new XMLHttpRequest();
var urlEncodedData = "";
var urlEncodedDataPairs = [];
for(var key in cropData) {
urlEncodedDataPairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(cropData[key]));
}
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.onreadystatechange=function(){
if (XHR.readyState==4 && XHR.status==200)
{
that.afterCrop(XHR.responseText);
}
}
XHR.open('POST', that.options.cropUrl);
XHR.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
XHR.setRequestHeader('Content-Length', urlEncodedData.length);
XHR.send(urlEncodedData);
}else{
formData = new FormData();
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] );
}
}
$.ajax({
url: that.options.cropUrl,
data: formData,
context: document.body,
cache: false,
contentType: false,
processData: false,
type: 'POST'
}).always(function (data) {
that.afterCrop(data);
});
}
//
},
afterCrop: function (data) {
var that = this;
that.colorOnClick(true);
try {
response = jQuery.parseJSON(data);
}
catch(err) {
response = typeof data =='object' ? data : jQuery.parseJSON(data);
}
if (response.status == 'success') {
if (that.options.imgEyecandy)
that.imgEyecandy.hide();
that.destroy();
that.saveImgUrl='product_image_crop_md5,'+response.md5+','+response.url;
var croppedImg='
';
that.obj.append(croppedImg);
if (that.options.outputUrlId !== '') { $('#' + that.options.outputUrlId).val(response.url); }
that.croppedImg = that.obj.find('.croppedImg');
that.croppedImg .width(that.objW+"px").height(that.objH+"px");
that.init();
that.hideLoader();
that.imgUploadControl.hide();
that.cropSaveControl.show();
}
if (response.status == 'error') {
if (that.options.onError) that.options.onError.call(that,response.message);
that.hideLoader();
that.cropControlsCrop.show();
}
if (that.options.onAfterImgCrop) that.options.onAfterImgCrop.call(that, response);
},
showLoader:function(){
var that = this;
that.obj.append(that.options.loaderHtml);
that.loader = that.obj.find('.loader');
},
hideLoader:function(){
var that = this;
that.loader.remove();
},
reset:function(){
var that = this;
that.destroy();
that.init();
that.imgUploadControl.show();
if( !$.isEmptyObject(that.croppedImg)){
that.obj.append(that.croppedImg);
if(that.options.outputUrlId !== ''){ $('#'+that.options.outputUrlId).val(that.croppedImg.attr('url')); }
}
if (typeof that.options.onReset == 'function')
that.options.onReset.call(that);
},
destroy:function(){
var that = this;
that.colorOnClick(true);
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'
+ ''
+ '';
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();
if(that.options.processInline && !that.options.uploadUrl){
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);
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;
},
hexadecimal:function(num) {
var r = parseInt(num).toString(16);
if (r.length == 1) {
return '0' + r;
}
return r.toUpperCase();
}
};
})(window, document);