var cwsUtil = new CwsUtil();
//window.onerror = cwsUtil.handleError;

var IE = navigator.appName.indexOf("Microsoft") != -1;
if (IE)
  var W3CDOM = parseInt(navigator.appVersion.substring(navigator.appVersion.indexOf("MSIE ")+5,navigator.appVersion.indexOf("MSIE ") + 6)) >= 5;
else
  var W3CDOM = parseInt(navigator.appVersion.substring(0,1)) >= 5;

function CwsUtil()  {
  this.debug = false;
  this.handleError = function() {
    if (this.debug) {
      alert("JS Error");
    }
    else  {
      return true;
    }
  }
}

CwsUtil.getListValue = function(masterKey,list,valueDelimiter,pairDelimiter)  {
  var key = "";
  var value = "";
  while (list.indexOf(valueDelimiter,0) > -1)
  {
    var i = list.indexOf(pairDelimiter,0);
    if (i == -1)
      i = list.length;
    var pair = list.substring(0,i);
    var j = pair.indexOf(valueDelimiter,0);
    key = pair.substring(0,j);
    if (key.substring(0,1) == " ")  {
      key = key.substring(1,(key.length));
    }
    value = pair.substring(j+valueDelimiter.length,(pair.length));
    list = list.substring(i+pairDelimiter.length,(list.length));
    if (key == masterKey)  {
      return value;
    }
  }
  return "";
}

CwsUtil.setListValue = function(masterKey,value,list,valueDelimiter,pairDelimiter)  {
  var tmpPos = -1;
  var masterPos = 0;
  var masterList = list;
  while (list.indexOf(valueDelimiter,0) > -1)
  {
    var i = list.indexOf(pairDelimiter,0);
    if (i == -1)
      i = list.length;
    var pair = list.substring(0,i);
    var j = pair.indexOf(valueDelimiter,0);
    key = pair.substring(0,j);
    if (key.substring(0,1) == " ")  {
      key = key.substring(1,(key.length));
    }
    list = list.substring(i+pairDelimiter.length,(list.length));
    if (key == masterKey)  {
      masterList = masterList.substring(0,masterPos+key.length+1) + value + masterList.substring(masterPos+i);
      return masterList;
    }
    else  {
      masterPos += i + 1;
    }
  }
  masterList += masterKey + "=" + value + ";";
  return masterList;
}

CwsUtil.getListValueByIndex = function(list,index,delimiter)  {
  var value = "";
  var currentIndex = -1;
  for (x = 0; x <= index; x++)
  {
    currentIndex = list.indexOf(delimiter);
    if (currentIndex > -1) {
      value = list.substring(0,currentIndex);
      list = list.substring(currentIndex+delimiter.length,list.length);
    }
    else  {
      value = list;
      list = "";
    }
  }
  return value;
}

CwsUtil.setCookieValue = function(key,value,expireDays)  {
  var cookieString = key + "=" + value + "; path=/;";
  if (expireDays > 0) {
    var date = new Date ();
    date.setTime(date.getTime() + (expireDays * 24 * 60 * 60 * 1000));
    cookieString += " expires=" + date.toGMTString() + ";";
  }
  document.cookie = cookieString;
}

function KartaHash(n)  {
  this.name = n;
  this.keys = new Array();
  this.values = new Array();

  this.setValue = function(k,v) {
    var keyIndex = this.getKeyIndex(k);
    if (keyIndex == -1)  {
      keyIndex = this.keys.length;
    }
    if ((keyIndex > -1) && (this.keys.length == this.values.length))  {
      this.keys[keyIndex] = k;
      this.values[keyIndex] = v;
      return true;
    }
    return false;
  }

  this.getValue = function(k) {
    var keyIndex = this.getKeyIndex(k);
    if ((keyIndex > -1) && (keyIndex < this.values.length))  {
      return this.values[keyIndex];
    }
    return null;
  }

  this.getValueByIndex = function(index) {
    if ((index > -1) && (index < this.values.length))  {
      return this.values[index];
    }
    return null;
  }

  this.getNumItems = function() {
    return this.keys.length;
  }

  this.getKeyArray = function() {
    return this.keys;
  }

  this.setKeyArray = function(k) {
    if (this.keys.length == k.length) {
      this.keys = k;
      return true;
    }
    return false;
  }

  this.getValueArray = function() {
    return this.values;
  }

  this.setValueArray = function(v) {
    if (this.values.length == v.length) {
      this.values = v;
      return true;
    }
    return false;
  }

  this.getKeyIndex = function(k) {
    for (var i=0;i<this.keys.length;i++) {
      if (k == this.keys[i])  {
        return i;
      }
    }
    return -1;
  }
}

//1 based, not 0 based
function set_item_in_list(item_list,item_value,location,delimiter)
{
  var tmp_pos = -1;
  var master_pos = 0;
  var tmp_list = item_list;
  var tmp_loc = parseInt(location);
  if (tmp_loc <= get_item_count(item_list,delimiter)) {
    for (x = 1; x <= tmp_loc; x++)
    {
      tmp_pos = tmp_list.indexOf(delimiter);
      if (tmp_pos > -1) {
        tmp_list = tmp_list.substring(tmp_pos+1,tmp_list.length);
        if (x == tmp_loc)  {
          item_list = item_list.substring(0,master_pos) + item_value + delimiter + tmp_list;
        }
      }
      else  {
        //value in last slot, so just add value on the end
        item_list = item_list.substring(0,master_pos) + item_value;
      }
      master_pos += tmp_pos + 1;
    }
  }
  return item_list;
}

CwsUtil.encodePassword = function(password) {
  var encPassword = hex_md5(password);
  //return just the first 8 chars
  return encPassword.substr(0,8);
}

CwsUtil.padZeros = function(number, numDigits) {
  var zeros = "";
  var numZeros = 0;
  var i = 0;
  number += "";
  if (number.length < numDigits)	{
    numZeros = numDigits - number.length;
    for (i=0; i < numZeros; i++)	{
      zeros += "0";
    }
  }
  return zeros + number;
}

CwsUtil.getUrlValue = function(key,url) {
  var urlPos = -1;
  var value = "";
  var temp = window.document.location;
  if (url != null)  {
    temp = url;
  }
  if (temp != "")  {
    var url = temp.toString();
    var offset = key.length + 1;
    if (url.indexOf('?') > -1)  {
      //get page
      qs = url.substring(url.indexOf('?') + 1,url.length);
      urlPos = qs.indexOf(key);
      if (urlPos > -1)  {
        value = qs.substring(urlPos+offset,qs.length);
        if (value.indexOf('&') >= 0)
          value=value.substring(0,value.indexOf('&'));
      }
    }
  }
  return value;
}

CwsUtil.getUrlPath = function(url)  {
  for (i=url.length-1;i>=0;i--) {
    if (url.substr(i,1) == "/") {
      return url.substring(0,i+1);
    }
  }
  return "";
}
CwsUtil.getItemCount = function(list,delimiter)  {
  var numItems = -1;
  var item = "null";
  while (item != "")  {
    item = CwsUtil.getItemInList(list,numItems+1,delimiter);
    numItems += 1;
  }
  return numItems;
}
CwsUtil.getItemInList = function(list,location,delimiter)  {
  var item = null;
  var itemPos = -1;
  var itemLoc = parseInt(location,10);
  for (x = 0; x <= itemLoc; x++)
  {
    itemPos = list.indexOf(delimiter);
    if (itemPos > -1) {
      item = list.substring(0,itemPos);
      list = list.substring(itemPos+1,list.length);
    }
    else  {
      item = list;
      list = "";
    }
  }
  return item;
}
CwsUtil.itemInArray = function(item,array) {
  for (i=0;i<array.length;i++)  {
    if (item == array[i])
      return true;
  }
  return false;
}
CwsUtil.itemIndexInArray = function(item,array) {
  for (i=0;i<array.length;i++)  {
    if (item == array[i])
      return i;
  }
  return -1;
}

CwsUtil.getObjStyle = function(objId) {
  if (W3CDOM) {
    return "document.getElementById('" + objId + "').style";
  }
  else  {
    if (IE) {
      return objId + ".style";
    }
    else  {
      return "document." + objId;
    }
 }
}

CwsUtil.getHtmlObjText = function(objId) {
  if (W3CDOM) {
    return "document.getElementById('" + objId + "')";
  }
  else  {
    if (IE) {
      return objId;
    }
    else  {
      return "document." + objId;
    }
 }
}

CwsUtil.convertStringToHex = function(stringValue)
{
  var hexValue = "";
  stringValue = stringValue + "";
  for (y = 0; y < stringValue.length; y++)
  {
    hexValue += CwsUtil.dec2hex(stringValue.charCodeAt(y));
  }
  return hexValue;
}

CwsUtil.convertStringFromHex = function(hexValue)
{
  var stringValue = "";
  hexValue += "";
  while (hexValue.length > 0) {
    stringValue += String.fromCharCode(CwsUtil.hex2dec(hexValue.substr(0,2)));
    if (hexValue.length == 2)
      hexValue = "";
    else
      hexValue = hexValue.substring(2,hexValue.length);
  }
  return stringValue;
}

CwsUtil.hex2dec = function(strVal)  {
  // where strVal is a string
  // parseInt('ff',16) == 255
  return parseInt(strVal,16);
}

CwsUtil.dec2hex = function(n) {
var hex = "0123456789ABCDEF";
var mask = 0xf;
var retstr = "";

  while(n != 0)
  {
    retstr = hex.charAt(n&mask) + retstr;
    n>>>=4;
  }

 return retstr.length == 0 ? "0" : retstr;
}

CwsUtil.replaceChar = function(oldChar,newChar,str) {
  for (i=0;i<str.length;i++)  {
    curChar = str.substr(i,1);
    if (curChar == oldChar) {
      str = str.substring(0,i) + newChar + str.substring(i+1);
    }
  }
  return str;
}

CwsUtil.replaceChars = function(oldChars,newChars,str) {
  for (i=0;i<str.length;i++)  {
    curChars = str.substr(i,oldChars.length);
    if (curChars == oldChars) {
      str = str.substring(0,i) + newChars + str.substring(i+oldChars.length);
    }
  }
  return str;
}

CwsUtil.pathChecker = function(path) {
  if (path.substr(0,7) == "file://") {
    if (path.substr(9,1) != ":") {
      if (path.substr(7,2) != "//")  {
        path = "file:////" + path.substr(7);
      }
    }
  }
  return path;
}

function BrowserWindow()  {
  this.win = null;
  this.name = "";
  this.closeOnExit = true;
  this.opened = false;
  var winUrl = "";
  var winWidth = 400;
  var winHeight = 300;
  var winTop = "";
  var winLeft = "";
  var winScroll = "no";
  var winResizable = "no";
  var winMenuBar = "no";

  this.closeWin = function()  {
    if (this.win != null) {
      if (!this.win.closed) {
        this.win.close();
      }
      this.win = null;
    }
  }
  this.setWidth = function(width) {
    winWidth = width;
  }
  this.setHeight = function(height) {
    winHeight = height;
  }
  this.setTop = function(top) {
    winTop = top;
  }
  this.setLeft = function(left) {
    winLeft = left;
  }
  this.setScroll = function(scroll) {
    if (scroll) {
      winScroll = "yes";
    }
    else  {
      winScroll = "no";
    }
  }
  this.setResizable = function(resizable) {
    if (resizable)  {
      winResizable = "yes";
    }
    else  {
      winResizable = "no";
    }
  }
  this.setMenuBar = function(menuBar) {
    if (menuBar)  {
      winMenuBar = "yes";
    }
    else  {
      winMenuBar = "no";
    }
  }
  this.openWin = function()  {
    if (winUrl != null) {
      var style = "width=" + winWidth.toString() + ",height=" + winHeight.toString() + ",scrollbars=" + winScroll + ",resizable=" + winResizable + ",toolbar=no,directories=no,menubar=" + winMenuBar + ",status=yes,location=no,";
      if (winTop.toString() != "") {
        style += "top=" + winTop + ",";
      }
      if (winLeft.toString() != "") {
        style += "left=" + winLeft + ",";
      }
      this.win = open(winUrl,this.name, style);
    }
  }
  this.getWin = function() {
    return this.win;
  }
  this.gotoUrl = function(url)  {
    winUrl = url;
    if ((this.win == null) || (this.win.closed)) {
      this.openWin();
    }
    else  {
      this.win.location.href = winUrl;
    }
  }
}

function BrowserFrame() {
  this.win = null;
  this.name = "";
  var winWidth = 400;
  var winHeight = 300;
  var winTop = 0;
  var winLeft = 0;

  this.closeWin = function()  {
    if (this.win.parent != null) {
      if (!this.win.parent.closed) {
        this.win.parent.close();
      }
      this.win = null;
    }
  }
  this.setWidth = function(width) {
    winWidth = width;
  }
  this.setHeight = function(height) {
    winHeight = height;
  }
  this.setTop = function(top) {
    winTop = top;
  }
  this.setLeft = function(left) {
    winLeft = left;
  }
  this.setScroll = function(scroll) {

  }
  this.setResizable = function(resizable) {
  }
  this.openWin = function()  {
    if (winUrl != null) {
      this.gotoUrl(winUrl);
    }
  }
  this.gotoUrl = function(url)  {
    winUrl = url;
    if (this.win != null) {
      this.win.location.href = winUrl;
      //this.win.parent.moveTo(winTop,winLeft);
      //this.win.resizeTo(winWidth,winHeight);
    }

  }
}

function Glossary() {
  var glossary = new Array();

  this.getGlossary = function() {
    return glossary;
  }
  this.addTerm = function(term,definition) {
    var termObj = new GlossaryTerm(term,definition);
    glossary[glossary.length] = termObj;
  }
  this.getTerms = function()  {
    var terms = new Array();
    for (t=0;t<glossary.length;t++)  {
      terms[t] = glossary[t].term;
    }
    return terms;
  }
  this.getDefinition = function(term) {
    for (t=0;t<glossary.length;t++)  {
      if (glossary[t].term == term)  {
        return glossary[t].definition;
      }
    }
    return "";
  }
}

function isValidFunction(funct)  {
  if ((typeof funct == "object") || (typeof funct == "function")) {
    return true;
  }
  return false;
}

function GlossaryTerm(term,definition) {
  this.term = term;
  this.definition = definition;
}

function WmpVolumeControl(cwsObj,win,sliderSpanObj,mediaPlayer) {
  var wmpVolumeMax = 100;
  var wmpVolumeMin = 0;
  var wmpField = wmpVolumeMax - wmpVolumeMin;

  var sliderWidth = sliderSpanObj.sliderWidth;
  var sliderXOffset = sliderSpanObj.sliderXOffset;
  var zoneLeft = sliderSpanObj.zoneLeft;
  var zoneWidth = sliderSpanObj.zoneWidth;

  var sliderLeft = zoneLeft + sliderXOffset;
  var X = sliderLeft;

  var volume = 0;

  var currentObj = null;
  var dragObj = null;

  var slider = eval("win." + CwsUtil.getHtmlObjText(sliderSpanObj.id));

  if (!IE)  {
    win.document.captureEvents(Event.MOUSEDOWN | Event.MOUSEMOVE | Event.MOUSEUP);
  }
  win.document.onmousedown = mouseDown;
  win.document.onmousemove = mouseMove;
  win.document.onmouseup = mouseUp;

  this.initialize = function(volume)  {
    if ((volume >= wmpVolumeMin) && (volume <= wmpVolumeMax)) {
      moveSlider(volume);
      if (mediaPlayer != null)  {
        mediaPlayer.setVolume(volume);
      }
    }
  }

  this.setMediaPlayer = function(player)  {
    mediaPlayer = player;
  }

  this.overSlider = function()
  {
    currentObj = slider;
  }
  this.outSlider = function()
  {
    currentObj = null;
  }

  function updateVolume(volume)  {
    cwsObj.masterVolume = volume;
    if (mediaPlayer != null)  {
      mediaPlayer.setVolume(cwsObj.masterVolume);
    }
  }

  function moveSlider(percent) {
    var field = zoneWidth - ((2 * sliderXOffset) + sliderWidth);
    var position = Math.round((percent * field) / 100)
    var x = position + sliderLeft;
    slider.style.left = x;
    sliderSpanObj.left = x;
  }

  function mouseDown(e)
  {
    if (currentObj != null) {
      dragObj = currentObj;
      //get position
      if (!IE)  {
        X = e.layerX;
        return false;
      }
      else  {
        X = win.event.offsetX;
      }
    }
  }

  function mouseMove(e)
  {
    var percent = 0;
    if (dragObj != null)  {
      if (!IE)  {
        if (inZone(e.pageX-X))  {
          dragObj.style.left = e.pageX-X;
          updateVolume(getPercent(e.pageX-X));
        }
      }
      else  {
        if (inZone(win.event.clientX-X + win.document.body.scrollLeft))  {
          dragObj.style.pixelLeft = win.event.clientX-X + win.document.body.scrollLeft;
          updateVolume(getPercent(win.event.clientX-X + win.document.body.scrollLeft));
        }
        return false;
      }
    }
  }

  function mouseUp(e)
  {
    if (dragObj != null)  {
      var mouse_x = 0;
      if (!IE)  {
        mouse_x = e.pageX;
      }
      else  {
        mouse_x = win.event.x;
      }
      sliderSpanObj.left = dragObj.style.left;
      dragObj = null;
    }
  }

  function inZone(x)
  {
    if ((x >= sliderLeft) && ((x + sliderWidth) <= (zoneLeft + zoneWidth - sliderXOffset)))  {
      return true;
    }
    return false;
  }

  function getPercent(x) {
    var percent = 0;
    var field = zoneWidth - ((2 * sliderXOffset) + sliderWidth);
    var position = x - sliderLeft;
    if (position > 0)  {
      if (position < field) {
        percent = Math.round(position/field * 100);
      }
      else  {
        percent = 100;
      }
    }
    return percent;
  }
}

function KeyTrap(fObj,win,kloObj)  {
  var timerIntervalId = null;
  var timerInterval = 250;
  var active = false;
  var doFocus = true;

  this.start = function() {
    timerIntervalId = setInterval(this.setFocus,timerInterval);
    active = true;
  }

  this.stop = function()  {
    if (timerIntervalId != "")  {
      clearInterval(timerIntervalId);
      timerIntervalId = null;
    }
    active = false;
  }

  this.trapKey = function(keyStrokeEvent) {
    if (active) {
      doFocus = false;
      var event = keyStrokeEvent;
      if (win.event) {
        event = win.event;
      }
      var keyCode = event.keyCode;
      if (win.event) {
        //if IE, you have to remap the key to keep the event alive
        event.keyCode = 505;
      }

      //set variable in Flash shell
      var timeStamp = new Date();
      var trapKeyValue = timeStamp.getTime() + "," + keyCode + "," + event.shiftKey + "," + event.ctrlKey + "," + event.altKey;
      if (fObj != null) {
        fObj.SetVariable("trapKeyValue", trapKeyValue);
      }
      doFocus = true;
      return false;
    }
    return true;
  }

  this.setFocus = function()  {
    if (doFocus)  {
      win.focus();
    }
  }
}

function getObjectFunction(funct,object) {
  return function() {
    funct.apply(object);
  }
}

function handleError()  {
  return true;
}