var aUniverseResArr = new Array(); var aRefreshInterval = 10; 
var aSpeedArray = new Array();
var aFinalArmadaSpeed = 0;
var aActiveSlides = new Array();
var aSliding = false;
var aPendingFlightCalc = -1;
var aCalculating = false;
var aOnlyUnits=0;  // This is used for "colonyres.php" ajax call
var aTplTypes = new Array('sa','sd','pa','pd');

function describe(aMsg){ window.status = aMsg; return true; };
function refreshmenu(){ window.top.frmenu.refreshMessages(0); window.top.header.refreshMessages(1); };

function validateform(){
  for(var i=0;i<reguiredFlds.length;i++){
    if (document.registerform.elements[reguiredFlds[i]].type=="select-one") {
      if (document.registerform.elements[reguiredFlds[i]].val()=="-"){
        alert("You must select a " + reguiredFlds[i]);
        return false;
      };
    }else{
      if (document.registerform.elements[reguiredFlds[i]].val().length==0){
        alert("You must fill in the " + reguiredFlds[i]);
        return false;
      };
    };
  }
  return true;
}

// It returns the ACTUAL position in the screen of a specific element...
function findPos(obj) {
  var curleft = curtop = 0;
  if (obj.offsetParent) {
    do {
      curleft += obj.offsetLeft;
      curtop += obj.offsetTop;
    } while (obj = obj.offsetParent);
    return [curleft,curtop];
  }
}

function getWindowWidth(){
  minW = 1004;
  if (parseInt(navigator.appVersion, 10)>3) {
   if (navigator.appName=="Netscape") {
    minW = window.innerWidth-16;
   }
   if (navigator.appName.indexOf("Microsoft")!=-1) {
    minW = document.body.offsetWidth-20;
   }
  }
  return minW;
}

function getWindowHeight(){
  minH = 600;
  if (parseInt(navigator.appVersion, 10)>3) {
   if (navigator.appName=="Netscape") {
    minH = window.innerHeight-16;
   }
   if (navigator.appName.indexOf("Microsoft")!=-1) {
    minH = document.body.offsetHeight-20;
   }
  }
  return minH;
}

function getScrollXY() {
  var scrOfX = 0, scrOfY = 0;
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
  return [ scrOfX, scrOfY ];
}

function doClear(aControlId){ jQuery('#'+aControlId).val(""); };
function setValue(aControlId, aValue){ document.getElementById(aControlId).value=aValue; };
function checkEmail(aEmail){ return (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(aEmail)); }
function trim(s) {return s.replace(/^\s*(.*?)\s*$/,"$1")}
function StrPos(aSource,aChar){for(var i=0;i<aSource.length;i++) if(aSource.charAt(i)==aChar) return i; return -1;}

function indexOfArr(aArray, aKey){
  var aPos = -1;
  for(var i=0;i<aArray.length;i++) if(aArray[i]==aKey) aPos=i;
  return aPos;
}

function validateNumericInput(e){
  var key = window.event ? e.keyCode : e.which;
  reg = /\d|\./;
  if (key<32) return true;
  var keychar = String.fromCharCode(key);
  return reg.test(keychar);
}

function clearFormElements(frm){
  for(var i=0;i<frm.elements.length;i++){
    el = frm.elements[i];
    switch (el.tagName.toLowerCase()) {
      case 'input'   :
      case 'textarea':  el.value=trim(el.value);
                        break;
    }
  }
}

// Highlight the building...
function doHL(aDiv, aHighlight){
  if(aHighlight==1){
    aDiv.style.opacity='0.6';
    aDiv.style.filter='alpha(opacity = 50)';
  }else{
    aDiv.style.opacity='1';
    aDiv.style.filter='alpha(opacity=100)';
  }
}

// grid Row Up...
function rU(aRow){aRow.className="alternate2"; }

// grid Row Out...
function rO(aRow){aRow.className="alternate"; }

function ValidateInput(){
  if (document.login.nickname.value.length<1){ alert("You need to supply a nickname!"); return false; }
  if (document.login.password.value.length<1){ alert("You need to supply a password!"); return false; }
}

function submitenter(myfield,e)
{
  var keycode;
  if (window.event) keycode = window.event.keyCode;
  else if (e) keycode = e.which;
  else return true;
  if (keycode == 13){
    myfield.form.submit();
    return false;
  }else
    return true;
}

function drawResources(){
  for(aRes in aUniverseResArr){
    aStock = aUniverseResArr[aRes][1]; aMax = aUniverseResArr[aRes][2]; aAmount = aUniverseResArr[aRes][3];
    aNewAmount = aStock + (aAmount*aRefreshInterval/3600);
    if (aNewAmount>aMax) aNewAmount = aMax;
    aUniverseResArr[aRes][1] = aNewAmount;
  }
  for(aRes in aUniverseResArr){
    aElem = jQuery('#res'+aUniverseResArr[aRes][0]);
    if(aElem) aElem.innerHTML = Math.floor(aUniverseResArr[aRes][1]);
  }
  setTimeout(drawResources, aRefreshInterval*1000);
};

function addRes(aResId, aStock, aMax, aAmount){ aUniverseResArr.push(new Array(aResId, aStock, aMax, aAmount)); }

function validateAmount(aInput, aMax){
  var aNumbers = "0123456789";
  if (aNumbers.search(aInput.value.charAt(aInput.value.length-1)) == -1)
    aInput.value = aInput.value.substr(0,aInput.value.length-1);
  if (aInput.value==""){
    aInput.value = 0;
  }else if (parseInt(aInput.value,10) > aMax)
    aInput.value = aMax;
}

function get_radio_value(aRadio){
  if(!aRadio.length) return aRadio.value;
  for (var i=0; i < aRadio.length; i++)
    if (aRadio[i].checked)
      return aRadio[i].value;
}

function set_radio_value(radioObj, newValue) {
  if(!radioObj) return;
  var radioLength = radioObj.length;
  if(radioLength == undefined) {
    radioObj.checked = (radioObj.value == newValue.toString());
    return;
  }
  for(var i = 0; i < radioLength; i++) {
    radioObj[i].checked = false;
    if(radioObj[i].value == newValue.toString()) {
      radioObj[i].checked = true;
    }
  }
}

function validateMoveOrder(){
  var aResult = true;
  if (document.getElementById("fromstr").value==""){
    alert("You must choose a source colony!");
    aResult = false;
  }else if (document.getElementById("tostr")){
    if (document.getElementById("tostr").value==""){
      alert("You must choose a destination colony!");
      aResult = false;
    }
  }
  return aResult;
}

function findRes(aResId){
  for(i=0;i<aArmada.length;i++) 
    if(aArmada[i][0]==aResId) return i;
  return -1;
}

function recalcCargo(aResId,aPlanetCargo,aStarCargo,aSize,aAmount,aPlanetSpeed,aStarSpeed){
  var aCargoIndex = findRes(aResId);
  if(aCargoIndex==-1){
    aArmada.push(new Array(aResId,aPlanetCargo,aStarCargo,aSize,aAmount,aPlanetSpeed,aStarSpeed));
  }else
    aArmada[aCargoIndex][4] = aAmount;

  var aTotalPlanetCargo=0; var aTotalStarCargo=0; var aTotalPlanetSize=0; var aTotalStarSize=0;
  var aMinPlanetSpeed=10000; var aMinStarSpeed=10000;
  for(var i=0;i<aArmada.length;i++) if(aArmada[i][4]>0) {
    pc = aArmada[i][1]; sc=aArmada[i][2]; sz=aArmada[i][3]; am=aArmada[i][4]; ps=aArmada[i][5]; ss=aArmada[i][6]
    if((ps>0)&&(ps<aMinPlanetSpeed)) aMinPlanetSpeed=ps;
    if((ss>0)&&(ss<aMinStarSpeed)) aMinStarSpeed=ss;
    if((pc==0)&&(sc==0)){
      aTotalPlanetSize += sz*am;
      aTotalStarSize += sz*am;
    }
    if((pc!=0)&&(sc!=0)){
      aTotalPlanetCargo += pc*am;
      aTotalStarCargo += sc*am;
    }else{
      if(pc!=0){
        aTotalPlanetCargo += pc*am;
        aTotalStarSize += sz*am;
      }else
        aTotalStarCargo += sc*am;
    }
  }

  if(aTotalStarSize>aTotalStarCargo) {
    if (aMinPlanetSpeed==10000) aMinPlanetSpeed = 0;
    aFinalArmadaSpeed = aMinPlanetSpeed;
    jQuery('#edMove').html('Planetary (' + aMinPlanetSpeed + ')');
    jQuery('#edMove').css('color', '#CCCCCC');
    jQuery('#edCapacity').html(Math.round(aTotalPlanetSize*10)/10);
    jQuery('#edMaxCapacity').html(aTotalPlanetCargo);
    if(aTotalPlanetSize>aTotalPlanetCargo) {
      jQuery('#edCapacity').css('color', '#FF0000');
    }else
      jQuery('#edCapacity').css('color', '#00FF00');
  }else{
    if(aMinStarSpeed==10000) aMinStarSpeed = '0';
    aFinalArmadaSpeed = aMinStarSpeed;
    jQuery('#edMove').html('Space ('+aMinStarSpeed + ')');
    jQuery('#edMove').css('color', '#0000FF');
    jQuery('#edCapacity').html(Math.round(aTotalStarSize*10)/10);
    jQuery('#edMaxCapacity').html(aTotalStarCargo);
    jQuery('#edCapacity').css('color', '#00FF00');
  }
  getEta(jQuery('#colonyfrom').val(), jQuery('#colonyto').val(), 'spanEta');
}

function getResources(aResetColonies,aIdFld){
  aArmada = new Array();
  jQuery('#edCapacity').html('0'); jQuery('#edMaxCapacity').html('0'); jQuery('#edMove').html('Planetary'); jQuery('#edMove').css('color', '#CCCCCC');
  if(aResetColonies==true){
    jQuery('#colonyto').val(''); jQuery('#tostr').val('');
  }
  if(jQuery('#type').val()!=6){
    if((jQuery('#type').val()==1)||(jQuery('#type').val()==5)){
      jQuery('#hrefToAll').css('display','none'); jQuery('#hrefToOwn').css('display','');
    }else{
      jQuery('#hrefToOwn').css('display','none'); jQuery('#hrefToAll').css('display','');
    }
  }
  if((jQuery('#colonyfrom').val()=='')||(jQuery('#colonyfrom').val()==0)) return;
    jQuery('#edDetails').html("<span class='highlight'>Loading Resources...</span>");
    var req = jQuery.ajax({
      url:'colonyres.php',
      data: { 'id' : jQuery('#colonyfrom').val(), 'onlyunits':aOnlyUnits, 'recalc':'1' },
      success: function(response) { jQuery('#edDetails').html(response); }
  });
}

function findPosX(obj){
  var curleft = 0;
  if (obj.offsetParent){
    while (obj.offsetParent){
      curleft += obj.offsetLeft
      obj = obj.offsetParent;
    }
  }else if(obj.x)
    curleft += obj.x;
  return curleft;
}

function findPosY(obj){
  var curtop = 0;
  if (obj.offsetParent){
    while (obj.offsetParent){
      curtop += obj.offsetTop
      obj = obj.offsetParent;
    }
  }else if(obj.y)
    curtop += obj.y;
  return curtop;
}

function toggleVisible(aId){
  if (document.getElementById(aId).css('display')==''){
    document.getElementById(aId).css('display','none');
  }else
    document.getElementById(aId).css('display','');
}

function getFlightTime(aFrom, aTo, aSpeed){
  for(var i=0;i<aSpeedArray.length;i++){
    aSpeedInfo = aSpeedArray[i];
    if((aSpeedInfo[0]==aFrom)&&(aSpeedInfo[1]==aTo)&&(aSpeedInfo[2]==aSpeed))
      return aSpeedInfo[3];
  }
  return -1;
}

function getEtaFromCache(aFrom, aTo, aSpeed, aSpanId){
  clocktime = getFlightTime(aFrom, aTo, aSpeed);
  if (clocktime==-1) return false;

  var hours = Math.floor(clocktime/3600);
  var minutes = Math.floor(clocktime/60)-hours*60;
  var seconds = clocktime - hours*3600 - minutes*60;
  if (minutes <= 9) minutes = "0" + minutes;
  if (seconds <= 9) seconds = "0" + seconds;
  dispTime = hours + ":" + minutes + ":" + seconds;
  jQuery('#'+aSpanId).html(dispTime);

  getFlightCost(clocktime);

  return true;
}

function getEta(aFrom, aTo, aSpanId){
  if((aFrom=='')||(aTo=='')||(aFrom==0)||(aTo==0)) return;
  if(aFinalArmadaSpeed==0){
    jQuery('#'+aSpanId).html(''); return;
  }
  if(!getEtaFromCache(aFrom, aTo, aFinalArmadaSpeed, aSpanId)){
    jQuery('#'+aSpanId).html("<span class='highlight'>Calculating...</span>");
    var req = jQuery.ajax({
      url: 'tooltips/ajaxEta.php',
      data: { 'from' : aFrom, 'to':aTo, 'speed':aFinalArmadaSpeed, 'dungeon':aDungeon },
      success: function(response) { 
        aSpeedArray.push(new Array(aFrom, aTo, aFinalArmadaSpeed, response)); 
        getEtaFromCache(aFrom, aTo, aFinalArmadaSpeed, aSpanId);
      }
    });
  }
}

function getFlightCost(aFlightTime){
  if(aFlightTime<=0) return;
  if(aCalculating) {
    aPendingFlightCalc = aFlightTime;
    return;
  }

  aUnitList='';
  for(var i=0;i<aArmada.length;i++){
    if(aUnitList!='') aUnitList += ';';
    aUnitList += aArmada[i][0]+':'+aArmada[i][4];
  }
  if(aUnitList==''){
    jQuery('#spanCost').html('');
    return;
  }
  if(jQuery('#type').val()!=5) aFlightTime = 2 * aFlightTime; // Only Reinforcements are 2-way trips...
  aCalculating = true;
  jQuery('#spanCost').html("<span class='highlight'>Calculating...</span>");
  var req = jQuery.ajax({
    url: 'tooltips/ajaxFlightCost.php',
    data: { 'units' : aUnitList, 'flight' : aFlightTime },
    success: function(response) { 
               jQuery('#spanCost').html(response); 
               if(aPendingFlightCalc!=-1) {
                 setTimeout('getFlightCost(aPendingFlightCalc)',1500);
                 aPendingFlightCalc = -1;
               }
               aCalculating=false; 
             }
  });
}

function setMaxUnits(aAmountId, aUnits, aRadioObj, aRadioValue){
  setValue(aAmountId, aUnits);
  set_radio_value(aRadioObj, aRadioValue);
}

function setVal(aId, aLabel, aCount, aClass){ 
  var aHTML=aLabel; 
  if(aCount==null) aCount=0; if(aClass==null) aClass='';
  if(aHTML!=''){
    if(aCount>0) aHTML = aHTML + ' ('+aCount+')'; 
  }else aHTML = aCount;
  if(jQuery('#lbl'+aId)){
    jQuery('#lbl'+aId).html(aHTML);
    jQuery('#lbl'+aId).className=aClass; 
  }
}

function showElem(aId, aLabel, aClass){
  if(!jQuery('#lbl'+aId))return;
  if(aLabel==null) aLabel='';
  if(aClass==null) aClass='';
  if(aLabel!=''){
    jQuery('#lbl'+aId).html(aLabel);
    jQuery('#lbl'+aId).className=aClass; 
    jQuery('#lbl'+aId).css('display', '');
  }else jQuery('#lbl'+aId).css('display', 'none');
}

function refreshMessages(aType, aUpdSess) { 
  var req = jQuery.ajax({ 
    url: 'tooltips/ajaxMenu.php', 
    data: {'standalone': '1', 'type': aType, 'updSess': aUpdSess}, 
    success: function(response) { if(trim(response)!='') eval(response); } 
  }); 
}

function doScheduler(aType, aUpdSess){ 
  refreshMessages(aType, aUpdSess); setTimeout('doScheduler('+aType+','+aUpdSess+')', 15 * 60 * 1000);
}

function setAction(aType,aInfId){
  switch (aType){
    case '1' : jQuery('#dvUser').css('display', 'none');  // Expand
               jQuery('#dvInfluence').css('display', 'none');
               break;
    case '2' : jQuery('#dvUser').css('display', 'none');  // Support
               jQuery('#dvInfluence').css('display', '');
               break;
    case '3' : jQuery('#dvUser').css('display', '');      // Attack
               jQuery('#dvInfluence').css('display', '');
               jQuery('#targetinf').value(aInfId);
               break;
    case '4' : jQuery('#dvUser').css('display', '');      // Lend
               jQuery('#dvInfluence').css('display', 'none');
               break;   
  }
}

function setBounty(aType){
  switch (aType){
    case '1' : jQuery('#dvInfluence').css('display', 'none');// Battle
               break;
    case '2' : jQuery('#dvInfluence').css('display', '');    // Influence
               break;
  }
}

function getSlideIndex(aId){
  aPos=-1;
  for(var i=0;i<aActiveSlides.length;i++)
    if(aActiveSlides[i][0]==aId){
      aPos=i; 
      break; 
    }
  return aPos;
}

function popSlide(aId){
  var aLastSlide=null;
  var aTmp = new Array();
  aLastFound=false;
  for(var i=aActiveSlides.length-1;i>=0;i--){
    if(aActiveSlides[i][0]==aId){
      if(!aLastFound){
        aLastSlide = aActiveSlides[i];
        aLastFound=true;
      }
    }else
      aTmp.push(aActiveSlides[i]);
  }
  aActiveSlides = aTmp;
  return aLastSlide;
}

function slide(aId, aDirection, aNextId) {
  aIndex = getSlideIndex(aId);
  if(aIndex>-1){
    aActiveSlides[aIndex] = new Array(aId, aDirection, aNextId);
    return;
  }else
    aActiveSlides.push(new Array(aId, aDirection, aNextId));

  var $active = jQuery('#'+aId+' div.active');
  if ( $active.length == 0 ) $active = jQuery('#'+aId+' div:last');
  if(aDirection==0){
    var $next = jQuery('#'+aNextId);
  }else if(aDirection>0){
    var $next = $active.next().length ? $active.next() : jQuery('#'+aId+' div:first');
  }else{
    var $next = $active.prev().length ? $active.prev() : jQuery('#'+aId+' div:last');
  }

  $active.animate({opacity: 0.0}, 800, function() { $active.addClass('divHidden'); });
  $next.css({opacity: 0.0})
       .removeClass('divHidden')
       .animate({opacity: 1.0}, 1000, function() { 
          $active.removeClass('active'); 
          $next.addClass('active'); 
          aTmp = popSlide(aId);
          if((aTmp[0]!=aId)||(aTmp[1]!=aDirection)||(aTmp[2]!=aNextId))
            slide(aTmp[0], aTmp[1], aTmp[2]);
        });
}

function vwPlan(aId){ 
  jQuery('#tpl').html("<span class='highlight'>Loading...</span>");
  var req = jQuery.ajax({
    url: 'tooltips/tpl.php',
    data: { 'id' : aId },
    success: function(response) { jQuery('#tpl').html(response); }
  });
}

function addTpl(aType, aResId){
  if((aType==0)||(aType==2)) {
    aMaxCur = parseInt(jQuery('#tplatt').val());
    if((aMaxCur+1)>aMaxAttack) { alert('Not enough Points!'); return; }
  }else{
    aMaxCur = parseInt(jQuery('#tpldef').val());
    if((aMaxCur+1)>aMaxDefense) { alert('Not enough Points!'); return; }
  }
  var aCurVal = jQuery('#'+aTplTypes[aType]+aResId).val();
  aNewVal = parseInt(aCurVal.replace('%','')) + 1;
  jQuery('#'+aTplTypes[aType]+aResId).val(aNewVal + '%');
  if((aType==0)||(aType==2)) {
    jQuery('#tplatt').val(aMaxCur + 1);
  }else
    jQuery('#tpldef').val(aMaxCur + 1);
}

function subTpl(aType, aResId){
  var aCurVal = jQuery('#'+aTplTypes[aType]+aResId).val();
  aNewVal = parseInt(aCurVal.replace('%','')) - 1;
  if(aNewVal<0) return;
  jQuery('#'+aTplTypes[aType]+aResId).val(aNewVal + '%');
  if((aType==0)||(aType==2)) {
    jQuery('#tplatt').val(parseInt(jQuery('#tplatt').val()) - 1);
  }else
    jQuery('#tpldef').val(parseInt(jQuery('#tpldef').val()) - 1);
}

function doColorBox(){
  jQuery('.cbox').colorbox({ 
                             title: function(){ return jQuery(this).attr('title'); },
                             width: function(){ return jQuery(this).attr('cbw'); },
                             height: function(){ return jQuery(this).attr('cbh'); },
                             iframe: true
                           });
  jQuery('.cboximg').colorbox({ 
                             title: function(){ return jQuery(this).attr('title'); },
                             width: function(){ return jQuery(this).attr('cbw'); },
                             height: function(){ return jQuery(this).attr('cbh'); }
                           });
}
