var jj = jQuery.noConflict(); //Editor variables var afc_fonts = afc_data_obj.allfonts , fontGeneratorUrl = afc_data_obj.afcLocalFontFacesURL , afc_domSelectors = '' , afc_bindedClick = 0 , afc_allElems = [] , increaseInterval = null , decreaseInterval = null , afc_lockedElement = -1 , userIsEditing = 0 , afc_strings = afc_data_obj.afc_strings , afc_existingData = afc_data_obj.afc_existingData , afc_taxonomyList = afc_data_obj.pageTypes , afc_activeTab = 1 , framejQuery = ''; if (afc_existingData.length > 0) afc_allElems = deepCopy(afc_existingData); jj(document).ready(function () { jj('.afcui.toggleeditor').click(function () { if (jj('.afcwrap').css('display') == 'block') jj('.afcwrap').stop(true,false).fadeOut(200); else jj('.afcwrap').stop(true, false).fadeIn(200); }); //To make the plugin editor draggable jj('.afcwrap').draggable({ cursor: 'move', cancel: '.afcselectedelement, input, select, .increasethesize, .decreasethesize, .afcui.toggle.checkbox, .afcui.dropdown, .afc-op-button', axis: 'x' }); //To show pop up when user hovers an specified elements in editor jj('.afc-op-button, .afcwrap .taxonomytitle').afcpopup({ inline: true, position: 'top center', delay: { show: 100, hide: 50 } }); //To call a function when selected font in fontselection dropdown changes jj('.afcwrap .propertylist').afcdropdown('setting', 'onChange', function (value) { afcShowProperty(value); }); //To call a function when selected font in fontselection dropdown changes jj('.afcwrap .fontselection').afcdropdown('setting', 'onChange', function (value) { afcEditorController('fontname', value); }); //To handle 'force change' switch in plugin editor jj('.afcwrap .afcforcechange').afccheckbox('setting', 'onChange', function () { afcEditorController('forcecheck', jj(this)); }); jj('.fontsize.increasethesize').mousedown(function () { sizeButtons('inc', '.afcfontsize', 'font-size'); }).mouseup(function () { window.clearInterval(increaseInterval); increaseInterval = null; }).mouseout(function () { window.clearInterval(increaseInterval); increaseInterval = null; }); jj('.fontsize.decreasethesize').mousedown(function () { sizeButtons('dec', '.afcfontsize', 'font-size'); }).mouseup(function () { window.clearInterval(decreaseInterval); decreaseInterval = null; }).mouseout(function () { window.clearInterval(decreaseInterval); decreaseInterval = null; }); //To call a function when selected font in font-weight dropdown changes jj('.afcwrap .fontweight').afcdropdown('setting', 'onChange', function (value) { afcEditorController('fontweight', value); }); //To call a function when selected font in font-style dropdown changes jj('.afcwrap .fontstyle').afcdropdown('setting', 'onChange', function (value) { afcEditorController('fontstyle', value); }); //To init wp color picker jj('#textshadow-color, #afctextcolor').wpColorPicker({ change: function (event, ui) { if (jj(this).is('#afctextcolor')) changeTheColor(ui, 'textcolor'); else changeTheColor(ui, 'shadowcolor'); } }); jj('.wp-color-result').on('click', function (e) { if (!jj(this).hasClass('.wp-picker-open') && afc_lockedElement == -1) { if (jj(' #afctextcolor', jj(this).next()).length > 0) jj('#afctextcolor').wpColorPicker('close'); else jj('#textshadow-color').wpColorPicker('close'); afcRunModal( afc_strings.noelemselected ); } }); jj('.textcolor .wp-picker-clear').on('click', function () { if (afc_lockedElement != -1 && typeof afc_allElems[afc_lockedElement].properties.textColor != 'undefined') resetProperties(['textColor']); }); jj('.shadowcolor .wp-picker-clear').on('click', function () { if (afc_lockedElement != -1 && typeof afc_allElems[afc_lockedElement].properties.textShadow != 'undefined') resetProperties(['shadowColor']); }); //To call a function when selected text decoration changes jj('.afcwrap .textdecoration').afcdropdown('setting', 'onChange', function (value) { afcEditorController('decoration', value); }); //To handle text-shadow buttons jj('.h-shadow.increasethesize').mousedown(function () { increaseInterval = window.setInterval(function () { shadowSizeButtons('inc', '.afctxth-shadow', 'h-shadow'); }, 110); }).mouseup(function () { window.clearInterval(increaseInterval); increaseInterval = null; }).mouseout(function () { window.clearInterval(increaseInterval); increaseInterval = null; }); jj('.h-shadow.decreasethesize').mousedown(function () { decreaseInterval = window.setInterval(function () { shadowSizeButtons('dec', '.afctxth-shadow', 'h-shadow'); }, 110); }).mouseup(function () { window.clearInterval(decreaseInterval); decreaseInterval = null; }).mouseout(function () { window.clearInterval(decreaseInterval); decreaseInterval = null; }); jj('.v-shadow.increasethesize').mousedown(function () { increaseInterval = window.setInterval(function () { shadowSizeButtons('inc', '.afctxtv-shadow', 'v-shadow'); }, 110); }).mouseup(function () { window.clearInterval(increaseInterval); increaseInterval = null; }).mouseout(function () { window.clearInterval(increaseInterval); increaseInterval = null; }); jj('.v-shadow.decreasethesize').mousedown(function () { decreaseInterval = window.setInterval(function () { shadowSizeButtons('dec', '.afctxtv-shadow', 'v-shadow'); }, 110); }).mouseup(function () { window.clearInterval(decreaseInterval); decreaseInterval = null; }).mouseout(function () { window.clearInterval(decreaseInterval); decreaseInterval = null; }); jj('.shadow-blur.increasethesize').mousedown(function () { increaseInterval = window.setInterval(function () { shadowSizeButtons('inc', '.afcshadow-blur', 'blur'); }, 110); }).mouseup(function () { window.clearInterval(increaseInterval); increaseInterval = null; }).mouseout(function () { window.clearInterval(increaseInterval); increaseInterval = null; }); jj('.shadow-blur.decreasethesize').mousedown(function () { decreaseInterval = window.setInterval(function () { shadowSizeButtons('dec', '.afcshadow-blur', 'blur'); }, 110); }).mouseup(function () { window.clearInterval(decreaseInterval); decreaseInterval = null; }).mouseout(function () { window.clearInterval(decreaseInterval); decreaseInterval = null; }); //To handle pagetype switches of selector in plugin editor jj('.afcwrap .tax').afccheckbox('setting', 'onChange', function () { afcEditorController('pt', getFJ(this)); }); //Running the core //afcRunTheCore(); jj('.afcframe').load(function () { framejQuery = jj('.afcframe')[0].contentWindow.jQuery; afc_domSelectors = framejQuery.find('body *:not( script, #wpadminbar, #wpadminbar *,.afcwrap, .afcwrap *, .afcwaiting )'); afcRunTheCore(); jj('.afcwrap,.toggleeditor').css('display', 'block'); }); }); //We call this function every time user clicks on an element in dom function afcRunTheCore() { if (!userIsEditing) { jj('.afcwrap').show(); userIsEditing = 1; if (!afc_bindedClick) { setTimeout(function () { jj(afc_domSelectors).click(function (e) { if (userIsEditing) { if (afc_lockedElement == -1) { var afcself = jj(e.target); jj(".afcwrapper").animate({ borderColor: "#5BBD72" }, 200); jj(afcself).addClass('afcactive'); jj(afcself).removeClass('afchover'); afcInitEditorData(afcself); } return false; } else { return true; } }); jj(afc_domSelectors).mouseover( function (e) { if (jj('.afcactive').length == 0 && userIsEditing && afc_lockedElement == -1) jj(e.target).addClass('afchover'); else return true; }) .mouseout( function (e) { if (userIsEditing) jj(e.target).removeClass('afchover'); }); }, 500); afc_bindedClick = 1; } } else { afccancel(); } afcWaiting('hide'); } //Main controller of plugin editor function afcInitEditorData(currObj) { var objectPos = afcObjectExists(currObj); if (objectPos !== false) { var tempObj = afc_allElems[objectPos]; afc_lockedElement = objectPos; afcMakeFormReady(tempObj); } else { afcAddElementToList(currObj); objectPos = afcObjectExists(currObj); var tempObj = afc_allElems[objectPos]; afc_lockedElement = objectPos; afcMakeFormReady(tempObj); } } //Switches to requested function function afcEditorController(property, val) { if (afc_lockedElement != -1) { switch (property) { case 'fontname': afcInsertFont(val); break; case 'forcecheck': afcforcechangehandle(val); break; case 'fontweight': afcChangeFW(val); break; case 'fontstyle': afcChangeFS(val); break; case 'decoration': afcInsertTD(val); break; case 'pt': afcPtHandle(val); } } else { if ((val != 'unset' && val != 'none' && typeof val != 'object') || (typeof val == 'object' && val.is(':checked'))) { if (property == 'forcecheck') afcRunModal(afc_strings.nofontselected); else afcRunModal(afc_strings.noelemselected); resetTheForm(); } } } //Generates an object for afc_allElems array from current received object. function afcAddElementToList(currObj) { var numberOfParents = 0; if (!afcObjectHasID(currObj) && !afcObjectHasClass(currObj)) { tempObject = currObj; while (tempObject.get(0) !== jj('body').get(0)) { tempObject = tempObject.parent(); if (afcObjectHasID(tempObject) || afcObjectHasClass(tempObject)) { numberOfParents++; break; } else { numberOfParents++; } } } afc_allElems.push({ selectorName: afcGenerateSelector('string', currObj, numberOfParents), properties: {}, pageType: { all: 'empty' }, editorData: { object: currObj, selectorMap: afcGenerateSelector('arr', currObj, numberOfParents), numOfParents: numberOfParents, isEditable: 1, isNew: 1, isShortCode: 0 } }); } //Generates a complete selector from received object. uses parents number to determine how many parents must be inserted in selector function afcGenerateSelector(status, object, parents) { var tempObj = object , result = [] , tempStr = ''; result.push({ name: afcGenerateSelectorForThisObj(object), included: 1 }); if (parents > 0) { for (var i = 1; i <= parents; i++) { tempObj = tempObj.parent(); result[i] = { name: afcGenerateSelectorForThisObj(tempObj), included: 1 }; } } if (status == 'string') { for (var i = result.length - 1; i >= 0; i--) tempStr += ' ' + result[i].name; return tempStr; } return result; } //Returns string containing current object tag plus its classes function afcGenerateSelectorForThisObj(object) { var objTagName = object.get(0).tagName.toLowerCase() , objID = object.prop('id') , objClasses = object.prop('class').split(' ') , result = objTagName; if (objID.trim() != '') result += '#' + objID; for (var i in objClasses) if (objClasses[i] != 'afchover' && objClasses[i] != 'afcactive' && objClasses[i].trim() != '') result += '.' + objClasses[i]; return result; } //Generates a set of elements from received object. uses parents number to determine how many parents must be reached. This function's usage is for plugin editor. function afcGenerateEditorElement(selector, isEditable) { var result = '' , tempStr = ''; if (selector != '') { var selectorArr = selector.trim().split(' ') , parentsCount = selectorArr.length; if (parentsCount > 1) { for (var i = 0; i < parentsCount ; i++) { if (i == 0) result = afcGenerateAnElement(selectorArr[i], parentsCount - i - 1, isEditable, 'begin'); else if (i == parentsCount - 1) result += afcGenerateAnElement(selectorArr[i], parentsCount - i - 1, isEditable, 'end'); else { result += afcGenerateAnElement(selectorArr[i], parentsCount - i - 1, isEditable); } } } else if (parentsCount == 1) { result = afcGenerateAnElement(selectorArr[0], 0, isEditable, 'end', 1); } } return result; } //To generate an element for a selector of type shortcode function afcGenerateShortCodeElement(selector) { return outPut = '' + selector + ''; } //Generates one element for current part of selector function afcGenerateAnElement(selector, parent, editable, pos, sLength) { var result = '' , sTag = '' , specialElems = { removeThisTag: '', addParentTag: '', removeID: '', reBuildThis: '', removeThisClass: '' }; if (editable) { specialElems = { removeThisTag: '' , addParentTag: '' , removeID: '' , reBuildThis: '' , removeThisClass: '' }; } if (selector.length > 0) { var sArr = selector.trim().replace(/#/g, ' #').replace(/\./g, ' .').split(' '); sTag = ' '; for (var i in sArr) { if (sArr[i].indexOf('.') != -1) { sTag += '' + sArr[i] + specialElems.removeThisClass + ''; } else if (sArr[i].indexOf('#') != -1) { sTag += '' + sArr[i] + specialElems.removeID + ''; } else { sTag += sArr[i]; } } sTag += specialElems.reBuildThis + ((pos != 'end') ? specialElems.removeThisTag : '') + ''; if (pos == 'begin' || (pos == 'end' && sLength == 1)) sTag = specialElems.addParentTag + sTag; } return sTag; } //Removes requested tag from the current selector function afcRemoveThisTag(element) { var objectPos = afc_lockedElement , parentNum = afc_allElems[objectPos].editorData.numOfParents , selectorArr = afc_allElems[objectPos].editorData.selectorMap , targetObj = jj(element).parent() , tagID = -1 , targetSelector = targetObj.text().replace(/<.>/g, '').replace(' ', ''); for (var i in selectorArr) { if (targetSelector.trim() == selectorArr[i].name.trim()) { tagID = i; } } if (tagID == parentNum) { selectorArr.pop(); parentNum -= 1; var newParentNum = parentNum; for (var i = parentNum; i > 0; i--) { if (selectorArr[i].included == 0) { selectorArr.pop(); newParentNum -= 1; } else { break; } } parentNum = newParentNum; } else { selectorArr[tagID].included = 0; } afc_allElems[objectPos].editorData.numOfParents = parentNum; reNewSelector(objectPos, selectorArr); } //Adds one parent tag to the current selector function afcAddParentTag() { var objectPos = afc_lockedElement , object = afc_allElems[objectPos].editorData.object , parentNum = afc_allElems[objectPos].editorData.numOfParents , selectorArr = afc_allElems[objectPos].editorData.selectorMap , error = 0; if (selectorArr[parentNum].included == 0) { selectorArr[parentNum].included = 1; } else { var tempObj = object; for (var i = 0; i <= parentNum; i++) tempObj = tempObj.parent(); if (tempObj.get(0) != getFJ('html').get(0)) { afc_allElems[objectPos].editorData.numOfParents = parseInt(parentNum) + 1; selectorArr.push({ name: afcGenerateSelectorForThisObj(tempObj), included: 1 }); } else { afcRunModal(afc_strings.bodyreached); error = 1; } } if (!error) { reNewSelector(objectPos, selectorArr); } } //Rebuilds requested tag of current selector function afcReBuildThis(element) { var objectPos = afc_lockedElement , selectorArr = afc_allElems[objectPos].editorData.selectorMap , tagID = jj(element).parent().attr('parent') , object = afc_allElems[objectPos].editorData.object; for (var i = 0; i < tagID; i++) { object = object.parent(); } selectorArr[tagID].name = afcGenerateSelectorForThisObj(object); reNewSelector(objectPos, selectorArr); } //Removes the requested class or id from the its tag in current selector function removeThisAttr(type, element) { var objectPos = afc_lockedElement , selectorArr = afc_allElems[objectPos].editorData.selectorMap , targetObj = jj(element).parent() , targetSelector = targetObj.parent().text().replace(/<.>/g, '').replace(' ', '') , tagID = -1; for (var i in selectorArr) { if (targetSelector.trim() == selectorArr[i].name.trim()) { tagID = i; } } var classes = selectorArr[tagID].name.split('.') , tagAndID = classes[0]; //print_r(selectorArr); //alert(tagID); if (type == 'class') { targetClass = targetObj.text().replace(/<.>/g, '').replace(' ', '').replace('.','') , cPos = -1; for (var i in classes) { if (targetClass.trim() == classes[i].trim()) { cPos = i; } } //alert(cPos); classes.splice(cPos, 1); classes.shift(); //print_r(classes); if (classes.length > 0) { classes = '.' + classes.join('.'); } else { classes = ''; } } else if (type == 'id') { tagAndID = tagAndID.split('#'); tagAndID.pop(); tagAndID = tagAndID[0]; classes.shift(); if (classes.length > 0) classes = '.' + classes.join('.'); else classes = ''; } selectorArr[tagID].name = tagAndID + classes; reNewSelector(objectPos, selectorArr); } function reNewSelector(objectPos, selectorArr) { var newSelector = afcSelectorArrToString(selectorArr); afc_allElems[objectPos].selectorName = newSelector; afc_allElems[objectPos].editorData.selectorMap = selectorArr; jj('.afcselectedelement').text('').append(afcGenerateEditorElement(newSelector, 1)); } //Converts selector map to string function afcSelectorArrToString(selectorArr) { var result = ''; for (var i in selectorArr) if (selectorArr[i].included == 1) result = selectorArr[i].name + ' ' + result; return result; } //Fills the editor form using existing data in received object. function afcMakeFormReady(elementObject) { if (elementObject.editorData.isEditable == 1) jj('.afcselectedelement').append(afcGenerateEditorElement(elementObject.selectorName, 1)); else if (elementObject.editorData.isShortCode == 1) jj('.afcselectedelement').append(afcGenerateShortCodeElement(elementObject.selectorName)); else jj('.afcselectedelement').append(afcGenerateEditorElement(elementObject.selectorName, 0)); var selectorData = elementObject.properties; if (typeof selectorData.fontName != 'undefined') { jj(".fontselection").afcdropdown('set selected', selectorData.fontName.name); if (selectorData.fontName.forceChangeFont == '1') { jj(".afcwrap .afcforcechange").afccheckbox('check'); } } if (typeof selectorData.fontSize != 'undefined') { jj('.afcwrap .afcfontsize').text(selectorData.fontSize); } else { jj('.afcwrap .afcfontsize').text(elementObject.editorData.object.css('font-size').replace('px', '')); } if (typeof selectorData.fontWeight != 'undefined') { jj(".fontweight").afcdropdown('set selected', selectorData.fontWeight); } if (typeof selectorData.fontStyle != 'undefined') { jj(".fontstyle").afcdropdown('set selected', selectorData.fontStyle); } if (typeof selectorData.textColor != 'undefined') { jj("#afctextcolor").wpColorPicker('color', selectorData.textColor); } if (typeof selectorData.textDecoration != 'undefined') { jj(".textdecoration").afcdropdown('set selected', selectorData.textDecoration); } if (typeof selectorData.textShadow != 'undefined') { jj(".textshadow .afctxth-shadow").text(selectorData.textShadow.hshadow); jj(".textshadow .afctxtv-shadow").text(selectorData.textShadow.vshadow); jj(".textshadow .afcshadow-blur").text(selectorData.textShadow.blur); jj("#textshadow-color").wpColorPicker('color', selectorData.textShadow.color); } for (var j in selectorData.pageType) { jj('#chb_' + selectorData.pageType[j]).afccheckbox('check'); } } //Checks wether object exists in afc_allElems array or not. function afcObjectExists(currObj) { var selector = ''; for (var i in afc_allElems) { selector = ''; if (afc_allElems[i].editorData.isEditable == 1) { for (j = afc_allElems[i].editorData.selectorMap.length - 1; j >= 0; j--) selector += ' ' + afc_allElems[i].editorData.selectorMap[j].name; } else { selector = afc_allElems[i].selectorName; } if (currObj.is(framejQuery.find(selector))) { if (typeof afc_allElems[i].editorData.object == 'undefined' || afc_allElems[i].editorData.object.get(0) != currObj.get(0)) { afc_allElems[i].editorData.object = currObj; afc_allElems[i].editorData.isNew = 0; } return i; } } return false; } //Checks wether selected html element has any class or not. function afcObjectHasClass(object) { var objClasses = jj(object).prop('class').split(' '); for (var i in objClasses) if (objClasses[i] != 'afchover' && objClasses[i] != 'afcactive' && objClasses[i].trim() != '') return true; return false; } //Checks wether selected html element has ID or not. function afcObjectHasID(object) { var objID = jj(object).prop('id'); if (objID.trim() != '') return true; return false; } //To save changes on server and update current page function afcSaveChanges() { afcWaiting('show'); if (afc_lockedElement != -1) afcUnlock(); var forSave = [] if (afc_allElems.length > 0) { for (var i in afc_allElems) { if (typeof afc_allElems[i].selectorName != 'undefined') { if (typeof afc_allElems[i].editorData.object != 'undefined') delete afc_allElems[i].editorData.object; if (typeof afc_existingData[i] != 'undefined') afc_allElems[i].editorData.isNew = 0; forSave.push(afc_allElems[i]); } } if (forSave.length > 0) { if (isLoggedIn()) { jj.ajax({ url: afc_data_obj.ajax_url, type: 'POST', data: { 'action': 'afc_ajax', 'afcnonce': afc_data_obj.afcnonce, 'afcdata': forSave, 'afcaction': 'add' }, success: function (data) { afcRunModal(afc_strings.changessaved, 'relaod'); location.reload(); }, error: function (data) { afcRunModal(afc_strings.savefailed); } }); } else { afcWaiting('hide'); } } else { nothingToSave(); } } else { nothingToSave(); } } //Shows a message when there is nothing for saving function nothingToSave() { afcRunModal(afc_strings.nothingtosave); afcWaiting('hide'); } //To remove style of current selected element from current page and server function afcRemoveSelector() { if (afc_lockedElement != -1) { afcWaiting('show'); var thisElem = [] , doajax = 0 , selector = afc_allElems[afc_lockedElement].selectorName; if (typeof afc_existingData[afc_lockedElement] != 'undefined') { thisElem.push(afc_existingData[afc_lockedElement]); doajax = 1; } properties = ['fontName', 'fontSize', 'fontWeight', 'fontStyle', 'textColor', 'textShadow', 'textDecoration']; if (doajax) { jj.ajax({ url: afc_data_obj.ajax_url, type: 'POST', data: { 'action': 'afc_ajax', 'afcdata': thisElem, 'afcnonce': afc_data_obj.afcnonce, 'afcaction': 'removethiselem' }, success: function (data) { resetProperties(properties, 0, afc_lockedElement); afcRunModal(afc_strings.elemremoved); var currentInlineCSS = getFJ('.afccss').text(); if (currentInlineCSS.indexOf(selector) >= 0) { var selectorsList = currentInlineCSS.split('/*eos*/'); for (var j in selectorsList) { if (selectorsList[j].indexOf(selector) > -1) { selectorsList[j] = ''; break; } } for (var j in selectorsList) { if (selectorsList[j].trim != '') selectorsList[j] = selectorsList[j] + '/*eos*/'; } getFJ('.afccss').text(selectorsList.join(' ')); } if (typeof afc_existingData[afc_lockedElement] != 'undefined') delete afc_existingData[afc_lockedElement]; var elementID = afc_lockedElement; afcUnlock(); delete afc_allElems[elementID]; afcWaiting('hide'); }, error: function () { afcWaiting('hide'); } }); } else { resetProperties(properties, 0, afc_lockedElement); var elementID = afc_lockedElement; afcUnlock(); delete afc_allElems[elementID]; afcWaiting('hide'); } } else afcRunModal(afc_strings.noelemselected); } //To unlock the ability to select elements with mouse if script is locked on an element function afcUnlock() { jj(".afcwrapper").animate({ borderColor: "#D95C5C" }, 200); jj(afc_allElems[afc_lockedElement].editorData.object).removeClass('afcactive'); afc_lockedElement = -1; resetTheForm(); } //To cancel new edits on current page only function afcCancel() { //location.reload(); if (window.top) window.top.close(); else window.close(); } //To reseet values in plugin editor function resetTheForm() { jj('.afcselectedelement').text(''); jj('.afcfontsize,.afctxth-shadow,.afctxtv-shadow,.afcshadow-blur').text(0); jj(".afcui.dropdown ").afcdropdown('set selected', 'none'); jj(".textdecoration.afcui.dropdown ").afcdropdown('set selected', 'unset'); jj(".afcwrap .afcforcechange").afccheckbox('uncheck'); jj(".afcwrap .tax").afccheckbox('uncheck'); jj('.wp-picker-clear').trigger('click'); } function resetProperties(properties, fs, sID) { var selectorID = (typeof sID != 'undefined') ? sID : afc_lockedElement , fromStyle = (typeof fs != 'undefined') ? fs : 1 , selectorName = afc_allElems[selectorID].selectorName; for (var i in properties) { switch (properties[i]) { case 'fontName': delete afc_allElems[selectorID].properties.fontName; removeInlineProperty(selectorName, 'font-family', '/*eof*/', fromStyle); break; case 'fontSize': delete afc_allElems[selectorID].properties.fontSize; removeInlineProperty(selectorName, 'font-size', '/*eofs*/', fromStyle); break; case 'fontWeight': removeInlineProperty(selectorName, 'font-weight', '/*eofw*/', fromStyle); delete afc_allElems[selectorID].properties.fontWeight; break; case 'fontStyle': removeInlineProperty(selectorName, 'font-style', '/*eofs*/', fromStyle); delete afc_allElems[selectorID].properties.fontStyle; break; case 'textColor': delete afc_allElems[selectorID].properties.textColor; removeInlineProperty(selectorName, 'color', '/*eotc*/', fromStyle); break; case 'textDecoration': removeInlineProperty(selectorName, 'text-decoration', '/*eotd*/', fromStyle); delete afc_allElems[selectorID].properties.textDecoration; break; case 'textShadow': var shadowVals = [0, 0, 0]; changeShadowInlineProperties(shadowVals, '', selectorName); delete afc_allElems[selectorID].properties.textShadow; break; case 'shadowColor': var isDefined = (typeof afc_allElems[selectorID].properties.textShadow != 'undefined') , shadowVals = getShadowVals(); if (isDefined) afc_allElems[selectorID].properties.textShadow.color = ''; changeShadowInlineProperties(shadowVals, ''); break; } } } function removeInlineProperty(selector, property, code, fromStyle) { var currentInlineCSS = getFJ('.afccss').text(); getFJ(selector).css(property, ''); var propertyRegex = new RegExp(property + "([0-9a-zA-Z# :\)\(,])*;", "g"); getFJ(selector).attr('style', function (i, s) { if (typeof s != 'undefined') { if (s.indexOf(property) != -1) { s = s.replace(propertyRegex, ''); } return s; } }); if (currentInlineCSS.indexOf(selector) >= 0 && fromStyle) { var selectorsList = currentInlineCSS.split('/*eos*/'); for (var i = 0; i < selectorsList.length; i++) { var thisSelectorPr = selectorsList[i].substring(selectorsList[i].indexOf(property), selectorsList[i].indexOf(code)); if (selectorsList[i].indexOf(selector) >= 0) { selectorsList[i] = selectorsList[i].replace(thisSelectorPr + code, ''); } } for (var i in selectorsList) if (selectorsList[i].trim != '') selectorsList[i] = selectorsList[i] + '/*eos*/'; getFJ('.afccss').text(selectorsList.join(' ')); } } //To handle editor taxonomy switches status change event function afcPtHandle(obj) { if (obj.is(':checked') && afc_lockedElement != -1) { if (typeof afc_allElems[afc_lockedElement].pageType[obj.val()] == 'undefined') afc_allElems[afc_lockedElement].pageType[obj.val()] = 'empty'; if (typeof afc_allElems[afc_lockedElement].pageType.all != 'undefined') delete afc_allElems[afc_lockedElement].pageType.all; } else if (obj.is(':checked') && afc_lockedElement == -1) { afcRunModal(afc_strings.noelemselected); obj.prop('checked', false); setTimeout(function () { obj.removeClass('checked'); }, 500); resetTheForm(); } else if (!obj.is(':checked')) { if (afc_lockedElement != -1) { delete afc_allElems[afc_lockedElement].pageType[obj.val()]; if (afcIsEmptyObject(afc_allElems[afc_lockedElement].pageType)) afc_allElems[afc_lockedElement].pageType['all'] = 'empty'; } } } function afcIsEmptyObject(obj) { var name; for (name in obj) { return false; } return true; } //To load font-face and style for current element function afcInsertFont(selectedFontName) { var fontName = selectedFontName; if (fontName != 'none') { removeForceChecked(); insertFont(fontName); afc_allElems[afc_lockedElement].properties.fontName = { name: fontName, forceChangeFont: 0 }; } else if (fontName == 'none') { removeForceChecked(); resetProperties(['fontName']); } } //To load the font face in document if not exists function insertFont(requestedFontName) { var fontName = requestedFontName , thisFont = extractThisFont(fontName) , thisFontsObj = {}; if(afc_data_obj.wf_status == 'yes'){ if (thisFont['status'] == 'local') { if (fontGeneratorUrl.indexOf(fontName) < 0){ fontGeneratorUrl += fontName + '|'; var localFont = afcCreateFontObject('local', [thisFont]); if (isNotEmpty(localFont)) { thisFontsObj.custom = localFont; getFJ('.afcfontloaderlink').remove(); } } } else if (thisFont['status'] == 'google') { var googleFont = afcCreateFontObject('google', [thisFont]); if (isNotEmpty(googleFont)) thisFontsObj.google = googleFont; } if (isNotEmpty(thisFontsObj)) { document.getElementsByClassName('afcframe')[0].contentWindow.WebFont.load(thisFontsObj); } } else{ if (thisFont['status'] == 'local') { var href = getFJ('.afcdirectloadlocalfonts').attr("href"); if (href.indexOf(fontName) < 0){ href += fontName + '|'; getFJ('.afcdirectloadlocalfonts').attr("href", href); } } else if (thisFont['status'] == 'google') { var href = getFJ('.afcdirectloadgooglefonts').attr("href"); if (href.indexOf(fontName) < 0){ href += fontName + '|'; getFJ('.afcdirectloadgooglefonts').attr("href", href); } //getFJ('head').append(); } //if (isNotEmpty(thisFontsObj)) { // document.getElementsByClassName('afcframe')[0].contentWindow.WebFont.load(thisFontsObj); //} } getFJ().css({ 'font-family': fontName }); } //This function generates a object of fonts for send to fontloader. function afcCreateFontObject(status, fontsArr) { var fontsObj = {}; if (typeof fontsArr == 'object' && fontsArr.length > 0) { var familiesArr = [], urlArr = []; if (status == 'google') { var weight = ''; for (i in fontsArr) { weight = ''; if (typeof fontsArr[i].metadata != 'undefined' && typeof fontsArr[i].metadata.fvd != 'undefined' && fontsArr[i].metadata.fvd != '') { weight = fontsArr[i].metadata.fvd; } if (weight != '') familiesArr.push(fontsArr[i].name + ':' + weight); else familiesArr.push(fontsArr[i].name); } fontsObj.families = familiesArr; } else if (status == 'local') { fontsObj.custom = {}; for (i in fontsArr) { familiesArr.push(fontsArr[i].name); } fontsObj = { families: familiesArr, urls: [fontGeneratorUrl] }; } else if (status == 'unknown') { var weight = ''; for (i in fontsArr) { weight = ''; if (typeof fontsArr[i].metadata != 'undefined' && typeof fontsArr[i].metadata.fvd != 'undefined' && fontsArr[i].metadata.fvd != '') { weight = fontsArr[i].metadata.fvd; } if (typeof fontsArr[i].metadata != 'undefined' && typeof fontsArr[i].metadata.url != 'undefined' && fontsArr[i].metadata.url != '') { urlArr.push(fontsArr[i].metadata.url); } if (weight != '') familiesArr.push(fontsArr[i].name + ':' + weight); else familiesArr.push(fontsArr[i].name); } if (urlArr.length > 0) fontsObj = { families: familiesArr, urls: urlArr }; else fontsObj = { families: familiesArr }; } } return fontsObj; } //To extract font name and status of given fontname function extractThisFont(fontName) { for (i in afc_fonts) if (afc_fonts[i]['name'] == fontName) return afc_fonts[i]; return false; } //To handle force change font switch function afcforcechangehandle(obj) { if (obj.is(':checked') && jj('.fontselection').afcdropdown('get value') != 'none') { afc_allElems[afc_lockedElement].properties.fontName.forceChangeFont = '1'; getFJ().css({ 'font-family': '' }).attr('style', function (i, s) { return s + 'font-family: ' + jj('.fontselection').afcdropdown('get value') + ' !important;'; }); } else if (obj.is(':checked') && jj('.fontselection').afcdropdown('get value') == 'none') { afcRunModal(afc_strings.noelemselected); obj.prop('checked', false); } else if (!obj.is(':checked')) { afc_allElems[afc_lockedElement].properties.fontName.forceChangeFont = '0'; removeForceChecked(); } } //To reset force change switch function removeForceChecked() { jj('.afcwrap .afcforcechange').prop('checked', false); getFJ().css('font-family', ''); getFJ().attr('style', function (i, s) { return s + 'font-family: ' + jj('.fontselection').afcdropdown('get value') + ';'; }); } //To handle 'font size change buttons' functionality in editor function sizeButtons(job, target, property) { if (job == 'inc') { increaseInterval = window.setInterval(function () { if (afc_lockedElement != -1) { var newSize = parseInt(jj(target).text()) + 1; jj(target).text(newSize); getFJ().css(property, newSize + 'px'); if (property == 'font-size') afc_allElems[afc_lockedElement].properties.fontSize = newSize; } }, 110); } else if (job == 'dec') { decreaseInterval = setInterval(function () { if (afc_lockedElement != -1) { if (parseInt(jj(target).text()) > 0) { var newSize = parseInt(jj(target).text()) - 1; jj(target).text(newSize); getFJ().css(property, newSize + 'px'); if (property == 'font-size') afc_allElems[afc_lockedElement].properties.fontSize = newSize; } } }, 110); } } //To handle font weight change function afcChangeFW(fontWeight) { if (fontWeight != 'none') { getFJ().css('font-weight', fontWeight); afc_allElems[afc_lockedElement].properties.fontWeight = fontWeight; } else { resetProperties(['fontWeight']); } } //To handle font style change function afcChangeFS(fontStyle) { if (fontStyle != 'none') { getFJ().css('font-style', fontStyle); afc_allElems[afc_lockedElement].properties.fontStyle = fontStyle; } else { resetProperties(['fontStyle']); } } //To change the color when user changes it in wp-color-picker function changeTheColor(ui, property) { if (property == 'textcolor') { getFJ().css({ 'color': '' }).attr('style', function (i, s) { if (typeof s != 'undefined') { var temp = s; if (s.indexOf('color') != -1) { temp = s.replace(/color([0-9a-zA-Z# :)(,])*;/g, ''); } return temp + 'color:' + ui.color.toString() + ';'; } else { return 'color:' + ui.color.toString() + ';'; } }); afc_allElems[afc_lockedElement].properties.textColor = ui.color.toString(); } else if (property == 'shadowcolor') { var isDefined = (typeof afc_allElems[afc_lockedElement].properties.textShadow != 'undefined') , shadowVals = getShadowVals() , color = ui.color.toString(); changeShadowInlineProperties(shadowVals, color); if (!isDefined) afc_allElems[afc_lockedElement].properties.textShadow = { hshadow: 0, vshadow: 0, blur: 0, color: color }; else afc_allElems[afc_lockedElement].properties.textShadow.color = color; } } //To adding css text decoration to selected element function afcInsertTD(textDecor) { if (textDecor != 'unset') { getFJ().css('text-decoration', textDecor); afc_allElems[afc_lockedElement].properties.textDecoration = textDecor; } else { resetProperties(['textDecoration']); } } //To handle text shadow size buttons functionality in editor function shadowSizeButtons(job, target, property) { if (afc_lockedElement != -1) { var isDefined = (typeof afc_allElems[afc_lockedElement].properties.textShadow != 'undefined') , isInc = (job == 'inc') , isDec = (job == 'dec') , shadowVals = getShadowVals() , color = (isDefined) ? afc_allElems[afc_lockedElement].properties.textShadow.color : ''; switch (property) { case 'h-shadow': if (isInc) shadowVals[0] += 1; else if (isDec) shadowVals[0] -= 1; jj(target).text(shadowVals[0]); if (isDefined) afc_allElems[afc_lockedElement].properties.textShadow.hshadow = shadowVals[0]; else afc_allElems[afc_lockedElement].properties.textShadow = { hshadow: shadowVals[0], vshadow: 0, blur: 0, color: '' }; break; case 'v-shadow': if (isInc) shadowVals[1] += 1; else if (isDec) shadowVals[1] -= 1; jj(target).text(shadowVals[1]); if (isDefined) afc_allElems[afc_lockedElement].properties.textShadow.vshadow = shadowVals[1]; else afc_allElems[afc_lockedElement].properties.textShadow = { hshadow: 0, vshadow: shadowVals[1], blur: 0, color: '' }; break; case 'blur': if (isInc) shadowVals[2] += 1; else if (isDec && shadowVals[2] > 0) shadowVals[2] -= 1; jj(target).text(shadowVals[2]); if (isDefined) afc_allElems[afc_lockedElement].properties.textShadow.blur = shadowVals[2]; else afc_allElems[afc_lockedElement].properties.textShadow = { hshadow: 0, vshadow: 0, blur: shadowVals[2], color: '' }; break; } changeShadowInlineProperties(shadowVals, color); } } //Returns shadow properties values function getShadowVals() { var hshadow = parseInt(jj('.afctxth-shadow').text()) , vshadow = parseInt(jj('.afctxtv-shadow').text()) , blur = parseInt(jj('.afcshadow-blur').text()); return [hshadow, vshadow, blur]; } //To edit text shadow properties function changeShadowInlineProperties(shadowVals, color, selector) { var isEmpty = 1 , selectorName = (typeof selector != 'undefined') ? selector : afc_allElems[afc_lockedElement].selectorName , currentInlineCSS = getFJ('.afccss').text() , code = '/*eots*/'; for (var i in shadowVals) if (parseInt(shadowVals[i]) != 0) { isEmpty = 0; break; } var tShadow = (!isEmpty || color != '') ? 'text-shadow: ' + shadowVals[0] + 'px ' + shadowVals[1] + 'px ' + shadowVals[2] + 'px ' + color + ';' : ''; if (isEmpty && color == '') { delete afc_allElems[afc_lockedElement].properties.textShadow; } if (currentInlineCSS.indexOf(selectorName) >= 0) { var selectorsList = currentInlineCSS.split('/*eos*/'); for (var i = 0; i < selectorsList.length; i++) { var thisSelectorTS = selectorsList[i].substring(selectorsList[i].indexOf('text-shadow'), selectorsList[i].indexOf(code)); if (selectorsList[i].indexOf(selectorName) >= 0) { selectorsList[i] = selectorsList[i].replace(thisSelectorTS + code, ''); } } for (var i in selectorsList) if (selectorsList[i].trim != '') selectorsList[i] = selectorsList[i] + '/*eos*/'; getFJ('.afccss').text(selectorsList.join(' ')); } getFJ(selectorName).attr('style', function (i, s) { if (typeof s != 'undefined') { var temp = s; if (s.indexOf('text-shadow') != -1) { temp = s.replace(/text-shadow([0-9a-zA-Z# :)(,])*;/g, ''); } return temp + tShadow; } else { return tShadow; } }); } //To handle switch tabs buttons in editor function afcSwitchTab() { if (afc_activeTab == 1) { jj('.afcwrap .group2').stop(true,true).fadeIn(); jj('.afcwrap .group1').stop(true, true).fadeOut(); afc_activeTab = 2; } else if (afc_activeTab == 2) { jj('.afcwrap .group1').stop(true, true).fadeIn(); jj('.afcwrap .group2').stop(true, true).fadeOut(); afc_activeTab = 1; } } //To show choosen property in editor function afcShowProperty(val) { for (var i in afc_data_obj.propertyList) { jj('.afcwrap .databox .' + i).css('display', 'none'); } jj('.afcwrap .databox .' + val).css('display', 'block'); } //To check if user is loggedin or not function isLoggedIn() { var info = jj.ajax({ async: false, url: afc_data_obj.ajax_url, type: 'POST', data: { 'action': 'afc_ajax', 'afcnonce': afc_data_obj.afcnonce, 'afcaction': 'logincheck' }, error: function (data) { afcRunModal(afc_strings.connectionfailed); } }); if (info.responseText.indexOf('afc Logged In') != -1) { return true; } else if (info.responseText.indexOf('afc Not Logged In') != -1) { afcRunModal(afc_strings.pleaselogin); return false; } else { afcRunModal(afc_strings.servererror + ": \n" + info.responseText); return false; } } //To return object in frame function getFJ(selector) { if (typeof selector != 'undefined') return framejQuery(selector); else return framejQuery(afc_allElems[afc_lockedElement].selectorName) } //To run modal, for showing message to user function afcRunModal(message) { jj(".ui.modal .description").text(message); jj(".ui.modal").modal('setting', 'transition', 'horizontal flip').modal('show'); } //To show waiting function afcWaiting(status) { if(status == 'show') jj('.afcwaiting').css('display', 'block'); else jj('.afcwaiting').css('display', 'none'); } /* * Helper function */ //To create a deepcopy of an array function deepCopy(obj) { if (Object.prototype.toString.call(obj) === '[object Array]') { var out = [], i = 0, len = obj.length; for (; i < len; i++) { out[i] = arguments.callee(obj[i]); } return out; } if (typeof obj === 'object') { var out = {}, i; for (i in obj) { out[i] = arguments.callee(obj[i]); } return out; } return obj; } //To print given array or object function print_r(printthis, returnoutput) { var output = ''; if (jj.isArray(printthis) || typeof (printthis) == 'object') { for (var i in printthis) { output += i + ' : ' + print_r(printthis[i], true) + '\n'; } } else { output += printthis; } if (returnoutput && returnoutput == true) { return output; } else { alert(output); } } //To check if an object is empty or not function isNotEmpty(object) { for (var i in object) { return true; } return false; }