%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/js/landing/ui/ |
| Current File : /home/bitrix/www/bitrix/js/landing/ui/style_node.js |
;(function() {
"use strict";
BX.namespace("BX.Landing.UI");
var isString = BX.Landing.Utils.isString;
/**
* Implements interface for works with style node
*
* @param {{
* id: [string],
* node: HTMLElement|HTMLElement[],
* selector: string,
* relativeSelector: string,
* property: string,
* [onClick]: function,
* iframe: HTMLIFrameElement|Window
* }} options
*
* @constructor
*/
BX.Landing.UI.Style = function(options)
{
this.node = "node" in options ? options.node : null;
this.id = "id" in options ? options.id : null;
this.selector = "selector" in options ? options.selector : null;
this.relativeSelector = "relativeSelector" ? options.relativeSelector : null;
this.clickHandler = "onClick" in options ? options.onClick : (function() {});
this.iframe = "iframe" in options ? options.iframe : null;
this.affects = new BX.Landing.Collection.BaseCollection();
this.onFrameLoad();
};
BX.Landing.UI.Style.prototype = {
/**
* Handles iframe load event
*/
onFrameLoad: function()
{
if (!this.node)
{
this.node = this.getNode(true);
this.currentTarget = this.node[0];
}
this.node.forEach(function (node) {
node.addEventListener("click", this.onClick.bind(this));
node.addEventListener("mouseover", this.onMouseEnter.bind(this));
node.addEventListener("mouseleave", this.onMouseLeave.bind(this));
}, this);
this.value = this.getValue();
},
getNode: function(all)
{
var elements = [].slice.call(this.iframe.document.querySelectorAll(this.relativeSelector));
if (this.isSelectGroup() || all)
{
return elements;
}
return this.currentTarget ? [elements[this.getElementIndex(this.currentTarget)]] : [];
},
getElementIndex: function(element)
{
return [].indexOf.call(this.getNode(true), element);
},
/**
* Handles node click event
* @param {MouseEvent} event
*/
onClick: function(event)
{
if (BX.Landing.UI.Panel.StylePanel.getInstance().isShown())
{
event.preventDefault();
event.stopPropagation();
this.currentTarget = event.currentTarget;
this.clickHandler();
}
},
/**
* Handles mouse enter event on node
* @param {MouseEvent} event
*/
onMouseEnter: function(event)
{
event.preventDefault();
event.stopPropagation();
this.highlight(event.currentTarget);
},
/**
* Handles mouse leave event on node
* @param {MouseEvent} event
*/
onMouseLeave: function(event)
{
event.preventDefault();
event.stopPropagation();
this.unHighlight();
var node = BX.type.isArray(this.node) && this.node.length ? this.node[0] : this.node;
BX.fireEvent(node.parentNode, "mouseenter");
},
isSelectGroup: function()
{
return window.localStorage.getItem("selectGroup") === "true";
},
/**
* Highlights this node
* @param {HTMLElement|Node} target
*/
highlight: function(target)
{
if (BX.Landing.UI.Panel.StylePanel.getInstance().isShown())
{
if (this.isSelectGroup())
{
target = this.node;
}
BX.Landing.UI.Highlight.getInstance().show(target);
}
},
/**
* Hides highlight for this node
*/
unHighlight: function()
{
BX.Landing.UI.Highlight.getInstance().hide();
},
/**
* Checks that this node style is changed
* @returns {*}
*/
isChanged: function()
{
return JSON.stringify(this.value) !== JSON.stringify(this.getValue());
},
/**
* Sets node value
* @param {string|object.<string>} value className
* @param {object[]} items
* @param {string} postfix
* @param {string} affect
* @param {object} [exclude]
*/
setValue: function(value, items, postfix, affect, exclude)
{
this.lastValue = this.lastValue || this.getValue();
if (!!value && BX.type.isArray(items))
{
affect = !!affect ? affect : "";
if (typeof value === "object")
{
if ("from" in value && "to" in value)
{
value.from += "-min";
value.to += "-max";
}
var keys = Object.keys(value);
value = keys.map(function(key) {
return value[key];
});
}
else
{
value = [value];
}
if (affect.length)
{
if (affect !== "background-image")
{
this.affects.add(affect);
}
}
this.getNode().forEach(function(node) {
value.forEach(function(valueItem) {
items.forEach(function(item) {
if (value.indexOf(item.value) === -1 &&
value.indexOf(item.value+"-min") === -1 &&
value.indexOf(item.value+"-max") === -1)
{
node.classList.remove(item.value);
node.classList.remove(item.value+"-min");
node.classList.remove(item.value+"-max");
}
});
if (affect)
{
node.style[affect] = null;
if (affect !== "background-image")
{
[].slice.call(node.querySelectorAll("*")).forEach(function(child) {
child.style[affect] = null;
if (affect === "color")
{
child.removeAttribute("color");
}
});
}
}
node.classList.add(valueItem);
}, this);
if (exclude)
{
exclude.items.forEach(function(item) {
node.classList.remove(item.value);
});
}
});
}
},
/**
* Gets style node value
* @returns {{classList: string[], affect: ?string}}
*/
getValue: function()
{
return {
classList: this.getNode().length ? this.getNode()[0].className.split(" ") : [],
affect: this.affects.toArray()
};
}
};
})();