//determine browsers
var isMoz = (window.XMLHttpRequest)? true:false;
var isIE = (window.ActiveXObject) ? true:false;

//config vars
intRefreshRate = 60000;

//global debug
var bDebug = false;

//holds whether to close forecast when we have prices
var blnCloseForecast = false;

//array holds all odds rows in table
var oddsRowsArray = new Array();
//global XML
var cardOddsXML = new objXML();
cardOddsXML.cachecontrol = "public";

//global head info
var cardHeaderXML = new objXML();
var lastUpdateDate;

//global timers
var cardOddsTimer;
var priceChangeTimer;

//stores priceid values that have changed
var priceChangeArray = new Array();


//price change config
var pricesChangeState = true;
var pricesChangeNumber = 10; //number of changes (has to be EVEN) of state of price change alert e.g. 10 = 5 flashes
var pricesChangeCount = 0; //

//user controllable variables
var priceType = "fraction";

//internally modified vars
var prevPriceType = "fraction";

//are we just showing best odds
var bBestOdds = false;
var bBestOddsModeChange = false;

//are we loading all the XML
var bFullReload = false;

//store race status
var raceStatus = "";
var bFinalPass = false;

//store update information
var CurrentDate = "";
var LastUpdate = "";

//for debug
var bStopOff = false;

//livwshow flag
var bLiveShow = false;

//called from race card
function StartRaceCardComparison(intRaceID) {
  if(intRaceID) cardOddsXML.intRaceID = intRaceID;
  cardOddsTimer = window.setTimeout('RaceCardComparision()',intRefreshRate);
}

function RaceCardComparision(intRaceID) {
  //alert("intRaceID = " + intRaceID);
  
  cardOddsXML.resetHTTP();//otherwise onreadychangestate will not fire  
  
  if(intRaceID) cardOddsXML.intRaceID = ""+intRaceID; //string functions won't work on number
  
  if(!cardOddsXML.intRaceID) {
    //something is wrong, don't continue
  } else {
    
    window.clearTimeout(cardOddsTimer); // clear timeout to stop multiple updates getting conflicts
    //alert("bFullReload, bLiveShow = " + bFullReload + ", " + bLiveShow);
    if(bFullReload && !bLiveShow) {
      //load in all XML
      //document.write("/process/GetXml.aspx?rt=transform&xslLoc=/includes.net/xsl/oddsDOM.xsl&PathName=ATR_racecard/betting_set_"+cardOddsXML.intRaceID+".xml");
      cardOddsXML.getXML("/process/GetXml.aspx?PathName=ATR_racecard/betting_set_"+cardOddsXML.intRaceID+".xml",DisplayCardComparison);
      //cardHeaderXML.getHeaderInfo("/CommonFiles/GetXML.asp?PathName=ATR_racecard/"+(cardOddsXML.intRaceID.substr(cardOddsXML.intRaceID.length-3,3))+"/betting_set_"+cardOddsXML.intRaceID+".xml",DisplayHeaderInfo);    
      
    } else if(cardOddsXML.mode == "XML") {
      //to make sure get new version to last time alternate between 1 and 2
      cardOddsXML.cacheoverride = (cardOddsXML.cacheoverride < 2) ? (cardOddsXML.cacheoverride + 1) : 1;
      cardOddsXML.getXML("/process/GetXml.aspx?rt=transform&xslLoc=/includes.net/xsl/oddsDOM.xsl&PathName=ATR_racecard/betting_set_"+cardOddsXML.intRaceID+".xml",DisplayCardComparison);    
      //document.write("/CommonFiles/GetXML_iis6.asp?rt=transform&xslLoc=/includes.net/xsl/oddsDOM.xsl&PathName=ATR_racecard/"+(cardOddsXML.intRaceID.substr(cardOddsXML.intRaceID.length-3,3))+"/betting_set_"+cardOddsXML.intRaceID+".xml");
    } else {
      //cardOddsXML.getXML("/CommonFiles/GetXML.asp?rt=transform&xslLoc=/includes.net/xsl/odds.xsl&PathName=ATR_racecard/"+(cardOddsXML.intRaceID.substr(cardOddsXML.intRaceID.length-3,3))+"/betting_set_"+cardOddsXML.intRaceID+".xml",DisplayCardComparison);
    }  
  
  }
    
  

}

function elementSwitch(id,blnOpen) {
  
  if(document.getElementById(id)) {
    if(blnOpen) {
      //show element
      document.getElementById(id).style.display = "none";  
    } else {
      //close element
      document.getElementById(id).style.display = "block";
    }
  }
  

}

function DisplayHeaderInfo() {
  if(cardHeaderXML.checkStatus()) {
     alert(cardHeaderXML.xmlHTTP.getAllResponseHeaders());
  }
}


function ShowOddsTable(bShow) {
  var NumRows = oddsRowsArray.length;
  var strShowDiv = "inline";
  var strShowRow = (isIE)?"block":"table-row";
  //if(document.getElementById('OddsComparisonChart')) document.getElementById('OddsComparisonChart').style.display = (bShow)?strShow:"none";  
  if(document.getElementById('oddslegend_showfulltable')) document.getElementById('oddslegend_showfulltable').style.display =  (bShow)?"none":strShowDiv;  
  if(document.getElementById('oddslegend_showsummary')) document.getElementById('oddslegend_showsummary').style.display =  (bShow)?strShowDiv:"none";
  if(document.getElementById('oddslegend_showsummary_checkbox')) document.getElementById('oddslegend_showsummary_checkbox').style.display =  (bShow)?strShowDiv:"none";
  //if(document.getElementById('oddssummary')) document.getElementById('oddssummary').style.display =  (bShow)?"none":strShow;
  
  for(var i=4;i<NumRows;i++) {    
    if(document.getElementById(oddsRowsArray[i])) document.getElementById(oddsRowsArray[i]).style.display =  (bShow)?strShowRow:"none";  
  }
}



function DisplayCardComparison() {
  if(cardOddsXML.checkStatus()) {
    //alert(cardOddsXML.xmlHTTP.responseText);
    if(cardOddsXML.mode == "HTML") {
      //WriteInnerHTML("CardOddsComparison",cardOddsXML.xmlHTTP.responseText);
    } else {
      var xDoc,xNode,xHorses,xSelections,str;
      var currentPrice,xPrice,xPriceID,priceSummaryDivID,xBPind;
      var bBeenHorseChanges,bBeenAnyChanges,currentClass,priceDivID;
      var intBP,xPD;
      
      bBeenAnyChanges = false;
      bBeenHorseChanges = false;
  
      //we may be part way through highlighting price changes so don't want to interrupt
      if(!bFullReload) { 
        priceChangeArray = new Array();//otherwise changes will not get reset
        pricesChangeCount = 0;        
      } else {
        
        //check if changing between best odds or not
        if(bBestOddsModeChange) {
          var sBestText = (bBestOdds)?"Show All Odds":"Show Best Odds";
          WriteInnerHTML("oddslegend_showbest",sBestText);
        }        
      }
      
      
      //if(bDebug) WriteInnerHTML("CardOddsComparison","priceType = " + priceType,true);
      
      xDoc = cardOddsXML.getResponseXML();
      xNode = xDoc.getElementsByTagName("root")[0];

      if(xNode) {
        
        bLiveShow = (xNode.getAttribute("LIVESHOW")=="yes")?true:false;      
        if(bLiveShow) {
          //no longer needed because of BlueSq change
          //doClose("oddslegend_showbest");
          //bBestOdds = false;
        }
        
        xHorses = xNode.getElementsByTagName("HORSE");                
        //loop through horse nodes
        for(var i=0;i<xHorses.length;i++) {       
          
          //need to update best odds summary if best price has changed
          intBP = 1*xHorses[i].getAttribute("BPGind")
          xSelections = xHorses[i].getElementsByTagName("selection");
          bBeenHorseChanges = false;
          for(var j=0;j<xSelections.length;j++) {
          
            //xPriceID = xSelections[j].getAttribute("priceid");
            xPriceID = xHorses[i].getAttribute("participantid") + "_" + xSelections[j].getAttribute("FID");
            priceDivID = "odd_" + xPriceID;
            
            //priceSummaryDivID = "oddsum_" + xPriceID;
            currentPrice = (document.getElementById(priceDivID))?document.getElementById(priceDivID).innerHTML:"";
            //xPrice = (priceType=="decimal")?Math.round((1*xSelections[j].getAttribute("pd")+1)*100)/100:(xSelections[j].getAttribute("pf")=="1/1")?"evn":xSelections[j].getAttribute("pf");
            //xPrice = (xSelections[j].getAttribute("pf")==-1 || xSelections[j].getAttribute("pf") == -2)?"SP":( (xSelections[j].getAttribute("pf") == -5)?"odds":(((xSelections[j].getAttribute("pd") == -3) && priceType=="decimal") || (xSelections[j].getAttribute("pd") == -2 && xSelections[j].getAttribute("pv") == "Y") )?"N/A":xPrice);
            //alert("CP = " + ConvertPrice(xSelections[j]) + ", xPrice = " + xPrice);
            xPrice = ConvertPrice(xSelections[j]);
            xBPind = xSelections[j].getAttribute("BPind")
            xPD = 1*xSelections[j].getAttribute("pd");
            
            //if(bDebug) WriteInnerHTML("CardOddsComparison","prevPriceType = " + prevPriceType + ", priceType = " + priceType + "<br/>",true);
            
            if(bFullReload) {//need to change all prices
                //determine if only showing best prices                
                if (raceStatus == "off") {
                  WriteInnerHTML("oddcell_" + xPriceID,xPrice,false)
                } else if (bBestOdds && (xPD < intBP)) {
                  //hide value
                  if(xSelections[j].getAttribute("sb")!="Y") {
                    WriteInnerHTML(priceDivID,"",false);
                  }
                } else {
                  WriteInnerHTML(priceDivID,xPrice,false);
                }
              
            } else { //must be price change nodes (may have already been changed, just means XML is marked as changed from last time)
             
              //price may be different or price still the same but no longer best price
              if (bBestOdds || (currentPrice != xPrice) ) {                
                
                if(bDebug) {WriteInnerHTML("CardOddsComparison",xHorses[i].getAttribute("name") + " = " + xSelections[j].getAttribute("name") + "<strong>CHANGE</strong> currentPrice = " + currentPrice + ", xPrice = " + xPrice + "<br/><br/>",true);}                
                
                // *** do price change ***
                //only if showing all prices or if price is best when showing best
                if( !bBestOdds || ((xPD >= intBP) && bBestOdds) ) {
                  if(currentPrice != xPrice) {
                    WriteInnerHTML(priceDivID,xPrice,false);
                    //WriteInnerHTML(priceSummaryDivID,xPrice,false);
                    //add this to the array of prices that have changed
                    priceChangeArray[priceChangeArray.length] = new Array(xPriceID,xSelections[j]);
                    bBeenHorseChanges = true;
                    bBeenAnyChanges = true;
                  }                     
                } else if (bBestOdds && (xPD < intBP)) {
                  //need to hide odds that are now not best odds if showing best odds
                  if(xSelections[j].getAttribute("sb")!="Y") {
                    WriteInnerHTML(priceDivID,"",false);
                  }
                }
          
             
              }
                                          
            }
          }//for selections         
                   
          //has to be done for when any PRICE changes (e.g. now best price even though price hasn't changed)
          //needs final pass for when race has gone off
          if(bBestOdds || bBeenHorseChanges || raceStatus=="off") {         
            for(var j=0;j<xSelections.length;j++) {
              //xPriceID = xSelections[j].getAttribute("priceid");
              xPriceID = xHorses[i].getAttribute("participantid") + "_" + xSelections[j].getAttribute("FID");
              setOddStyle(xPriceID,xSelections[j])
            }
          }
          
                                  
        }//for horses
        


        if (raceStatus == "off") {
          //reset data
          WriteInnerHTML("BPBook","0.00"); //2 decimal places         
          
        } else {
        
          //update book % if needed        
          if(bBeenAnyChanges) {          
            if (xNode.getAttribute("BPBookTotal")*1 > 0) {
            WriteInnerHTML("BPBook",Math.round(xNode.getAttribute("BPBookTotal")*100)/100); //2 decimal places
            } else {
              WriteInnerHTML("BPBook","0.00");
          }            
          }            
          if(prevPriceType!=priceType) {
            //reset price type to new one
            prevPriceType=priceType;
            WriteInnerHTML("oddslegend_changeodds",((priceType=="decimal")?"Fractional":"Decimal Odds"));                      
          } else {
            //go off and highlight which prices have changed
            ShowPriceChangesIndicator();
          }                
        
        }
        

        


      }                  
      
    }
    
    //reset some vars and data once all changes have been made
    bFullReload = false; //so only load changes from now on
    bBestOddsModeChange = false;
            
    //check if race has gone off
    if(xNode) {
      raceStatus = (xNode.getAttribute("racestatus")) ? xNode.getAttribute("racestatus").toLowerCase() : "";
    }
    
    if(!bStopOff && (raceStatus=='off' || raceStatus=='photograph' || raceStatus=='finished' || raceStatus=='result'|| raceStatus=='weighedin') ) {
      //blank out all data
      bFullReload = true;
      raceStatus = "off";      
      doOpen("OddSuspended");
      if (!bFinalPass) {
        bFinalPass = true;
        RaceCardComparision(); 
      }
      
         
    } else {

      if(xNode) {
        CurrentDate = xNode.getAttribute("CURRENTDATE");
        LastUpdate = xNode.getAttribute("MODIFICATIONDATE");
      }
            
      //alert("CurrentDate = " + CurrentDate + ", LastUpdate = " + LastUpdate);
      cardOddsTimer = window.setTimeout('RaceCardComparision()',intRefreshRate);
    }
     
  }
}


function ShowPriceChangesIndicator() {

  //if(bDebug) WriteInnerHTML("CardOddsComparison","priceChangeArray.length = " + priceChangeArray.length + "<br/>",true);
  
  //only do anything if there are changes to make
  if(priceChangeArray.length>0) {  
    
    var oddID;
    
    if(pricesChangeCount < pricesChangeNumber) {
      
      for(var i=0;i<priceChangeArray.length;i++) {
        oddID = "oddcell_" + priceChangeArray[i][0];        
        if(document.getElementById(oddID)) {      
          var sBest = (document.getElementById(oddID).className.indexOf("best") > -1) ? " best" : "";
          if(pricesChangeState) {
            document.getElementById(oddID).className = "flashon"+sBest;            
          } else {
            document.getElementById(oddID).className = "flashoff"+sBest;            
          }            
        }      

      }//for      
      pricesChangeState = (pricesChangeState)?false:true;
      pricesChangeCount++;
      priceChangeTimer = window.setTimeout('ShowPriceChangesIndicator()',500);
     } else {
        //have made all changes
        for(var i=0;i<priceChangeArray.length;i++) {
          setOddStyle(priceChangeArray[i][0],priceChangeArray[i][1])
        }
       
     
     }
  }
}

function showBestOdds() {
  
  bBestOdds = (bBestOdds)?false:true;    
  bFullReload = true;
  bBestOddsModeChange = true;
  RaceCardComparision();
}

function changeOddsPriceFormat() {

  if(cardOddsTimer) {
    clearTimeout(cardOddsTimer);
  }
  
  //store current for reference later  
  prevPriceType = priceType;
  
  //change to new price type
  if (priceType=="fraction") {   
    priceType = "decimal";
  } else {
    priceType = "fraction";
  }
  
  bFullReload = true;
  RaceCardComparision();
}


function setOddStyle(id,xNode) {

  id = "oddcell_" + id;

  if(document.getElementById(id)) {

    var newClass;
    
    if(bDebug) WriteInnerHTML("CardOddsComparison","before document.getElementById(" + id + ").className = " + document.getElementById(id).className + "<br/>",true);
    
    if (raceStatus=="off" && bFinalPass) {
      newClass = "";
    } else if (xNode.getAttribute("pf")=="-1" || xNode.getAttribute("pf")=="-2" || xNode.getAttribute("pf")=="-3") {
      newClass = "";
    } else if (xNode.getAttribute("pdiff")=="+" && xNode.getAttribute("BPind")>="0") {
      newClass = "drifting best";
    } else if (xNode.getAttribute("pdiff")=="-" && xNode.getAttribute("BPind")>="0") {
      newClass = "shortened best";
    } else if (xNode.getAttribute("pdiff")=="+") {
      newClass = "drifting";
    } else if (xNode.getAttribute("pdiff")=="-") {
      newClass = "shortened";
    } else if (xNode.getAttribute("BPind")>="0") {
      newClass = "best";
    } else {
      newClass = "";
    }
    
    //alert("before = " + document.getElementById(id).className + ", after = " + newClass);
    document.getElementById(id).className = newClass;
    if(bDebug) WriteInnerHTML("CardOddsComparison","after document.getElementById(" + id + ").className = " + document.getElementById(id).className + "<br/>",true);
        
  }

}

function SetAlwaysShow(obj) {
  if(obj.checked) {
    setCookie("AlwaysShow",1); 
  } else {
    setCookie("AlwaysShow",0); 
  }
}

function SetPriceType(t) {priceType=t;};
function GetPriceType() {return priceType;};