wp_blog/wp-content/plugins/revslider/js/edit_layers.js
2020-01-02 23:15:16 +07:00

2363 lines
55 KiB
JavaScript

//ver 3.1
var UniteLayersRev = new function(){
var initTop = 100;
var initLeft = 100;
var initSpeed = 300;
var initTopVideo = 20;
var initLeftVideo = 20;
var g_startTime = 500;
var g_stepTime = 300;
var g_slideTime;
var initText = "Caption Text";
//init system vars
var t = this;
var containerID = "#divLayers";
var container;
var arrLayers = {};
var id_counter = 0;
var initLayers = null;
var selectedLayerSerial = -1;
var urlCssCaptions = null;
var initArrCaptionClasses = [];
var sortMode = "time"; //can be "depth" or "time"
var g_codemirrorCss = null;
/**
* set init layers object (from db)
*/
t.setInitLayersJson = function(jsonLayers){
initLayers = jQuery.parseJSON(jsonLayers);
}
/**
* set init captions classes array (from the captions.css)
*/
t.setInitCaptionClasses = function(jsonClasses){
initArrCaptionClasses = jQuery.parseJSON(jsonClasses);
}
/**
* set captions url for refreshing when needed
*/
t.setCssCaptionsUrl = function(url){
urlCssCaptions = url;
}
/**
* close css dialog
*/
t.closeCssDialog = function(){
jQuery("#dialog_edit_css").dialog("close");
}
/**
* insert button by class and text
*/
t.insertButton = function(buttonClass,buttonText){
if(selectedLayerSerial == -1)
return(false);
var html = "<a href='javascript:alert(\"click\");' class='tp-button "+buttonClass+" small'>"+buttonText+"</a>";
jQuery("#layer_caption").val("");
jQuery("#layer_text").val(html);
updateLayerFromFields();
jQuery("#dialog_insert_button").dialog("close");
}
//======================================================
// Init Functions
//======================================================
/**
* init the layout
*/
t.init = function(slideTime){
if(jQuery().draggable == undefined || jQuery().autocomplete == undefined){
jQuery("#jqueryui_error_message").show();
}
g_slideTime = Number(slideTime);
container = jQuery(containerID);
//add all layers from init
if(initLayers){
var len = initLayers.length;
if(len){
for(var i=0;i<len;i++)
addLayer(initLayers[i],true);
}else{
for(key in initLayers)
addLayer(initLayers[key],true);
}
}
//disable the properties box
disableFormFields();
//init elements
initMainEvents();
initSortbox();
initButtons();
initEditCSSDialog();
initHtmlFields();
initAlignTable();
}
/**
* init the align table
*/
var initAlignTable = function(){
jQuery("#align_table a").click(function(){
var obj = jQuery(this);
if(jQuery("#align_table").hasClass("table_disabled"))
return(false);
if(obj.hasClass("selected"))
return(false);
var alignHor = obj.data("hor");
var alignVert = obj.data("vert");
jQuery("#align_table a").removeClass("selected");
obj.addClass("selected");
jQuery("#layer_align_hor").val(alignHor);
jQuery("#layer_align_vert").val(alignVert);
var objLayerXText = jQuery("#layer_left_text");
var objLayerYText = jQuery("#layer_top_text");
switch(alignHor){
case "left":
objLayerXText.html(objLayerXText.data("textnormal")).css("width","auto");
jQuery("#layer_left").val("10");
break;
case "right":
objLayerXText.html(objLayerXText.data("textoffset")).css("width","42px");
jQuery("#layer_left").val("10");
break;
case "center":
objLayerXText.html(objLayerXText.data("textoffset")).css("width","42px");
jQuery("#layer_left").val("0");
break;
}
switch(alignVert){
case "top":
objLayerYText.html(objLayerYText.data("textnormal")).css("width","auto");
jQuery("#layer_top").val("10");
break;
case "bottom":
objLayerYText.html(objLayerYText.data("textoffset")).css("width","42px");
jQuery("#layer_top").val("10");
break;
case "middle":
objLayerYText.html(objLayerYText.data("textoffset")).css("width","42px");
jQuery("#layer_top").val("0");
break;
}
updateLayerFromFields();
});
}
/**
* init general events
*/
var initMainEvents = function(){
//unselect layers on container click
container.click(unselectLayers);
}
/**
* init events (update) for html properties change.
*/
var initHtmlFields = function(){
//show / hide slide link offset
jQuery("#layer_slide_link").change(function(){
showHideOffsetRow();
});
//set layers autocompolete
jQuery( "#layer_caption" ).autocomplete({
source: initArrCaptionClasses,
minLength:0,
close:updateLayerFromFields
});
//open the list on right button
jQuery( "#layer_captions_down" ).click(function(event){
event.stopPropagation();
//if opened - close autocomplete
if(jQuery('#layer_caption').data("is_open") == true)
jQuery( "#layer_caption" ).autocomplete("close");
else //else open autocomplete
if(jQuery(this).hasClass("ui-state-active"))
jQuery( "#layer_caption" ).autocomplete( "search", "" );
});
//handle autocomplete close
jQuery('#layer_caption').bind('autocompleteopen', function() {
jQuery(this).data('is_open',true);
});
jQuery('#layer_caption').bind('autocompleteclose', function() {
jQuery(this).data('is_open',false);
});
jQuery("body").click(function(){
jQuery( "#layer_caption" ).autocomplete("close");
});
//set events:
jQuery("#form_layers select").change(updateLayerFromFields);
jQuery("#layer_text").keyup(updateLayerFromFields);
var pressEnterFields = "#form_layers input, #form_layers textarea";
jQuery(pressEnterFields).blur(updateLayerFromFields);
jQuery(pressEnterFields).keypress(function(event){
if(event.keyCode == 13)
updateLayerFromFields();
});
//end time validation
jQuery("#layer_endtime").blur(validateCurrentLayerTimes).keypress(function(event){
if(event.keyCode == 13)
validateCurrentLayerTimes();
});
}
/**
* init buttons actions
*/
var initButtons = function(){
//set event buttons actions:
jQuery("#button_add_layer").click(function(){
addLayerText();
});
jQuery("#button_add_layer_image").click(function(){
UniteAdminRev.openAddImageDialog("Select Layer Image",function(urlImage){
addLayerImage(urlImage);
});
});
//add youtube actions:
jQuery("#button_add_layer_video").click(function(){
UniteAdminRev.openVideoDialog(function(videoData){
addLayerVideo(videoData);
});
});
//edit video actions
jQuery("#button_edit_video").click(function(){
var objCurrentLayer = getCurrentLayer();
var objVideoData = objCurrentLayer.video_data;
//open video dialog
UniteAdminRev.openVideoDialog(function(videoData){
//update video layer
var objLayer = getVideoObjLayer(videoData);
updateCurrentLayer(objLayer);
updateHtmlLayersFromObject(selectedLayerSerial);
updateLayerFormFields(selectedLayerSerial);
redrawLayerHtml(selectedLayerSerial);
},
objVideoData);
});
//change image source actions
jQuery("#button_change_image_source").click(function(){
UniteAdminRev.openAddImageDialog("Select Layer Image",function(urlImage){
var objData = {};
objData.image_url = urlImage;
updateCurrentLayer(objData);
redrawLayerHtml(selectedLayerSerial);
});
});
//delete layer actions:
jQuery("#button_delete_layer").click(function(){
if(jQuery(this).hasClass("button-disabled"))
return(false);
//delete selected layer
deleteCurrentLayer();
});
//delete layer actions:
jQuery("#button_duplicate_layer").click(function(){
if(jQuery(this).hasClass("button-disabled"))
return(false);
//delete selected layer
duplicateCurrentLayer();
});
//delete all layers actions:
jQuery("#button_delete_all").click(function(){
if(confirm("Do you really want to delete all the layers?") == false)
return(true);
if(jQuery(this).hasClass("button-disabled"))
return(false);
deleteAllLayers();
});
//insert button link - open the dialog
jQuery("#linkInsertButton").click(function(){
if(jQuery(this).hasClass("disabled"))
return(false);
var buttons = {"Cancel":function(){jQuery("#dialog_insert_button").dialog("close")}}
jQuery("#dialog_insert_button").dialog({buttons:buttons,minWidth:500,modal:true});
});
}
//======================================================
// Init Function End
//======================================================
/**
* show / hide offset row accorging the slide link value
*/
var showHideOffsetRow = function(){
var value = jQuery("#layer_slide_link").val();
var offsetRow = jQuery("#layer_scrolloffset_row");
if(value == "scroll_under")
offsetRow.show();
else
offsetRow.hide();
}
/**
* do various form validations
*/
var doCurrentLayerValidations = function(){
if(selectedLayerSerial == -1)
return(false);
validateCurrentLayerTimes();
}
/**
* validate times (start and end times) of the current layer
*/
var validateCurrentLayerTimes = function(){
var currentLayer = getCurrentLayer();
if(!currentLayer)
return(false);
var startTime = currentLayer.time;
var endTime = jQuery("#layer_endtime").val();
endTime = jQuery.trim(endTime);
if(!endTime || endTime == ""){
unmarkFieldError("#layer_endtime");
return(false);
}
startTime = Number(startTime);
endTime = Number(endTime);
if(startTime >= endTime)
markFieldError("#layer_endtime","Must be greater then start time ("+startTime+")");
else
unmarkFieldError("#layer_endtime");
}
/**
* mark some field as error field and give it a error title
*/
var markFieldError = function(field_selector,errorTitle){
jQuery(field_selector).addClass("field_error");
if(errorTitle)
jQuery(field_selector).prop("title",errorTitle);
}
/**
* unmark field error class and title
*/
var unmarkFieldError = function(field_selector){
jQuery(field_selector).removeClass("field_error");
jQuery(field_selector).prop("title","");
}
/**
* get the first style from the styles list (from autocomplete)
*/
var getFirstStyle = function(){
var arrClasses = jQuery( "#layer_caption" ).autocomplete("option","source");
var firstStyle = "";
if(arrClasses.length == 0)
return("");
var firstStyle = arrClasses[0];
return(firstStyle);
}
/**
* clear layer html fields, and disable buttons
*/
var disableFormFields = function(){
//clear html form
jQuery("#form_layers")[0].reset();
jQuery("#form_layers input, #form_layers select, #form_layers textarea").attr("disabled", "disabled").addClass("setting-disabled");
jQuery("#button_delete_layer").addClass("button-disabled");
jQuery("#button_duplicate_layer").addClass("button-disabled");
jQuery("#form_layers label, #form_layers .setting_text, #form_layers .setting_unit").addClass("text-disabled");
jQuery("#layer_captions_down").removeClass("ui-state-active").addClass("ui-state-default");
jQuery("#linkInsertButton").addClass("disabled");
jQuery("#align_table").addClass("table_disabled");
}
/**
* enable buttons and form fields.
*/
var enableFormFields = function(){
jQuery("#form_layers input, #form_layers select, #form_layers textarea").removeAttr("disabled").removeClass("setting-disabled");
jQuery("#button_delete_layer").removeClass("button-disabled");
jQuery("#button_duplicate_layer").removeClass("button-disabled");
jQuery("#form_layers label, #form_layers .setting_text, #form_layers .setting_unit").removeClass("text-disabled");
jQuery("#layer_captions_down").removeClass("ui-state-default").addClass("ui-state-active");
jQuery("#linkInsertButton").removeClass("disabled");
jQuery("#align_table").removeClass("table_disabled");
}
/**
* set code mirror editor
*/
t.setCodeMirrorEditor = function(){
g_codemirrorCss = CodeMirror.fromTextArea(document.getElementById("textarea_edit"), {});
}
/**
* init dialog actions
*/
var initEditCSSDialog = function(){
jQuery("#button_edit_css").click(function(){
UniteAdminRev.ajaxRequest("get_captions_css","",function(response){
//update textarea with css:
var cssData = response.data;
if(g_codemirrorCss != null)
g_codemirrorCss.setValue(cssData);
else{
jQuery("#textarea_edit").val(cssData);
setTimeout('UniteLayersRev.setCodeMirrorEditor()',500);
}
//open captions edit dialog
var buttons = {
//---- update button action:
"Update":function(){
UniteAdminRev.setErrorMessageID("dialog_error_message");
var data;
if(g_codemirrorCss != null)
data = g_codemirrorCss.getValue();
else
data = jQuery("#textarea_edit").val();
UniteAdminRev.ajaxRequest("update_captions_css",data,function(response){
jQuery("#dialog_success_message").show().html(response.message);
setTimeout("UniteLayersRev.closeCssDialog()",500);
if(urlCssCaptions)
UniteAdminRev.loadCssFile(urlCssCaptions,"rs-plugin-captions-css");
//update html select (got as "data" from response)
updateCaptionsInput(response.arrCaptions);
});
},
//---- restore original button action:
"Restore Original":function(){
UniteAdminRev.setErrorMessageID("dialog_error_message");
UniteAdminRev.ajaxRequest("restore_captions_css","",function(response){
jQuery("#dialog_success_message").show().html("css content restored, please press update");
if(g_codemirrorCss != null)
g_codemirrorCss.setValue(response.data);
else
jQuery("#textarea_edit").val(response.data);
setTimeout("jQuery('#dialog_success_message').hide()",1000);
});
},
//----- cancel button action:
"Cancel":function(){t.closeCssDialog()}
};
//lock scrollbars
jQuery('body').css({'overflow':'hidden'});
//hide dialog error message
jQuery("#dialog_error_message").hide();
jQuery("#dialog_success_message").hide();
//open the dialog
jQuery("#dialog_edit_css").dialog({
buttons:buttons,
minWidth:800,
modal:true,
close: function(event, ui){
//return scrollbars
jQuery('body').css({'overflow':'auto'});
}
});
}); //main ajax request
}); //edit css button click
}
/**
* update z-index of the layers by order value
*/
var updateZIndexByOrder = function(){
for(var key in arrLayers){
var layer = arrLayers[key];
if(layer.order !== undefined){
var zindex = layer.order+1;
jQuery("#slide_layer_"+key).css("z-index",zindex);
}
};
}
/**
* update the select html, set selected option, and update events.
*/
var updateCaptionsInput = function(arrCaptions){
jQuery("#layer_caption").autocomplete("option","source",arrCaptions);
}
/**
* get layers array
*/
t.getLayers = function(){
if(selectedLayerSerial != -1)
updateLayerFromFields();
return(arrLayers);
}
/**
* refresh layer events
*/
var refreshEvents = function(serial){
//update layer events.
var layer = getHtmlLayerFromSerial(serial);
layer.draggable({
drag: onLayerDrag, //set ondrag event
grid: [1,1] //set the grid to 1 pixel
});
layer.click(function(event){
setLayerSelected(serial);
event.stopPropagation();
});
}
/**
* get layer serial from id
*/
var getSerialFromID = function(layerID){
var layerSerial = layerID.replace("slide_layer_","");
return(layerSerial);
}
/**
* get serial from sortID
*/
var getSerialFromSortID = function(sortID){
var layerSerial = sortID.replace("layer_sort_","");
return(layerSerial);
}
/**
* get html layer from serial
*/
var getHtmlLayerFromSerial = function(serial){
var htmlLayer = jQuery("#slide_layer_"+serial);
if(htmlLayer.length == 0)
UniteAdminRev.showErrorMessage("Html Layer with serial: "+serial+" not found!");
return(htmlLayer);
}
/**
* get sort field element from serial
*/
var getHtmlSortItemFromSerial = function(serial){
var htmlSortItem = jQuery("#layer_sort_"+serial);
if(htmlSortItem.length == 0){
UniteAdminRev.showErrorMessage("Html sort field with serial: "+serial+" not found!");
return(false);
}
return(htmlSortItem);
}
/**
* get layer object by id
*/
var getLayer = function(serial){
var layer = arrLayers[serial];
if(!layer)
UniteAdminRev.showErrorMessage("getLayer error, Layer with serial:"+serial+"not found");
//modify some data
layer.speed = Number(layer.speed);
layer.endspeed = Number(layer.endspeed);
return layer;
}
/**
* get current layer object
*/
var getCurrentLayer = function(){
if(selectedLayerSerial == -1){
UniteAdminRev.showErrorMessage("Selected layer not set");
return(null);
}
return getLayer(selectedLayerSerial);
}
/**
* set layer object to array
*/
var setLayer = function(layerID,layer){
if(!arrLayers[layerID]){
UniteAdminRev.showErrorMessage("setLayer error, Layer with ID:"+layerID+"not found");
return(false);
}
arrLayers[layerID] = layer;
}
/**
* make layer html, with params from the object
*/
var makeLayerHtml = function(serial,objLayer){
var type = "text";
if(objLayer.type)
type = objLayer.type;
var zIndex = Number(objLayer.order)+1;
var style = "z-index:"+zIndex+";position:absolute;";
var html = '<div id="slide_layer_' + serial + '" style="' + style + '" class="slide_layer tp-caption '+objLayer.style+'" >';
//add layer specific html
switch(type){
case "image":
html += '<img src="'+objLayer.image_url+'" alt="'+objLayer.text+'"></img>';
break;
default:
case "text":
html += objLayer.text;
break;
case "video":
var styleVideo = "width:"+objLayer.video_width+"px;height:"+objLayer.video_height+"px;";
switch(objLayer.video_type){
case "youtube":
case "vimeo":
styleVideo += ";background-image:url("+objLayer.video_image_url+");";
break;
case "html5":
if(objLayer.video_image_url !== undefined && objLayer.video_image_url != "")
styleVideo += ";background-image:url("+objLayer.video_image_url+");";
break;
}
html += "<div class='slide_layer_video' style='"+styleVideo+"'><div class='video-layer-inner video-icon-"+objLayer.video_type+"'>"
html += "<div class='layer-video-title'>" + objLayer.video_title + "</div>";
html += "</div></div>";
break;
}
//add cross icon:
html += "<div class='icon_cross'></div>";
html += '</div>';
return(html);
}
/**
* update layer by data object
*/
var updateLayer = function(serial,objData){
var layer = getLayer(serial);
if(!layer)
return(false);
for(key in objData){
layer[key] = objData[key];
}
setLayer(serial,layer);
}
/**
* update current layer
*/
var updateCurrentLayer = function(objData){
if(!arrLayers[selectedLayerSerial]){
UniteAdminRev.showErrorMessage("error! the layer with serial: "+selectedLayerSerial+" don't exists");
return(false);
}
updateLayer(selectedLayerSerial,objData);
}
/**
* add image layer
*/
var addLayerImage = function(urlImage){
objLayer = {
style : "",
text : "Image " + (id_counter+1),
type : "image",
image_url : urlImage
};
addLayer(objLayer);
}
/**
* get video layer object from video data
*/
var getVideoObjLayer = function(videoData){
var objLayer = {
type:"video",
style : "",
video_type: videoData.video_type,
video_width:videoData.width,
video_height:videoData.height,
video_data:videoData
};
if(objLayer.video_type == "youtube" || objLayer.videoType == "vimeo"){
objLayer.video_id = videoData.id;
objLayer.video_title = videoData.title;
objLayer.video_image_url = videoData.thumb_medium.url;
objLayer.video_args = videoData.args;
}
//set sortbox text
switch(objLayer.video_type){
case "youtube":
objLayer.text = "Youtube: " + videoData.title;
break;
case "vimeo":
objLayer.text = "Vimeo: " + videoData.title;
break;
case "html5":
objLayer.text = "Html5 Video";
objLayer.video_title = objLayer.text;
objLayer.video_image_url = "";
if(videoData.urlPoster != "")
objLayer.video_image_url = videoData.urlPoster;
break;
}
return(objLayer);
}
/**
* add video layer
*/
var addLayerVideo = function(videoData){
var objLayer = getVideoObjLayer(videoData);
addLayer(objLayer);
}
/**
* add text layer
*/
var addLayerText = function(){
var objLayer = {
text:initText + (id_counter+1),
type:"text"
};
addLayer(objLayer);
}
/**
* add layer
*/
var addLayer = function(objLayer,isInit){
if(!isInit)
var isInit = false;
//set init fields (if not set):
if(objLayer.order == undefined)
objLayer.order = (id_counter);
objLayer.order = Number(objLayer.order);
//set init position
if(objLayer.type == "video"){
if(objLayer.left == undefined)
objLayer.left = initLeftVideo;
if(objLayer.top == undefined)
objLayer.top = initTopVideo;
objLayer = checkUpdateFullwidthVideo(objLayer);
}else{
if(objLayer.left == undefined)
objLayer.left = initLeft;
if(objLayer.top == undefined)
objLayer.top = initTop;
}
//set animation:
if(objLayer.animation == undefined)
objLayer.animation = jQuery("#layer_animation").val();
//set easing:
if(objLayer.easing == undefined)
objLayer.easing = jQuery("#layer_easing").val();
//set speed:
if(objLayer.speed == undefined)
objLayer.speed = initSpeed;
if(objLayer.align_hor == undefined)
objLayer.align_hor = "left";
if(objLayer.align_vert == undefined)
objLayer.align_vert = "top";
//set animation:
if(objLayer.hiddenunder == undefined)
objLayer.hiddenunder = "";
if(objLayer.resizeme == undefined)
objLayer.resizeme = "";
//set image link
if(objLayer.link == undefined)
objLayer.link = "";
//set image link open in
if(objLayer.link_open_in == undefined)
objLayer.link_open_in = "same";
//set slide link:
if(objLayer.link_slide == undefined)
objLayer.link_slide = "nothing";
//set scroll under offset
if(objLayer.scrollunder_offset == undefined)
objLayer.scrollunder_offset = "";
//set style, if empty, add first style from the list
if(objLayer.style == undefined)
objLayer.style = jQuery("#layer_caption").val();
objLayer.style = jQuery.trim(objLayer.style);
if(isInit == false && objLayer.type == "text" && (!objLayer.style || objLayer.style == "") ){
objLayer.style = getFirstStyle();
}
//add time
if(objLayer.time == undefined)
objLayer.time = getNextTime();
objLayer.time = Number(objLayer.time); //casting
//end time:
if(objLayer.endtime == undefined)
objLayer.endtime = "";
if(objLayer.endspeed == undefined)
objLayer.endspeed = initSpeed;
//set end animation:
if(objLayer.endanimation == undefined)
objLayer.endanimation = jQuery("#layer_endanimation").val();
//set end easing:
if(objLayer.endeasing == undefined)
objLayer.endeasing = jQuery("#layer_endeasing").val();
//set corners
if(objLayer.corner_left == undefined)
objLayer.corner_left = "nothing";
if(objLayer.corner_right == undefined)
objLayer.corner_right = "nothing";
//round position
objLayer.top = Math.round(objLayer.top);
objLayer.left = Math.round(objLayer.left);
objLayer.serial = id_counter;
arrLayers[id_counter] = objLayer;
//add html
var htmlLayer = makeLayerHtml(id_counter,objLayer);
container.append(htmlLayer);
var objHtmlLayer = getHtmlLayerFromSerial(id_counter);
//update layer position
updateHtmlLayerPosition(objHtmlLayer,objLayer.top,objLayer.left,objLayer.align_hor,objLayer.align_vert);
//update corners
updateHtmlLayerCorners(objHtmlLayer,objLayer);
//update cross position
updateCrossIconPosition(objHtmlLayer,objLayer);
//add layer to sortbox
addToSortbox(id_counter,objLayer);
//refresh draggables
refreshEvents(id_counter);
id_counter++;
//enable "delete all" button, not event, but anyway :)
jQuery("#button_delete_all").removeClass("button-disabled");
//select the layer
if(isInit == false){
setLayerSelected(objLayer.serial);
jQuery("#layer_text").focus();
}
}
/**
*
* delete layer from layers object
*/
var deleteLayerFromObject = function(serial){
var arrLayersNew = {};
var flagFound = false;
for (key in arrLayers){
if(key != serial)
arrLayersNew[key] = arrLayers[key];
else
flagFound = true;
}
if(flagFound == false)
UniteAdminRev.showErrorMessage("Can't delete layer, serial: "+serial+" not found");
arrLayers = arrLayersNew;
}
/**
* delete the layer from html.
*/
var deleteLayerFromHtml = function(serial){
var htmlLayer = getHtmlLayerFromSerial(serial);
htmlLayer.remove();
}
/**
* delete all representation of some layer
*/
var deleteLayer = function(serial){
deleteLayerFromObject(serial);
deleteLayerFromHtml(serial);
deleteLayerFromSortbox(serial);
}
/**
*
* call "deleteLayer" function with selected serial
*/
var deleteCurrentLayer = function(){
if(selectedLayerSerial == -1)
return(false);
deleteLayer(selectedLayerSerial);
//set unselected
selectedLayerSerial = -1;
//clear form and disable buttons
disableFormFields();
}
/**
* duplicate layer, set it a little aside of the layer position
*/
var duplicateLayer = function(serial){
var obj = arrLayers[serial];
var obj2 = jQuery.extend(true, {}, obj); //duplicate object
obj2.left += 5;
obj2.top += 5;
obj2.order = undefined;
obj2.time = undefined;
addLayer(obj2);
redrawSortbox();
}
/**
* call "duplicateLayer" function with selected serial
*/
var duplicateCurrentLayer = function(){
if(selectedLayerSerial == -1)
return(false);
duplicateLayer(selectedLayerSerial);
}
/**
* delete all layers
*/
var deleteAllLayers = function(){
arrLayers = {};
container.html("");
emptySortbox();
selectedLayerSerial = -1;
disableFormFields();
jQuery("#button_delete_all").addClass("button-disabled");
}
/**
* update the corners
*/
var updateHtmlLayerCorners = function(htmlLayer,objLayer){
var ncch = htmlLayer.outerHeight();
var bgcol = htmlLayer.css('backgroundColor');
switch(objLayer.corner_left){
case "curved":
htmlLayer.append("<div class='frontcorner'></div>");
break;
case "reverced":
htmlLayer.append("<div class='frontcornertop'></div>");
break;
}
switch(objLayer.corner_right){
case "curved":
htmlLayer.append("<div class='backcorner'></div>");
break;
case "reverced":
htmlLayer.append("<div class='backcornertop'></div>");
break;
}
htmlLayer.find(".frontcorner").css({
'borderWidth':ncch+"px",
'left':(0-ncch)+'px',
'borderRight':'0px solid transparent',
'borderTopColor':bgcol
});
htmlLayer.find(".frontcornertop").css({
'borderWidth':ncch+"px",
'left':(0-ncch)+'px',
'borderRight':'0px solid transparent',
'borderBottomColor':bgcol
});
htmlLayer.find('.backcorner').css({
'borderWidth':ncch+"px",
'right':(0-ncch)+'px',
'borderLeft':'0px solid transparent',
'borderBottomColor':bgcol
});
htmlLayer.find('.backcornertop').css({
'borderWidth':ncch+"px",
'right':(0-ncch)+'px',
'borderLeft':'0px solid transparent',
'borderTopColor':bgcol
});
}
/**
* update the position of html cross
*/
var updateCrossIconPosition = function(objHtmlLayer,objLayer){
var htmlCross = objHtmlLayer.find(".icon_cross");
var crossWidth = htmlCross.width();
var crossHeight = htmlCross.height();
var totalWidth = objHtmlLayer.outerWidth();
var totalHeight = objHtmlLayer.outerHeight();
var crossHalfW = Math.round(crossWidth / 2);
var crossHalfH = Math.round(crossHeight / 2);
var posx = 0;
var posy = 0;
switch(objLayer.align_hor){
case "left":
posx = - crossHalfW;
break;
case "center":
posx = (totalWidth - crossWidth) / 2;
break;
case "right":
posx = totalWidth - crossHalfW;
break;
}
switch(objLayer.align_vert){
case "top":
posy = - crossHalfH;
break;
case "middle":
posy = (totalHeight - crossHeight) / 2;
break;
case "bottom":
posy = totalHeight - crossHalfH;
break;
}
htmlCross.css({"left":posx+"px","top":posy+"px"});
}
/**
* update html layer position
*/
var updateHtmlLayerPosition = function(htmlLayer,top,left,align_hor,align_vert){
//update positions by align
var width = htmlLayer.width();
var height = htmlLayer.height();
var totalWidth = container.width();
var totalHeight = container.height();
var objCss = {};
//handle horizontal
switch(align_hor){
default:
case "left":
objCss["right"] = "auto";
objCss["left"] = left+"px";
break;
case "right":
objCss["left"] = "auto";
objCss["right"] = left+"px";
break;
case "center":
var realLeft = (totalWidth - width)/2;
realLeft = Math.round(realLeft) + left;
objCss["left"] = realLeft + "px";
objCss["right"] = "auto";
break;
}
//handle vertical
switch(align_vert){
default:
case "top":
objCss["bottom"] = "auto";
objCss["top"] = top+"px";
break;
case "middle":
var realTop = (totalHeight - height)/2;
realTop = Math.round(realTop)+top;
objCss["top"] = realTop + "px";
objCss["bottom"] = "auto";
break;
case "bottom":
objCss["top"] = "auto";
objCss["bottom"] = top+"px";
break;
}
//objCss["top"] = top+"px";
//objCss["top"] = top+"px";
htmlLayer.css(objCss);
}
/**
* check / update full width video position and size
*/
var checkUpdateFullwidthVideo = function(objLayer){
if(objLayer.type != "video")
return(objLayer);
if(objLayer.video_data && objLayer.video_data.fullwidth && objLayer.video_data.fullwidth == true){
objLayer.top = 0;
objLayer.left = 0;
objLayer.align_hor = "left";
objLayer.align_vert = "top";
objLayer.video_width = container.width();
objLayer.video_height = container.height();
}
return(objLayer);
}
/**
* update html layers from object
*/
var updateHtmlLayersFromObject = function(serial){
if(!serial)
serial = selectedLayerSerial
var objLayer = getLayer(serial);
if(!objLayer)
return(false);
var htmlLayer = getHtmlLayerFromSerial(serial);
//set class name
var className = "slide_layer ui-draggable tp-caption";
if(serial == selectedLayerSerial)
className += " layer_selected";
className += " "+objLayer.style;
htmlLayer.attr("class",className);
//set html
var type = "text";
if(objLayer.type)
type = objLayer.type;
//update layer by type:
switch(type){
case "image":
break;
case "video": //update fullwidth position
objLayer = checkUpdateFullwidthVideo(objLayer);
break;
default:
case "text":
htmlLayer.html(objLayer.text);
updateHtmlLayerCorners(htmlLayer,objLayer);
htmlLayer.append("<div class='icon_cross'></div>");
break;
}
//set position
updateHtmlLayerPosition(htmlLayer,objLayer.top,objLayer.left,objLayer.align_hor,objLayer.align_vert);
updateCrossIconPosition(htmlLayer,objLayer);
}
/**
* update layer from html fields
*/
var updateLayerFromFields = function(){
if(selectedLayerSerial == -1){
UniteAdminRev.showErrorMessage("No layer selected, can't update.");
return(false);
}
var objUpdate = {};
objUpdate.style = jQuery("#layer_caption").val();
objUpdate.text = jQuery("#layer_text").val();
objUpdate.top = Number(jQuery("#layer_top").val());
objUpdate.left = Number(jQuery("#layer_left").val());
objUpdate.animation = jQuery("#layer_animation").val();
objUpdate.speed = jQuery("#layer_speed").val();
objUpdate.align_hor = jQuery("#layer_align_hor").val();
objUpdate.align_vert = jQuery("#layer_align_vert").val();
objUpdate.hiddenunder = jQuery("#layer_hidden").is(":checked");
objUpdate.resizeme = jQuery("#layer_resizeme").is(":checked");
objUpdate.easing = jQuery("#layer_easing").val();
objUpdate.link_slide = jQuery("#layer_slide_link").val();
objUpdate.scrollunder_offset = jQuery("#layer_scrolloffset").val();
objUpdate.link = jQuery("#layer_image_link").val();
objUpdate.link_open_in = jQuery("#layer_link_open_in").val();
objUpdate.endtime = jQuery("#layer_endtime").val();
objUpdate.endanimation = jQuery("#layer_endanimation").val();
objUpdate.endspeed = jQuery("#layer_endspeed").val();
objUpdate.endeasing = jQuery("#layer_endeasing").val();
objUpdate.corner_left = jQuery("#layer_cornerleft").val();
objUpdate.corner_right = jQuery("#layer_cornerright").val();
//update object
updateCurrentLayer(objUpdate);
//update html layers
updateHtmlLayersFromObject();
//update html sortbox
updateHtmlSortboxFromObject();
//update the timeline with the new data
updateCurrentLayerTimeline();
}
/**
* redraw some layer html
*/
var redrawLayerHtml = function(serial){
var objLayer = getLayer(serial);
var html = makeLayerHtml(serial,objLayer)
var htmlInner = jQuery(html).html();
var htmlLayer = getHtmlLayerFromSerial(serial);
htmlLayer.html(htmlInner);
}
/**
* update layer parameters from the object
*/
var updateLayerFormFields = function(serial){
var objLayer = arrLayers[serial];
jQuery("#layer_caption").val(objLayer.style);
jQuery("#layer_text").val(objLayer.text);
jQuery("#layer_top").val(objLayer.top);
jQuery("#layer_left").val(objLayer.left);
jQuery("#layer_animation").val(objLayer.animation);
jQuery("#layer_easing").val(objLayer.easing);
jQuery("#layer_slide_link").val(objLayer.link_slide);
jQuery("#layer_scrolloffset").val(objLayer.scrollunder_offset);
jQuery("#layer_speed").val(objLayer.speed);
jQuery("#layer_align_hor").val(objLayer.align_hor);
jQuery("#layer_align_vert").val(objLayer.align_vert);
if(objLayer.hiddenunder == "true" || objLayer.hiddenunder == true)
jQuery("#layer_hidden").prop("checked",true);
else
jQuery("#layer_hidden").prop("checked",false);
if(objLayer.resizeme == "true" || objLayer.resizeme == true)
jQuery("#layer_resizeme").prop("checked",true);
else
jQuery("#layer_resizeme").prop("checked",false);
jQuery("#layer_image_link").val(objLayer.link);
jQuery("#layer_link_open_in").val(objLayer.link_open_in);
jQuery("#layer_endtime").val(objLayer.endtime);
jQuery("#layer_endanimation").val(objLayer.endanimation);
jQuery("#layer_endeasing").val(objLayer.endeasing);
jQuery("#layer_endspeed").val(objLayer.endspeed);
//set advanced params
jQuery("#layer_cornerleft").val(objLayer.corner_left);
jQuery("#layer_cornerright").val(objLayer.corner_right);
//set align table
var alignClass = "#linkalign_"+objLayer.align_hor+"_"+objLayer.align_vert;
jQuery("#align_table a").removeClass("selected");
jQuery(alignClass).addClass("selected");
//show / hide go under slider offset row
showHideOffsetRow();
}
/**
* unselect all html layers
*/
var unselectHtmlLayers = function(){
jQuery(containerID + " .slide_layer").removeClass("layer_selected");
}
/**
* set all layers unselected
*/
var unselectLayers = function(){
unselectHtmlLayers();
unselectSortboxItems();
selectedLayerSerial = -1;
disableFormFields();
hideLayerTimeline();
//reset elements
jQuery("#button_edit_video_row").hide();
jQuery("#button_change_image_source_row").hide();
jQuery("#layer_text").css("height","80px");
jQuery("#layer_image_link_row").hide();
jQuery("#layer_link_open_in_row").hide();
}
/**
* set layer selected representation
*/
var setLayerSelected = function(serial){
if(selectedLayerSerial == serial)
return(false);
objLayer = getLayer(serial);
var layer = getHtmlLayerFromSerial(serial);
//unselect all other layers
unselectHtmlLayers();
//set selected class
layer.addClass("layer_selected");
setSortboxItemSelected(serial);
//update selected serial var
selectedLayerSerial = serial;
//update bottom fields
updateLayerFormFields(serial);
//enable form fields
enableFormFields();
//do specific operations depends on type
switch(objLayer.type){
case "video": //show edit video button
jQuery("#linkInsertButton").addClass("disabled");
jQuery("#button_edit_video_row").show();
jQuery("#layer_text").css("height","25px");
break;
case "image":
//disable the insert button
jQuery("#linkInsertButton").addClass("disabled");
//show / hide some elements
jQuery("#button_change_image_source_row").show();
jQuery("#layer_text").css("height","25px");
jQuery("#layer_image_link_row").show();
jQuery("#layer_link_open_in_row").show();
break;
default: //set layer text to default height
jQuery("#layer_text").css("height","80px");
break;
}
//hide edit video button
if(objLayer.type != "video"){
jQuery("#button_edit_video_row").hide();
}
//hide image layer related fields
if(objLayer.type != "image"){
jQuery("#layer_image_link_row").hide();
jQuery("#layer_link_open_in_row").hide();
jQuery("#button_change_image_source_row").hide();
}
//show/hide text related layers
if(objLayer.type == "text"){
jQuery("#layer_cornerleft_row").show();
jQuery("#layer_cornerright_row").show();
jQuery("#layer_resizeme_row").show();
}else{
jQuery("#layer_cornerleft_row").hide();
jQuery("#layer_cornerright_row").hide();
jQuery("#layer_resizeme_row").hide();
}
//hide autocomplete
jQuery( "#layer_caption" ).autocomplete("close");
//make layer form validations
doCurrentLayerValidations();
//update timeline of the layer
updateCurrentLayerTimeline();
//set focus to text editor
jQuery("#layer_text").focus();
}
/**
*
* return if the layer is selected or not
*/
var isLayerSelected = function(serial){
return(serial == selectedLayerSerial);
}
/**
* hide in html and sortbox
*/
var hideLayer = function(serial,skipGlobalButton){
var htmlLayer = jQuery("#slide_layer_"+serial);
htmlLayer.hide();
setSortboxItemHidden(serial);
if(skipGlobalButton != true){
if(isAllLayersHidden())
jQuery("#button_sort_visibility").addClass("e-disabled");
}
}
/**
* show layer in html and sortbox
*/
var showLayer = function(serial,skipGlobalButton){
var htmlLayer = jQuery("#slide_layer_"+serial);
htmlLayer.show();
setSortboxItemVisible(serial);
if(skipGlobalButton != true)
jQuery("#button_sort_visibility").removeClass("e-disabled");
}
/**
* hide all layers
*/
var showAllLayers = function(){
for (serial in arrLayers)
showLayer(serial,true);
}
/**
* hide all layers
*/
var hideAllLayers = function(){
for (serial in arrLayers)
hideLayer(serial,true);
}
/**
* get true / false if the layer is hidden
*/
var isLayerVisible = function(serial){
var htmlLayer = jQuery("#slide_layer_"+serial);
var isVisible = htmlLayer.is(":visible");
return(isVisible);
}
/**
* get true / false if all layers hidden
*/
var isAllLayersHidden = function(){
for(serial in arrLayers){
if(isLayerVisible(serial) == true)
return(false);
}
return(true);
}
//======================================================
// Sortbox Functions
//======================================================
/**
* init the sortbox
*/
var initSortbox = function(){
redrawSortbox();
//set the sortlist sortable
jQuery( "#sortlist" ).sortable({
axis:'y',
update: function(){
onSortboxSorted();
}
});
//set input time events:
jQuery("#sortlist").delegate(".sortbox_time","keyup",function(event){
if(event.keyCode == 13)
onSortboxTimeChange(jQuery(this));
});
jQuery("#sortlist").delegate(".sortbox_time","blur",function(event){
onSortboxTimeChange(jQuery(this));
});
/*
//set input depth events:
jQuery("#sortlist").delegate(".sortbox_depth","keyup",function(event){
if(event.keyCode == 13)
onSortboxDepthChange(jQuery(this));
});
jQuery("#sortlist").delegate(".sortbox_depth","blur",function(event){
onSortboxDepthChange(jQuery(this));
});
*/
jQuery("#sortlist").delegate(".sortbox_depth","focus",function(event){
jQuery(this).blur();
});
//set click event
jQuery("#sortlist").delegate("li","mousedown",function(){
var serial = getSerialFromSortID(this.id);
setLayerSelected(serial);
});
//sort type buttons events
jQuery(".button_sorttype").click(function(){
var mode = this.id.replace("button_sort_","");
changeSortmode(mode);
});
//on show / hide layer icon click - show / hide layer
jQuery("#sortlist").delegate(".sortbox_eye","mousedown",function(event){
var sortboxID = jQuery(this).parent().attr("id");
var serial = getSerialFromSortID(sortboxID);
if(isLayerVisible(serial))
hideLayer(serial);
else
showLayer(serial);
//prevnt the layer from selecting
event.stopPropagation();
});
//show / hide all layers
jQuery("#button_sort_visibility").click(function(){
var button = jQuery(this);
if(button.hasClass("e-disabled")){ //show all
button.removeClass("e-disabled");
showAllLayers();
}else{ //hide all
button.addClass("e-disabled");
hideAllLayers();
}
});
}
/**
* set sortbox items selected
*/
var setSortboxItemSelected = function(serial){
var sortItem = getHtmlSortItemFromSerial(serial);
unselectSortboxItems();
sortItem.removeClass("ui-state-default").addClass("ui-state-hover");
}
/**
* set sortbox item hidden mode
*/
var setSortboxItemHidden = function(serial){
var sortItem = getHtmlSortItemFromSerial(serial);
sortItem.addClass("sortitem-hidden");
}
/**
* set sortbox item visible mode
*/
var setSortboxItemVisible = function(serial){
var sortItem = getHtmlSortItemFromSerial(serial);
sortItem.removeClass("sortitem-hidden");
}
/**
*
* change sortmode, display the changes
*/
var changeSortmode = function(mode){
if(mode != "depth" && mode != "time"){
trace("wrong mode: "+mode);
}
if(sortMode == mode)
return(false);
sortMode = mode;
redrawSortbox();
//change to time mode
if(sortMode == "time"){
jQuery("#button_sort_time").removeClass("ui-state-hover").addClass("ui-state-active");
jQuery("#button_sort_depth").removeClass("ui-state-active").addClass("ui-state-hover");
}else{ //change to depth mode
jQuery("#button_sort_depth").removeClass("ui-state-hover").addClass("ui-state-active");
jQuery("#button_sort_time").removeClass("ui-state-active").addClass("ui-state-hover");
updateOrderFromSortbox();
}
}
/**
*
* add layer to sortbox
*/
var addToSortbox = function(serial,objLayer){
var isVisible = isLayerVisible(serial);
var classLI = "";
if(isVisible == false)
classLI = " sortitem-hidden";
var sortboxText = getSortboxText(objLayer.text);
var depth = Number(objLayer.order)+1;
var htmlSortbox = '<li id="layer_sort_'+serial+'" class="ui-state-default'+classLI+'"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>';
htmlSortbox += '<span class="sortbox_text">' + sortboxText + '</span>';
htmlSortbox += '<div class="sortbox_eye"></div>';
htmlSortbox += '<input type="text" class="sortbox_time" title="Edit Timeline" value="'+objLayer.time+'">';
htmlSortbox += '<input type="text" class="sortbox_depth" readonly title="Edit Depth" value="'+depth+'">';
htmlSortbox += '<div class="clear"></div>';
htmlSortbox += '</li>';
jQuery("#sortlist").append(htmlSortbox);
}
/**
*
* delete layer from sortbox
*/
var deleteLayerFromSortbox = function(serial){
var sortboxLayer = getHtmlSortItemFromSerial(serial);
sortboxLayer.remove();
}
/**
*
* unselect all items in sortbox
*/
var unselectSortboxItems = function(){
jQuery("#sortlist li").removeClass("ui-state-hover").addClass("ui-state-default");
}
/**
* update layers order from sortbox elements
*/
var updateOrderFromSortbox = function(){
var arrSortLayers = jQuery( "#sortlist" ).sortable("toArray");
for(var i=0;i<arrSortLayers.length;i++){
var sortID = arrSortLayers[i];
var serial = getSerialFromSortID(sortID);
var objUpdate = {order:i};
updateLayer(serial,objUpdate);
//update sortbox order input
var depth = i+1;
jQuery("#"+sortID+" input.sortbox_depth").val(depth);
}
//update z-index of the html window by order
updateZIndexByOrder();
}
/**
* shift order among all the layers, push down all order num beyong the given
* need to redraw after this function
*/
var shiftOrder = function(orderToFree){
for(key in arrLayers){
var obj = arrLayers[key];
if(obj.order >= orderToFree){
obj.order = Number(obj.order)+1;
arrLayers[key] = obj;
}
}
}
/**
* get sortbox text from layer html
*/
var getSortboxText = function(text){
sorboxTextSize = 50;
var textSortbox = UniteAdminRev.stripTags(text);
//if no content - escape html
if(textSortbox.length < 2)
textSortbox = UniteAdminRev.htmlspecialchars(text);
//short text
if(textSortbox.length > sorboxTextSize)
textSortbox = textSortbox.slice(0,sorboxTextSize)+"...";
return(textSortbox);
}
/**
*
* redraw the sortbox
*/
var redrawSortbox = function(mode){
if(mode == undefined)
mode = sortMode;
emptySortbox();
var layers_array = getLayersSorted(mode);
if(layers_array.length == 0)
return(false);
for(var i=0; i<layers_array.length;i++){
var objLayer = layers_array[i];
addToSortbox(objLayer.serial,objLayer);
}
if(selectedLayerSerial != -1)
setSortboxItemSelected(selectedLayerSerial);
}
/**
* remove all from sortbox
*/
var emptySortbox = function(){
jQuery("#sortlist").html("");
}
/**
*
* update sortbox text from object
*/
var updateHtmlSortboxFromObject = function(serial){
if(!serial)
serial = selectedLayerSerial;
var objLayer = getLayer(serial);
if(!objLayer)
return(false);
var htmlSortItem = getHtmlSortItemFromSerial(serial);
if(!htmlSortItem)
return(false);
var sortboxText = getSortboxText(objLayer.text);
htmlSortItem.children(".sortbox_text").text(sortboxText);
}
/**
* on sortbox sorted event.
*/
var onSortboxSorted = function(){
if(sortMode == "depth")
updateOrderFromSortbox();
else //sort by time
redistributeTimes();
}
//======================================================
// Sortbox Functions End
//======================================================
//======================================================
// Time Functions
//======================================================
/**
* get next available time
*/
var getNextTime = function(){
var maxTime = 0;
//get max time
for (key in arrLayers){
var layer = arrLayers[key];
layerTime = (layer.time)?Number(layer.time):0;
if(layerTime > maxTime)
maxTime = layerTime;
}
var outputTime;
if(maxTime == 0)
outputTime = g_startTime;
else
outputTime = Number(maxTime) + Number(g_stepTime);
return(outputTime);
}
/**
* change time on the layer from the sortbox and reorder
*/
var onSortboxTimeChange = function(inputBox){
//update the time by inputbox:
var timeValue = inputBox.val();
timeValue = Number(timeValue);
var sortLayerID = inputBox.parent().attr("id");
var serial = getSerialFromSortID(sortLayerID);
var objUpdate = {time:timeValue};
updateLayer(serial,objUpdate);
if(sortMode == "time")
redrawSortbox();
validateCurrentLayerTimes();
}
/**
* change time on the layer from the sortbox and reorder
*/
var onSortboxDepthChange = function(inputBox){
//update the time by inputbox:
var depthValue = inputBox.val();
depthValue = Number(depthValue);
var order = depthValue-1;
var sortLayerID = inputBox.parent().attr("id");
var serial = getSerialFromSortID(sortLayerID);
var objUpdate = {order:order};
updateLayer(serial,objUpdate);
redrawSortbox();
if(sortMode == "depth")
updateOrderFromSortbox();
}
/**
* order layers by time
* type can be [time] or [order]
*/
var getLayersSorted = function(type){
if(type == undefined)
type = "time";
//convert to array
var layers_array = [];
for(key in arrLayers){
var obj = arrLayers[key];
obj.serial = key;
layers_array.push(obj);
}
if(layers_array.length == 0)
return(layers_array);
//sort layers array
layers_array.sort(function(layer1,layer2){
switch(type){
case "time":
if(Number(layer1.time) == Number(layer2.time)){
if(layer1.order == layer2.order)
return(0);
if(layer1.order > layer2.order)
return(1);
return(-1);
}
if(Number(layer1.time) > Number(layer2.time))
return(1);
break;
case "depth":
if(layer1.order == layer2.order)
return(0);
if(layer1.order > layer2.order)
return(1);
break;
default:
trace("wrong sort type: "+type);
break;
}
return(-1);
});
return(layers_array);
}
/**
* reditribute times between the layers sorted from small to big
*/
var redistributeTimes = function(){
//collect times to array:
var arrTimes = [];
for(key in arrLayers)
arrTimes.push(Number(arrLayers[key].time));
arrTimes.sort(function(a,b){return a-b}); //sort number
var arrSortLayers = jQuery( "#sortlist" ).sortable("toArray");
for(var i=0;i<arrSortLayers.length;i++){
var sortID = arrSortLayers[i];
var serial = getSerialFromSortID(sortID);
//update time:
var newTime = arrTimes[i];
var objUpdate = {time:newTime};
updateLayer(serial,objUpdate);
//update input box:
jQuery("#"+sortID+" input.sortbox_time").val(newTime);
}
}
//======================================================
// Time Functions End
//======================================================
//======================================================
// Events Functions
//======================================================
/**
*
* on layer drag event - update layer position
*/
var onLayerDrag = function(){
var layerSerial = getSerialFromID(this.id);
var htmlLayer = jQuery(this);
var position = htmlLayer.position();
var objLayer = getLayer(layerSerial);
var posTop = Math.round(position.top);
var posLeft = Math.round(position.left);
var layerWidth = htmlLayer.width();
var totalWidth = container.width();
var layerHeight = htmlLayer.height();
var totalHeight = container.height();
var updateY,updateX;
switch(objLayer.align_hor){
case "left":
updateX = posLeft;
break;
case "right":
updateX = totalWidth - posLeft - layerWidth;
break;
case "center":
updateX = posLeft - (totalWidth - layerWidth)/2;
updateX = Math.round(updateX);
break;
}
switch(objLayer.align_vert){
case "top":
updateY = posTop;
break;
case "bottom":
updateY = totalHeight - posTop - layerHeight;
break;
case "middle":
updateY = posTop - (totalHeight - layerHeight)/2;
updateY = Math.round(updateY);
break;
}
var objUpdate = {top:updateY,left:updateX};
updateLayer(layerSerial,objUpdate);
//update the position back with the rounded numbers (improve precision)
updateHtmlLayerPosition(htmlLayer,objUpdate.top,objUpdate.left);
//update bottom fields (only if selected)
if(isLayerSelected(layerSerial))
updateLayerFormFields(layerSerial);
}
/**
* move some layer
*/
var moveLayer = function(serial,dir,step){
var layer = getLayer(serial);
if(!layer)
return(false);
switch(dir){
case "down":
arrLayers[serial].top += step;
break;
case "up":
arrLayers[serial].top -= step;
break;
case "right":
arrLayers[serial].left += step;
break;
case "left":
arrLayers[serial].left -= step;
break;
default:
UniteAdminRev.showErrorMessage("wrong direction: "+dir);
return(false);
break;
}
updateHtmlLayersFromObject(serial);
if(isLayerSelected(serial))
updateLayerFormFields(serial);
}
//======================================================
// Events Functions End
//======================================================
//======================================================
// Time Line Functions
//======================================================
/**
* get some calculations like real end time
*/
var getLayerExtendedParams = function(layer){
var endSpeed = layer.endspeed;
if(!endSpeed)
endSpeed = layer.speed;
endSpeed = Number(endSpeed);
var endTime = layer.endtime;
var realEndTime;
if(!endTime || endTime == undefined || endTime == ""){ //end time does not given
endTime = g_slideTime - Number(layer.speed);
realEndTime = g_slideTime;
}else{ //end time given
realEndTime = Number(endTime) + Number(endSpeed);
}
layer.endTimeFinal = Number(endTime); //time caption stay - without end transition
layer.endSpeedFinal = Number(endSpeed);
layer.realEndTime = Number(realEndTime); //time with end transition
layer.timeLast = layer.realEndTime - layer.time; //time that the whole caption last
return(layer);
}
/**
* hide layer timeline
*/
var hideLayerTimeline = function(){
jQuery("#layer_timeline").hide();
}
/**
* show layer timeline
*/
var showLayerTimeline = function(xStart,widthLast,mode){
var props = {};
props.left = xStart+"px";
props.width = widthLast+"px";
var layerTimeline = jQuery("#layer_timeline");
if(mode == "error"){
layerTimeline.addClass("layertime-error");
layerTimeline.prop("title","Error - Something wrong with the caption times!");
}
else{
layerTimeline.removeClass("layertime-error");
layerTimeline.prop("title","");
}
jQuery("#layer_timeline").show().css(props);
}
/**
* update timeline of current layer
*/
var updateCurrentLayerTimeline = function(){
var layer = getCurrentLayer();
if(!layer)
return(false);
layer = getLayerExtendedParams(layer);
var gTimeline = jQuery("#global_timeline");
var gWidth = gTimeline.width();
var multiplier = gWidth / g_slideTime;
var widthLast = Math.round(layer.timeLast * multiplier);
var widthStart = Math.round(layer.speed * multiplier);
var widthEnd = Math.round(layer.endSpeedFinal * multiplier);
var xStart = Math.round(layer.time * multiplier);
var xEnd = Math.round(layer.endTimeFinal * multiplier); //start of the end transition
var xFinal = xStart + widthLast;
if(xFinal > (gWidth+1)){
var errorWidth;
if(xStart >= gWidth){
hideLayerTimeline();
}else{
errorWidth = gWidth - xStart;
showLayerTimeline(xStart,errorWidth,"error"); //show error timeline mode
}
}
else{
showLayerTimeline(xStart,widthLast);
}
}
}