// JScript File
var mNewsServerName = "";
var mPricesServerName = "";
var mSecGUID = 0;
var mIsPremium = false;
var mFlashTime = 500;
var mTimeout = 0;

var mPriceRefresh = 0;
var mNewsRefresh = 0;

var mDataSplitChar = "";
var mRowSep = String.fromCharCode(13);
var cSecCheck = 15121969;
var cDefaultTimestamp = "3-Dec-1970 12:50:38";
var cPrices = 1, cNews = 2, cReports = 3, cScoopNews=4;

var mPricesHTTPRequest="";
var mNewsHTTPRequest = "";
var mReportsHTTPRequest = "";
var mDynamicUpdateLogoffPage = "";
var o1 = null;
var o2 = null;

var mDynIndex = 0;
var arrData = new Array();

var flashPriceUpColour = "green";
var flashPriceDownColour = "red";
var flashPriceSameColour = "blue";
var priceChangeUpColour = "green";
var priceChangeDownColour = "red";
var priceChangeNoneColour = "black";
var mRunning = false;

function init_DynamicUpdate(isPremium) {
  mIsPremium = isPremium;
  mNewsServerName = document.getElementById("lblNewsServerName").innerHTML;
  mPricesServerName = document.getElementById("lblPricesServerName").innerHTML;
  mFlashTime = document.getElementById("lblPriceFlashDuration").innerHTML;
  mTimeout = document.getElementById("lblDataTimeout").innerHTML;
  mSecGUID = parseInt(document.getElementById("lblDataGUID").innerHTML)+cSecCheck;
  mPriceRefresh = document.getElementById("lblPricesRefresh").innerHTML;
  mNewsRefresh = document.getElementById("lblNewsRefresh").innerHTML;
  mDynamicUpdateLogoffPage = document.getElementById("lblDan_AJAX_Logoff_Redirect_Page").innerHTML;
  if (mNewsServerName.length > 0 && mPricesServerName.length > 0) {
    SetupXMLHTTPObject();  
    mRunning=true;
  }
}

function AddDynamicControl(Parent, DataType, Symbols, Fields, UpdateTypes,RefreshSeconds,_Custom1,_Custom2) {    
  if(mRunning){
    var splitCh = (DataType == cPrices ? '#' : '~~~');
    var custom1 = "";
    var custom2 = "";
    var custom3 = "";
    if (DataType == cNews) {
      Fields += "!AGENCY!LOCK!DATETIME";    
      var NumNews = parseInt(UpdateTypes);
      var Sym = Symbols;
      Symbols = "";
      var sep="";
      for (var i = 0; i < NumNews; i++) {
        Symbols += sep + Sym + i;
        sep = "!";
      }
      UpdateTypes = "4!4!4!4";
    }
    else if (DataType == cScoopNews) {
      Fields += "!SRC!DTE!LVL!IMG!TXT";
      custom1 = parseInt(_Custom1);
      custom2 = _Custom2;
      custom3 = UpdateTypes;
      UpdateTypes = "8!8!8!8!8!8";
    }
    if (RefreshSeconds == 0) RefreshSeconds=(DataType == cPrices ? mPriceRefresh : mNewsRefresh);
    var dyn = new Data(DataType, splitCh, RefreshSeconds, mTimeout, Parent, Symbols, Fields, UpdateTypes, mDynIndex, custom1, custom2, custom3);
    mDynIndex++;
    arrData.push(dyn);
  }
}

function StopAll() {
  for (var i = 0; i < arrData.length; i++) arrData[i].Stop();
}

function SetupXMLHTTPObject() {
  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("DynamicUpdate :: Could not find an XMLHttpRequest alternative.")
  };
}

function Data(mode, _splitChar, _refreshRate, _timeout, _parent, _symbols, _fields, _updateTypes, _index,_custom1,_custom2,_custom3) {
  this.AddDataRequest = function(_symbols, _fields, _updateTypes) {    
    try {      
      var fld, sym;
      var localSymbols = _symbols.split('!');
      for (var i = 0; i < localSymbols.length; i++) {
        sym = localSymbols[i].replace(' ', '')
        if (this.symbols != "") this.symbols += '!';
        this.symbols += sym;
        var d = sym.indexOf(':');
        if (d >= 0) sym = sym.substr(0, d);
        this.symbolList.length++;
        this.symbolList[this.symbolList.length - 1] = sym;
      }      
      var localFields = _fields.split('!');
      for (var i = 0; i < localFields.length; i++) {
        fld = localFields[i].replace(' ', '');
        if (this.fields != "") this.fields += '!';
        this.fields += fld;
        this.fieldList.length++;
        this.fieldList[this.fieldList.length - 1] = fld;
      }      
      if (_updateTypes.indexOf("!") == -1) {        
        this.updateTypesList = new Array(1);        
        this.updateTypesList[0] = _updateTypes;        
      }
      else {       
        this.updateTypesList = _updateTypes.split('!');
      }      
      
    }
    catch (e) {}
  }

  this.Stop = function() {
    this.DataRunning = false;
  }

  this.Refresh = function(timedOut) {
    try {
      var u = this.GetURL();
      if (u.length > 0) {
        for (var i = 0; i < u.length; i++) this.RequestData(this.ServerName + u[i], timedOut, i, i == u.length - 1);
      }
      else
        setTimeout("arrData[" + this.Index + "].Refresh(" + timedOut + ");", this.RefreshRate);
    } catch (e) { setTimeout("arrData[" + this.Index + "].Refresh(true);", this.RefreshRate); }
  }

  this.RequestData = function(url, timedOut, reqIdx, setTmt) {
    var DataMode = this.Mode;
    var callbackFunction = ProcessResponses;
    try {
      if (this.DataRunning) {
        if (!this.Request[reqIdx]) this.Request[reqIdx] = new XMLHttpRequest();
        if (this.Request[reqIdx]) {
          if (!timedOut) this.DataStatus(1);
          var req = this.Request[reqIdx];
          var idx = this.Index;
          req.open("GET", url, true);
          req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
          req.setRequestHeader("Cache-Control", "no-cache");
          req.setRequestHeader("Connection", "keep-alive");
          req.onreadystatechange = function() {
            try {
              if (req.readyState == 4 && req.status == 200 && req.responseText) callbackFunction(idx, reqIdx, setTmt);
            } catch (e) {}
          };
          if (setTmt) this.LastRequestCheck = setTimeout("arrData[" + idx + "].Retry();", this.Timeout);
          req.send(null);
        }
      }
    } catch (e) {
      setTimeout("arrData[" + this.Index + "].DataStatus(0);", 100);
      setTimeout("arrData[" + this.Index + "].Refresh(true);", this.RefreshRate);
    }
  }

  this.Retry = function() {
    try {
      this.DataStatus(3);
      this.Refresh(true);
    }
    catch (e) { }
  }  

  this.GetURL = function() {
    var urls = new Array;
    if (this.symbols != "" && this.fields != "") {
      var uS = new Array();
      if (this.symbols.length > 1800) {
        uS[0] = this.symbols.substr(0, 1000);
        uS[1] = this.symbols.substr(1000);
        if (uS[0].substr[999, 1] == '!') {
          uS[0] = uS[0].substr(0, 999);
        }
        else {
          var s = uS[1].indexOf('!');
          if (s == 0) {
            uS[1] = uS[1].substr(1);
          }
          else {
            uS[0] = uS[0] + uS[1].substr(0, s);
            uS[1] = uS[1].substr(s + 1);
          }
        }
      }
      else uS[0] = this.symbols;
      for (var i = 0; i < uS.length; i++) {
        var res = '';
        res = res.concat('?sym=', uS[i], '&fld=', this.fields, '&zz=', mSecGUID, '&nr=', (this.Mode == cReports || this.Mode == cNews || this.Mode == cScoopNews ? 'true' : 'false'),
					'&scoop=',(this.Mode==cScoopNews?'true&site='+this.Custom3:'false'),'&prxxm=', (mIsPremium ? 'true' : 'false'), '&__=', encodeURIComponent((new Date()).getTime()), '&ts=',
					this.LastTimeStamp.replace(' ', '+').replace(':', '%3A'));
        urls.push(res);        
      }
    }
    return urls;
  }
  this.ProcessResponse = function(reqIdx) {
    var ret_code = true;
    var ignoreRequest = false;     
    var row = this.Request[reqIdx].responseText.split(mRowSep);
    try {
      if (row.length > 0) {
        var ts = row[row.length - 1];
        if (ts == "@@LOGOFF@@") {
          StopAll();
          setTimeout("LogOff(1);", 100);
          ret_code = false;
        }
        else if ((ts >= this.LastTimeStamp && ts.length >= 19 && ts.length <= 20) || this.LastTimeStamp == cDefaultTimestamp) {
          this.LastTimeStamp = ts;
        }
        else ignoreRequest = true;
      }
      if (!ignoreRequest) {
        var dynID = document.getElementById(this.Parent + "_DynID");
        if (dynID && dynID.innerHTML == this.UniqueID) {
          for (var r = 0; r < row.length - 1; r++) {
            if (row[r] == "@@LOGOFF@@") {
              StopAll();
              setTimeout("LogOff(2);", 100);
              ret_code = false;
              break;
            }
            this.ProcessUpdate(row[r]);            
          }
        } else {
          //no longer exists so remove this request
          ret_code = false;
        }
      }
    } catch (e) { }
    return ret_code;
  }

  this.DataStatus = function(i) {    
    try{
			var ReqLight = document.getElementById(this.Parent + "_ReqStatus");
	    var RespLight = document.getElementById(this.Parent + "_RespStatus");
		  if (ReqLight && RespLight) {
			  switch (i) {
        case 0: ReqLight.style.backgroundColor = ''; RespLight.style.backgroundColor = ''; break;
        case 1: ReqLight.style.backgroundColor = 'lime'; RespLight.style.backgroundColor = ''; break;
        case 2: ReqLight.style.backgroundColor = 'lime'; RespLight.style.backgroundColor = 'lime'; break;
        case 3: ReqLight.style.backgroundColor = 'red'; RespLight.style.backgroundColor = 'red'; break;
				}
      }
    }
		catch(e){}
  }

  this.ChangePageSymbols = function(_symbols) {
    try {
      this.symbols = "";
      this.symbolList.length = 0;
      var sym;
      var localSymbols = _symbols.split('!');
      for (var i = 0; i < localSymbols.length; i++) {
        sym = localSymbols[i].replace(' ', '')
        if (this.symbols != "") this.symbols += '!';
        this.symbols += sym;
        var d = sym.indexOf(':');
        if (d >= 0) sym = sym.substr(0, d);
        this.symbolList.length++;
        this.symbolList[this.symbolList.length - 1] = sym;
      }
    } catch (e) {}
  }

  this.Mode = mode;

  if (this.Mode == cScoopNews) {

    this.ProcessUpdate = function(row) {
      try {
        var cells = row.split(this.SplitChar);
        if (cells.length > 0) {
          var m = cells[0];
          var t = cells[1];
          var d = cells[2];
          var l = cells[3];
          var u = cells[4];
          var s = cells[5];
          var i = cells[6];
          var tt = cells[7];
          var n = cells[8];
          var tbl = document.getElementById(this.Parent + "_scoop");          
          var tkr = document.getElementById(this.Parent + "_TKR");
          tkr = tkr ? tkr.innerHTML == 'true' ? true : false : false;
          switch (m) {
            case "U":
            case "I":
              {
                var rw = 0;
                var xc = null;
                //search for a place to insert this story
                for (var r = 0; r < tbl.rows.length; r++) {
                  var c = tbl.rows[r].cells;
                  var z = c[0].innerHTML;
                  var v = z.split(this.SplitChar);
                  var d1 = v[0];
                  var t1 = v[1];
                  //check this isn't an erroneous duplication
                  if (d1 == d) {
                    rw = r;
                    m = "U";
                    xc = c;
                    break;
                  }
                  else if (t1 > t) {
                    rw = r + 1;
                  }
                }
                if (xc == null) m = "I";
                if (m == "I") {
                  var nr = tbl.insertRow(rw);
                  nr.id = this.Parent + "_TR_" + (tbl.rows.length + 1);
                  if (tkr) nr.style.displayFlash = 'none';
                  for (var nc = 0; nc < 3; nc++) {
                    var td = document.createElement('td');
                    switch (nc) {
                      case 0:
                        {
                          td.innerHTML = d + this.SplitChar + t;
                          td.style.display = "none";
                          break;
                        }
                      case 1: td.innerHTML = u + "<br>" + s; break;
                      case 2:
                        {
                          td.innerHTML = l + "<br>" + tt;
                          td.align = "right";
                          break;
                        }
                    }
                    td.className = "td";
                    nr.appendChild(td);
                  }
                  unr(tbl, tkr, this.Parent);
                  for (var r = tbl.rows.length - 1; r > this.Custom1 - 1; r--) tbl.deleteRow(r);
                }
                else {
                  for (var nc = 1; nc < xc.length; nc++) {
                    switch (nc) {
                      case 1: xc[nc].innerHTML = u + "<br>" + s; break;
                      case 2:
                        {
                          xc[nc].innerHTML = l + "<br>" + tt;
                          xc[nc].align = "right";
                          break;
                        }
                    }
                  }
                  break;
                }
                break;
              }
            case "D":
              {
                //search for this row
                for (var r = 0; r < tbl.rows.length; r++) {
                  var c = tbl.rows[r].cells;
                  var z = c[0].innerHTML;
                  var v = z.split(this.SplitChar);
                  var d1 = v[0];
                  var t1 = v[1];
                  if (d1 == d) {
                    tbl.deleteRow(r);
                    unr(tbl, tkr, this.Parent);
                    break;
                  }
                }
                break;
              }

          }
          //alert(tbl.innerHTML);
        }
      } catch (ex) { alert(dbg + " : " + ex); }
    }
    
  }
  else {
  
    this.ProcessUpdate = function(row) {
      var cells = row.split(this.SplitChar);
      if (cells.length > 0) {
        var sym = cells[0];
        for (var f = 1; f < cells.length; f++) priceUpdate(this.Parent, this.Parent + "_" + sym + "_" + this.fieldList[f - 1], cells[f], this.updateTypesList[f - 1], this.Mode);
        cells = null;
      }
    }
    
  }
  
  this.ServerName = (mode == cPrices ? mPricesServerName : mNewsServerName);
  this.symbols = "";
  this.fields = "";
  this.updateTypes = "";
  this.symbolList = new Array;
  this.fieldList = new Array;
  this.updateTypesList = new Array;  
  this.LastTimeStamp = (mode == cScoopNews ? _custom2 : cDefaultTimestamp);
  this.UpdateMutex = false;
  this.SplitChar = _splitChar;
  this.Request = new Array(new XMLHttpRequest());
  this.RefreshRate = _refreshRate;
  this.Timeout = _timeout;
  this.LastRequestCheck = null;
  this.Index = _index;
  this.Parent = _parent;
  this.DataRunning = true;
  this.UniqueID = document.getElementById(_parent + "_DynID").innerHTML;
  this.Custom1 = _custom1;
  this.Custom2 = _custom2;
  this.Custom3 = _custom3;
  this.AddDataRequest(_symbols, _fields, _updateTypes);
  setTimeout("arrData[" + this.Index + "].Refresh(false);", this.RefreshRate);
}

function Stop(ID) {
  for (var i = 0; i < arrData.length; i++) {
    if (arrData[i].Parent == ID) {
      arrData[i].Stop();
      break;
    }
  }
}

function unr(tbl,tkr,prnt) {
  for (var r = 0; r < tbl.rows.length; r++) {
    if (tkr) {
      tbl.rows[r].style.display = r == 0 ? "" : "none";
      tbl.rows[r].id = prnt + "_TR_" + (r + 1);
    }
    else {
      var css = (r % 2 == 0 ? "_A" : "");
      var c = tbl.rows[r].cells;
      for (var p = 1; p < c.length; p++) c[p].className = "td" + css;
    }
  }  
}

function ChangePriceSymbols(ID, symbols) {
  for (var i = 0; i < arrData.length; i++) {    
    if (arrData[i].Parent == ID) {
      arrData[i].ChangePageSymbols(symbols);
      break;
    }
  }
}

function ProcessResponses(Index, reqIdx, setTmt) {
  var dta = arrData[Index];
  if (setTmt && dta.LastRequestCheck) {
    clearTimeout(dta.LastRequestCheck);    
  }
  if (dta.ProcessResponse(reqIdx)) {
    if (setTmt) {
      setTimeout("arrData[" + Index + "].DataStatus(0);", 100);
      setTimeout("arrData[" + Index + "].Refresh(false);", dta.RefreshRate);
    }
  } 
  else dta.DataRunning = false;
}

function displayFlash(element, newValue, updateType) {
  try {
    var flashCol = "";
    var oldValue = element.innerHTML;
    if (oldValue == 0 || oldValue == "-" || newValue == "-")element.innerHTML = newValue;
    if (newValue > oldValue)
      flashCol = flashPriceUpColour;
    else if (newValue < oldValue)
      flashCol = flashPriceDownColour;    
    if (flashCol != "") {
      element.style.color = '#ffffff';
      element.style.backgroundColor = flashCol;
      element.innerHTML = newValue;
      if (updateType == 1) setTimeout("rst('" + element.id.replace("\\", "\\\\") + "','" + element.innerHTML + "');", mFlashTime);
    }
  }
  catch (e) {}
}

function rst(symbol, prevValue) {
	try{
	  var o = document.getElementById(symbol);
		if (o && o.innerHTML == prevValue) {
			o.style.color = '';
	    o.style.backgroundColor = '';
		}
	}
	catch(e){}
}

function priceUpdate(parent, symbol, fieldValue, updateType, mode) {
  try {
    var o;    
    if (fieldValue.length > 0) {
      o = document.getElementById(symbol);
      if (o) {
        if (updateType == 1)
          displayFlash(o, fieldValue, updateType);
        else if (updateType == 2)
          o.innerHTML = fieldValue;
        else if (updateType == 3) {
          if (fieldValue.length <= 6) o.innerHTML = fieldValue;
        }
        else if (updateType == 4)
          o.innerHTML = fieldValue;
        else if (updateType == 6) {
          var alt = '';
          var ig = false;
          switch (fieldValue) {
            case 'RNG1 ': alt = 'Ring 1'; ig = true; break;
            case 'RNG2 ': alt = 'Ring 2'; ig = true; break;
            case 'RNG3 ': alt = 'Ring 3'; ig = true; break;
            case 'RNG4 ': alt = 'Ring 4'; ig = true; break;
            case 'KRB1 ': alt = 'AM Kerb'; ig = true; break;
            case 'KRB2 ': alt = 'PM Kerb'; ig = true; break;
            case 'SLCT ': alt = 'LME Select'; ig = true; break;
            case 'LMES ': alt = 'LME Select'; ig = true; break;
            case 'MEMB ': alt = 'Matched Trade'; ig = true; break;
            case '(BM)': alt = 'BaseMetals.com implied price.'; fieldValue = 'bm'; ig = true; break;
            case 'BLNK ': ig = false; break;
          }
          if (ig) {            
            var img = new Image();            
            img.src = 'img/icon/' + fieldValue.substr(0, 4) + '.gif';
            img.setAttribute("alt", alt);
            o.innerHTML = "";
            o.appendChild(img);
          }
          else if (fieldValue.indexOf('BLNK') < 0) {
            o.innerHTML = fieldValue;
          }
        }
        else if (updateType == 42) {
          displayFlash(o, fieldValue, 1);        
          var bwdcgo = document.getElementById(symbol + '_bwcg');
          if (bwdcgo) {
            var v = eval(fieldValue);
            if (v < 0) {
              bwdcgo.className = 'cgo';
              bwdcgo.innerHTML = 'c';
            }
            else if (v > 0) {
              bwdcgo.className = 'bwd';
              bwdcgo.innerHTML = 'b';
            }
          }
        }
      }
      else if (updateType == 63) {
        o = document.getElementById(parent + '_tblData');
        if (o) {
          UpdTK(parent, o, fieldValue);
        }
      }
      else if (updateType == 96) {
        if (symbol.indexOf('RNGFWDMQ') >= 0) {
          o = document.getElementById(parent+'_RNGFWDMQ');
          if (o && fieldValue.indexOf('...') > 2 && fieldValue != '' && fieldValue != ' ') {
            o.innerHTML = fieldValue;
          }
        }
        else if (symbol.indexOf('RINGTIMES_cur') >= 0) {
          o = document.getElementById(parent+'_RINGTIMES_cur');
          if (o) o.innerHTML = fieldValue;
        }
        else if (symbol.indexOf('XLMEFLR_MO') >= 0)
          UpdRings(parent,fieldValue);
      }
    }
  }
  catch (e) {}
}

var mLastTickTimeStamp = '';
function UpdTK(parent, tbl, data) {  
  if (mLastTickTimeStamp == '') {
    var ld = document.getElementById(parent+"_lastTickTimeStamp");
    if (ld) mLastTickTimeStamp = ld.innerHTML;
  }  
  var rw = data.split('*');
  if (tbl.rows.length > 100) for (i = tbl.rows.length - 1; i > 100; i--) tbl.deleteRow(i);
  var cnt = 0;
  var cr1 = (tbl.rows.length > 1 ? tbl.rows[1].cells[0].style.backgroundColor.toUpperCase() : "");  
  var nrh = true;
  var ev = rw.length % 2;
  if (ev == 0) nrh = !nrh;  
  for (i = 0; i < rw.length; i++) {
    var cl = rw[i].split('@');
    if (cl[0] >= mLastTickTimeStamp) {
      var tr = tbl.insertRow(++cnt);
      for (var c = 1; c < cl.length; c++) {
        var td = document.createElement('td');
        td.innerHTML = cl[c];
        if (nrh) {          
          if (c == 2)
            td.className = "ts_A";
          else if (c != 2)
            td.className = "td_A";
        }
        else {
          if (c == 2)
            td.className = "ts";
          else if (c != 2)
            td.className = "td";
        }
        tr.appendChild(td);        
      }
      mLastTickTimeStamp = cl[0];
      nrh=!nrh;
    }
  }
}

function rzCC(s) {  
  for (var exp = /-([a-z])/; exp.test(s); s = s.replace(exp, RegExp.$1.toUpperCase()));
  return s;
}

function _setStyle(o, style) {
  if (style.charAt(style.length - 1) == ';')
    style = style.slice(0, -1);
  var k, v;
  var arr = style.split(';');
  for (var i = 0, len = arr.length; i < len; i++) {
    var r = arr[i].split(':')
    k = rzCC(r[0]);
    v = r[1];
    o.style[k] = v;
  }
}

function UpdRings(prnt, c) {
  var dbg = 1;
  try {
    dbg = 2;
    var cur = document.getElementById(prnt+'_LMERings_RINGTIMES_cur');
    //trim the field value
    c = c.replace(' ', '');
    if (c == 'CLOSED') c = 'L_C';
    //get the commodity and ring from this value
    if (c.length >= 5) {
      dbg = 3;      
      //first find the ring number from the session code
      var ring = 'RSTUKL'.indexOf(c.substr(0, 1));
      if (++ring >= 1 && ring <= 4) {
        dbg = 4;
        comm = c.substr(1, 2).toUpperCase();        
        row = prnt+'_LMERings_XLMERNG' + ring + comm + '_MO';
        dbg = 5;        
        var o = document.getElementById(row);
        if (o) {
          dbg = 6;
          //if this is an alloy or steel contract we have to also find the matching commodity
          var oc = '';
          switch (comm) {
            case 'AA': oc = 'AN'; break;
            case 'AN': oc = 'AA'; break;                        
            case 'CO': oc = 'MO'; break;
            case 'MO': oc = 'CO'; break;
          }
          dbg = 7;
          //is this a close or open message ?
          if (EndsWith(c, '_O')) {
            dbg = 8;
            if (o.style.display != '') {
              dbg = 9;
              if (cur) cur.innerHTML = '<nobr>Ring ' + ring + '</nobr>';
              //find the current open rings and flag them for closing
              CloseActiveRings(comm, oc, prnt + "_LMERings");
              dbg = 10;
              var _c = comm.substr(0, 1);
              //ignore plastics
              if ((_c != 'P' && _c != 'L') || comm == 'PB') {
                dbg = 11;
                //open the detail for this commodity and session
                o.style.display = '';
                //if this is an alloy or steel contract we have to also open the matching commodity
                if (oc != '') {
                  row = prnt + '_LMERings_XLMERNG' + ring + oc + '_MO';
                  o = document.getElementById(row);
                  o.style.display = '';
                }
                dbg = 12;                
                ChangeRingSymbols((oc != "" ? comm + "!" + oc : comm), ring, prnt);
                dbg = 14;
              }
            }
          }
          else if (EndsWith(c, '_C')) {
            dbg = 15;
            if (o.style.display == '') setTimeout('HideRing("' + row + '")', 15000);
            dbg = 16;
            //if this is an alloy or steel contract we have to also close the matching commodity						
            if (oc != '') {
              dbg = 17;
              row = prnt + '_LMERings_XLMERNG' + ring + oc + '_MO';
              o = document.getElementById(row);
              dbg = 18;
              if (o && o.style.display == '') setTimeout('HideRing("' + row + '")', 15000);              
              dbg = 20;
            }
          }
        }
      }
      else if (ring > 4 && ring <= 6) {
        dbg = 21;
        //regardless of this being an open or close on the kerb we must close all active rings
        CloseActiveRings('', '',prnt+"_LMERings");
        dbg = 22;
        if (cur) {
          dbg = 23;
          if (ring == 6 && EndsWith(c, '_C')) RemovePrices("bodyprices");
          dbg = 24;
          switch (ring) {
            case 5: if (EndsWith(c, '_O')) cur.innerHTML = '<nobr>AM Kerb</nobr>'; break;
            case 6:
              {
                if (EndsWith(c, '_O'))
                  cur.innerHTML = '<nobr>PM Kerb</nobr>';
                else if (EndsWith(c, '_C'))
                  cur.innerHTML = '<nobr>Rings Closed</nobr>';
                break;
              }
          }
        }
      }
    }
    else if (c.length >= 3) {
      dbg = 24;
      var kerb = c.substr(0, 1);
      if (kerb == 'K' || kerb == 'L') {
        dbg = 25;
        CloseActiveRings('', '',prnt+"_LMERings");
        dbg = 26;
        if (cur) {
          dbg = 27;
          if (kerb == 'L') {
            if (EndsWith(c, '_C'))
              cur.innerHTML = '<nobr>Rings Closed</nobr>';
            else
              cur.innerHTML = '<nobr>PM Kerb</nobr>';
          }
          else if (kerb == 'K' && EndsWith(c, '_O'))
            cur.innerHTML = '<nobr>AM Kerb</nobr>';
        }
      }
    }
  } catch (e) {}
}

function ChangeRingSymbols(comm, ring,prnt) {
  try {    
    if (ring > 2) ring++;
    var metals = new Array('CU', 'AL', 'NI', 'ZN', 'PB', 'ZN', 'AA', 'AN', 'FM','CO','MO');
    var commodities = "XLMEFLR!RNGFWDMQ";
    var arrCommodities = comm.split("!");
    for (var c = 0; c < arrCommodities.length; c++) {
      for (var t = 0; t <= 3; t++) commodities += "!X" + arrCommodities[c].toUpperCase() + "FD" + t + ring;
    }
    for (var m = 0; m < metals.length; m++) commodities += "!X" + metals[m] + "FD3R";    
    ChangePriceSymbols(prnt, commodities);
  } catch (e) {}
}

function HideRing(n) {
  var t = document.getElementById(n);
  if (t && t.style.display == '') {
    t.style.display = 'none';    
  }
}

function EndsWith(s, e) {
  return ((s.length >= e.length) && (s.substr(s.length - e.length, e.length) == e) ? true : false);
}

function CloseActiveRings(comm, oc,prnt) {
  try {
    //find the current open rings and flag them for closing
    var com = new Array('CU', 'AL', 'NI', 'ZN', 'SN', 'PB', 'AA', 'AN', 'FM', 'CO','MO');
    var row = null;
    var rowID = "";
    for (var z = 1; z <= 4; z++) {
      for (var c = 0; c < com.length; c++) {
        if (com[c] != oc && com[c] != comm) {
          rowID = prnt+'_XLMERNG' + z + com[c] + '_MO';
          row = document.getElementById(rowID);
          if (row && row.style.display != 'none') setTimeout('HideRing("' + rowID + '")', 15000);
        }
      }
    }
  } catch (e) {}
}

function LogOff(n) {
  document.location=mDynamicUpdateLogoffPage;
}
