/*--------------------------------------------------->
******************************************************
This object adds events to elements of the cut class
that facilitate cutting and pasting of those elements.
Basic usage:
window.onload = function(){cutup.addEventToAll();}
******************************************************
<---------------------------------------------------*/


var cutup = {
  //selected node
  selectedNode: null,
  //method sets clicked on word to selected if selected != null otherwise
  //pastes word to the left or right of element being hovered over.
  setSelected: function(event)
  {
    if(cutup.selectedNode == null){
      cutup.selectedNode = this.cloneNode(true);
      cutup.selectedNode.innerHTML = cutup.selectedNode.innerHTML;
      this.remove();
    }else if(this.hasClassName('insertRight')){
      par = this.parentNode;
      par.insertBefore(cutup.selectedNode,this.nextSibling);
      cutup.selectedNodeRef = cutup.selectedNode;
      cutup.selectedNode = null;
      cutup.addEventToNode(cutup.selectedNodeRef);
    }else if(this.hasClassName('insertLeft')){
      par = this.parentNode;
      par.insertBefore(cutup.selectedNode,this);
      cutup.selectedNodeRef = cutup.selectedNode;
      cutup.selectedNode = null;
      cutup.addEventToNode(cutup.selectedNodeRef);      
    }
  },
  //adds events to all elements of the "cut" class
  addEventToAll: function()
  {
    var cutups = document.getElementsByClassName("cut");
    for(i = 0; i < cutups.length; i++){
      cutups[i].onclick = function(){return false};
      cutups[i].observe('mousedown', this.setSelected);
      cutups[i].observe('mouseout', this.removeSideIndicator);
      cutups[i].observe('mousedown',this.removeSideIndicator);
    }
    Event.observe(document.body, 'mousemove', cutup.insertToSide); 
  },
  //adds cutup to events node
  addEventToNode: function(myNode)
  {
    var selectedCut = myNode;
    selectedCut.onclick = function(){return false};
    selectedCut.observe('mousedown', this.setSelected);
    selectedCut.observe('mouseout', this.removeSideIndicator);
    selectedCut.observe('mousedown',this.removeSideIndicator);
    Event.observe(document.body, 'mousemove', cutup.insertToSide); 
  },
  //when node is "cut"(selected != null) then method calculates to which
  //side of a given word the selected node should be pasted
  insertToSide: function(event)
  {
    var elt = Event.element(event);
    if(cutup.selectedNode != null && elt.hasClassName('cut')){
      var dimension = elt.getDimensions();
      if(Event.pointerX(event) < (Position.page(elt)[0] + (dimension.width / 2))){
        elt.removeClassName('insertRight');
        elt.addClassName('insertLeft');
      }else if(Event.pointerX(event) > (Position.page(elt)[0] + (dimension.width / 2))){
        elt.removeClassName('insertLeft');
        elt.addClassName('insertRight');
      }else{
        elt.removeClassName('insertLeft');
        elt.removeClassName('insertRight');
      }
    }
  },
  removeSideIndicator: function(event){
    this.removeClassName('insertLeft');
    this.removeClassName('insertRight');
  }
}
function createXMLHttpRequest(){
  try{ return new ActiveXObject("Msxml2.XMLHTTP");} catch(e){}
  try{ return new ActiveXObject("Microsoft.XMLHTTP");} catch(e){}
  try{ return new XMLHttpRequest();} catch(e){}
  alert("ajax not supported");
  return null;
}

function whichDay(){
  var re = /=([0-9]{6})/
  var day = re.exec(window.location)[1];
  return day;
}

function sendBody(){
  var loader = new Image();
  loader.src = "images/ajax-loader.gif";
  removeEmbeddedScripts();
  //remove navigation
  removeNavi();
  var bod = document.getElementsByTagName("body")[0];
  var innerBod = bod.innerHTML;
  var day = whichDay();
  var params = "dayName=" + day +"&bod=" + escape(innerBod);
  var xhr=createXMLHttpRequest();
  xhr.onreadystatechange = function(){
    var NYTImage = document.getElementById("NYTLogo");
    NYTImage.src = loader.src;
    NYTImage.style.width = "32px";
    NYTImage.style.height = "32px";
    NYTImage.style.paddingTop = "10px";
    NYTImage.style.marginBottom = "22px";
    if(xhr.readyState==4){
      if(xhr.status==200){
        NYTImage.style.paddingTop = "0px";
        NYTImage.style.marginBottom = "";
        NYTImage.style.width = "379px"; 
        NYTImage.style.height = "64px";
        NYTImage.src = "http://graphics8.nytimes.com/images/misc/nytlogo379x64.gif";
        addNavi();
        addNaviEvent();
      }else{
        NYTImage.style.paddingTop = "0px"
        NYTImage.style.marginBottom = "";
        NYTImage.style.width = "379px"; 
        NYTImage.style.height = "64px";
        NYTImage.src = "http://graphics8.nytimes.com/images/misc/nytlogo379x64.gif";
        addNavi();
        addNaviEvent();
      }
    }
  }
  xhr.open("POST", "process.php", true);
  xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  xhr.setRequestHeader("Content-length", params.length);
  xhr.setRequestHeader("Connection", "close");
  xhr.send(params);
}


function addLogoEvent(){
  var logo = document.getElementById("NYTLogo");
  logo.onclick = function(){
    sendBody();
  }
}

function addNavi(){
  var logo = document.getElementById("NYTLogo");
  var navi = document.createElement("DIV");
  navi.id = "saveInfo";
  var navCode = '<ul><li id="saveButton"><a onclick="javascript:sendBody()">Save changes.</a></li><li id="homeButton"><a href="http://joseph-moore.com/many_times/">Many Times.</a></li></ul>';
  navi.innerHTML = navCode;
  logo.parentNode.appendChild(navi);
}

function removeNavi(){
  var logo = document.getElementById("NYTLogo");
  var navi = document.getElementById("saveInfo");
  logo.parentNode.removeChild(navi);
}

function attachShowNavi(event){
  var saveInfo = document.getElementById("saveInfo");
  var logo = document.getElementById("NYTLogo");
  if(Position.within(logo,Event.pointerX(event),Event.pointerY(event)) == true){
    saveInfo.style.visibility = "visible";
  }else{
    saveInfo.style.visibility = "hidden";
  }
}  

function addNaviEvent(){
  var logo = document.getElementById("NYTLogo");
  Position.cumulativeOffset(logo);
  Element.getDimensions(logo);
  Event.observe(document.body, 'mousemove', attachShowNavi);
}

function removeEmbeddedScripts(){
  var embeddedScripts = document.getElementsByTagName("script");
  for(i=0;i<embeddedScripts.length;i++){
    embeddedScripts[i].remove();
  }  
}
window.onload = function(){
  var links = document.getElementsByClassName("a");
  cutup.addEventToAll();
  addNavi();
  addNaviEvent();
}

