// some of this is from http://code.google.com/appengine/articles/rpc.html

//
// As mentioned at http://en.wikipedia.org/wiki/XMLHttpRequest
//
if( !window.XMLHttpRequest ) XMLHttpRequest = function() {
  try{ return new ActiveXObject("Msxml2.XMLHTTP.6.0") }catch(e){}
  try{ return new ActiveXObject("Msxml2.XMLHTTP.3.0") }catch(e){}
  try{ return new ActiveXObject("Msxml2.XMLHTTP") }catch(e){}
  try{ return new ActiveXObject("Microsoft.XMLHTTP") }catch(e){}
  throw new Error("Could not find an XMLHttpRequest alternative.")
};

//
// Makes an AJAX request to a local server function w/ optional arguments
//
// functionName: the name of the server's AJAX function to call
// opt_argv: an Array of arguments for the AJAX function
//
function Request(function_name, opt_argv) {
  if (!opt_argv)
    opt_argv = new Array();

  // Find if the last arg is a callback function; save it
  var callback = null;
  var len = opt_argv.length;
  if (len > 0 && typeof opt_argv[len-1] == 'function') {
    callback = opt_argv[len-1];
    opt_argv.length--;
  }
  var async = (callback != null);

  // Build an Array of parameters, w/ function_name being the first parameter
  var params = new Array(function_name);
  for (var i = 0; i < opt_argv.length; i++) {
    params.push(opt_argv[i]);
  }
  var body = JSON.stringify(params);

  // Create an XMLHttpRequest 'POST' request w/ an optional callback handler
  var req = new XMLHttpRequest();
  req.open('POST', '/rpc', async);

  req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  req.setRequestHeader("Content-length", body.length);
  req.setRequestHeader("Connection", "close");

  if (async) {
    req.onreadystatechange = function() {
      if(req.readyState == 4 && req.status == 200) {
        var response = null;
        try {
         response = JSON.parse(req.responseText);
        } catch (e) {
         response = req.responseText;
        }

        if (response.substr(0, 11) == 'EXCEPTION: ') {
          window.alert(response);
          return;
        }

        callback(response);
      }
    }
  }

  // Make the actual request
  req.send(body);
}
// Adds a stub function that will pass the arguments to the AJAX call
function InstallFunction(obj, functionName) {
  obj[functionName] = function() { Request(functionName, arguments); }
}

// Handy "macro"
function $(id){
  return document.getElementById(id);
}

// Server object that will contain the callable methods
var server = {};

function addLoadEvent(func) { // from http://simonwillison.net/2004/May/26/addLoadEvent/
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      if (oldonload) {
        oldonload();
      }
      func();
    }
  }
}

function parseXML(xml) {
  try { //Internet Explorer
    xmlDoc = new ActiveXObject('Microsoft.XMLDOM');
    xmlDoc.async = 'false';
    xmlDoc.loadXML(xml);
  }
  catch(e) {
    try { //Firefox, Mozilla, Opera, etc.
      parser = new DOMParser();
      xmlDoc = parser.parseFromString(xml, 'text/xml');
    }
    catch(e) {
      alert(e.message);
      return null;
    }
  }

  return xmlDoc;
}

function parseGameInfoString(gameInfoString) {
  xmlDoc = parseXML(gameInfoString);
  r = { }
  r['name'] = xmlDoc.getElementsByTagName('name')[0].childNodes[0].nodeValue;
  r['player1'] = xmlDoc.getElementsByTagName('player1')[0].childNodes[0].nodeValue;
  r['player2'] = xmlDoc.getElementsByTagName('player2')[0].childNodes[0].nodeValue;
  r['player1_fighter1'] = xmlDoc.getElementsByTagName('player1_fighter1')[0].childNodes[0].nodeValue;
  r['player1_fighter2'] = xmlDoc.getElementsByTagName('player1_fighter2')[0].childNodes[0].nodeValue;
  r['player2_fighter1'] = xmlDoc.getElementsByTagName('player2_fighter1')[0].childNodes[0].nodeValue;
  r['player2_fighter2'] = xmlDoc.getElementsByTagName('player2_fighter2')[0].childNodes[0].nodeValue;
  r['status'] = xmlDoc.getElementsByTagName('status')[0].childNodes[0].nodeValue;
  r['player1_captured'] = xmlDoc.getElementsByTagName('player1_captured')[0].childNodes[0].nodeValue;
  r['player2_captured'] = xmlDoc.getElementsByTagName('player2_captured')[0].childNodes[0].nodeValue;
  r['outcome'] = xmlDoc.getElementsByTagName('outcome')[0].childNodes[0].nodeValue;
  return r;
}

function parseFighterXML(xml) {
  xmlDoc = parseXML(xml);
  r = { }
  r['name'] = xmlDoc.getElementsByTagName('name')[0].childNodes[0].nodeValue;
  r['dice'] = xmlDoc.getElementsByTagName('dice')[0].childNodes[0].nodeValue;
  r['rating'] = xmlDoc.getElementsByTagName('rating')[0].childNodes[0].nodeValue;
  r['baseValue'] = xmlDoc.getElementsByTagName('baseValue')[0].childNodes[0].nodeValue;
  r['manager'] = xmlDoc.getElementsByTagName('manager')[0].childNodes[0].nodeValue;
  return r;
}

function getPrettyFighterString(xml) {
  fighterInfo = parseFighterXML(xml);
  return fighterInfo['name'].replace(/_/g, ' ') + ' (' + fighterInfo['rating'] + '): ' + fighterInfo['dice'];
}

function removeAllChildren(node) {
  while (node.hasChildNodes()) {
    node.removeChild(node.firstChild);
  }
}

function parseOutFighterName(fighterString) {
  array = fighterString.split(' ');
  return array[0].substr(0, array[0].length - 1); // strip off colon
}

function parseOutFighterDice(fighterString) {
  array = fighterString.split(' ');
  array.splice(0, 1); // remove fighter name element
  return array.join(' ');
}

function sumDiceSides(diceString) {
  if (diceString == 'None') return 0;
  var a = diceString.split(' ');
  var sum = 0;
  for (var i = 0; i < a.length; i++) {
    v = parseInt(a[i].split(':')[0].substr(1));
    if (!isNaN(v)) sum += v;
  }
  return sum;
}

function openFighterDetailsPopup(fighter) {
  if (fighter.length > 0) {
    var url = '/fighter_details?fighter=' + fighter;
    window.open(url, 'FighterDetailsWindow', 'menubar=no, width=800, height=700, toolbar=no');
  }
}

function openCreateOrderForFighterPopup(fighter) {
  if (fighter.length > 0) {
    var url = '/create_order?fighter=' + fighter;
    window.open(url, 'CreateOrderWindow', 'menubar=no, width=800, height=500, toolbar=no');
  }
}
