//---------PIM helper functions-----------------------------------------------------------
/*
 currently PmWiki backend
   could use http://fabien.benetou.fr/Site/AllRecentChanges?action=source to check for update
   heavy but nearly no processing required
   enough if done once per minute or so
   if update, request serverrender on modified page
     IFF it's being displayed
 planned Evernote backend
   https://github.com/evernote/evernote-sdk-js
   https://github.com/wanasit/everest-js
   https://stackoverflow.com/questions/24580588/how-to-list-all-the-notes-from-an-evernote-notebook-javascript-node-js
   https://dev.evernote.com/doc/articles/polling_notification.php
 or other popular PIMs
   https://developers.trello.com/
   http://www.xmind.net/developer/
 ideally with webhooks on a backend abstraction with coherent API 
   
*/
  
  function pimvrSaveItemsStates(callback) {
    function updateItemsStates(globalStates){    
      let pageStates = {};
      let [group, page] = getPageGroup();
      let elements = document.body.querySelectorAll('.pimvr-item');
      for (let item of elements) {
        let id = item.getAttribute("id");
        let position = item.getComputedAttribute("position");
        pageStates[id] = {"position": position};
      }
      globalStates[group+"_"+page] = pageStates;
      pimvrSaveRemote("ItemsStates", JSON.stringify(globalStates));
      return "Items states saved";
      
    }
    pimvrLoadRemote("ItemsStates", updateItemsStates);
  }  
  
  function pimvrSaveConfiguration(callback) {
    let configuration = {};
    let elements = document.body.querySelectorAll('.pimvr-configuration');
    for (let item of elements) {
      let id = item.getAttribute("id");
      let position = item.getComputedAttribute("position");
      configuration[id] = {"position": position};
    }
    
    pimvrSaveRemote("Configuration", JSON.stringify(configuration));
    return "Configuration saved";
  }
  
  function pimvrLoadIoTData(callback) {
    // should give min/max ranges, here seems to be 0-1010
    // to use (once normalized) as an attribute value
    // used on http://jsbin.com/nucanat/edit?html,output
    // warning HTTPS on tick is really hammering
    const readURL = "https://fabien.benetou.fr/PIMVRdata/IoTData?action=source";
    
    var myRequest = new XMLHttpRequest();
    myRequest.open('GET', readURL);
    myRequest.onreadystatechange = function () {
      if (myRequest.readyState === 4) {
        callback(myRequest.responseText);
      }
    };
    myRequest.send();
  }  
  
  function pimvrServerRender(group, page, callback) {
    const readURL = "https://fabien.benetou.fr/"+group+"/"+page+"?action=serverrender";
    
    var myRequest = new XMLHttpRequest();
    myRequest.open('GET', readURL);
    myRequest.onreadystatechange = function () {
      if (myRequest.readyState === 4) {
        callback(JSON.parse(myRequest.responseText).res);
      }
    };
    myRequest.send();
  }
  
  function pimvrLoadRemoteSmarthWatchConfiguration(callback) {
    
    const readURL = "https://fabien.benetou.fr/PIMVRdata/SmartWatchConfiguration?action=source";
    
    var myRequest = new XMLHttpRequest();
    myRequest.open('GET', readURL);
    myRequest.onreadystatechange = function () {
      if (myRequest.readyState === 4) {
        callback(JSON.parse(myRequest.responseText));
      }
    };
    myRequest.send();
  }
  //pimvrLoadRemoteSmarthWatchConfiguration(console.log);
  //   usage unclear, can be used as
  //     haptic feedback on interactible items e.g. vibrate on gaze
  //     controller backup e.g. gaze+click
  //     controller locator e.g. making 2 bright columns
  //     heart rate monitor (sadly not with PebbleTime) to reshape experience
  
  function pimvrLoadRemoteMetadata(group, page, callback, query) {
    
    const readURL = "https://fabien.benetou.fr/"+group+"/"+page+"?action=metajson";
    
    var myRequest = new XMLHttpRequest();
    myRequest.open('GET', readURL+"&query="+query, true);
    myRequest.onreadystatechange = function () {
      if (myRequest.readyState === 4) {
        callback(JSON.parse(myRequest.responseText));
      }
    };
    myRequest.send();
  }

  function pimvrLoadRemote(page, callback) {
    
    const readURL = "https://fabien.benetou.fr/PIMVRdata/"+page+"?action=source";
    // assumes JSON
    
    var myRequest = new XMLHttpRequest();
    myRequest.open('GET', readURL);
    myRequest.onreadystatechange = function () {
      if (myRequest.readyState === 4) {
        callback(JSON.parse(myRequest.responseText));
      }
    };
    myRequest.send();
  }
    
  function pimvrSaveRemote(page, data) {
    const writeURL = "https://fabien.benetou.fr/PIMVRdata/"+page+"?action=edit";
    
    var myWriteRequest = new XMLHttpRequest();
    myWriteRequest.open('POST', writeURL, true);
    myWriteRequest.setRequestHeader("Content-Type",
     "application/x-www-form-urlencoded");
    myWriteRequest.onreadystatechange = function () {
      if (myWriteRequest.readyState === 4) {
        //console.log(myWriteRequest.responseText);
        console.log("Save on "+page+" sucessful");
      }
    };
    console.log("trying to open "+writeURL+"post=1&author=PIMVR&authpw=edit_password&text="+data)
    myWriteRequest.send("post=1&author=PIMVR&authpw=edit_password&text="+data);
    // cf http://www.pmwiki.org/wiki/PmWiki/EditingAPI
  }
  
function loadRemoteGraph(callback, params){
  const myDataURL = "https://vatelier.net/MyDemo/newtooling/wiki_graph.json";
  // not that as agressive as it gets cached
  
	var myRequest = new XMLHttpRequest();
	myRequest.open('GET', myDataURL);
	myRequest.onreadystatechange = function () {
		if (myRequest.readyState === 4) {
      //window.PIMgraph = JSON.parse(myRequest.responseText).Nodes;
      callback(JSON.parse(myRequest.responseText).Nodes, params);
		}
	};
	myRequest.send();
}

function getMyNeighbours(nodes, page){
  console.log(nodes[page].Targets);
}
  
function getPageGroup(){   
    let group = QueryString.group || "Main";
    let page = QueryString.page || "HomePage";
    return [group, page];
}