bebeboutik/adm/ajaxfilemanager/jscripts/ajaximageeditor.js

874 lines
19 KiB
JavaScript
Raw Normal View History

2016-01-04 12:48:08 +01:00
/*
* author: Logan Cai
* Email: cailongqun [at] yahoo [dot] com [dot] cn
* Website: www.phpletter.com
* Created At: 21/April/2007
*/
/**
* get current selected mode value
*/
function getModeValue()
{
//check if an mode has been selected or selected first one be default
var CheckedElem = null;
for(var i = 0; i < document.formAction.mode.length; i++)
{
if(document.formAction.mode[i].checked || i == 0)
{
CheckedElem = document.formAction.mode[i];
}
}
CheckedElem.checked = true;
return CheckedElem.value;
};
/**
* get fired when mode changed
* fire according function
*/
function changeMode(restore, force)
{
var mode = getModeValue();
var imageMode = $('#image_mode');
if(mode != $(imageMode).val() || (typeof(restore) == "boolean"))
{
/**
* confirm it when there has been some changes before go further
*/
if(isImageHistoryExist() || typeof(force) == 'boolean')
{
if(typeof(restore) == "boolean" || typeof(force) == 'boolean' )
{
if(!restoreToOriginal(restore))
{
return false;
}
clearImageHistory();
}
else if(!window.confirm(warningLostChanges))
{
cancelChangeMode();
return false;
}else
{
restoreToOriginal(false);
clearImageHistory();
}
}else if((typeof(restore) == "boolean" && restore))
{
return false;
}
initPositionHandler();
switch(mode)
{
case "resize":
switch($('#image_mode').val())
{
case "crop":
disableCrop();
break;
case "rotate":
disableRotate();
break;
case "flip":
disableFlip();
break;
default:
disableRotate();
}
enableResize(document.formAction.constraint.checked);
break;
case "crop":
switch($('#image_mode').val())
{
case "resize":
disableResize();
break;
case "rotate":
disableRotate();
break;
case "flip":
disableFlip();
break;
default:
disableRotate();
}
enableCrop();
break;
case "rotate":
switch($('#image_mode').val())
{
case "resize":
disableResize();
break;
case "crop":
disableCrop();
break;
case "flip":
disableFlip();
break;
default:
//do nothing
}
enableRotate();
break;
case "flip":
switch($('#image_mode').val())
{
case "resize":
disableResize();
break;
case "crop":
disableCrop();
break;
case "rotate":
disableRotate();
break;
default:
//do nothing
}
enableFlip();
break;
default:
alert('Unexpected Operation!');
return false;
}
$('#image_mode').val(mode);
}
};
function resetEditor()
{
if(isImageHistoryExist())
{
changeMode(true);
}else
{
alert(warningResetEmpty);
}
return false;
};
/**
* enable to crop function
*/
function enableCrop()
{
var widthField = $('#width');
var heightField = $('#height');
var topField = $('#y');
var leftField = $('#x');
var imageToResize = getImageElement();
var imageWidth = $(imageToResize).attr('width');
var imageHeight = $(imageToResize).attr('height');
var overlay = $('#resizeMe');
var imageContainer = $('#imageContainer');
var imageContainerTop = parseInt($(imageContainer).css('top').replace('px', ''));
var imageContainerLeft = parseInt($(imageContainer).css('left').replace('px', ''));
//Init Container
$(imageContainer).css('width', imageWidth + 'px');
$(imageContainer).css('height', imageHeight + 'px');
$(imageToResize).css('opacity', '.5');
//Init Overlay
overlay.css('background-image', 'url('+ $(imageToResize).attr('src')+')');
overlay.css('width', imageWidth + 'px');
overlay.css('height', imageHeight + 'px');
//Init Form
widthField.val(imageWidth);
heightField.val(imageHeight);
topField.val(0);
leftField.val(0);
$(overlay).Resizable(
{
minWidth: 10,
minHeight: 10,
maxWidth: imageWidth,
maxHeight: imageHeight,
minTop: imageContainerTop,
minLeft: imageContainerLeft,
maxRight: (parseInt(imageWidth) + imageContainerLeft),
maxBottom: (parseInt(imageHeight) + imageContainerTop),
dragHandle: true,
onDrag: function(x, y)
{
this.style.backgroundPosition = '-' + (x - imageContainerLeft) + 'px -' + (y - imageContainerTop) + 'px';
$(topField).val(Math.round(y - imageContainerTop));
$(leftField).val(Math.round(x - imageContainerLeft));
addImageHistory();
},
handlers: {
se: '#resizeSE',
e: '#resizeE',
ne: '#resizeNE',
n: '#resizeN',
nw: '#resizeNW',
w: '#resizeW',
sw: '#resizeSW',
s: '#resizeS'
},
onResize : function(size, position) {
this.style.backgroundPosition = '-' + (position.left - imageContainerLeft) + 'px -' + (position.top - imageContainerTop) + 'px';
$(widthField).val(Math.round(size.width));
$(heightField).val(Math.round(size.height));
$(topField).val(Math.round(position.top - imageContainerTop));
$(leftField).val(Math.round(position.left - imageContainerLeft));
addImageHistory();
$('#ratio').val($(overlay).ResizableRatio() );
}
}
);
enableConstraint();
toggleConstraint();
disableRotate();
};
/*
* disable crop function
*/
function disableCrop()
{
$('#resizeMe').ResizableDestroy();
hideHandlers();
};
/**
* disable resize function
*/
function disableResize()
{
$('#resizeMe').ResizableDestroy();
hideHandlers();
};
/**
* hide all handlers
*/
function hideHandlers()
{
$('#resizeSE').hide();
$('#resizeE').hide();
$('#resizeNE').hide();
$('#resizeN').hide();
$('#resizeNW').hide();
$('#resizeW').hide();
$('#resizeSW').hide();
$('#resizeS').hide();
};
/**
*
* enable to resize the image
*/
function enableResize(constraint)
{
hideHandlers();
var imageToResize = getImageElement();
var imageContainer = $('#imageContainer');
var imageContainerTop = parseInt($(imageContainer).css('top').replace('px', ''));
var imageContainerLeft = parseInt($(imageContainer).css('left').replace('px', ''));
var resizeMe = $('#resizeMe');
var width = $('#width');
var height = $('#height');
//ensure the container has same size with the image
$(imageContainer).css('width', $(imageToResize).attr('width') + 'px');
$(imageContainer).css('height', $(imageToResize).attr('height') + 'px');
$(resizeMe).css('width', $(imageToResize).attr('width') + 'px');
$(resizeMe).css('height', $(imageToResize).attr('height') + 'px');
$('#width').val($(imageToResize).attr('width'));
$('#height').val($(imageToResize).attr('height'));
$('#x').val(0);
$('#y').val(0);
$(resizeMe).Resizable(
{
minWidth: 10,
minHeight: 10,
maxWidth: 2000,
maxHeight: 2000,
minTop: imageContainerTop,
minLeft: imageContainerLeft,
maxRight: 2000,
maxBottom: 2000,
handlers: {
s: '#resizeS',
se: '#resizeSE',
e: '#resizeE'
},
onResize: function(size)
{
$(imageToResize).attr('height', Math.round(size.height).toString());
$(imageToResize).attr('width', Math.round(size.width).toString());
$(width).val(Math.round(size.width));
$(height).val(Math.round(size.height));
$(imageContainer).css('width', $(imageToResize).attr('width') + 'px');
$(imageContainer).css('height', $(imageToResize).attr('height') + 'px');
$('#ratio').val($(resizeMe).ResizableRatio() );
addImageHistory();
}
}
);
$(resizeMe).ResizeConstraint(constraint);
if(typeof(constraint) == 'boolean' && constraint)
{
$('#resizeS').hide();
$('#resizeE').hide();
}else
{
$('#resizeS').show();
$('#resizeE').show();
}
$('#resizeSE').show();
$('#ratio').val($(resizeMe).ResizableRatio() );
};
/**
* initiate the position of handler
*/
function initPositionHandler()
{
var widthField = $('#width');
var heightField = $('#height');
var topField = $('#x');
var leftField = $('#y');
var imageToResize = getImageElement();
var imageWidth = $(imageToResize).attr('width');
var imageHeight = $(imageToResize).attr('height');
var overlay = $('#resizeMe');
var imageContainer = $('#imageContainer');
var imageContainerTop = parseInt($(imageContainer).css('top').replace('px', ''));
var imageContainerLeft = parseInt($(imageContainer).css('left').replace('px', ''));
//Init Container
$(imageContainer).css('width', imageWidth + 'px');
$(imageContainer).css('height', imageHeight + 'px');
//Init Overlay
$(imageToResize).css('opacity', '100');
$(overlay).css('width', imageWidth + 'px');
$(overlay).css('height', imageHeight + 'px');
$(overlay).css('background-image', '');
$(overlay).css('backgroundPosition', '0 0');
$(overlay).css('left', imageContainerLeft);
$(overlay).css('top', imageContainerTop);
//Init Form
$(widthField).val(imageWidth);
$(heightField).val(imageHeight);
$(topField).val(0);
$(leftField).val(0);
$('#angle').val(0);
$('#flip_angle').val('');
};
/**
* enable rotate function
*/
function enableRotate()
{
hideHandlers();
toggleDisabledButton('actionRotateLeft', false);
toggleDisabledButton('actionRotateRight', false);
};
/**
* disable rotation function
*/
function disableRotate()
{
toggleDisabledButton('actionRotateLeft', true);
toggleDisabledButton('actionRotateRight', true);
};
function enableConstraint()
{
$('#constraint').removeAttr('disabled');
};
function disableConstraint()
{
$('#constraint').attr('disabled', 'disabled');
};
function ShowHandlers()
{
$('#resizeSE').show();
$('#resizeE').show();
$('#resizeNE').show();
$('#resizeN').show();
$('#resizeNW').show();
$('#resizeW').show();
$('#resizeSW').show();
$('#resizeS').show();
} ;
/**
* turn constraint on or off
*/
function toggleConstraint()
{
hideHandlers();
if(document.formAction.constraint.checked)
{
$('#resizeMe').ResizeConstraint(true);
switch(getModeValue())
{
case "resize":
$('#resizeSE').show();
break;
case "crop":
$('#resizeSE').show();
$('#resizeNE').show();
$('#resizeNW').show();
$('#resizeSW').show();
break;
case "rotate":
break;
}
}else
{
$('#resizeMe').ResizeConstraint(false);
switch(getModeValue())
{
case "resize":
$('#resizeSE').show();
$('#resizeE').show();
$('#resizeS').show();
break;
case "crop":
ShowHandlers();
break;
case "rotate":
break;
}
}
};
/**
* restore to the state the image was
*/
function restoreToOriginal(warning)
{
if(typeof(warning) == "boolean" && warning)
{
if(!window.confirm(warningReset))
{
return false;
}
}
$("#imageContainer").empty();
$("#hiddenImage img").clone().appendTo("#imageContainer");
return true;
};
/*
* left rotate
*/
function leftRotate()
{
var imageToResize = getImageElement();
$(imageToResize).rotate(-90);
swapWidthWithHeight();
addImageHistory();
var angle = $('#angle');
var angleDegree = (parseInt($(angle).val()) + 90);
angleDegree = ((angleDegree == 360)?angleDegree:angleDegree%360);
$(angle).val((angleDegree ));
return false;
};
/**
* cancel mode change
*/
function cancelChangeMode()
{
$('#formAction input[@value=' + $('#image_mode').val() + ']').attr('checked', 'checked');
};
/**
* get the image element which is going to be modified
*/
function getImageElement()
{
var imageElement = null;
var imageContainer = document.getElementById('imageContainer');
for(var i = 0; i < imageContainer.childNodes.length; i++)
{
if((typeof(imageContainer.childNodes[i].name) != "undefined" && imageContainer.childNodes[i].name.toLowerCase() == 'image') || (typeof(imageContainer.childNodes[i].tagName) != "undefined" && (imageContainer.childNodes[i].tagName.toLowerCase() == 'canvas' || imageContainer.childNodes[i].tagName.toLowerCase() == 'img')) )
{
imageElement = imageContainer.childNodes[i];
}
}
return imageElement;
};
/*
right rotate
*/
function rightRotate()
{
var imageToResize = getImageElement();
$(imageToResize).rotate(90);
swapWidthWithHeight();
addImageHistory();
var angle = $('#angle');
var angleDegree = (parseInt($(angle).val()) - 90 );
if(angleDegree < 0)
{
angleDegree += 360;
}
angleDegree = ((angleDegree == 360)?angleDegree:angleDegree%360);
$(angle).val((angleDegree ));
return false;
} ;
/**
* swap image width with height when rotation fired
*/
function swapWidthWithHeight()
{
var imageContainer = $('#imageContainer');
var resizeMe = $('#resizeMe');
var width = $('#width');
var height = $('#height');
var imageToResize = getImageElement();
var newWidth = 0;
var newHeight = 0;
newWidth = $(imageToResize).attr('width');
newHeight = $(imageToResize).attr('height');
$(imageContainer).css('width', newWidth + 'px');
$(imageContainer).css('height', newHeight + 'px');
$(width).val(newWidth);
$(height).val(newHeight);
$(resizeMe).css('width', newWidth + 'px');
$(resizeMe).css('height', newHeight + 'px');
};
/**
* records all change mede to the image
* this features will be implemented next release
*/
function addImageHistory()
{
imageHistory = true;
initDisabledButtons(false);
};
/**
* cleare all records
* this features will be implemented next release
*/
function clearImageHistory()
{
imageHistory = false;
initDisabledButtons(true);
};
function initDisabledButtons(forceDisable)
{
if(numSessionHistory)
{
toggleDisabledButton('actionUndo', false);
}else
{
toggleDisabledButton('actionUndo', true);
}
if(imageHistory)
{
toggleDisabledButton('actionSave', false);
toggleDisabledButton('actionReset', false);
}else
{
toggleDisabledButton('actionSave', true);
toggleDisabledButton('actionReset', true);
}
};
/**
* return record
* this features will be implemented next release
*/
function getImageHistory()
{
return imageHistory;
};
/**
* check if there exists any changes
* this features will be implemented next release
*/
function isImageHistoryExist()
{
return imageHistory;
};
function flipHorizontal()
{
if(window.confirm(warningFlipHorizotal))
{
addImageHistory();
$('#flip_angle').val('horizontal');
$('#mode').val('flip');
saveImage();
}
return false;
};
function flipVertical()
{
if(window.confirm(warningFlipVertical))
{
addImageHistory();
$('#flip_angle').val('vertical');
$('#mode').val('flip');
saveImage();
}
return false;
};
function enableFlip()
{
toggleDisabledButton('actionFlipH', false);
toggleDisabledButton('actionFlipV', false);
};
function toggleDisabledButton(buttonId, forceDisable)
{
var disabledButton = $('#' + buttonId);
var newClass = '';
var changeRequired = true;
var toBeDisabled = false;
var currentClass = $(disabledButton).attr('class') ;
if(typeof(forceDisable) == 'boolean')
{
if(forceDisable && currentClass == 'button')
{
newClass = 'disabledButton';
$(disabledButton).attr('disabled', 'disabled');
}else if(!forceDisable && currentClass == 'disabledButton')
{
newClass = 'button';
$(disabledButton).removeAttr('disabled');
}else
{
changeRequired = false;
}
}
else if(currentClass == 'button')
{
newClass = 'disabledButton';
$(disabledButton).attr('disabled', 'disabled');
}else
{
newClass = 'button';
$(disabledButton).removeAttr('disabled');
}
if(changeRequired)
{
$(disabledButton).removeClass('button disabledButton');
$(disabledButton).addClass(newClass);
}
};
function disableFlip()
{
toggleDisabledButton('actionFlipH', true);
toggleDisabledButton('actionFlipV', true);
};
function undoImage()
{
if(numSessionHistory < 1)
{
alert(warningResetEmpty);
}else
{
if(window.confirm(warningUndoImage))
{
processImage('formAction');
}
}
return false;
};
function processImage(formId)
{
$("#loading")
.ajaxStart(function(){
$(this).show();
})
.ajaxComplete(function(){
$(this).hide();
});
var options =
{
dataType: 'json',
error: function (data, status, e)
{
alert(e);
},
success: function(data)
{
if(typeof(data.error) == 'undefined')
{
alert('Unexpected information ');
}
else if(data.error != '')
{
alert(data.error);
}else
{
$("#loading").show();
currentFolder = data.folder_path;
if(data.save_as == '1')
{
numSessionHistory = 0;
}else
{
numSessionHistory = parseInt(data.history);
}
$('#file_path').val(data.path);
$('#path').val(data.path);
var preImage = new Image();
preImage.width = data.width;
preImage.height = data.height;
preImage.onload = function()
{
$('#hiddenImage').empty();
$(preImage).appendTo('#hiddenImage');
changeMode(false, true);
$('#loading').hide();
$('#windowSaveAs').jqm({modal: true}).jqmHide();
};
var now = new Date();
preImage.src = data.path + "?" + now.getTime();
}
}
};
$('#' + formId).ajaxSubmit(options);
return false;
};
function saveAsImagePre()
{
$('#windowSaveAs').jqm({modal: true}).jqmShow();
var saveTo = $('#save_to');
$(saveTo).removeOption(/./);
$(saveTo).ajaxAddOption(urlGetFolderList, {}, false,
function()
{
$(saveTo).selectOptions(currentFolder);
});
return false;
};
function saveAsImage()
{
var pattern=/^[A-Za-z0-9_ \-]+$/i;
var newName = $('#new_name');
var saveAs = $('#save_to').get(0);
//alert($(saveAs).val());
if(!pattern.test($(newName).val()))
{
alert(warningInvalidNewName);
}else if(saveAs.selectedIndex < 0)
{
alert(warningNoFolderSelected);
}else
{
$('#hidden_new_name').val($(newName).val());
$('#hidden_save_to').val(saveAs.options[saveAs.selectedIndex].value);
if(saveImage(true))
{
}
}
return false;
};
function saveImage(saveAs)
{
if(typeof(saveAs) == 'boolean' && saveAs)
{
}else
{//remove new name if just normal save
$('#hidden_new_name').val('');
$('#hidden_save_to').val('');
}
if (!isImageHistoryExist() && (typeof(saveAs) == 'undefined' || !saveAs))
{
alert(noChangeMadeBeforeSave);
}else
{
if(processImage('formImageInfo'))
{
return true;
}
}
return false;
};
function editorClose()
{
if(window.confirm(warningEditorClose))
{
window.close();
}
return false;
};