personacontent-8.x-2.x-dev/js/personacontent.region.paragraph.js
js/personacontent.region.paragraph.js
(function (Drupal, $, drupalSettings, once) {
'use strict';
/**
* Global variables.
*/
var keyCache = 'personacontent--region--paragraph-5-';
Drupal.behaviors.personacontentRegionParagraph = {
attach: function (context, settings) {
$(once('personaDebug', 'html', context)).each(function () {
window.personaDebug.switchDebug(true);
});
$(once('once-personacontent--region--paragraph', '.personacontent--region--paragraph', context)).each(function () {
var region_id = $(this).attr('data-personacontent-region-paragraph-id');
if (typeof region_id !== typeof undefined && region_id !== false) {
// Check for cache.
var key = keyCache + region_id;
var segment_cache = localStorage.getItem(key);
if (false && segment_cache != null) {
segment_cache = JSON.parse(segment_cache);
var now = Math.round(new Date().getTime() / 1000);
if (parseInt(segment_cache.expire, 10) >= now) {
var segment = drupalSettings.personacontent_paragraph[region_id][segment_cache.i];
var segmentL = JSON.parse(JSON.stringify(segment));
personacontentRegionSegmentRender(segment.element, this, region_id, segment_cache.i, segmentL);
return true;
}
}
var segments = drupalSettings.personacontent_paragraph[region_id];
var segment_i = -1;
if (segments.length > 0) {
consoleLog('personacontent--region--paragraph - Processing ' + segments.length + ' Segments');
personacontentRegionSegmentProcess(segments, this, region_id, segment_i);
}
}
});
}
};
/**
* Debug encapsulation for debugging regions.
*/
function consoleLog() {
if (typeof drupalSettings.personacontent !== undefined) {
if (typeof drupalSettings.personacontent.screen_debug !== undefined) {
if (drupalSettings.personacontent.screen_debug == 1) {
console.log.apply(null, arguments);
}
}
}
}
function logStyle(style) {
switch (style) {
case '1':
return 'padding: 5px; background: yellow; color: black; font-weight: bold;';
case '1.2':
return 'padding: 5px; background: black; color: yellow; font-weight: bold;';
case '1.3':
return 'margin-left: 10px; padding: 5px; background: black; color: yellow; font-weight: bold;';
case '2':
return 'padding: 5px; background: aqua; color: black; font-weight: bold;';
case '2.2':
return 'padding: 5px 5px 5px 0; background: black; color: aqua; font-weight: bold;';
}
}
/**
* Process region element by id in queued mode.
*/
function personacontentRegionSegmentProcess(segments, region, region_id, segment_i) {
segment_i++;
// Process first segment available in array of segments.
var segment = segments.shift();
var segmentL = JSON.parse(JSON.stringify(segment));
consoleLog('%c SEGMENT ' + segment_i + ' %c' + segmentL.title, logStyle('1'), logStyle('2'), segmentL);
// If no rules, then this segment is valid already.
if (segment.rules.length == 0) {
consoleLog('%c - %c No rules, found valid by default', logStyle('1'), logStyle('1.2'));
return personacontentRegionSegmentRender(segment.element, region, region_id, segment_i, segmentL);
}
// Process the segment item.
segment.rules_validation = [];
segment.rules_count = parseInt(segment.rules.length, 10);
// Process.
personacontentRegionSegmentProcessRules(segment, segments, region, region_id, segment_i, segmentL);
}
/**
* Process one segment out of the region.
*/
function personacontentRegionSegmentProcessRules(segment, segments, region, region_id, segment_i, segmentL) {
// Process first rule available in array of rules.
var rule = segment.rules.shift();
var ruleL = JSON.parse(JSON.stringify(rule));
consoleLog('%c * Rule ', logStyle('1.2'), ruleL);
switch (rule.type) {
// Url comparisons.
case 'url:current':
personacontentRegionElementIsSegmentValidUrlCurrent(rule, segment, segments, region, region_id, segment_i, segmentL);
break;
case 'url:referer':
personacontentRegionElementIsSegmentValidUrlReferer(rule, segment, segments, region, region_id, segment_i, segmentL);
break;
case 'url:history':
personacontentRegionElementIsSegmentValidUrlHistory(rule, segment, segments, region, region_id, segment_i, segmentL);
break;
case 'event:click':
personacontentRegionElementIsSegmentValidEvent(rule, segment, segments, region, region_id, segment_i, segmentL);
break;
case 'location:city':
case 'location:state':
case 'location:region':
case 'location:country':
case 'location:zipcodes':
personacontentRegionElementIsSegmentValidLocation(rule, segment, segments, region, region_id, segment_i, segmentL);
break;
default:
// Verify if there are more rules to validate.
var result = false;
segment.rules_validation.push(result);
if (parseInt(segment.rules.length) > 0) {
consoleLog('%c --- %c Result = %c FALSE %c Skiping, Validating next rule', logStyle('1'), logStyle('1.2'), logStyle('2.2'), logStyle('1.2'), false);
personacontentRegionSegmentProcessRules(segment, segments, region, region_id, segment_i, segmentL);
}
else {
//personacontentRegionSegmentProcess.
consoleLog('%c --- %c Result = %c FALSE %c Skiping, Checking Rules Summary', logStyle('1'), logStyle('1.2'), logStyle('2.2'), logStyle('1.2'), false);
personacontentRegionSegmentProcessItemRulesResult(segment, segments, region, region_id, segment_i, segmentL);
}
break;
}
}
/**
* Evaluate all rules results after validating all rules.
*/
function personacontentRegionSegmentProcessItemRulesResult(segment, segments, region, region_id, segment_i, segmentL) {
// Evaluate rules_matches.
var valid = true;
$(segment.rules_validation).each(function (i, result) {
if (result) {
// If we need only one rule to apply, escape each().
if (segment.rules_matches == 'any') {
valid = true;
return false;
}
else if (segment.rules_matches == 'none') {
valid = false;
return false;
}
}
else {
valid = false;
// If all rules needs to apply and one fails, escape each().
if (segment.rules_matches == 'all') {
return false;
}
}
});
if (valid) {
personacontentRegionSegmentRender(segment.element, region, region_id, segment_i, segmentL);
}
else if (segments.length > 0) {
personacontentRegionSegmentProcess(segments, region, region_id, segment_i);
}
}
/**
* Process one item and reduces segments array.
*/
function personacontentRegionSegmentRender(element, region, region_id, segment_i, segment) {
// Render the element into page.
$(region).find('.personacontent-render').html(element);
Drupal.attachBehaviors($(region).find('.personacontent-render')[0]);
// Store in cache the choosen segment.
var key = keyCache + region_id;
var expire = Math.round(new Date().getTime() / 1000) + 3600;
var cache = JSON.stringify({'i': segment_i, 'expire': expire});
localStorage.setItem(key, cache);
// Screen.
window.personaDebug.screenPrint(segment);
$.event.trigger({
type: "personacontent-region-paragraph-ready"
});
return true;
}
/**
* Validates Location Rule.
*/
function personacontentRegionElementIsSegmentValidLocation(rule, segment, segments, region, region_id, segment_i, segmentL) {
var location;
// Get current location.
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function (position) {
var latlng = {
lat: position.coords.latitude,
lng: position.coords.longitude
};
var geocoder = new google.maps.Geocoder;
geocoder.geocode({'location': latlng}, function (results, status) {
if (status === 'OK') {
if (results[1]) {
var string = personacontentRegionGetFirstValue(rule.values);
location = results[1];
if (personacontentRegionElementIsSegmentValidUrlOperator(rule, location.formatted_address)) {
personacontentRegionElementIsSegmentValidLocationNext(true, segment, segments, region, region_id, segment_i, segmentL);
}
else {
personacontentRegionElementIsSegmentValidLocationNext(false, segment, segments, region, region_id, segment_i, segmentL);
}
}
else {
personacontentRegionElementIsSegmentValidLocationNext(false, segment, segments, region, region_id, segment_i, segmentL);
}
}
else {
personacontentRegionElementIsSegmentValidLocationNext(false, segment, segments, region, region_id, segment_i, segmentL);
}
});
}, function () {
personacontentRegionElementIsSegmentValidLocationNext(false, segment, segments, region, region_id, segment_i, segmentL);
});
}
else {
personacontentRegionElementIsSegmentValidLocationNext(false, segment, segments, region, region_id, segment_i, segmentL);
}
}
/**
* When validating Location proceeds to the next rule.
*/
function personacontentRegionElementIsSegmentValidLocationNext(valid, segment, segments, region, region_id, segment_i, segmentL) {
segment.rules_validation.push(valid);
// Verify if there are more rules to validate.
if (parseInt(segment.rules.length) > 0) {
personacontentRegionSegmentProcessRules(segment, segments, region, region_id, segment_i, segmentL);
}
else {
personacontentRegionSegmentProcessItemRulesResult(segment, segments, region, region_id, segment_i, segmentL);
}
}
/**
* Validates a referer url rule.
*/
function personacontentRegionElementIsSegmentValidUrlReferer(rule, segment, segments, region, region_id, segment_i, segmentL) {
var path = personacontentRegionGetUrlRefererPath();
var result = false;
if (path) {
result = personacontentRegionElementIsSegmentValidUrlOperator(rule, path);
}
var resultString = result ? 'TRUE' : 'FALSE';
consoleLog('%c --- Result =%c' + resultString, logStyle('1.2'), logStyle('2.2'));
segment.rules_validation.push(result);
// Verify if there are more rules to validate.
if (parseInt(segment.rules.length) > 0) {
personacontentRegionSegmentProcessRules(segment, segments, region, region_id, segment_i, segmentL);
}
else {
personacontentRegionSegmentProcessItemRulesResult(segment, segments, region, region_id, segment_i, segmentL);
}
}
/**
* Validates a current url rule.
*/
function personacontentRegionElementIsSegmentValidUrlCurrent(rule, segment, segments, region, region_id, segment_i, segmentL) {
var path = personacontentRegionGetUrlPath();
var result = personacontentRegionElementIsSegmentValidUrlOperator(rule, path);
var resultString = result ? 'TRUE' : 'FALSE';
consoleLog('%c - Rule Result =%c' + resultString, logStyle('1.2'), logStyle('2.2'));
segment.rules_validation.push(result);
// Verify if there are more rules to validate.
if (parseInt(segment.rules.length) > 0) {
personacontentRegionSegmentProcessRules(segment, segments, region, region_id, segment_i, segmentL);
}
else {
// Evaluate rules_matches.
personacontentRegionSegmentProcessItemRulesResult(segment, segments, region, region_id, segment_i, segmentL);
}
}
/**
* Validates a history url rule.
*/
function personacontentRegionElementIsSegmentValidUrlHistory(rule, segment, segments, region, region_id, segment_i, segmentL) {
// Get History.
var result = window.personaHistory.searchRule(rule);
var resultString = result ? 'TRUE' : 'FALSE';
consoleLog('%c - Rule Result =%c' + resultString, logStyle('1.2'), logStyle('2.2'));
segment.rules_validation.push(result);
// Verify if there are more rules to validate.
if (parseInt(segment.rules.length) > 0) {
personacontentRegionSegmentProcessRules(segment, segments, region, region_id, segment_i, segmentL);
}
else {
// Evaluate rules_matches.
personacontentRegionSegmentProcessItemRulesResult(segment, segments, region, region_id, segment_i, segmentL);
}
}
/**
* Validates an Event.
*/
function personacontentRegionElementIsSegmentValidEvent(rule, segment, segments, region, region_id, segment_i, segmentL) {
// Get events.
var result = window.personaEvents.searchRule(rule);
var resultString = result ? 'TRUE' : 'FALSE';
consoleLog('%c - Rule Result =%c' + resultString, logStyle('1.2'), logStyle('2.2'));
segment.rules_validation.push(result);
// Verify if there are more rules to validate.
if (parseInt(segment.rules.length) > 0) {
personacontentRegionSegmentProcessRules(segment, segments, region, region_id, segment_i, segmentL);
}
else {
// Evaluate rules_matches.
personacontentRegionSegmentProcessItemRulesResult(segment, segments, region, region_id, segment_i, segmentL);
}
}
/**
* Get first value out of the values textarea.
*/
function personacontentRegionGetFirstValue(values) {
var string = values + '';
string = string.split("\n");
string = string[0];
return string;
}
/**
* Validates a path apply to the operator rule.
*/
function personacontentRegionElementIsSegmentValidUrlOperator(rule, path) {
path = $.trim(path).replace('?', '\\?').replace('&', '\\&');
var result = false;
$(rule.values).each(function (i, value) {
var string = $.trim(value);
var resultString = result ? 'TRUE' : 'FALSE';
consoleLog('%c > Rule ValidUrlOperator: string=%c"' + string + '"%cvs path=%c"' + path + '"', logStyle('1.3'), logStyle('2.2'), logStyle('1.2'), logStyle('2.2'));
switch (rule.operator) {
case 'starts':
result = path.startsWith(string);
break;
case 'ends':
result = path.endsWith(string);
break;
case 'contains':
result = path.includes(string);
break;
}
if (result !== false) {
return false;
}
});
return result;
}
/**
* Get the referer url path.
*/
function personacontentRegionGetUrlRefererPath() {
if (document.referrer == '') {
return false;
}
var referer = document.referrer;
var matches = referer.match(/^\/?(.*)/);
var path = matches[1];
path = decodeURIComponent(path.replace(/\+/g, ' '));
return path;
}
/**
* Get the current url path.
*/
function personacontentRegionGetUrlPath() {
var path = window.location.pathname + window.location.search;
var matches = path.match(/^\/?(.*)/);
path = matches[1];
path = decodeURIComponent(path.replace(/\+/g, ' '));
return path;
}
})(Drupal, jQuery, drupalSettings, once);
