/**************************************************************
 * 
 *  Animated Box Web Component
 * 
 *************************************************************/

/**
 * Template structure and classes
 */
const templateAnimatedBox = document.createElement('template');
templateAnimatedBox.innerHTML = /*html*/`
    <style>

    :host {
            /**Main Container Element */
            --abContainerBackground: #fff;
            --abContainerBackgroundRadius: 50px 50px 50px 50px;
            --abContainerShadow: drop-shadow(2px 0px 8px rgba(0,0,0,0.10));
            --abContainerBorder: none;
            --abContainerBorderColor: none;
            --abContainerBorderHoverColor: none;
            --abContainerTextPadding: 0px;
            --abContainerPadding: 0px;
        
            /**Before Element */
            --abContainerBeforeBackground: #0b0b13;
            --abContainerBeforeLeft: -220px;
            --abContainerBeforeHoverLeft: -40px;
            --abContainerBeforeTop: -220px;
            --abContainerBeforeHoverTop: -220px;

            /**After Element */
            --abContainerAfterBackground: #ff9301;
            --abContainerAfterLeft: -40px;
            --abContainerAfterTop: -72px;

            /**H5 Title format */
            --abH5FontColor: #232323;
            --abH5TextAlign: left;
            --abH5FontFamily: inherit;
            --abH5FontSize: 1.25rem;
            --abH5FontBold: bold;
            --abH5FontItalic: none;
            --abH5FontHoverColor: #fff;
            --abH5Margins: 20px;
            
            /**Paragraph format */
            --abPFontColor: #232323;
            --abPTextAlign: left;
            --abPFontFamily: inherit;
            --abPFontSize: 1rem;
            --abPFontBold: normal;
            --abPFontItalic: none;
            --abPFontHoverColor: #fff;
            --abPMargins: 20px;


            /**Image FIle */
            --abImageIcon: none;
            --abImageAlign: left;
            --abImageWidth: 80px;
            --abImageHeight: 80px;
            --abImageMargin: 20px;

            /**Call to action */
            --abCTAFontFamily: inherit;
            --abCTAFontColor: #232323;
            --abCTAFontSize: inderit;
            --abCTAFontBold: normal;
            --abCTAFontItalic: none;
            --abCTABackgroundColor: #ffe12e;
            --abCTAMargins: 0px 0px 0px 0px;
            --abCTAPadding: 5px 5px 5px 5px;
            --abCTAAlign: left;
            --abCTAShow: block;
            --abCTABorderRadius: 0px;;
            --abCTAFontHoverColor: #ffffff;
            --abCTABackgroundHoverColor: #232323;

            

    }

    .icmAnimatedBoxContainer {
        background: var(--abContainerBackground);
        border-radius: var(--abContainerBackgroundRadius);
        overflow: hidden;
        padding: var(--abContainerPadding);      
        position: relative;
        z-index: 1;
        filter: var(--abContainerShadow);
        border-width: var(--abContainerBorder);
        border-style: solid;
        border-color: var(--abContainerBorderColor);
        -moz-transition: border-color .5s ease-in-out;
        -ms-transition: border-color .5s ease-in-out;
        -o-transition: border-color .5s ease-in-out;
        transition: border-color .5s ease-in-out;
    }

    .icmAnimatedBoxContainer:before {
        background: var(--abContainerBeforeBackground);
        border-radius: 0;
        left: var(--abContainerBeforeLeft);
        top: var(--abContainerBeforeTop);
        z-index: -1;
    }

    .icmAnimatedBoxContainer:after,
    .icmAnimatedBoxContainer:before {
        content: "";
        height: 200px;
        position: absolute;
        transition: .5s ease-in-out;
        width: 200px
    }

    .icmAnimatedBoxContainer:after {
        background: var(--abContainerAfterBackground);
        border-radius: 50%;
        left: var(--abContainerAfterLeft);
        top: var(--abContainerAfterTop);
        z-index: -2
    }

    .icmAnimatedBoxContainer .icmAnimatedBoxContentIcon {
        color: #fff;
        font-size: 40px;
        line-height: 60px;
        text-align: var(--abImageAlign);
        margin: var(--abImageShift);
    }

    .icmAnimatedBoxContainer .icmAnimatedBoxContent {
        padding: var(--abContainerTextPadding);
    }

    .icmAnimatedBoxContainer h5 {
        /**TITOLO -> Font, colore e allineamento*/
        color: var(--abH5FontColor);
        text-align: var(--abH5TextAlign);
        font-family: var(--abH5FontFamily);
        font-size: var(--abH5FontSize);
        font-weight: var(--abH5FontBold);
        font-style: var(--abH5FontItalic);
        transition: .5s ease-in-out;
        margin-block: 0px 0px;
        margin: var(--abH5Margins);
    }

    .icmAnimatedBoxContainer p {
        /**Testo contenuto -> Font, colore e allineamento*/
        color: var(--abPFontColor);
        text-align: var(--abPTextAlign);
        font-family: var(--abPFontFamily);
        font-size: var(--abPFontSize);
        font-weight: var(--abPFontBold);
        font-style: var(--abPFontItalic);

        margin: var(--abPMargins);
        transition: .5s ease-in-out;
    }

    .icmAnimatedBoxContainer:hover{
        /**Main container Hover Effects */
        color: var(--abH5FontHoverColor);
        border-width: var(--abContainerBorder);
        border-color: var(--abContainerBorderHoverColor);
        -moz-transition: border-color .5s ease-in-out;
        -ms-transition: border-color .5s ease-in-out;
        -o-transition: border-color .5s ease-in-out;
        transition: border-color .5s ease-in-out;
    }

    .icmAnimatedBoxContainer:hover h5 {
        /**Colore Hover titolo e icona */
        color: var(--abH5FontHoverColor);
    }

    .icmAnimatedBoxContainer:hover p {
        /**Colore Hover testo */
        color: var(--abPFontHoverColor);
    }

    .icmAnimatedBoxContainer:hover:before {
        border-radius: 50%;
        left: var(--abContainerBeforeHoverLeft);
        top: var(--abContainerBeforeHoverTop);;
    }

    .icmAnimatedBoxContainer:hover:after {
        border-radius: 0;
        content: "";
        height: 120%;
        left: -10%;
        top: -10%;
        transition: all .55s cubic-bezier(.39,.58,.57,1);
        width: 120%
    }

    .icmAnimatedBoxContainer:hover .icmAnimatedBoxContentIcon,
    .icmAnimatedBoxContainer:hover h5,.icmAnimatedBoxContainer:hover p {
        -webkit-animation: slideTop .5s ease-in-out 0s 1 normal none running!important;
        animation: slideTop .5s ease-in-out 0s 1 normal none running!important;
        -webkit-transition: border-color .25s ease;

    }

    .icmAnimatedBoxContentIconImage::before {
        background-image: var(--abImageIcon);
        background-size: cover;
        display: inline-block;
        background-position: center;
        width: var(--abImageWidth);
        height: var(--abImageHeight);
        content: "";
        max-width: 100%;
        margin: var(--abImageMargin);
    }

    .icmAnimatedBoxLink{
        text-decoration: none;
    }

    .icmAnimatedBoxContentButtonContainer{
        text-align: var(--abCTAAlign);
        display: var(--abCTAShow);
    }

    .icmAnimatedBoxContentButton,
    .icmAnimatedBoxContentButtonContainer a,
    .icmAnimatedBoxContentButtonContainer button
    {
        font-family: var(--abCTAFontFamily);
        color: var(--abCTAFontColor);
        font-size: var(--abCTAFontSize);
        font-weight: var(--abCTAFontBold);
        font-style: var(--abCTAFontItalic);
        background-color: var(--abCTABackgroundColor);
        margin: var(--abCTAMargins);
        padding: var(--abCTAPadding);
        border-radius: var(--abCTABorderRadius);
        border: none;
        display: inline-block;
        text-decoration: none;

        -moz-transition: all .25s ease-in-out;
        -ms-transition: all .25s ease-in-out;
        -o-transition: all .25s ease-in-out;
        transition: all .25s ease-in-out;
    }

    .icmAnimatedBoxContentButton:hover,
    .icmAnimatedBoxContentButtonContainer a:hover,
    .icmAnimatedBoxContentButtonContainer button:hover
     {
        color: var(--abCTAFontHoverColor);
        background-color: var(--abCTABackgroundHoverColor);
        cursor: pointer;

        -moz-transition: all .25s ease-in-out;
        -ms-transition: all .25s ease-in-out;
        -o-transition: all .25s ease-in-out;
        transition: all .25s ease-in-out;
    }
    </style>

    <div class="icmAnimatedBoxContainer">
        <div class="icmAnimatedBoxContentIcon">
            <i class="icmAnimatedBoxContentIcon icmAnimatedBoxContentIconImage"></i>
        </div>
        <div class="icmAnimatedBoxContent">
            <h5 id="icmAnimatedBoxContentTitle"></h5>
            <p id="icmAnimatedBoxContentText"></p>
            <div id="icmAnimatedBoxContentButtonContainer" class="icmAnimatedBoxContentButtonContainer"></div>
        </div>  
    </div>
`


/**
 * WebComonent Main Class
 */
class IcmAnimatedBox extends HTMLElement {
    constructor(){
      super();
      this._shadowRoot = this.attachShadow({'mode': 'open'});
      this._shadowRoot.appendChild(templateAnimatedBox.content.cloneNode(true));
    }  
    
    connectedCallback(){
        /**
         * Object initialization
         */
        this._shadowRoot.getElementById("icmAnimatedBoxContentTitle").innerHTML=this.#decodeHTMLEntities(this.getAttribute('data-abTitleString'));
        this._shadowRoot.getElementById("icmAnimatedBoxContentText").innerHTML=this.#decodeHTMLEntities(this.getAttribute('data-abTextString'));
        try {
            this._shadowRoot.getElementById("icmAnimatedBoxContentButtonContainer").innerHTML=this.#decodeHTMLEntities(decodeURIComponent(this.getAttribute('data-abLinkString')));        
        } catch (e) {
            this._shadowRoot.getElementById("icmAnimatedBoxContentButtonContainer").innerHTML=this.#decodeHTMLEntities(this.getAttribute('data-abLinkString'));        
        }
    }
    
    #decodeHTMLEntities(str){
        /** 
         * Class Private Method for string to HTML conversion
         * */
        if(str && typeof str === 'string') {
            str = str.replace(/<script[^>]*>([\S\s]*?)<\/script>/gmi, '');
            str = str.replace(/<\/?\w(?:[^"'>]|"[^"]*"|'[^']*')*>/gmi, '');
            var textArea = document.createElement('textarea');
              textArea.innerHTML = str;
              str =  textArea.value;
              str = str.replace(/\\'/g, "'");
          }
          return str;
    }
  }
  
  window.customElements.define('icm-animatedbox', IcmAnimatedBox);
  