var rablDefaultTab = 'preview';

//rablDefaultTab = 'attribs';

function rablInitPreviewIframe(iframe,src) {
  if(!src) { throw "rablInitPreviewIframe() requires src as second argument"; }

  // this disables click/nav events
  iframe.contentDocument.addEventListener('click',function(e){ 
    e.stopPropagation(); 
    e.preventDefault(); 
  });

  var AppDV = rablGetAppDV(iframe);
  var activateTab = AppDV.rablLastSelectedTabName;
  
  if(!iframe.rablDoAjaxLoad) {
    // We're doing this manually instead of just setting src to ensure we have control
    // of exactly when and why requests happen. This is important for dev, but may not
    // actually be needed and we can do it the normal way
    iframe.rablDoAjaxLoad = function() {
      var xreq = new XMLHttpRequest();
      xreq.onload = function() {
        iframe.contentWindow.document.open('text/html', 'replace');
        iframe.contentWindow.document.write([
          '<base href="',src,'"/>',
          xreq.responseText
        ].join(""));
        iframe.contentWindow.document.write();
        iframe.contentWindow.document.close();
      };
      xreq.open("GET", src);
      xreq.send();
    }
    if(!AppDV.rablFirstLoad) {
      iframe.rablDoAjaxLoad();
      AppDV.rablFirstLoad = true;
      activateTab = activateTab || rablDefaultTab;
      
    }
  }
  
  if(activateTab) {
    rablActivateTab(iframe,activateTab);
  }
}


function rablGetParentEl(node,cls) {
  if(!node || !cls) { return null; }
  return node.classList.contains(cls)
    ? node
    : rablGetParentEl(node.parentElement,cls);
}

function rablPreviewReload(el) {
  var AppDV = rablGetAppDV(el);
  if(AppDV) {
    AppDV.rablIframeReloadTask.delay(0);
  }
}

function rablActivateTab(target,name,extra,robot) {
  //console.log(' --> rablActivateTab ('+name+','+extra+','+robot+')');
  
  var topEl = rablGetParentEl(target,'rapi-blog-postview');
  var selEl = rablGetParentEl(target,'ra-rowdv-select');
  var AppDV = rablGetAppDV(selEl);
  if(!AppDV) { throw "no AppDV"; }
  
  if(!robot) {
    delete AppDV._editFromPreviewCleared;
  }
  
  if(
    // Do not process tab change during record update
    !selEl || selEl.classList.contains('editing-record')
  ) { return false; }
  
  name == 'preview'
    ? topEl.classList.add   ('rabl-preview-mode')
    : topEl.classList.remove('rabl-preview-mode');
  
  var links = topEl.getElementsByClassName('tab-link');
  var conts = topEl.getElementsByClassName('tab-content');
  
  for (i = 0; i < links.length; i++) {
    var el = links[i];
    el.classList.remove('active');
    el.classList.remove('inactive');
    if(el.classList.contains(name)) {
      el.classList.add('active');
    }
    else {
      el.classList.add('inactive');
    }
  }
  
  for (i = 0; i < conts.length; i++) {
    var el = conts[i];
    if(el.classList.contains(name)) {
      //rablReloadPreviewIframe(el,500);
      el.style.display = 'block';
    }
    else {
      el.style.display = 'none';
    }
  }
  
  if(name == 'source' && extra == 'edit') {
    var controlEl = topEl.getElementsByClassName('edit-record-toggle')[0];
    if(controlEl) {
      var editEl = controlEl.getElementsByClassName('edit')[0];
      if(editEl) {
        AppDV._editFromPreview = true;
        editEl.click();
      }
    }
  }
  
  AppDV.rablActiveTabName = name;
  if(!robot) {
    AppDV.rablLastSelectedTabName = name;
  }
}


function rablGetAppDV(el) {
  var AppDV = null;
  var appdvEl = rablGetParentEl(el,'ra-dsapi-deny-create');
  if(!appdvEl) { console.dir(el); }
  if(appdvEl) {
    AppDV = Ext.getCmp(appdvEl.id);
    if(AppDV && !AppDV.rablInitialized) {
    
    //Ext.ux.RapidApp.util.logEveryEvent(AppDV.store);
    
      AppDV.rablActivateTab = function(name,extra,robot) {
        var target = AppDV.el.dom.getElementsByClassName('rapi-blog-postview')[0]
        return rablActivateTab(target,name,extra,robot);
      }
    
      AppDV.getPreviewIframe = function() {
        return AppDV.el.dom
          ? AppDV.el.dom.getElementsByClassName('preview-iframe')[0]
          : null;
      };
    
      AppDV.rablIframeReloadTask = new Ext.util.DelayedTask(function(){
        var iframe = AppDV.getPreviewIframe();
        if(iframe && iframe.rablDoAjaxLoad) {
           // Call the special, manual ajax load function:
           iframe.rablDoAjaxLoad();
        }
      },AppDV);
      
      AppDV.handleEndEdit = function() {
        if(AppDV._editFromPreview && (AppDV.rablActiveTabName != 'preview' || !AppDV.currentEditRecord)) {
          delete AppDV._editFromPreview;
          AppDV._editFromPreviewCleared = true;
          AppDV.rablLastSelectedTabName = 'preview';
          AppDV.rablActivateTab('preview',null,true);
        }
      };
      
      AppDV.store.on('buttontoggle',AppDV.handleEndEdit,AppDV);

      AppDV.store.on('save',function() {
        AppDV.rablIframeReloadTask.delay(50);
        if(AppDV._editFromPreview || AppDV._editFromPreviewCleared) {
          delete AppDV._editFromPreviewCleared;
          delete AppDV._editFromPreview;
          AppDV.rablActivateTab('preview',null,true);
        }
      },AppDV);

      AppDV.rablInitialized = true;
    }
  }
  return AppDV;
}


function rablDeletePost(el) {
  var realEl = el.parentElement.getElementsByClassName('delete-record')[0];
  if(realEl) {
    Ext.Msg.show({
      title: 'Confirm delete post',
      msg: [
        '<div style="padding:10px;">',
        '<b style="font-size:22px;">Really delete post?</b>',
        '<br><br>This operation cannot be undone.<br>',
        '</div>'
      ].join(''),
      buttons: Ext.Msg.YESNO,
      icon: Ext.Msg.WARNING,
      minWidth: 375,
      fn: function(button_id) {
        if(button_id == 'yes') {
          realEl.click();
        }
      },
      scope: this
    });
  }
}


Ext.apply(Ext.form.VTypes,{

  rablPostName: function(v) { return /^[0-9a-z\.\-\_]+$/.test(v); },
  rablPostNameMask: /[0-9a-z\.\-\_]+/,
  rablPostNameText: 'Post names must be unique, can only contain lowercase alpha characters, dot (.), dash (-) or underscore (_)'

});


function rablTagNamesColumnRenderer(v) {
	if(!v) { return Ext.ux.showNull(v); }
	var tags = v.split(/\s+/);
	return tags.join(', ');
}