

function prepareLinks(containerId,canvasId) {
  if (!document.getElementById) return false;
  if (!document.getElementById(containerId)) return false;
  if (!document.getElementById(canvasId)) return false;
  var links = document.getElementById(containerId).getElementsByTagName("a");
  for (var i=0; i<links.length; i++) {
      if(links[i].hasAttribute("class") && links[i].getAttribute("class") =="hijax") {
          links[i].canvasId = canvasId;
          links[i].onclick = function() {
            var file = this.getAttribute("href"); 
            return (!sendData(null,'GET',file,this.canvasId));
          };
        
      }
    
  }
}

function getSource(event) {
  var src;
  if (!event) var event = window.event;

  if (event.target) {  // Firefox
     src = event.target;
  } else if (event.srcElement) {
    src = event.srcElement; // IE
  }

  if (src.nodeType == 3) { // defeat Safari bug
    src = src.parentNode;
  }

  return src;
}

var submitButton;
var hijaxForm = false;

function prepareForm(formId,canvasId) {
  if (!document.getElementById) {
    // alert('getElementById failed, returning');
    return false;
  }
  if (!document.getElementById(formId)) {
      // alert('no such element as ' + formId + ', returning');
      return false;
  } 
  var form = document.getElementById(formId);
  form.onsubmit = function(event) {
      if(hijaxForm) {
      var data = "";
      
      var inputs = form.getElementsByTagName("input");
      for (var i=0; i<inputs.length; i++) {
        if(inputs[i].type != 'submit' && inputs[i].name != '') {

          if(inputs[i].type == 'checkbox' || inputs[i].type == 'radio') {
            if(inputs[i].checked) {
              data+= inputs[i].name;
              data+= "=";
              data+= encodeURIComponent(inputs[i].value);
              data+= "&";
            }
          } else { 
            data+= inputs[i].name;
            data+= "=";
            data+= encodeURIComponent(inputs[i].value);
            data+= "&";
          }
        } 
      }
      var selects = form.getElementsByTagName("select");
      for (var i=0; i<selects.length; i++) {
          data+= selects[i].name;
          data+= "=";
          data+= encodeURIComponent(selects[i].value);
          data+= "&";
      }
 
      var textareas = form.getElementsByTagName("textarea");
      for (var i=0; i<textareas.length; i++) {
        data+= textareas[i].name;
        data+= "=";
        var editor = FCKeditorAPI.GetInstance(textareas[i].id) ;
        var editorValue = editor.GetHTML();
        data+= encodeURIComponent(editorValue);
        data+= "&";
      } 
      data +=submitButton + "=" + submitButton;
      return (!sendData(data,form.getAttribute('method'),form.getAttribute('action'),canvasId));
    } else {
      return true;
    }
  };
  var submitButtons = form.getElementsByTagName("input");
  for (var i=0; i<submitButtons.length; i++) {
    if(submitButtons[i].type == 'submit' && submitButtons[i].getAttribute("class") == 'hijax') {
      submitButtons[i].onclick = function(event) {
        submitButton = this.name;
        hijaxForm = true;
        return true;
      }
    } else if(submitButtons[i].type == 'submit' && submitButtons[i].getAttribute("class") != 'hijax') {
      submitButtons[i].onclick = function(event) {
        submitButton = this.name;
        hijaxForm = false;
        return true;
      }
    }
  }
}

function sendData(data,method,file,canvasId) {
  var request = getHTTPObject();
  if (request) {
    if(file.indexOf("?") == -1) {
      file += "?fragments=" + canvasId;
    } else {
      file += "&fragments=" + canvasId;
    }	

    request.onreadystatechange = function() {
      parseResponse(request,canvasId);
    };
    request.open(method, file, true );
    request.setRequestHeader("Accept","text/html;type=ajax");
    request.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");
    request.setRequestHeader("Accept-Charset","UTF-8");
    request.send(data);
    
    return true;
  } else {
    return false;
  }
}

function parseResponse(request,canvasId) {
  if (request.readyState == 4) {
    //alert(request.status + " " + request);
    if (request.status == 200) { // simple GET or POST -> response
      if(request.getResponseHeader('Spring-Redirect-URL')) {
         //alert(request.getResponseHeader('Spring-Redirect-URL'));
         var redirectUrl = request.getResponseHeader('Spring-Redirect-URL');
         var redirectRequest = getHTTPObject();
         request.onreadystatechange = function() {
           parseResponse(request,canvasId);
         };
         if(redirectUrl.indexOf("?") == -1) {
           redirectUrl += "?";
         } 	
         request.open("GET", redirectUrl + "&fragments=" + canvasId, true );
         request.setRequestHeader("Accept","text/html;type=ajax");
         
         request.send(null);
      } else {
        document.getElementById(canvasId).innerHTML = request.responseText;
        /**
         * working on the assumption that all decorations are applied using a separate <script class='hijax'/> tag with a special 
         * hijax class in a distinct, zero-arg function. By extracting the contents of the tag, removing the everything between the
         * parentheses and eval()-ing it, we re-apply the decoration within the fragment.
         *
         * cool beans.
         */
        var scriptTags = document.getElementById(canvasId).getElementsByTagName('script');
        var toEvaluate = "";
        for (var i=0; i<scriptTags.length; i++) {
          if(scriptTags[i].hasAttribute("class")) {
             
            if(scriptTags[i].getAttribute("class") =="hijax") {
              var scriptTag = scriptTags[i];
              var firstParenthesis = scriptTag.innerHTML.indexOf("{");
              var lastParenthesis = scriptTag.innerHTML.lastIndexOf("}");
              toEvaluate = toEvaluate +  scriptTag.innerHTML.substring(firstParenthesis +1,lastParenthesis);
            }
          }
        }
        if(toEvaluate.length > 0) {
          try {
            eval(toEvaluate);
          } catch(e) {
          }
        }
        hijax();
     }
    } else {
    }
  }
}

function getHTTPObject() {
  var xhr = false;
  if (window.ActiveXObject) {
    try {
      xhr = new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
      try {
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
      } catch(e) {
        xhr = false;
      }
    }
  } else if (window.XMLHttpRequest) {
    try {
      xhr = new XMLHttpRequest();
    } catch(e) {
      xhr = false;
    }
  }
  return xhr;
}
