// JavaScript download functions

Array.prototype.mapFunction =
  function(f) {
    var l = this.length;
    for(var i=0; i<l; i++)
      f(this[i]);
  };

function selectObject(obj) {
  if (obj.checked) {
    var f =
      function(a) {
        var elm = document.getElementById(a);
        if (!elm.disabled) {
          elm.checked = true;
          selectFunction(elm);
        }
      };
  }
  else {
    var f =
      function(a) {
        document.getElementById(a).checked = false;
        document.getElementById(a).disabled = false;
      };
  }
  data[obj.id].mapFunction(f);
  updateCurrentSize();
}

function selectAll(obj) {
  var e = obj.form.elements;
  var l = e.length;
  if (obj.checked) {
    for(var i=0; i<l; i++) {
      if (e[i].type == 'checkbox' && !e[i].disabled) {
        e[i].checked = true;
        selectFunction(e[i]);
      }
    }
  }
  else {
    for(var i=0; i<l; i++) {
      if (e[i].type == 'checkbox')
        e[i].checked = false;
        e[i].disabled = false;
    }
  }
  updateCurrentSize();
}

function validate(e,obj) {
  var elm = obj.elements;
  var l = elm.length;
  for(var i=0; i<l; i++) {
    if (elm[i].type == 'checkbox' && elm[i].checked) {
      enableAll(obj);
      return true;
    }
  }
  if (e.target)
    e.preventDefault();
  else
    e.returnValue = false;
  return false;
}

function enableAll(obj) {
  var e = obj.elements;
  var l = e.length;
  for(var i=0; i<l; i++) {
    if (e[i].type == 'checkbox' && e[i].checked && e[i].disabled)
      e[i].disabled = false;
  }
}

function selectFunction(obj) {
  if (fncDep[obj.id]) {
    if (obj.checked) {
      var a = fncDep[obj.id];
      for(var i=0; i<a.length; i++) {
        var elm = document.getElementById(a[i]);
        elm.checked = true;
        elm.disabled = true;
        selectFunction(elm);
      }
    }
    else {
      var a = fncDep[obj.id];
      for(var i=0; i<a.length; i++)
        checkReverse(a[i]);
    }
  }
  updateCurrentSize();
}

function checkReverse(id) {
  var a = fncDepReverse[id];
  for(var i=0; i<a.length; i++) {
    var elm = document.getElementById(a[i]);
    if (elm.checked)
      return;
  }
  var elm = document.getElementById(id);
  elm.disabled = false;
  if (!fncDep[id])
    elm.checked = false;
}

function updateCurrentSize() {
  var commentsOff = document.getElementById('commentsOff');
  var elm = document.getElementById('currentSize');
  if (!elm) {
    elm = document.createElement('div');
    elm.id = 'currentSize';
    elm.className = 'currentSize';
    elm.appendChild(document.createTextNode(''));
    commentsOff.parentNode.insertBefore(elm, commentsOff.nextSibling.nextSibling.nextSibling);
  }
  var p = commentsOff.checked ? 'min' : 'max';
  var e = commentsOff.form.elements;
  var l = e.length;
  var size = 0;
  for(var i=0; i<l; i++) {
    if (e[i].checked && e[i].id.match(/^fid/)) {
      size += fnc[e[i].id][p];
    }
  }
  if (size > 1023)
    elm.firstChild.nodeValue = 'Current size is ~' + (size/1024).toFixed(2) + ' Kb';
  else
    elm.firstChild.nodeValue = 'Current size is ~' + size + ' bytes';
}

function showSize() {
  var a, l, i, span;
  var o = {min:0,max:0};
  var all = {min:0,max:0};
  for(var p in data) {
    a = data[p]
    l = a.length;
    for(i=0; i<l; i++) {
      // Size for functions in object
      span = document.createElement('span');
      span.appendChild(document.createTextNode('(' + fnc[a[i]].min + '/' + fnc[a[i]].max + ')'));
      span.className = 'size';
      document.getElementById(a[i]).parentNode.appendChild(span);
      o.min += fnc[a[i]].min;
      o.max += fnc[a[i]].max;
    }
    // Size for object
    span = document.createElement('span');
    span.appendChild(document.createTextNode('(' + o.min + '/' + o.max + ')'));
    span.className = 'size';
    document.getElementById(p).parentNode.insertBefore(span,document.getElementById(p).nextSibling.nextSibling);
    all.min += o.min;
    all.max += o.max;
    o.min = 0;
    o.max = 0;
  }
  // Size for all objects
  span = document.createElement('span');
  span.appendChild(document.createTextNode('(' + all.min + '/' + all.max + ')'));
  span.className = 'size';
  document.getElementById('all').parentNode.appendChild(span);
}

// If page is called with a function id select that function
function selectInit() {
  //var m = document.location.search.match(/^\?fid\=(\d+)\s*$/);
  var m = document.location.search.match(/((f|o)id\=\d+)/g);
  if (m) {
    var tmp;
    for(var i=0; i<m.length; i++) {
      tmp = m[i].split('=');
      var elm = document.getElementById(tmp[0] + '_' + tmp[1]);
      if (elm && !elm.checked) {
        var li = elm.parentNode;
        // Add elements. Can't use innerHTML
        // This HAS to be done before simulating click otherwise
        // FF, OP and SF reset input to default
        li.appendChild(document.createElement('br'));
        li.appendChild(document.createElement('br'));
        li.appendChild(document.createTextNode('The function and its depedendencies have been automatically selected. You may continue selecting other functions or proceed to '));
        var a = document.createElement('a');
        a.href = '#';
        a.onclick =
          function() {
            document.getElementById('downloadBox').scrollIntoView();
            return false;
          };
        a.appendChild(document.createTextNode('create'));
        li.appendChild(a);
        li.appendChild(document.createTextNode(' the JavaScript file.'));
        if (document.createEventObject)
          elm.click();
        else {
          var e = document.createEvent('MouseEvent');
          e.initMouseEvent('click',true,true,window,1,null,null,null,null,null,null,null,null,0,null);
          elm.dispatchEvent(e);
        }
        elm.parentNode.className = 'selected';
        // Scroll to object for function if fid
        if (tmp[0] == 'fid') {
          // input -> li -> ul -> li -> ul - not elegant but it works for now
          var elm = elm.parentNode.parentNode.parentNode.parentNode;
        }
        // Mark LI element as selected
        elm.parentNode.scrollIntoView();
      }
    }
  }
}

function getSource(elm) {
  var xhr = new XHR();
  xhr.onabort =
    function() {
      alert('An error occured while retreiving the source. We are sorry for the inconvenience');
    };
  xhr.onreadystateloaded =
    function() {
      var ta = document.createElement('textarea');
      ta.wrap = 'off';
      ta.className = 'source';
      ta.value = this.req.responseText;
      elm.appendChild(document.createElement('br'));
      elm.appendChild(ta);
    };
  var url = 'getSource.php' + document.location.search;
  xhr.open('GET',url, true);
  xhr.send(null);
}

if (document.createEventObject)
  window.attachEvent('onload', function(){document.getElementById('javascriptEnabled').value = 'true'; showSize(); updateCurrentSize(); selectInit();});
else
  window.addEventListener('load', function(){document.getElementById('javascriptEnabled').value = 'true'; showSize(); updateCurrentSize(); selectInit();}, false);
  