text: //== Class definition
  var LayoutBuilder = function() {
  
    var exporter = {
      init: function() {
        $('#m-btn-howto').click(function(e) {
          e.preventDefault();
          $('#m-howto').slideToggle();
        });
        this.exportHtml();
        this.exportHtmlStatic();
        this.exportAngular();
      },
      startLoad: function(options) {
        $('#builder_export').
            addClass('m-loader m-loader--light m-loader--right').
            find('> span > span').
            text('Exporting...').
            closest('.m-form__actions').
            find('.btn').
            prop('disabled', true);
        $.notify(options);
      },
      doneLoad: function() {
        $('#builder_export').
            removeClass('m-loader m-loader--light m-loader--right').
            find('> span > span').
            text('Export').
            closest('.m-form__actions').
            find('.btn').
            prop('disabled', false);
      },
      exportHtml: function() {
        $('#builder_export_html').click(function(e) {
          e.preventDefault();
          if (!envato.isVerified()) return;
  
          var _self = $(this);
  
          exporter.startLoad({
            title: 'Generate HTML Partials',
            message: 'Process started and it may take about 1 to 10 minutes.',
          });
  
          $.ajax('index.php', {
            method: 'POST',
            data: {
              builder_export: 1,
              export_type: 'partial',
              demo: $(_self).data('demo'),
            },
          }).done(function(r) {
            var result = JSON.parse(r);
            if (result.message) {
              exporter.stopWithNotify(result.message);
              return;
            }
  
            var timer = setInterval(function() {
              $.ajax('index.php', {
                method: 'POST',
                data: {
                  builder_export: 1,
                  builder_check: result.id,
                },
              }).done(function(r) {
                var result = JSON.parse(r);
                if (typeof result === 'undefined') return;
                // export status 1 is completed
                if (result.export_status !== '1') return;
  
                $('<iframe/>').attr({
                  src: 'index.php?builder_export&builder_download&id=' +
                  result.id,
                  style: 'visibility:hidden;display:none',
                }).ready(function() {
                  $.notify({
                    title: 'Export HTML Version Layout',
                    message: 'HTML version exported.',
                  }, {type: 'success'});
                  exporter.doneLoad();
                  // stop the timer
                  clearInterval(timer);
                }).appendTo(_self);
              });
            }, 15000);
          });
        });
      },
      exportHtmlStatic: function() {
        $('#builder_export_html_static').click(function(e) {
          e.preventDefault();
          if (!envato.isVerified()) return;
  
          var _self = $(this);
  
          exporter.startLoad({
            title: 'Generate HTML Static Version',
            message: 'Process started and it may take about 1 to 10 minutes.',
          });
  
          $.ajax('index.php', {
            method: 'POST',
            data: {
              builder_export: 1,
              export_type: 'html',
              demo: $(_self).data('demo'),
            },
          }).done(function(r) {
            var result = JSON.parse(r);
            if (result.message) {
              exporter.stopWithNotify(result.message);
              return;
            }
  
            var timer = setInterval(function() {
              $.ajax('index.php', {
                method: 'POST',
                data: {
                  builder_export: 1,
                  builder_check: result.id,
                },
              }).done(function(r) {
                var result = JSON.parse(r);
                if (typeof result === 'undefined') return;
                // export status 1 is completed
                if (result.export_status !== '1') return;
  
                $('<iframe/>').attr({
                  src: 'index.php?builder_export&builder_download&id=' +
                  result.id,
                  style: 'visibility:hidden;display:none',
                }).ready(function() {
                  $.notify({
                    title: 'Export Default Version',
                    message: 'Default HTML version exported with current configured layout.',
                  }, {type: 'success'});
                  exporter.doneLoad();
                  // stop the timer
                  clearInterval(timer);
                }).appendTo(_self);
              });
            }, 15000);
          });
  
        });
      },
      exportAngular: function() {
        $('#builder_export_angular').click(function(e) {
          e.preventDefault();
          if (!envato.isVerified()) return;
  
          var _self = $(this);
  
          exporter.startLoad({
            title: 'Export Angular Version',
            message: 'Process started and it may take about 1 to 10 minutes.',
          });
  
          $.ajax('index.php', {
            method: 'POST',
            data: {
              builder_export: 1,
              export_type: 'angular',
              demo: $(_self).data('demo'),
            },
          }).done(function(r) {
            var result = JSON.parse(r);
            if (result.message) {
              exporter.stopWithNotify(result.message);
              return;
            }
  
            var timer = setInterval(function() {
              $.ajax('index.php', {
                method: 'POST',
                data: {
                  builder_export: 1,
                  builder_check: result.id,
                },
              }).done(function(r) {
                var result = JSON.parse(r);
                if (typeof result === 'undefined') return;
                // export status 1 is completed
                if (result.export_status !== '1') return;
  
                $('<iframe/>').attr({
                  src: 'index.php?builder_export&builder_download&id=' +
                  result.id,
                  style: 'visibility:hidden;display:none',
                }).ready(function() {
                  $.notify({
                    title: 'Export Angular Version',
                    message: 'Angular App version exported with current configured layout.',
                  }, {type: 'success'});
                  exporter.doneLoad();
                  // stop the timer
                  clearInterval(timer);
                }).appendTo(_self);
              });
            }, 15000);
          });
        });
      },
      stopWithNotify: function(message, type) {
        type = type || 'danger';
        $.notify({
          title: 'Verification failed',
          message: message,
        }, {type: type});
        exporter.doneLoad();
      },
    };
  
    //== Private functions
    var preview = function() {
      $('[name="builder_submit"]').click(function(e) {
        e.preventDefault();
        var _self = $(this);
        $(_self).
            addClass('m-loader m-loader--light m-loader--right').
            closest('.m-form__actions').
            find('.btn').
            prop('disabled', true);
  
        $.ajax('index.php?demo=' + $(_self).data('demo'), {
          method: 'POST',
          data: $('[name]').serialize(),
        }).done(function(r) {
          $.notify({
            title: 'Preview updated',
            message: 'Preview has been updated with current configured layout.',
          }, {type: 'success'});
        }).always(function() {
          setTimeout(function() {
            location.reload();
          }, 600);
        });
      });
    };
  
    var reset = function() {
      $('[name="builder_reset"]').click(function(e) {
        e.preventDefault();
        var _self = $(this);
        $(_self).
            addClass('m-loader m-loader--primary m-loader--right').
            closest('.m-form__actions').
            find('.btn').
            prop('disabled', true);
  
        $.ajax('index.php?demo=' + $(_self).data('demo'), {
          method: 'POST',
          data: {
            builder_reset: 1,
            demo: $(_self).data('demo'),
          },
        }).done(function(r) {
        }).always(function() {
          location.reload();
        });
      });
    };
  
    var keepActiveTab = function() {
      $('[href^="#m_builder_"]').click(function(e) {
        var which = $(this).attr('href');
        var btn = $('[name="builder_submit"]');
        var tab = $('[name="builder[tab]"]');
        if ($(tab).length === 0) {
          $('<input/>').
              attr('type', 'hidden').
              attr('name', 'builder[tab]').
              val(which).
              insertBefore(btn);
        } else {
          $(tab).val(which);
        }
      }).each(function() {
        if ($(this).hasClass('active')) {
          var which = $(this).attr('href');
          var btn = $('[name="builder_submit"]');
          var tab = $('[name="builder[tab]"]');
          if ($(tab).length === 0) {
            $('<input/>').
                attr('type', 'hidden').
                attr('name', 'builder[tab]').
                val(which).
                insertBefore(btn);
          } else {
            $(tab).val(which);
          }
        }
      });
    };
  
    // localStorage.removeItem('envato');
    window.envato = {
      apiKey: '05kxpfkxwymzzczjm75d9s3li4spg0j1',
      expires_in: '3600', // seconds
      isVerified: function() {
        // console.log(envato.getItem());
        // check token is not expired and verified
        return !envato.tokenIsExpired() && envato.getItem('verified');
      },
      reCaptchaVerified: function() {
        return $.ajax('http://keenthemes.com/metronic/preview/inc/api/envato.php?recaptcha', {
          method: 'POST',
          data: {
            response: $('#g-recaptcha-response').val(),
          },
        }).fail(function() {
          grecaptcha.reset();
          $('#alert-message').
              removeClass('alert-success m--hide').
              addClass('alert-danger').
              html('Invalid reCaptcha validation');
        });
      },
      verifyEvent: function() {
        // click event
        $('#builder_export').click(function(e) {
          e.preventDefault();
          if (envato.isVerified()) return;
          grecaptcha.reset();
          $('#m-modal-purchase').modal('show');
          $('#alert-message').addClass('m--hide');
        });
  
        $('#submit-verify').click(function(e) {
          e.preventDefault();
          envato.reCaptchaVerified().done(function(response) {
            if (response.success) {
              var purchaseCode = $('#purchase-code').val();
              envato.setItem('purchase_code', purchaseCode);
              envato.verifyPurchase(purchaseCode);
            } else {
              grecaptcha.reset();
              $('#alert-message').
                  removeClass('alert-success m--hide').
                  addClass('alert-danger').
                  html('Invalid reCaptcha validation');
            }
          });
        });
  
        $('#purchase-code').keyup(function() {
          $('#alert-message').addClass('m--hide');
        });
      },
      verifyPurchase: function(purchaseCode) {
        return $.ajax('https://marketplace.envato.com/api/edge/keenthemes/' +
            envato.apiKey + '/verify-purchase:' +
            purchaseCode + '.json', {
          method: 'GET',
        }).done(function(response) {
          if (!$.isEmptyObject(response['verify-purchase'])) {
            envato.setItems(response['verify-purchase']);
            envato.setItem('verified', true);
  
            // keep session is php
            $.ajax('inc/api/envato.php', {
              method: 'POST',
              data: envato.getItem(),
            });
  
            $('#alert-message').
                removeClass('alert-danger m--hide').
                addClass('alert-success').
                html('Purchase code is successfully verified');
          } else {
            grecaptcha.reset();
            $('#alert-message').
                removeClass('alert-success m--hide').
                addClass('alert-danger').
                html('Invalid purchase code');
          }
        }).fail(function(e) {
          grecaptcha.reset();
          $('#alert-message').
              removeClass('alert-success m--hide').
              addClass('alert-danger').
              html('Invalid purchase code');
        });
      },
      setItems: function(object) {
        var params = $.extend({}, envato.getItem(), object);
        localStorage.setItem('envato', JSON.stringify(params));
      },
      setItem: function(key, val) {
        var assign = {};
        assign[key] = val;
        var params = $.extend({}, envato.getItem(), assign);
        localStorage.setItem('envato', JSON.stringify(params));
      },
      getItem: function(key) {
        var params = JSON.parse(localStorage.getItem('envato'));
        if (typeof key !== 'undefined') {
          return params !== null ? params[key] : null;
        }
        return params;
      },
      startTimer: function(now) {
        envato.setItem('created_on', now);
        setTimeout(function() {
          localStorage.removeItem('envato');
        }, envato.expires_in * 1000);
      },
      tokenIsExpired: function() {
        var diff = new Date().getTime() - envato.getItem('created_on');
        if (typeof envato.expires_in === 'undefined' ||
            diff >= ( envato.expires_in * 1000)) {
          localStorage.removeItem('envato');
          return true;
        }
        return false;
      },
    };
  
    // basic demo
    var init = function() {
      exporter.init();
      keepActiveTab();
      preview();
      reset();
    };
  
    return {
      // public functions
      init: function() {
        envato.verifyEvent();
        init();
      },
    };
  }();
  
  jQuery(document).ready(function() {
    LayoutBuilder.init();
  });
  