var vc_iframe = {
  scripts_to_wait: 0,
  time_to_call: false,
  ajax: false,
  activities_list: [],
  scripts_to_load: false,
  loaded_script: {},
  loaded_styles: {},
  inline_scripts: [],
  inline_scripts_body: []
};
(function($) {
  vc_iframe.showNoContent = function(show) {
    (show === false && $('#vc_no-content-helper').addClass('vc_not-empty')) || $('#vc_no-content-helper').removeClass('vc_not-empty');
  };
  vc_iframe.scrollTo = function(id) {
    var $el, el_height, hidden = true, position_y, position,
        window_height = $(window).height(),
        window_scroll_top = $(window).scrollTop();
    if(id && ($el = $('[data-model-id=' + id +']'))) {
      position = $el.offset();
      if((position_y = position ? position.top : false) === false) return false;
      el_height = $el.height();
      if((position_y > window_scroll_top + window_height) ||
        (position_y + el_height < window_scroll_top)) {
        $.scrollTo($el, 500, {offset:-50});
      }
    }
  };
  vc_iframe.startSorting = function() {
    $('body').addClass('vc_sorting');
  };
  vc_iframe.stopSorting = function() {
    $('body').removeClass('vc_sorting')
  };
  vc_iframe.initDroppable = function() {
    $('body').addClass('vc_dragging');
    $('.vc_container-block').bind('mouseenter.vcDraggable', function(){
      $(this).addClass('vc_catcher');
    }).bind('mouseout.vcDraggable', function(){
      $(this).removeClass('vc_catcher');
    });
  };
  vc_iframe.killDroppable = function() {
    $('body').removeClass('vc_dragging');
    $('.vc_container-block').unbind('mouseover.vcDraggable mouseleave.vcDraggable');
  };
  vc_iframe.addActivity = function(callback) {
    this.activities_list.push(callback);
  };
  vc_iframe.renderPlaceholder = function(event, element) {
    var tag = $(element).data('tag'),
      $helper = $('<div class="vc_helper vc_helper-' + tag + '"><i class="vc_element-icon'
        + ( parent.vc.map[tag].icon ? ' ' + parent.vc.map[tag].icon : '' )
        + '"></i> ' + parent.vc.map[tag].name + '</div>').prependTo('body');
    return $helper;
  };
  vc_iframe.setSortable = function(app){
    $('[data-tag=vc_row]').parent().sortable({
      forcePlaceholderSize: false,
      items: '[data-tag=vc_row]',
      handle: '.vc_move-vc_row',
      cursor: 'move',
      cursorAt: {top: 20, left: 16},
      placeholder: "vc_placeholder-row",
      helper: this.renderPlaceholder,
      start: function(event, ui){
        vc_iframe.startSorting();
        ui.placeholder.height(30);
      },
      stop: this.stopSorting,
      tolerance: "pointer",
      update: function(event, ui) {
        parent.vc.app.saveRowOrder();
      }
    });
    $('.vc_element-container').sortable({
      forcePlaceholderSize: true,
      helper: this.renderPlaceholder,
      distance: 3,
      scroll: true,
      scrollSensitivity: 70,
      cursor: 'move',
      cursorAt: {top: 20, left: 16},
      connectWith:'.vc_element-container',
      items: '> [data-model-id]',
      handle: '.vc_element-move',
      start: this.startSorting,
      update: app.saveElementOrder,
      change: function(event, ui) {
        ui.placeholder.height(30);
        ui.placeholder.width(ui.placeholder.parent().width());
      },
      placeholder: 'vc_placeholder',
      tolerance: "pointer",
      over:function (event, ui) {
        var tag = ui.item.data('tag'),
            vc_map = window.parent.vc.map || false,
            parent_tag = ui.placeholder.closest('[data-tag]').data('tag'),
            allowed_container_element = vc_map[parent_tag].allowed_container_element === undefined ? true : vc_map[parent_tag].allowed_container_element;
        ui.placeholder.removeClass('vc_hidden-placeholder');
        ui.placeholder.css({maxWidth:ui.placeholder.parent().width()});
        if(tag && vc_map) {
          if (!window.parent.vc.checkRelevance(parent_tag, tag)) {
            ui.placeholder.addClass('vc_hidden-placeholder');
          }
          if(ui.sender) {
            var $sender_column = ui.sender.closest('.vc_element').removeClass('vc_sorting-over');
            $sender_column.find('.vc_element').length < 1 && $sender_column.addClass('vc_empty');
          }
          ui.placeholder.closest('.vc_element').addClass('vc_sorting-over');
          if (vc_map[tag].is_container && !(allowed_container_element === true || allowed_container_element === tag.replace(/_inner$/, ''))) {
            ui.placeholder.addClass('vc_hidden-placeholder');
          }
        }
      },
      out: function(event, ui) {
        ui.placeholder.removeClass('vc_hidden-placeholder');
        // $(this).closest('.vc_element').removeClass('vc_sorting-over');
      },
      stop:function (event, ui) {
        var tag = ui.item.data('tag'),
            vc_map = window.parent.vc.map || false,
            parent_tag = ui.item.parents('[data-tag]:first').data('tag'),
            allowed_container_element = vc_map[parent_tag].allowed_container_element ? vc_map[parent_tag].allowed_container_element : true,
            trig_changed = true,
            item_model;
        if (!window.parent.vc.checkRelevance(parent_tag, tag)) {
          ui.placeholder.removeClass('vc_hidden-placeholder');
          $(this).sortable('cancel');
          trig_changed = false;
        }
        if (vc_map[tag].is_container && !(allowed_container_element === true || allowed_container_element === tag.replace(/_inner$/, ''))) { // && ui.item.hasClass('wpb_container_block')
          ui.placeholder.removeClass('vc_hidden-placeholder');
          $(this).sortable('cancel');
          trig_changed = false
        }
        if(trig_changed) {
          item_model = parent.vc.shortcodes.get(ui.item.data('modelId'));
          item_model.view.parentChanged();
        }
        vc_iframe.stopSorting();
      }
    });
    $('.wpb_row').sortable({
      forcePlaceholderSize: true,
      tolerance: "pointer",
      items: '> [data-tag=vc_column], > [data-tag=vc_column_inner]',
      handle: '> .vc_controls .vc_move-vc_column',
      start: function(event, ui) {
        vc_iframe.startSorting();
        var id = ui.item.data('modelId'),
            model = parent.vc.shortcodes.get(id),
            css_class = model.view.convertSize(model.getParam('width'));
        // ui.item.removeClass(css_class).data('removedClass', css_class);
        ui.item.appendTo(ui.item.parent().parent());
        ui.placeholder.addClass(css_class);
        ui.placeholder.width(ui.placeholder.width()-4);
      },
      cursor: 'move',
      cursorAt: {top: 20, left: 16},
      stop: function(event, ui){
        // ui.item.addClass(ui.item.data('removedClass'));
        vc_iframe.stopSorting(event, ui);
      },
      update: app.saveColumnOrder,
      placeholder: 'vc_placeholder-column',
      helper: this.renderPlaceholder
    });
  /*
    $('.vc_element_button', parent.document).draggable({
      // connectToSortable: '.vc_element-container',
      helper: 'clone',
      revert: true,
      cursor:"move"
    });
    */
    /*
    $('.vc_row_button', parent.document).draggable({
      connectToSortable: $('.entry-content'),
      helper: 'clone',
      revert: 'invalid',
      iframeFix: true
      // appendTo: "body"
    });
 /* .mouseup(function(){
        $(this).draggable( "disable" );
        $('.wpb_column > .wpb_wrapper').sortable('disable');
        $('.vc_placeholder', parent.document).remove();
        // $('.vc_placeholder').remove();
        $(this).draggable( "enable" );
      });
      */
    $('[data-tag=vc_row]').disableSelection();
    app.setFrameSize();
    $('#vc_load-new-js-block').appendTo('body');
  };
  vc_iframe.loadCustomCss = function(css) {
    if(!vc_iframe.$custom_style) {
      $('[data-type=vc_custom-css]').remove();
      vc_iframe.$custom_style = $('<style class="vc_post_custom_css_style"></style>').appendTo('body');
    }
    vc_iframe.$custom_style.html(css)
  };
  vc_iframe.setCustomShortcodeCss = function(css) {
    this.$shortcodes_custom_css = $('[data-type=vc_shortcodes-custom-css]');
    if(!this.$shortcodes_custom_css.length) {
      this.$shortcodes_custom_css = $('<style data-type="vc_shortcodes-custom-css"></style>').prependTo('body');
    }
    this.$shortcodes_custom_css.append(css);
  };
  vc_iframe.addInlineScript = function(script) {
    return this.inline_scripts.push(script)-1;
  };
  vc_iframe.addInlineScriptBody = function(script) {
    return this.inline_scripts_body.push(script)-1;
  };
  vc_iframe.loadInlineScripts = function() {
    var script,i = 0;
    while(this.inline_scripts[i]) {
      $(this.inline_scripts[i]).insertAfter('.js_placeholder_' + i);
      $('.js_placeholder_' + i).remove();
      i++;
    }
    this.inline_scripts = [];
  };
  vc_iframe.loadInlineScriptsBody = function() {
    var script,i = 0;
    while(this.inline_scripts_body[i]) {
      $(this.inline_scripts_body[i]).insertAfter('.js_placeholder_inline_' + i);
      $('.js_placeholder_inline_' + i).remove();
      i++;
    }
    this.inline_scripts_body = [];
  };
  vc_iframe.allowedLoadScript = function(src) {
    var script_url, i, scripts_string, scripts = [], scripts_to_add = [], ls_rc;
    if(src.match(/load\-scripts\.php/)) {
      scripts_string = src.match(/load%5B%5D=([^&]+)/)[1];
      if(scripts_string) scripts = scripts_string.split(',');
      for(i in scripts) {
        ls_rc = 'load-script:' + scripts[i];
        if(!vc_iframe.loaded_script[window.md5(ls_rc)]) {
          vc_iframe.loaded_script[window.md5(ls_rc)] = ls_rc;
          scripts_to_add.push(scripts[i]);
        }
      }
      return !scripts_to_add.length ? false : src.replace(/load%5B%5D=[^&]+/, 'load%5B%5D=' + scripts_to_add.join(','));
    } else if(!vc_iframe.loaded_script[window.md5(src)]) {
      vc_iframe.loaded_script[window.md5(src)] = src;
      return src;
    }
    return false;
  };
  vc_iframe.collectScriptsData = function() {
    $('script[src]').each(function(){
      vc_iframe.allowedLoadScript($(this).attr('src'));
    });
    $('link[href]').each(function(){
      var href = $(this).attr('href');
      vc_iframe.loaded_styles[window.md5(href)] = href;
    });
  };
  $('body').removeClass('admin-bar');
  $(document).ready(function(){
    $('#wpadminbar').hide();
    $('.edit-link').hide();
    window.parent.vc && !window.parent.vc.loaded && window.parent.vc.build && window.parent.vc.build();
  });
  vc_iframe.reload = function() {
    vc_iframe.reload_safety_call = false;
    $('a:not(.control-btn),form').each(function(){
        if(!$(this).attr('target') || $(this).attr('target').length==0){
            $(this).attr('target','_blank');
        }
    });

    window.vc_twitterBehaviour();
    window.vc_teaserGrid();
    window.vc_carouselBehaviour();
    window.vc_prettyPhoto();
    window.vc_googleplus();
    window.vc_pinterest();
    window.vc_progress_bar();
    window.vc_waypoints();

    //window.vc_google_fonts();
    this.collectScriptsData();
    this.loadInlineScripts();
    this.loadInlineScriptsBody();
    for(var i in this.activities_list) {
       this.activities_list[i].call(window);
    }
    this.activities_list = [];
    $(window).trigger('vc_reload');
    $(window).trigger('resize');
    return true;
  };
  vc_iframe.addScripts = function($elements) {
    vc_iframe.scripts_to_wait = $elements.length;
    vc_iframe.scripts_to_load = $elements;
  };
  vc_iframe.loadScripts = function() {
    if(!vc_iframe.scripts_to_wait || !vc_iframe.scripts_to_load) {
      vc_iframe.reload();
      return;
    }
    vc_iframe.scripts_to_load.each(function(){
      var $element = $(this);
      vc_iframe.reload_safety_call = true;
      if($element.is('script')) {
        var src = $element.attr('src');
        src = vc_iframe.allowedLoadScript(src);
        if(src) {
          $.getScript(src, function() {
            vc_iframe.scripts_to_wait -=1;
            vc_iframe.scripts_to_wait < 1 && vc_iframe.reload()
          });
        } else {
          vc_iframe.scripts_to_wait -=1;
          vc_iframe.scripts_to_wait < 1 && vc_iframe.reload()
        }
      } else {
        var href = $element.attr('href');
        if(!vc_iframe.loaded_styles[window.md5(href)]) {
          $('<link/>', {
            rel: 'stylesheet',
            type: 'text/css',
            href: href
          }).appendTo('body');
        }
        vc_iframe.scripts_to_wait -=1;
        vc_iframe.scripts_to_wait < 1 && vc_iframe.reload();
      }
    });
    vc_iframe.scripts_to_load = false;
    $( document ).ajaxComplete(function(e) {
      $(e.currentTarget).unbind('ajaxComplete');
      !vc_iframe.scripts_to_wait && vc_iframe.reload();
    });
    window.setTimeout(function(){
      vc_iframe.reload_safety_call === true && vc_iframe.reload();
    }, 14000);
  };
  vc_iframe.destroyTabs = function($tabs) {
    $tabs.each(function(){
      var $t = $(this).find('.wpb_tour_tabs_wrapper');
      $t.tabs('destroy');
    });
  };
  vc_iframe.buildTabs = function($tab, active) {
    var ver = $.ui.version.split('.'),
       old_version = parseInt(ver[0])==1 &&  parseInt(ver[1]) < 9;
    // if($call.hasClass('ui-widget')) $call.tabs('destroy');
    $tab.each(function(index) {
    var $tabs,
      interval = $(this).attr("data-interval"),
      tabs_array = [],
      $wrapper = $(this).find('.wpb_tour_tabs_wrapper');
    if($wrapper.hasClass('ui-widget')) {
      active = active!==false ? active : $wrapper.tabs('option', 'active');
      $tabs = $wrapper.tabs('refresh');
      $wrapper.tabs('option', 'active', active);
    } else {
      $tabs = $(this).find('.wpb_tour_tabs_wrapper').tabs({
        active: 0,
        show: function(event, ui) {wpb_prepare_tab_content(event, ui);},
        activate: function(event, ui) {wpb_prepare_tab_content(event, ui);}
      }); // .tabs('rotate', interval*1000);
    }
    $(this).find('.vc_element').each(function(){ tabs_array.push(this.id); });
    $(this).find('.wpb_prev_slide a, .wpb_next_slide a').unbind('click').click(function(e) {
      e.preventDefault();
      if(old_version) {
        var index = $tabs.tabs('option', 'selected');
        if ( $(this).parent().hasClass('wpb_next_slide') ) { index++; }
        else { index--; }
        if ( index < 0 ) { index = $tabs.tabs("length") - 1; }
        else if ( index >= $tabs.tabs("length") ) { index = 0; }
        $tabs.tabs("select", index);
      } else {
        var index = $tabs.tabs( "option", "active"),
          length = $tabs.find('.wpb_tab').length;

        if ( $(this).parent().hasClass('wpb_next_slide') ) {
          index = (index+1) >=length ? 0 : index+1;
        } else {
          index = index-1 < 0 ? length -1 : index-1;
        }
        $tabs.tabs( "option", "active", index );
      }
    });

    });
    return true;
  };
  vc_iframe.setActiveTab = function($tabs, index) {
    $tabs.each(function(){
      $(this).find('.wpb_tour_tabs_wrapper').tabs('refresh');
      $(this).find('.wpb_tour_tabs_wrapper').tabs('option', 'active', index);
    });
  };
  vc_iframe.setTabsSorting = function(view) {
    var $controls = $(view.tabsControls().get(0));
    if($controls.hasClass('ui-sortable')) {
      $controls.sortable('destroy');
    }
    $controls.sortable({
      axis:(view.model.get('shortcode') === 'vc_tour' ? 'y' : 'x'),
      update: view.stopSorting,
      items:"> li:not(.add_tab_block)"/*,
        start: function (event, ui) { ui.item.css('margin-top', $(window).scrollTop() ); },
        beforeStop: function (event, ui) { ui.item.css('margin-top', 0 ); }*/
    });
      // fix: #1019, from http://stackoverflow.com/questions/2451528/jquery-ui-sortable-scroll-helper-element-offset-firefox-issue
    var userAgent = navigator.userAgent.toLowerCase();

    if(userAgent.match(/firefox/)) {
        $controls.bind("sortstart", function (event, ui) {
            ui.helper.css('margin-top', $(window).scrollTop());
        });
        $controls.bind("sortbeforestop", function (event, ui) {
            ui.helper.css('margin-top', 0);
        });
    }
  };
  vc_iframe.buildAccordion = function($el, active) {
    $el.each(function(index) {
      var $this = $(this),
        $tabs,
        $wrapper = $this.find('.wpb_accordion_wrapper'),
        interval = $this.attr("data-interval"),
        active_tab = !isNaN($this.data('active-tab')) && parseInt($this.data('active-tab')) >  0 ? parseInt($this.data('active-tab'))-1 : false,
        collapsible =  active_tab === false || $this.data('collapsible') === 'yes';
      //
      if($wrapper.hasClass('ui-widget')) {
       if(active===false) active = $wrapper.accordion("option", 'active');
        $wrapper.accordion("refresh");
        $wrapper.accordion('option', 'active', active);
      } else {
        $tabs = $this.find('.wpb_accordion_wrapper').accordion({
          create: function(event, ui){
              ui.panel.parent().parent().addClass('vc_active-accordion-tab');
          },
          header: "> .vc_element > div > h3",
          autoHeight: false,
          heightStyle: "content",
          active: active_tab,
          collapsible: collapsible,
          navigation: true,
          activate: function(event, ui){
              vc_accordionActivate(event, ui);
              ui.oldPanel.parent().parent().removeClass('vc_active-accordion-tab');
              ui.newPanel.parent().parent().addClass('vc_active-accordion-tab');
          },
          change: function(event, ui){
            if($.fn.isotope!=undefined) {
              ui.newContent.find('.isotope').isotope("layout");
            }
            window.vc_carouselBehaviour();
          }

        });
      }
      //.tabs().tabs('rotate', interval*1000, true);
    });
  };
  vc_iframe.setAccordionSorting = function(view) {
    $(view.$accordion.find('> .wpb_accordion_wrapper').get(0)).sortable({
      handle: '.vc_move-vc_accordion_tab',
      update: view.stopSorting
    });
  };
  vc_iframe.vc_imageCarousel = function(model_id) {
    var $el = $('[data-model-id=' + model_id + ']'),
        images_count = $el.find('img').length,
        $carousel = $el.find('[data-ride="vc_carousel"]');
    if(!$carousel.find('img:first').length) {
      $carousel.carousel($carousel.data());
      return;
    }
    if(!$carousel.find('img:first').prop('complete')) {
      window.setTimeout(function(){
        vc_iframe.vc_imageCarousel(model_id);
      }, 500);
      return;
    }
    $carousel.carousel($carousel.data());
  };
  vc_iframe.vc_gallery = function(model_id) {
    var $el = $('[data-model-id=' + model_id +']'),
      $gallery = $el.find('.wpb_gallery_slides');
    if(!$gallery.find('img:first').prop('complete')) {
      window.setTimeout(function(){
        vc_iframe.vc_gallery(model_id);
      }, 500);
      return;
    }
    this.gallerySlider($gallery);
  };
  vc_iframe.vc_postsSlider = function(model_id) {
    var $el = $('[data-model-id=' + model_id +']'),
      $gallery = $el.find('.wpb_gallery_slides');
    this.gallerySlider($gallery);
  };
  vc_iframe.gallerySlider = function($gallery) {
    if($gallery.hasClass('wpb_flexslider')) {
      var sliderSpeed = 800,
        sliderTimeout = parseInt($gallery.attr('data-interval'))*1000,
        sliderFx = $gallery.attr('data-flex_fx'),
        slideshow = true;
      if ( sliderTimeout == 0 ) slideshow = false;
      $gallery.flexslider({
        animation: sliderFx,
        slideshow: slideshow,
        slideshowSpeed: sliderTimeout,
        sliderSpeed: sliderSpeed,
        smoothHeight: true
      });
      $gallery.addClass('loaded');
    } else if ( $gallery.hasClass('wpb_slider_nivo') ) {
      var sliderSpeed = 800,
        sliderTimeout = $gallery.attr('data-interval')*1000;

      if ( sliderTimeout == 0 ) sliderTimeout = 9999999999;

      $gallery.find('.nivoSlider').nivoSlider({
        effect: 'boxRainGrow,boxRain,boxRainReverse,boxRainGrowReverse', // Specify sets like: 'fold,fade,sliceDown'
        slices: 15, // For slice animations
        boxCols: 8, // For box animations
        boxRows: 4, // For box animations
        animSpeed: sliderSpeed, // Slide transition speed
        pauseTime: sliderTimeout, // How long each slide will show
        startSlide: 0, // Set starting Slide (0 index)
        directionNav: true, // Next & Prev navigation
        directionNavHide: true, // Only show on hover
        controlNav: true, // 1,2,3... navigation
        keyboardNav: false, // Use left & right arrows
        pauseOnHover: true, // Stop animation while hovering
        manualAdvance: false, // Force manual transitions
        prevText: 'Prev', // Prev directionNav text
        nextText: 'Next' // Next directionNav text
      });
    } else if ( $gallery.hasClass('wpb_image_grid') ) {
      var isotope = $gallery.find('.wpb_image_grid_ul');
      isotope.isotope({
        // options
        itemSelector : '.isotope-item',
        layoutMode : 'fitRows'
      });
      isotope.isotope("layout");
    }
  };
  vc_iframe.vc_Flickr = function($placeholder) {
    var link = $placeholder.data('link');
    // $('<script type="text/javascript" src="' + link + '"></script>').prependTo($placeholder);
    $.getScript(link, function() {
      $(window.b_txt).insertAfter($placeholder);
    });
  };
  vc_iframe.vc_toggle = function(model_id) {
    var $el = $('[data-model-id=' + model_id +']');
    $('.last_toggle_el_margin').remove();
    $el.find(".wpb_toggle").unbind('click').click(function(e) {
      var $this = $(this);
      if($this.next().is(':animated')) {
        return false;
      }
      if ( $this.hasClass('wpb_toggle_title_active') ) {
        $this.removeClass('wpb_toggle_title_active').next().slideUp(500);
      } else {
        $this.addClass('wpb_toggle_title_active').next().slideDown(500);
      }
    });
    /*
    $('[data-tag=vc_toggle]').each(function(index) {
      if ( $(this).next().is('[data-tag=vc_toggle]') == false ) {
        $('<div class="last_toggle_el_margin"></div>').appendTo(this);
      }
    });
    */
  };
  $(window).load(function(){
    if(!parent.vc.loaded) parent.vc.build();
  });
  // vc_iframe.setSortable(window.parent.vc.app);
})(window.jQuery);