/*! elementor - v3.27.0 - 16-02-2025 */ /*! For license information please see editor-modules.min.js.LICENSE.txt */ (()=>{var t={24617:(t,r,o)=>{"use strict";var i=o(12470).__,a=o(96784);Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;a(o(64537));var l=a(o(10564)),u=a(o(18821)),c=a(o(39805)),d=a(o(40989)),p=a(o(15118)),h=a(o(29402)),v=a(o(87861)),y=a(o(85707)),g=a(o(82946)),m=a(o(7568)),_=a(o(87705));function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t})()}var b=r.default=function(t){function Container(t){var r;if((0,c.default)(this,Container),r=function _callSuper(t,r,o){return r=(0,h.default)(r),(0,p.default)(t,_isNativeReflectConstruct()?Reflect.construct(r,o||[],(0,h.default)(t).constructor):r.apply(t,o))}(this,Container,[t]),(0,y.default)(r,"type",void 0),(0,y.default)(r,"id",void 0),(0,y.default)(r,"document",void 0),(0,y.default)(r,"model",void 0),(0,y.default)(r,"settings",void 0),(0,y.default)(r,"view",void 0),(0,y.default)(r,"parent",void 0),(0,y.default)(r,"children",new _.default),(0,y.default)(r,"dynamic",void 0),(0,y.default)(r,"globals",void 0),(0,y.default)(r,"label",void 0),(0,y.default)(r,"controls",{}),(0,y.default)(r,"repeaters",{}),(0,y.default)(r,"renderer",void 0),(0,y.default)(r,"panel",void 0),(0,y.default)(r,"placeholders",{}),r.validateArgs(t),0===(t=Object.entries(t)).length)throw Error("Container cannot be empty.");return t.forEach((function(t){var o=(0,u.default)(t,2),i=o[0],a=o[1];r[i]=void 0===a?r[i]:a})),void 0===r.renderer&&(r.renderer=r),r.document||(r.document=elementor.documents.getCurrent()),r.dynamic=new Backbone.Model(r.settings.get("__dynamic__")),r.globals=new Backbone.Model(r.settings.get("__globals__")),r.panel=new m.default(r),r.initialize(),r}return(0,v.default)(Container,t),(0,d.default)(Container,[{key:"initialize",value:function initialize(){this.isViewElement()&&(this.addToParent(),this.handleChildrenRecursive(),this.view.on("destroy",this.removeFromParent.bind(this))),this.handleRepeaterChildren()}},{key:"validateArgs",value:function validateArgs(t){this.requireArgumentType("type","string",t),this.requireArgumentType("id","string",t),this.requireArgumentInstance("settings",Backbone.Model,t),this.requireArgumentInstance("model",Backbone.Model,t),!1!==t.parent&&this.requireArgumentInstance("parent",elementorModules.editor.Container,t)}},{key:"getGroupRelatedControls",value:function getGroupRelatedControls(t){var r=this,o={};return Object.keys(t).forEach((function(t){Object.values(r.controls).forEach((function(i){var a;if(t===i.name)o[i.name]=i;else if(null!==(a=r.controls[t])&&void 0!==a&&a.groupPrefix){var l=r.controls[t].groupPrefix;i.name.toString().startsWith(l)&&(o[i.name]=i)}}))})),o}},{key:"getAffectingControls",value:function getAffectingControls(){var t=this,r={},o=this.settings.getActiveControls();return Object.entries(o).forEach((function(o){var i,a=(0,u.default)(o,2),c=a[0],d=a[1],p=t.settings.get(d.name);if(d.global&&(null==p||!p.length)&&(null!==(i=t.globals.get(d.name))&&void 0!==i&&i.length||t.getGlobalDefault(c).length))return d.global.utilized=!0,void(r[c]=d);if(d.dynamic&&t.dynamic.get(c))return d.dynamic.utilized=!0,void(r[c]=d);p!==d.default&&p&&("object"===(0,l.default)(p)&&Object.values(p).join()===Object.values(d.default).join()||(r[c]=d))})),r}},{key:"getParentAncestry",value:function getParentAncestry(){for(var t=[],r=this;r;)t.push(r),r=r.parent;return t}},{key:"handleChildrenRecursive",value:function handleChildrenRecursive(){var t;null!==(t=this.view.children)&&void 0!==t&&t.length?Object.values(this.view.children._views).forEach((function(t){if(t.container){var r=t.container;r.parent.children&&(r.parent.children[t._index]=r),r.handleChildrenRecursive()}})):this.children.clear()}},{key:"addToParent",value:function addToParent(){this.parent.children&&!this.isRepeaterItem()&&this.parent.children.splice(this.view._index,0,this)}},{key:"removeFromParent",value:function removeFromParent(){var t=this;this.parent.children&&!this.isRepeater()&&(this.parent.children=this.parent.children.filter((function(r){return r.id!==t.id})))}},{key:"handleRepeaterChildren",value:function handleRepeaterChildren(){var t=this;if(Object.values(this.controls).forEach((function(r){if(r.is_repeater){var o=new Backbone.Model({name:r.name});t.repeaters[r.name]=new elementorModules.editor.Container({type:Container.TYPE_REPEATER,id:r.name,model:o,settings:o,view:t.view,parent:t,label:r.label||r.name,controls:{},renderer:t.renderer}),t.settings.get(r.name).forEach((function(o,i){t.addRepeaterItem(r.name,o,i)}))}})),["widget","document"].includes(this.type)){var r=Object.values(this.controls).filter((function(t){return"repeater"===t.type}));this.model.get("supportRepeaterChildren")||1!==r.length||Object.defineProperty(this,"children",{get:function get(){return elementorDevTools.deprecation.deprecated("children","3.0.0","container.repeaters[ repeaterName ].children"),this.repeaters[r[0].name].children}})}}},{key:"addRepeaterItem",value:function addRepeaterItem(t,r,o){var a=r.get("_id");return a||(a="bc-"+elementorCommon.helpers.getUniqueId(),r.set("_id",a)),this.repeaters[t].children.splice(o,0,new elementorModules.editor.Container({type:Container.TYPE_REPEATER_ITEM,id:r.get("_id"),model:new Backbone.Model({name:t}),settings:r,view:this.view,parent:this.repeaters[t],label:this.label+" "+i("Item","elementor"),controls:r.options.controls,renderer:this.renderer})),this.repeaters[t]}},{key:"lookup",value:function lookup(){var t,r=this;if(!this.renderer)return this;if(this!==this.renderer&&null!==(t=this.renderer.view)&&void 0!==t&&t.isDisconnected&&this.renderer.view.isDisconnected()&&(this.renderer=this.renderer.lookup()),void 0===this.view||!this.view.lookup||!this.view.isDisconnected())return Container.TYPE_REPEATER_ITEM===this.type&&(this.settings=this.parent.parent.settings.get(this.model.get("name")).findWhere({_id:this.id})),r;var lookup=this.view.lookup();if(lookup){if(r=lookup.getContainer(),Container.REPEATER===this.type)return this.settings=r.settings.get(this.model.get("name")).findWhere({_id:this.id}),this;r.parent.children&&(r.parent.children[r.view._index]=r)}return r}},{key:"findChildrenRecursive",value:function findChildrenRecursive(t){return elementorDevTools.deprecation.deprecated("container.findChildrenRecursive( callback )","3.5.0","container.children.findRecursive( callback )"),this.children.findRecursive(t)}},{key:"forEachChildrenRecursive",value:function forEachChildrenRecursive(t){return elementorDevTools.deprecation.deprecated("container.forEachChildrenRecursive( callback )","3.5.0","container.children.forEachRecursive( callback )"),this.children.forEachRecursive(t)}},{key:"render",value:function render(){var t;this.renderer&&this.renderer.view.renderOnChange(this.settings,null===(t=this.view)||void 0===t?void 0:t.$el)}},{key:"renderUI",value:function renderUI(){this.renderer&&this.renderer.view.renderUI()}},{key:"isEditable",value:function isEditable(){return"edit"===elementor.channels.dataEditMode.request("activeMode")&&"open"===this.document.editor.status}},{key:"isDesignable",value:function isDesignable(){return elementor.userCan("design")&&this.isEditable()}},{key:"isGridContainer",value:function isGridContainer(){return"grid"===this.parent.settings.get("container_type")}},{key:"isLocked",value:function isLocked(){return this.model.get("isLocked")}},{key:"isRepeater",value:function isRepeater(){return Container.TYPE_REPEATER===this.type}},{key:"isRepeaterItem",value:function isRepeaterItem(){return Container.TYPE_REPEATER_ITEM===this.type}},{key:"isViewElement",value:function isViewElement(){return this.view&&this.model.get("elType")}},{key:"getSetting",value:function getSetting(t){var r,o=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=this.settings.get(t);return o?i:(this.getGlobalKey(t)&&(r=this.getGlobalValue(t)),r||i||this.getGlobalDefault(t))}},{key:"getGlobalKey",value:function getGlobalKey(t){return this.globals.get(t)}},{key:"getGlobalValue",value:function getGlobalValue(t){var r=this.controls[t],o=this.getGlobalKey(t),i=$e.data.commandExtractArgs(o),a=$e.data.getCache($e.components.get("globals"),i.command,i.args.query);if(null!=a&&a.value){var l,u=a.id;if(r.groupType){var c=elementor.breakpoints.getActiveMatchRegex(),d=r.name.replace(r.groupPrefix,"").replace(c,"");if(!a.value[elementor.config.kit_config.typography_prefix+d])return;d=d.replace("_","-"),l="var( --e-global-".concat(r.groupType,"-").concat(u,"-").concat(d," )"),elementor.config.ui.defaultGenericFonts&&r.groupPrefix+"font_family"===r.name&&(l+=", ".concat(elementor.config.ui.defaultGenericFonts))}else l="var( --e-global-".concat(r.type,"-").concat(u," )");return l}}},{key:"isGlobalApplied",value:function isGlobalApplied(t){return this.getSetting(t)!==this.settings.get(t)}},{key:"getGlobalDefault",value:function getGlobalDefault(t){var r,o=null===(r=this.controls[t])||void 0===r?void 0:r.global;if(null!=o&&o.default){var i=this.controls[t].type;if("color"===i&&(i="colors"),!elementor.config.globals.defaults_enabled[i])return"";var a=$e.data.commandExtractArgs(o.default),l=a.command,u=a.args,c=$e.data.getCache($e.components.get("globals"),l,u.query);return null==c?void 0:c.value}return""}}])}(g.default);(0,y.default)(b,"TYPE_REPEATER","repeater-control"),(0,y.default)(b,"TYPE_REPEATER_ITEM","repeater")},87705:(t,r,o)=>{"use strict";var i=o(96784);Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var a=i(o(39805)),l=i(o(40989)),u=i(o(15118)),c=i(o(29402)),d=i(o(87861)),p=i(o(22835));function _createForOfIteratorHelper(t,r){var o="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!o){if(Array.isArray(t)||(o=function _unsupportedIterableToArray(t,r){if(t){if("string"==typeof t)return _arrayLikeToArray(t,r);var o={}.toString.call(t).slice(8,-1);return"Object"===o&&t.constructor&&(o=t.constructor.name),"Map"===o||"Set"===o?Array.from(t):"Arguments"===o||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o)?_arrayLikeToArray(t,r):void 0}}(t))||r&&t&&"number"==typeof t.length){o&&(t=o);var i=0,a=function F(){};return{s:a,n:function n(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function e(t){throw t},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var l,u=!0,c=!1;return{s:function s(){o=o.call(t)},n:function n(){var t=o.next();return u=t.done,t},e:function e(t){c=!0,l=t},f:function f(){try{u||null==o.return||o.return()}finally{if(c)throw l}}}}function _arrayLikeToArray(t,r){(null==r||r>t.length)&&(r=t.length);for(var o=0,i=Array(r);o{"use strict";var i=o(96784);Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var a=i(o(39805)),l=i(o(40989));r.default=function(){return(0,l.default)((function Panel(t){(0,a.default)(this,Panel),this.container=t}),[{key:"refresh",value:function refresh(){$e.routes.isPartOf("panel/editor")&&$e.routes.refreshContainer("panel")}},{key:"closeEditor",value:function closeEditor(){$e.route("panel/elements/categories")}},{key:"getControlView",value:function getControlView(t){return elementor.getPanelView().getCurrentPageView().children.findByModelCid(this.getControlModel(t).cid)}},{key:"getControlModel",value:function getControlModel(t){return elementor.getPanelView().getCurrentPageView().collection.findWhere({name:t})}}])}()},38828:(t,r,o)=>{"use strict";var i,a=o(96784)(o(10564));i=Backbone.Model.extend({options:{},initialize:function initialize(t,r){var o=this;if(o.options=r,o.controls=elementor.mergeControlsSettings(r.controls),o.validators={},o.controls){var i=t||{},l={};_.each(o.controls,(function(t){if(!(t.features&&-1!==t.features.indexOf("ui"))){var r=t.name;"object"===(0,a.default)(t.default)?l[r]=structuredClone(t.default):l[r]=t.default;var u=t.dynamic&&t.dynamic.active,c=u&&i.__dynamic__&&i.__dynamic__[r];u&&!c&&t.dynamic.default&&(i.__dynamic__||(i.__dynamic__={}),i.__dynamic__[r]=t.dynamic.default,c=!0);var d=jQuery.isPlainObject(t.default);void 0===i[r]||!d||_.isObject(i[r])||c||(elementorCommon.debug.addCustomError(new TypeError("An invalid argument supplied as multiple control value"),"InvalidElementData","Element `"+(o.get("widgetType")||o.get("elType"))+"` got <"+i[r]+"> as `"+r+"` value. Expected array or object."),delete i[r]),void 0===i[r]&&(i[r]=l[r])}})),o.defaults=l,o.handleRepeaterData(i),o.set(i)}},convertRepeaterValueToCollection:function convertRepeaterValueToCollection(t,r){return new Backbone.Collection(t[r.name],{model:function model(t,o){return(o=o||{}).controls={},Object.values(r.fields).forEach((function(t){o.controls[t.name]=t})),t._id||(t._id=elementorCommon.helpers.getUniqueId()),new i(t,o)}})},handleRepeaterData:function handleRepeaterData(t){var r=this;_.each(this.controls,(function(o){o.is_repeater&&(t[o.name]instanceof Backbone.Collection||(t[o.name]=r.convertRepeaterValueToCollection(t,o)))}))},getFontControls:function getFontControls(){return this.getControlsByType("font")},getIconsControls:function getIconsControls(){return this.getControlsByType("icons")},getControlsByType:function getControlsByType(t){return _.filter(this.getActiveControls(),(function(r){return t===r.type}))},getStyleControls:function getStyleControls(t,r){var o=this;t=structuredClone(o.getActiveControls(t,r));var i=[];return jQuery.each(t,(function(){var r,a=this,l=elementor.config.controls[a.type];if((a=jQuery.extend({},l,a)).fields){var u=[];o.attributes[a.name]instanceof Backbone.Collection||(o.attributes[a.name]=o.convertRepeaterValueToCollection(o.attributes,a)),o.attributes[a.name].each((function(t){u.push(o.getStyleControls(a.fields,t.attributes))})),a.styleFields=u}(a.fields||null!==(r=a.dynamic)&&void 0!==r&&r.active||o.isGlobalControl(a,t)||o.isStyleControl(a.name,t))&&i.push(a)})),i},isGlobalControl:function isGlobalControl(t,r){var o,i,a=t.name;t.groupType&&(a=t.groupPrefix+t.groupType);var l=r[a];return!(null==l||null===(o=l.global)||void 0===o||!o.active)&&!!(null===(i=this.attributes.__globals__)||void 0===i?void 0:i[a])},isStyleControl:function isStyleControl(t,r){r=r||this.controls;var o=_.find(r,(function(r){return t===r.name}));return o&&!_.isEmpty(o.selectors)},getClassControls:function getClassControls(t){return t=t||this.controls,_.filter(t,(function(t){return!_.isUndefined(t.prefix_class)}))},isClassControl:function isClassControl(t){var r=_.find(this.controls,(function(r){return t===r.name}));return r&&!_.isUndefined(r.prefix_class)},getControl:function getControl(t){return _.find(this.controls,(function(r){return t===r.name}))},getActiveControls:function getActiveControls(t,r){var o={};return t||(t=this.controls),r||(r=this.attributes),r=this.parseGlobalSettings(r,t),jQuery.each(t,(function(i,a){elementor.helpers.isActiveControl(a,r,t)&&(o[i]=a)})),o},clone:function clone(){return new i(elementorCommon.helpers.cloneObject(this.attributes),elementorCommon.helpers.cloneObject(this.options))},setExternalChange:function setExternalChange(t,r){var o,i=this;"object"===(0,a.default)(t)?o=t:(o={})[t]=r,i.set(o),jQuery.each(o,(function(t,r){i.trigger("change:external:"+t,r)}))},parseDynamicSettings:function parseDynamicSettings(t,r,o){var i=this;return t=elementorCommon.helpers.cloneObject(t||i.attributes),r=r||{},o=o||this.controls,jQuery.each(o,(function(){var o,a=this;if(a.is_repeater)(o=t[a.name]).forEach((function(t,l){o[l]=i.parseDynamicSettings(t,r,a.fields)}));else if(o=t.__dynamic__&&t.__dynamic__[a.name]){var l=a.dynamic;if(void 0===l&&(l=elementor.config.controls[a.type].dynamic),l&&l.active){var u;try{u=elementor.dynamicTags.parseTagsText(o,l,elementor.dynamicTags.getTagDataContent)}catch(t){if(elementor.dynamicTags.CACHE_KEY_NOT_FOUND_ERROR!==t.message)throw t;u="",r.onServerRequestStart&&r.onServerRequestStart(),elementor.dynamicTags.refreshCacheFromServer((function(){r.onServerRequestEnd&&r.onServerRequestEnd()}))}l.property?t[a.name][l.property]=u:t[a.name]=u}}})),t},parseGlobalSettings:function parseGlobalSettings(t,r){var o=this;return t=elementorCommon.helpers.cloneObject(t),r=r||this.controls,jQuery.each(r,(function(r,i){var a,l,u;if(i.is_repeater)(u=t[i.name]).forEach((function(t,r){u[r]=o.parseGlobalSettings(t,i.fields)}));else if(u=null===(a=t.__globals__)||void 0===a?void 0:a[i.name]){var c=i.global;if(void 0===c&&(c=elementor.config.controls[i.type].global),null!==(l=c)&&void 0!==l&&l.active){var d=$e.data.commandExtractArgs(u),p=d.command,h=d.args,v=$e.data.getCache($e.components.get("globals"),p,h.query);i.groupType?t[i.name]="custom":t[i.name]=v}}})),t},removeDataDefaults:function removeDataDefaults(t,r){var o=this;jQuery.each(t,(function(i){var a=r[i];a&&(a.save_default||("text"===a.type||"textarea"===a.type)&&t[i]||(a.is_repeater?t[i].forEach((function(t){o.removeDataDefaults(t,a.fields)})):_.isEqual(t[i],a.default)&&delete t[i]))}))},toJSON:function toJSON(t){var r=Backbone.Model.prototype.toJSON.call(this);return t=t||{},delete r.widgetType,delete r.elType,delete r.isInner,_.each(r,(function(t,o){t&&t.toJSON&&(r[o]=t.toJSON())})),t.remove&&-1!==t.remove.indexOf("default")&&this.removeDataDefaults(r,this.controls),structuredClone(r)}}),t.exports=i},53780:t=>{"use strict";var r;r=Marionette.Behavior.extend({onRenderCollection:function onRenderCollection(){this.handleInnerTabs(this.view)},handleInnerTabs:function handleInnerTabs(t){var r=t.children.filter((function(t){return"tabs"===t.model.get("type")}));_.each(r,(function(r){r.$el.find(".elementor-control-content").remove();var o=r.model.get("name"),i=t.children.filter((function(t){return"tab"===t.model.get("type")&&t.model.get("tabs_wrapper")===o}));_.each(i,(function(o,i){r._addChildView(o);var a=o.model.get("name"),l=t.children.filter((function(t){return a===t.model.get("inner_tab")}));0===i?o.$el.addClass("e-tab-active"):_.each(l,(function(t){t.$el.addClass("e-tab-close")}))}))}))},onChildviewControlTabClicked:function onChildviewControlTabClicked(t){var r="e-tab-close",o="e-tab-active",i=t.model.get("name"),a=this.view.children.filter((function(r){return"tab"!==r.model.get("type")&&t.model.get("tabs_wrapper")===r.model.get("tabs_wrapper")})),l=this.view.children.filter((function(r){return"tab"===r.model.get("type")&&t.model.get("tabs_wrapper")===r.model.get("tabs_wrapper")}));_.each(l,(function(t){t.$el.removeClass(o)})),t.$el.addClass(o),_.each(a,(function(t){t.model.get("inner_tab")===i?t.$el.removeClass(r):t.$el.addClass(r)})),elementor.getPanelView().updateScrollbar()}}),t.exports=r},15213:(t,r)=>{"use strict";function _createForOfIteratorHelper(t,r){var o="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!o){if(Array.isArray(t)||(o=function _unsupportedIterableToArray(t,r){if(t){if("string"==typeof t)return _arrayLikeToArray(t,r);var o={}.toString.call(t).slice(8,-1);return"Object"===o&&t.constructor&&(o=t.constructor.name),"Map"===o||"Set"===o?Array.from(t):"Arguments"===o||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o)?_arrayLikeToArray(t,r):void 0}}(t))||r&&t&&"number"==typeof t.length){o&&(t=o);var i=0,a=function F(){};return{s:a,n:function n(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function e(t){throw t},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var l,u=!0,c=!1;return{s:function s(){o=o.call(t)},n:function n(){var t=o.next();return u=t.done,t},e:function e(t){c=!0,l=t},f:function f(){try{u||null==o.return||o.return()}finally{if(c)throw l}}}}function _arrayLikeToArray(t,r){(null==r||r>t.length)&&(r=t.length);for(var o=0,i=Array(r);o{"use strict";var r=elementorModules.Module.extend({onInit:function onInit(){var t=this,r=jQuery(window);r.on("elementor:init-components",this.onElementorInitComponents.bind(this)),r.on("elementor:loaded",(function(){t.onElementorLoaded(),elementor.on("document:loaded",t.onDocumentLoaded.bind(t))})),r.on("elementor:init",this.onElementorReady)},getEditorControlView:function getEditorControlView(t){return elementor.getPanelView().getCurrentPageView().children.findByModelCid(this.getEditorControlModel(t).cid)},getEditorControlModel:function getEditorControlModel(t){return elementor.getPanelView().getCurrentPageView().collection.findWhere({name:t})},onElementorReady:function onElementorReady(){this.onElementorInit(),elementor.on("frontend:init",this.onElementorFrontendInit.bind(this)).on("preview:loaded",this.onElementorPreviewLoaded.bind(this))}});r.prototype.onElementorLoaded=function(){},r.prototype.onElementorInit=function(){},r.prototype.onElementorPreviewLoaded=function(){},r.prototype.onDocumentLoaded=function(){},r.prototype.onElementorFrontendInit=function(){},r.prototype.onElementorInitComponents=function(){},t.exports=r},33029:(t,r,o)=>{"use strict";var i=o(12470).__,a=o(96784);Object.defineProperty(r,"__esModule",{value:!0}),r.default=void 0;var l=a(o(85707)),u=a(o(39805)),c=a(o(40989));r.default=function(){return(0,c.default)((function ControlsPopover(t){(0,u.default)(this,ControlsPopover),this.child=t,this.$popover=jQuery("
",{class:"elementor-controls-popover"}),t.$el.before(this.$popover),this.$popover.append(t.$el),this.popoverToggleView=t._parent.children.findByIndex(t._index-1),"typography"===this.child.model.attributes.groupType&&this.createPopoverHeader()}),[{key:"addChild",value:function addChild(t){this.$popover.append(t.$el)}},{key:"createPopoverHeader",value:function createPopoverHeader(){var t=this,r=this.$popover.prev().find(".elementor-control-popover-toggle-reset-label");this.$popoverHeader=jQuery("
",{class:"e-group-control-header"}).html(""+i("Typography","elementor")+""),this.$headerControlsWrapper=jQuery("
",{class:"e-control-tools"}),r.addClass("e-control-tool").on("click",(function(){return t.onResetButtonClick()})),this.$headerControlsWrapper.append(r),this.$popoverHeader.append(this.$headerControlsWrapper);var o=this.popoverToggleView.model.get("global");null!=o&&o.active&&this.createAddButton(),this.$popover.prepend(this.$popoverHeader).addClass("e-controls-popover--typography")}},{key:"onResetButtonClick",value:function onResetButtonClick(){this.$popover.hide();var t=this.child.model.get("groupPrefix")+"typography",r={container:this.child.options.container,settings:(0,l.default)({},t,"")};this.child.options.container.globals.get(t)?$e.run("document/globals/disable",r):$e.run("document/elements/settings",r)}},{key:"onAddButtonClick",value:function onAddButtonClick(){this.popoverToggleView.onAddGlobalButtonClick()}},{key:"createAddButton",value:function createAddButton(){var t=this;this.$addButton=jQuery("

Turn Old Phone into a Security Camera (4 Easy Steps)

This site contains affiliate links to products. We may receive a commission for purchases made through these links.

So I have just upgraded my smartphone, meaning I have yet another phone ready to be thrown in the dusty drawer like the ten before.

However, this time I wondered, could I put the phone to use? Would it be possible to turn an old phone into a security camera?

So I did a little research and found it was absolutely possible, as well as being more simple than I thought. All that’s required is a security camera app, some kind of DIY stand, a power source and obviously a functioning phone. 

Let’s take a look at how you can make your own phone security camera. 

Table of Contents

Step-by-Step Guide

 

Step 1: Setting up your old phone

First of all, you are going to want to find old phones that can be used, however, make sure that they are updated, support a security camera app and most importantly have a functioning camera.

Although just about any phone can be used, I do recommend you use one with a fairly good camera, when I did it with an old LG phone the camera just wasn’t good enough to give any kind of useful video (didn’t help that it was smashed).

Step 2: Setting up the app

For the actual security camera aspect of this, you are going to need some kind of security camera app. Surprisingly there are actually many options available on both IOS and Android which all do quite a similar job.

But the three that stood out the most for me were: 

IP Webcam– As of testing the IP webcam it was only available on Android but is a good option for those with access to Android phones. It offers 2-way audio, motion detection, video storage, baby monitoring including night vision and sound detection. 

There were a couple of people saying that the app crashed if there were any more than three cameras connected, but for me, it worked pretty well for my one camera.

Security Camera CZ– I actually didn’t get the chance to try this app out however it is really well rated and offers some cool features like the customizable motion detection range, resistance to false alarms, night vision and torch features. 

The only drawback was that when it detects motion, it takes a series of pictures rather than recording it as a video.

Alfred Home Surveillance– Last but not least is Alfred, the one I personally recommend most and the one I will be using throughout the set-up process.

It offers many neat features like the other two, however, where it stands out most is its performance, 24/7 stream and unlimited cloud storage.  

How to use the Alfred app

If you go with my recommendation, download the Alfred app onto your day to day phone. 

Arrow pointing to the viewer setting option in Alfred app

You can either use your google, apple or email account to sign in. 

Once you sign in make sure to set the phone to “viewer” as this is the phone you will view the video recording on. 

You can then go ahead and do the same on your old phone but instead of setting it to view, select the camera option. 

From your camera phone, you will only be able to adjust a couple of settings such as the power saving setting, activating/deactivating motion detection and some basic video quality adjustments. 

To access the majority of the customizable settings you will need to do this through your viewer phone. Some of the settings you can customise include:

Trust circle- Trust circle allows you to add family or friends to the account giving them access to the video feed as well as the motion alerts.

To add another person simply click on “Add Account” within the trust circle, then just enter the person’s email address. 

Motion detection- This allows you to adjust the motion settings to suit your requirements. The sensitivity can be set between high, medium and low, I found medium worked best for me. 

If you don’t want to receive motion alerts while at home, reminders can be set to turn off motion detection when at home and back on again when you are out.     

Arrow pointing to settings icon in Alfred app
Arrow pointing to reminder icon

There are a couple of additional settings such as adjusting detection zones but these are only available to people with premium accounts, which I, unfortunately, didn’t have. 

Video resolution and lighting settings are also adjustable within the app, if you are actually planning on using it permanently it may be worth upgrading your account to get access to HD quality. But I didn’t feel it was necessary for what I was using it for. 

Now the fun part, when you access the live feed through your viewer phone, there is a list of buttons underneath the video that you can use. 

The speaker icon allows you to speak through your camera phones speaker to anyone nearby as well as allowing them to speak back. 

Speaker icon with arrow pointing to it

(Ignore the picture quality, I took these screenshots while using the smashed LG unfortunately )

If you press the arrow at the bottom right, another row of options will be available. 

Arrow menu
Live feed secondary options

The first two allows you to tilt and flip your camera feed and if you select the torch icon, it will switch the torch in your camera phone on. 

The moon icon allows you to change the lighting, it comes with a day view and night vision but I recommend just sticking with auto as it will adjust the camera to whatever view is best for that time of day.

And finally, my personal favourite, the last icon will allow you to turn a siren on maximum volume in your camera phone. It isn’t the most useful feature but is great for scaring your family and friends.  

Live feed Siren

Step 3: Choosing a spot to position your camera

Once you have your live feed sorted you will now need to think about the placement of your camera, which is completely up to you and what you plan to use it for. 

A couple of things to keep in mind are if you plan on using it 24/7, be sure to place it in range of a power socket as you don’t want to have to take it down to recharge it every day. 

Another thing to think about is placing it near lighting, although the night vision is pretty good the camera picture will always be better with surrounding lighting. 

It may seem obvious but make sure to try and hide it or place it out of reach of people if you plan on using it as a security camera. 

Step 4: How to mount and power your camera 

If you don’t mind spending a little bit of money then I really recommend investing in either a suction cup phone holder or a tripod stand, which will allow you to place the phone just about anywhere while making sure your phone is secure.

phone stand

I used a car phone mount with a suction cup, as I wanted to place it at the top of my window but there are many stands that would work just as well. 

The other option I recommended, the tripod stand, is ideal if you are placing the camera on a flat surface. Your phone will be more than secure in this. 

A cheap alternative would be to use double-sided sticky tape, which will allow you to stick and hide your phone just about anywhere you can think of. 

But if you don’t feel like buying any extras, just about anything can be turned into a phone holder with a little bit of thought.

nubelson fernandes S8xWhJFidWQ unsplash 1

When it comes to powering your phone the average USB charger won’t be long enough for the job at hand. To give you as much range as possible you might want to look into buying a 10 ft USB charger, this allowed me to place the phone high off the ground while also in the range of a power socket.

FAQ

Why use a DIY security camera 

As the technology and features in security cameras become more and more advanced, so does the price tag. If you are looking for a basic security camera without breaking the bank then turning an old phone into a security camera could be ideal.

It cuts out the need to spend 100-200 dollars on a premium camera and at the same time puts old phones to good use. 

Phone security cameras obviously won’t compete with professional security cameras when it comes to performance, specs, and features but as a cheap alternative, they can be perfect for keeping an eye on your children and pets.   

Can it be used outside?

While it is possible to use the camera outside, I personally wouldn’t recommend it for a couple of reasons. The first being that keeping it powered would be a challenge as getting it within range of a power socket may be difficult.

The second reason is that you are going to need some kind of waterproof case which both adds to the price of the camera and potentially will distort the video quality. 

And finally, if it’s placed outside, in view of strangers, the chances of it getting stolen or damaged are quite high.

For these reasons I just don’t feel it’s worth the time or money and would rather just spend that bit extra for a professional security camera, check out our list of best outdoor security cameras to find out more. 

How much does it cost?

While I have suggested a few additional extras like the 10 ft cable and a good camera stand, none of these is absolutely necessary and if you really wanted to it’s completely possible to do it for free (excluding the price of the phone).

But if you did opt for the extras as I did, then you could easily make it for around 20-30 dollars.  

How to make your own DIY phone stand?

To be honest, I only attempted to make a DIY stand but it did turn it okay, I used two binder clips. When they are placed inside each other, the phone can be sat between the two clips and does kind of work.  

Below is the video I used to make it from Noreva Projects along with a few other ideas but if you are like me and want to save a bit of time I recommend just paying a little extra for a phone stand.

Overall I had a lot of fun playing about and setting up the phone camera and I recommend you give it a go if you have an old phone lying around the house collecting dust.

It is an ideal alternative for home security on a tight budget. 

Did I Miss Anything?

It would be great to hear your thoughts. 

Which security camera app are you going to try out first? 

Or maybe I missed something you think is super important. 

Either way, let me know by leaving a comment below right now.

Leave a Comment

Your email address will not be published.

Special offer for our visitors

Get your Home Security Free Guide

We will never send you spam. By signing up for this you agree with our privacy policy and to receive regular updates via email in regards to industry news and promotions