/**
 * Q42 Quplets and Quplo technology (c) 2007
 *
 * added by Kars, used in Personalized area
 */

var QUPLETS_ACTION_TIMEOUT = 0; //500;
var QUPLETS_SUBMIT_TIMEOUT = 0; //750;

var Agent = 
{
  IE: (navigator.appName == "Microsoft Internet Explorer"),
  FF: (navigator.appName == "Netscape"),
  OP: (navigator.appName== "Opera"),
  SF: (navigator.appName== "Safari"),

  addEventListener: function(el, strEventName, listener)
  {
    if (this.IE)
      el.attachEvent("on" + strEventName, listener);
    else
      el.addEventListener(strEventName, listener, true);
  },
  createXmlDocument: function()
  {
    if (this.IE)
    {
      for (var i in {6:6,4:4,3:3,2:2})
      {
        try
        {
          var doc = new ActiveXObject("MsXml2.DomDocument." + i + ".0");
          break;
        }
        catch(e)
        {
        }
      }
      doc.async = false;
    }
    else
    {
      var doc = document.implementation.createDocument("text/xml", "", null);
    }
    return doc;
  },
  createXmlDocumentFromString: function(xmlString)
  {
    if (this.IE)
    {
      var doc = this.createXmlDocument();
      doc.loadXML(xmlString);      
    }
    else
    {
      var parser = new DOMParser(); 
      var doc = parser.parseFromString(xmlString, "text/xml"); 
    }
    return doc;
  },
  createXmlHttpObject: function () 
  {
    if (this.IE)
      return new ActiveXObject("Microsoft.XmlHttp");
    else
      return new XMLHttpRequest();
  },
  setText: function (xmlNode, value)
  {
    if (this.IE)
      xmlNode.text = value;
    else
      xmlNode.textContent = value;
  },
  getXml: function (xmlNode) 
  {
    return xmlNode.xml || (new XMLSerializer()).serializeToString(xmlNode, "text/xml");
  }
};

var Quplets =
{
  qid : 1, // unique id counter
  lastInnerHTMLS : {}, // hashmap for storing innerHTML per qid
  
  handleKeyUp: function(evt)
  {
    evt = Agent.IE? event : evt;
    var el = Agent.IE? evt.srcElement : evt.target;
    var keyCode = evt.keyCode;
    if (keyCode == 27)
      Quplets.escape(el);
  },
  
  init: function()
  {  
    Agent.addEventListener(document, "keyup", Quplets.handleKeyUp);
  },
  getOuterQuplet: function(el, isInEditMode)
  {
    for (; el && el.parentNode; el = el.parentNode)
      if (el.className.indexOf("quplet")>-1)
      {
        return Quplets.setQid(el);
      }
  },
  // kamil? waarom qids? mogen deze weg? (kars)
  setQid: function(el)
  {
    if (!el.getAttribute("qid"))
      el.setAttribute("qid", "qid" + Quplets.qid++);
    return el;
  },
  escape: function(el)
  {
    var q = Quplets.getOuterQuplet(el);
    if (q)
    {
      var qid = q.getAttribute("qid");
      q.innerHTML = Quplets.lastInnerHTMLS[qid];
    }
  },
  fireTargetAction: function(el, target)
  {
    var q = Quplets.setQid(document.getElementById(target));
    Quplets.handleAction(q, el);
  },
  fireAction: function(el, overrideUrl)
  {
    var q = Quplets.getOuterQuplet(el);
    Quplets.handleAction(q, el, overrideUrl);
  },
  handleAction: function(q, el, overrideUrl)
  {
    if (!q)
    {
      // no quplet is here. Then, we use our previous sibling.
      q = document.createElement("div");
      el.parentNode.insertBefore(q, el);
      q.className="quplet";
    }
    if (q)
    {
      var qid = q.getAttribute("qid");
      Quplets.lastInnerHTMLS[qid] = q.innerHTML;
      q.className+= " quplet-loading";    
      var xhr = Agent.createXmlHttpObject();
      
      var url = overrideUrl?overrideUrl:el.getAttribute("href"); // optionally: manually override
      if (!url) return false;      
      if (url.indexOf("?")>-1) url += '&dummy='; else url += '?dummy=';      
      
      xhr.open("GET", url+new Date().getTime(), true);
      xhr.onreadystatechange = function()
      {
        if (xhr.readyState == 4)
        {
          q.className = "quplet-edit";
          Quplets.scatterHtml(q, xhr.responseText);
        }
      }
      setTimeout(function(){
        xhr.send(null);
      }, QUPLETS_ACTION_TIMEOUT);
    }
  },
  submit: function(form)
  {
    var q = Quplets.getOuterQuplet(form, true);
    var target = form.getAttribute("target");
    if (!q && target) q = document.getElementById(target);
    var submit = null;
    if (q)
    {
      var doc = Agent.createXmlDocumentFromString("<quplet />");
      var docEl = doc.documentElement;
      q.className += " quplet-loading"; 
      for (var i=0, el; el = form.elements[i++];)
      {
        var name = el.name? el.name : el.tagName + i;
        var node = doc.createElement(name);
        switch(true)
        {
          case el.type == "submit":
            el.disabled=true;
            submit = el;
          case el.type == "radio" && !el.checked:
            continue;
          case el.type == "checkbox":
            Agent.setText(node, el.checked.toString());
            break;
          default:
            Agent.setText(node, el.value);
            break;
        }  

        docEl.appendChild(node);
      }
      var xhr = Agent.createXmlHttpObject();
      var url = form.action;
      if (url.indexOf('?')>-1) url+='&dummy='; else url+='?dummy=';
      
      xhr.open("POST", url+new Date().getTime(), true);
      xhr.onreadystatechange = function()
      {
        if (xhr.readyState == 4)
        { 
          q.className = "quplet";
          Quplets.scatterHtml(q, xhr.responseText);
          submit.disabled = false;
        }
      }
      setTimeout(function(){
        xhr.send(doc);
      }, QUPLETS_SUBMIT_TIMEOUT);
      
    }
  },
  
  scatterHtml : function (el, html)
  {
  //debugger;
    // scatters html to targets, cleans up html if needed, finds out serverside commands
    if (!html) return;
    
    // create dummy div
    var div = document.createElement("div");
    div.innerHTML = html;

    var child,target;
    for (var i=0; i<div.childNodes.length; i++)
    {
      target = el;
      child = div.childNodes[i];
      if (child.nodeType==1) 
      {
        var className = child.className;
        var targetId = child.getAttribute("target");
        if (targetId)
        {
          // other target element
          var newtarget = this.getElementByPath(el, targetId);
          if (newtarget) target=newtarget;
        }
        switch (className)
        {
          case "quplet-replace":
          case "quplet":
          default:
            if (target.innerHTML) target.innerHTML = ""; // do not set innerHTML of images
          case "quplet-attribute":
            // possibly: set attributes if wanted, only possible attributes:
            // src
            // clss (class)
            if (child.getAttribute("src")) target.src = child.getAttribute("src");
            if (child.getAttribute("clss")) target.className = child.getAttribute("clss");
          case "quplet-append":
            while (child.firstChild) target.appendChild(child.firstChild);
            break;
        }
      }
    }
    var inputs = target.getElementsByTagName("input");
    if (inputs.length > 0)
      inputs[0].select();
  },
  
  getElementByPath: function(contextEl, path)
  {
    if (path==null || path=="") return contextEl;
    
    if (path.indexOf("../")==0)
    {
    
      // one node higher
      return this.getElementByPath(contextEl.parentNode, path.substring(3));
    }
    
    if (path.indexOf("@")==0)
    {
      // find children with this text in the classname, eg: @topic
      var className = path.substring(1);
      for (var i=0; i<contextEl.childNodes.length; i++)
      {
        var child = contextEl.childNodes[i];
        if (child.className.indexOf(className)>-1) {  return child; }
      }
      
      // not found.
      
      return null;
    }
    
    return document.getElementById(path);
  }
};
Quplets.init();  

