/***[AJAX]***/
var _HTTPFactories = [
  function () { return new XMLHttpRequest(); },
  function () { return new ActiveXObject("Msxml.XMLHTTP"); },
  function () { return new ActiveXObject("Microsoft.XMLHTTP"); }
];

var _HTTPFactory = null;

function HTTPRequest() {
  if(_HTTPFactory) return _HTTPFactory();
  for(var i=0; i < _HTTPFactories.length; i++) {
    try {
      var factory = _HTTPFactories[i];
      var request = factory();
      if(request != null) {
        _HTTPFactory = factory;
        return request;
      }
    }
    catch(e) { continue; }
  }
  alert("NoHttpRequest");
}

//On pourrait dire que si il y a un callback... quoi ?!
//FIXME: rename as get and post
function get(path, cmd, cbk) {
  var req = HTTPRequest();
  cbk = cbk || function(status, text) { alert("Unhandled response(" + status + "): " + text); };
  var opt = new Array(); /* FIXME: obj to URL: {prop:{sub_prop:value}} => prop.sub_prop=value */
  if(cmd) for(key in cmd) { opt.push(key + "=" + cmd[key]); }//FIXME:urlencode
  req.onreadystatechange = function() {
    if(req.readyState == 4) { cbk(req.status, req.responseText); }
//    else alert(req.readyState);
  };
  req.open("GET", path + "?" + opt.join("&"), true);
  req.send(null);
  return false;
}

function send_debug(status, text) {
  alert("scripts.js: send_debug: " + status + ", " + text);
};


/***[JSON]***/
function json_parse(text) {
  //FIXME: subst '/*' and '*/' around text to avoid <script src="target"/>
  try { return eval('(' + text + ')');
  } catch (e) { throw("parse error"); }
  //alert("json_parse: " + text + "\n========\n" + e); return false; }
}

function to_json(value) {
  switch(typeof value) {
  case "object":
    if(value.constructor == Array) return "[" + str_concat(",", map(value, to_json)) + "]";
    else return "{"+str_concat(",", obj_map(value, function(n,v){return n+":"+to_json(v);}))+"}";
  case "string": return "\"" + value + "\"";//FIXME: quote !
  default: return value;
  }
}


/***[POPUP]***/
var popup={};

function popup_open($title, $content, $footer) {
  popup.content=document.getElementById('popup_content');
  popup.footer=document.getElementById('popup_footer');
  popup.bg=document.getElementById('popup_bg');
  popup.win=document.getElementById('popup');
  popup.title = document.getElementById('popup_title');

  popup.bg.style.display = popup.win.style.display='block';
  popup.title.innerHTML = $title;
  popup.content.innerHTML = $content;
  popup.footer.innerHTML = $footer;
}

function popup_close() {
  popup.bg.style.display = popup.win.style.display = 'none';
}


/***[UPLOAD]***/
var upload = {};

function upload_progress_submit() {
  upload.iframe = document.getElementById('upload_target');
  function timeout_cbk() {}
  function cbk(code, text) {
    popup.content.innerHTML=text;
    switch(upload.state) {
      case 'finished':
        popup.content.innerHTML="<b>Transfert termine</b>";
        popup.footer.innerHTML = '<form action="videos.php" onsubmit="popup_close(); "><input type="submit" value="Ok" /></form>';
        break;
      case 'transfering':
        setTimeout(function () { get('progress.php', {}, cbk) }, 500);
        break;
      case 'cancel':
        popup.content.innerHTML = 'Transfert annule';
        popup.footer.innerHTML = '<form onsubmit="popup_close(); return false;"><input type="submit" value="Ok" /></form>';
        break;
      default:
        alert(upload.state);
        break;
    }
  }
  popup_open('Transfert', 'En attente du debut du transfert',
             '<form onsubmit="return upload_cancel();"><input type="submit" value="Cancel" /></form>');
  upload.state = 'transfering';
  get('progress.php', {}, cbk);
}

function upload_cancel() {
  upload.iframe.src = 'about:blank';
  upload.state = 'cancel';
  return false;
}
