/* Muwu navigation */

Muwu.ajax.newDocumentBody = {

declareRequest: function(targetMetadata) {
  Muwu.activeRequest.documentBody = { xhr: new XMLHttpRequest() };
  Muwu.activeRequest.documentBody.target = targetMetadata;
  Muwu.activeRequest.documentBody.xhr.onreadystatechange = Muwu.ajax.newDocumentBody.onreadystatechange;
  Muwu.activeRequest.documentBody.xhr.responseType = 'document';
},

makeRequest: function() {
  Muwu.activeRequest.documentBody.xhr.open('GET', Muwu.activeRequest.documentBody.target.filename);
  Muwu.activeRequest.documentBody.xhr.send();
},

onreadystatechange: function() {
  if (Muwu.activeRequest.documentBody.xhr.readyState === XMLHttpRequest.DONE) {
    if (Muwu.activeRequest.documentBody.xhr.status === 200) {
      Muwu.ajax.newDocumentBody.performAction();
    } else {
      Muwu.ajax.newDocumentBody.performAction_failure();
    }
  }
},

performAction: function() {
  var newDocumentBody = Muwu.activeRequest.documentBody.xhr.responseXML.body;
  if (newDocumentBody === null) {
    Muwu.ajax.newDocumentBody.performAction_failure();
  } else {
    Muwu.ajax.newDocumentBody.performAction_success(newDocumentBody);
    Muwu.ajax.newDocumentBody.undeclareRequest();
  }
},

performAction_failure: function() {
  console.log('XMLHttpRequest failed. Navigating via `window.location`.');
  window.location = Muwu.activeRequest.documentBody.target.href;
},

performAction_success: function(newDocumentBody) {
  var targetId = Muwu.activeRequest.documentBody.target.id;
  if (typeof targetId === 'string') {
    document.body.replaceWith(newDocumentBody);
    document.getElementById(targetId).scrollIntoView();
  } else if (typeof targetId === 'undefined') {
    document.body.replaceWith(newDocumentBody);
    window.scrollTo(0,0);
  }
},

undeclareRequest: function() {
  Muwu.activeRequest.documentBody = {};
}

};

Muwu.helper = {

parse_anchor: function(anchor) {
  var _hrefMetadata = Muwu.helper.parse_href(anchor.getAttribute('href'));
  var filename = _hrefMetadata.filename;
  var href = _hrefMetadata.href;
  var id = _hrefMetadata.id;
  var protocol = anchor.protocol;
  var result = {
    filename: filename,
    href: href,
    id: id,
    protocol: protocol
  };
  return result;
},

parse_href: function(href) {
  var _re = /(\w+[.]html)?(#{1})?(\w*)?/;
  var _hrefSplit = href.split(_re);
  var filename = _hrefSplit[1];
  var id = _hrefSplit[3];
  var result = {
    filename: filename,
    href: href,
    id: id
  };
  return result;
}

};

Muwu.responder.navigateFrom = {

anchorDocumentLink: function(event) {
  var anchor = event.target;
  var targetMetadata = Muwu.helper.parse_anchor(anchor);
  if (targetMetadata.protocol.match(/^http/)) {
    event.preventDefault();
    if (typeof targetMetadata.filename === 'string') {
      Muwu.responder.navigateTo.url(targetMetadata);
    } else if ((typeof targetMetadata.filename === 'undefined') && (typeof targetMetadata.id ==='string')) {
      Muwu.responder.navigateTo.element(targetMetadata);
    }
  }
}

};

Muwu.responder.navigateTo = {

element: function(targetMetadata) {
  if (targetMetadata.id === 'top') {
    Muwu.responder.navigateTo.windowTop();
  } else {
    Muwu.responder.navigateTo.elementById(targetMetadata);
  }
},

elementById: function(targetMetadata) {
  document.getElementById(targetMetadata.id).scrollIntoView();;
},

url: function(targetMetadata) {
  if (XMLHttpRequest) {
    Muwu.ajax.newDocumentBody.declareRequest(targetMetadata);
    Muwu.ajax.newDocumentBody.makeRequest();
  } else {
    console.log('XMLHttpRequest not available. Navigating via `window.location`.');
    Muwu.responder.navigateTo.windowLocation(targetMetadata);
  }
},

windowLocation: function(targetMetadata) {
  window.location = targetMetadata.href;
},

windowTop: function() {
  window.scrollTo(0,0);
}

};

$(document).ready(function() {

$(document).on('click', '.document_link', function(event) { Muwu.responder.navigateFrom.anchorDocumentLink(event); });

});