function handleError(desc,page,line) {
  document_location = document.location.href;
  err_string='/jserr.php?page='+escape(document_location);
  err_string+='&error_message='+escape(desc);
  err_string+='&file='+escape(page);
  err_string+='&line='+escape(line);
  
  err_string+='&user_agent='+escape(navigator.userAgent);
  err_string+='&application_name='+escape(navigator.appName);
  err_string+='&version='+escape(navigator.appVersion);
    
  if(document.getElementById('JSErrorHandlerImg')) {
    document.getElementById('JSErrorHandlerImg').src=err_string;
  } else {
    err_string+='&during_load=True';    
    img = document.createElement('img');
    img.src = err_string;
    document.innerHTML += img.innerHTML;
    
  }
  //alert(err_string);
  return false;
}
window.onerror = handleError;


//NoFunction();

function ID(id) {
  return document.getElementById(id);
}

function toPrice(srcPrice) {
  /* This function returns srcPrice with two forced decimal places. */
  srcPrice = Math.round(srcPrice*100)/100;
  srcPrice = srcPrice + "";
  if (srcPrice.indexOf(".") < 0) {
    srcPrice += ".00";
  } else {
    var decimals=srcPrice.length-srcPrice.indexOf(".")-1;
    if(decimals==0)
      srcPrice += "00";
    else if(decimals==1)
      srcPrice += "0";
  }
  return(srcPrice);
}

function cleanStringPopup(csstr) {
	return csstr.replace(/%([0-9][0-9A-F])/g, ' ');
}

function SelectIndexByID(id) {
  s=ID(id); if (!s) return false;
  if(s.options.length==0 || !s.options.length > s.options.selectedIndex) return false;
  return s.options[s.options.selectedIndex].value;
}

function SelectedTextByID(id) {
  s=ID(id); if (!s) return false;
  return s.options[s.options.selectedIndex].text;
}

//Similar to the php function of the same name but lacking a quote style option.
//Similar to but less complete that htmlentities
function htmlspecialchars(str) {
  return str.replace(/\&/g, "&amp;").replace(/\"/g, "&quot;").replace(/\</g, "&lt;").replace(/\>/g, "&gt;");
  /*
      '&' '&amp;'
      '"' '&quot;'
      '<' '&lt;'
      '>' '&gt;' 
  */
}

function CC(amt) {
  void window.open('/cc.php?amt='+amt,'cc','width=580,height=500,scrollbars=yes,resizable=yes');
  return;
}

function baseURL()
{
  //Firefox
  //if(document.baseURI) return document.baseURI;
  //Ie
  var baseEl=document.getElementsByTagName("base");
  if(baseEl.length>0) {
    return baseEl[0].href;
  }
  //Last resort
  return "/";
}

function showPopup(url) {
  var scr_width = 900;
  var scr_height = 600;
  window.open(baseURL()+url,"","width=" + scr_width + ",height=" + scr_height + ",scrollbars=yes,resizable=yes");
}


function FlyHelp (title,content,e) {
  //console.log('here');
  f=ID("FlyHelp");
  f.style.display='block';
  
  ID("FlyHelpTitle").innerHTML=title;
  ID("FlyHelpMsg").innerHTML=content;
  //console.log(x$("FlyHelp").element());
  x$("FlyHelp").clonePosition(xEvent(e).eventElem(),{offsetY:20,matchHeight:false,matchWidth:false});
  
/*  MX=e.clientX+GetScrollLeft()+10; // 
  MY=e.clientY+GetScrollTop()+10;  //;
  if (GetBodyWidth()-e.clientX < 200)
    MX=MX-180;
*/  
    
  f.style.display='block';
  f.style.width="180px";
  
}

function ZipupFly(id) { // Closes your Fly
  ID(id).style.display='none';
}


function ShowElem(id, show) {
  if(ID(id))
    ID(id).style.display = show ? '' : 'none';
}

function HideElem(id) { //,show = false
  show = false;
  if(HideElem.arguments.length == 2 && HideElem.arguments[1] == true)
    show = true;
  if(ID(id))
    ID(id).style.display = show ? '' : 'none';
}

// Obselete now in tools.js
function GetKeyCode(e) {
  var key;
  if (window.event) key = window.event.keyCode;
  else if (e) key = e.which | e.keyCode;  
  return key;
}
// Obselete now in tools.js
function GetEventElem(e) {
  var elem;
  if (!e) var e = window.event;
  if (e.target) elem = e.target;
  else if (e.srcElement) elem = e.srcElement;
  if (elem.nodeType == 3) // defeat Safari bug
    elem = targ.parentNode;
  return elem;  
}
function InsertSelectOption(elem, _value, _label) {
  if(typeof elem != 'object')
    elem = ID(elem);
    
  elem.options[elem.length] = new Option(_label, _value);
}

function SetSelectValue(SelectName, new_value) {
  if(typeof SelectName == 'string')
    elem = ID(SelectName);
  else
    elem = SelectName;
  
  for(var i = 0; i < elem.options.length; i++) {
    if( elem.options[i].value == new_value) {
       elem.selectedIndex = i;
    }
  }
}
function setValueAjax(data) {
  setValue(data[0], data[1]);
}

function setValue(elem_raw, value) {
  if(typeof elem_raw =='string')
    elem = ID(elem_raw);
  else
    elem = elem_raw;

  if((typeof elem == 'undefined' || elem == null) && ID(elem_raw+'year'))
    return setValueDate(elem_raw, value);
  if((typeof elem == 'undefined' || elem == null) && ID(elem_raw+'hour'))
    return setValueTime(elem_raw, value);
  if(typeof elem == 'undefined' || elem == null)
    return false;

  if(!elem.nodeName)
    return false;

  switch(elem.nodeName.toLowerCase()) {
   case 'input':
    switch(elem.type) {
      case 'checkbox':
        elem.checked = value!=0 && value!=false  ? true : false;
        break;
      default:
        elem.value = value;
        break;
    }
   break;  
   case 'select':
    SetSelectValue(elem, value);
   break;
   case 'span':
    elem.innerHTML = value;
   case 'div':
    elem.innerHTML = value;
   case 'th':
    elem.innerHTML = value;
   case 'td':
    elem.innerHTML = value;
   break;
   default:
     elem.innerHTML = value;
  }
}


function RemoveElem(id) {
  if(typeof id == 'object') {
    elem = id;
  } else {
    elem = ID(id);
  }  
  elem.parentNode.removeChild(elem);
}

function getValue(elem_raw) {
  if(typeof elem_raw =='string')
    elem = ID(elem_raw);
  else
    elem = elem_raw;


  if((typeof elem == 'undefined' || elem == null) && ID(elem_raw+'year')) 
    return getValueDate(elem_raw);
  if((typeof elem == 'undefined' || elem == null) && ID(elem_raw+'hour')) 
    return getValueTime(elem_raw);
  if(typeof elem == 'undefined' || elem == null)
    return false;
  
  if(!elem.nodeName)
    return false;
    
    
  switch(elem.nodeName.toLowerCase()) {
    case 'input':
      switch(elem.type) {
        case 'checkbox':
          return elem.checked ? elem.value : false;
        case 'radio':
          var frm = GetAncestor(elem, 'form');
          var nme = elem.name;
          var elems = (eval('frm.'+nme));
          for(var i=0;i<elems.length;i++) {
            if(typeof elems[i] == 'object') {
              if(elems[i].checked) {
                return elems[i].value;
              }
            }
          }
          break;
        default:
          return elem.value;
      }
    break;  
    case 'select':
      if(elem.options.length==0) return false;
      if(elem.multiple) {//getAttribute('multiple')=='multiple') {
        selected = new Array(); 
          for (var i = 0; i < elem.options.length; i++) 
            if (elem.options[ i ].selected) 
              selected.push(elem.options[ i ].value);
        //alert(selected);
        return selected;
     }
     return elem.options[elem.selectedIndex].value;
    break;   
    case 'span':
     return elem.innerHTML;
    case 'textarea':
     return elem.innerHTML;
    break;

  }  
}
function getValueDate(elem_raw) {
  year = getValue(elem_raw+'year');
  month = getValue(elem_raw+'month');
  day = getValue(elem_raw+'day');
  
  return year+'-'+month+'-'+day;  
}
function getValueTime(elem_raw) {
  hour = getValue(elem_raw+'hour');
  minute = getValue(elem_raw+'minute');
  meridian = getValue(elem_raw+'meridian');
  
  return hour+':'+minute+' '+meridian;  
}
function setValueDate(elem_raw, date) {
  var year = date.substr(0,4);
  var month = date.substr(5,2);
  var day = date.substr(8);
    
  SetSelectValue(ID(elem_raw+'year'),year);
  SetSelectValue(ID(elem_raw+'month'),month);
  SetSelectValue(ID(elem_raw+'day'),day);  
}
function setValueTime(elem_raw, time) {
  var hour = time.substr(0,2);
  var minute = time.substr(3,2);
  var meridian = time.substr(7);
    
  SetSelectValue(ID(elem_raw+'hour'),hour);
  SetSelectValue(ID(elem_raw+'minute'),minute);
  SetSelectValue(ID(elem_raw+'meridian'),meridian);  
}


function GetAncestor(elem, nodeName) {
  if(typeof elem.nodeName == 'string' && elem.nodeName.toLowerCase() == nodeName.toLowerCase()) {
    return elem;
  } 
  if(elem == window)  {
    return false;
  }
  return GetAncestor(elem.parentNode, nodeName);
}



DateTime = {
  GetHour: function(time) {
    hr = time.substr(0,2);
    return hr>12 ? hr-12 : hr;
  },
  GetMinute: function(time) {
    min = time.substr(3,2);
    return min;    
  },
  GetMeridian: function(time) {
    hr = time.substr(0,2);
    return hr>=12 ? 'pm' : 'am';
  }
  
}; 

subFlyHideElems = [];
subFlyTimeOuts = [];

function ShowSub(elem) {
  var i = elem.firstChild;
  while(i) {
    if(i.nodeName) {
      if(i.nodeName.toLowerCase() == 'ul') {
        i.style.display = '';
        for(var k in subFlyHideElems) {
          if(subFlyHideElems[k] === elem);
          var subFlyi=k; 
        }
        if(!subFlyi) {
          var subFlyi = subFlyHideElems.length;
          subFlyHideElems[subFlyi] = elem;
        }
        clearTimeout(subFlyTimeOuts[subFlyi]);
        break;
      } 
    }
    i = i.nextSibling;
  }
}
function HideSub(elem) {
  if(arguments.length==1) {
    window.status = subFlyHideElems.length;
    for(var k in subFlyHideElems) {
      if(subFlyHideElems[k] === elem);
      var subFlyi=k; 
    }
    if(!subFlyi) {
      var subFlyi = subFlyHideElems.length;
      subFlyHideElems[subFlyi] = elem;
    }
    subFlyTimeOuts[subFlyi] = setTimeout("HideSub(subFlyHideElems, "+subFlyi+")",500);
    return false;
  }
  var i = elem[arguments[1]].firstChild;
  while(i) {
    if(i.nodeName) {
      if(i.nodeName.toLowerCase() == 'ul') {
        i.style.display = 'none';
        break;
      } 
    }
    i = i.nextSibling;
  }
  delete(elem[arguments[1]]);
}




// Moved from select-functions.js

// selID is the html ID of the select box
// items is an object of value->text
// restoreSelection is:
//   Backup  -> Backup
//   Restore -> Restore from previous backup
//   Both    -> Backup and restore in this one operation
//   None    -> No backup, just change the select's values
fill_multiselect.selectedIdx=new Object; //Declare globally to simulate static variable
function fill_multiselect(selID,items,restoreSelection) {
  var sel=ID(selID);
  var selOptions=sel.options;
  if(restoreSelection=='Backup' || restoreSelection=='Both') { //Backup
    fill_multiselect.selectedIdx[selID]=new Object;
    for(var opIdx=0; opIdx<selOptions.length; opIdx++) {
      if(selOptions[opIdx].selected)
        fill_multiselect.selectedIdx[selID][selOptions[opIdx].value]=true;
    }
  }
  
  //Clear the select box - I tried a loop with sel.remove(idx) but it didnt work out
  selOptions.length=0;
  
  var opIdx=0;
  for (var value in items) {
    if(value=='toString') continue;
    selOptions[opIdx]=new Option(items[value],value);
    if(restoreSelection=='Restore' || restoreSelection=='Both') { //Restore
      if(fill_multiselect.selectedIdx[selID] && fill_multiselect.selectedIdx[selID][value]) {
        selOptions[opIdx].selected=true;
      }
    }
    opIdx++;
  }
}

function restartGif(){
  for(var i=0; i<document.images.length; i++){
    var img = document.images[i];
    var imgName = img.src.toUpperCase();
    if (imgName.substring(imgName.length-3, imgName.length) == "GIF"){
      img.src = img.src;
    }
  }
}

function printpage() {
  window.print();
}

/**
 * Show loading animation
 * @param str {string} Optional
 */
function showLoading() {

  try {
    str = arguments.length>0?arguments[0]:'Searching please wait...';
    var flashvars = {};
    flashvars.loadingText = str;
    var params = {};
    params.wmode = "transparent";
    params.swliveconnect="true";
    var attributes = {};
    attributes.id = "loadingflash";
    swfobject.embedSWF("flash/bouncing-balls.swf", "loadingflash", "295", "168", "8.0.0", false, flashvars, params, attributes);
    x$('ajaxmessage-busy').show();
  } catch(e) {  }
}
/**
 * Hide loading animation
 *
 */
function hideLoading() {
  try {
    x$('ajaxmessage-busy').hide();
  } catch(e) {}
}

function showMoreInfo(url) {
  var scr_width = 1010;
  var scr_height = 600;
  window.open(baseURL()+url,"","width=" + scr_width + ",height=" + scr_height + ",scrollbars=yes,resizable=yes");
}
function showMoreInfoBlank(url,w,h) {
  var scr_width = w;
  var scr_height = h;
  window.open(url,"","width=" + scr_width + ",height=" + scr_height + ",scrollbars=yes,resizable=yes");
}

function nicePrice(num) {
  var amt = (Math.round(parseFloat(num)*100)/100+'').replace(/([^.0-9])/,'');
  if(amt.indexOf('.')==-1)
    amt+='.00';
  var prec = 3 - (amt.length - amt.indexOf('.'));
  var i=0;
  if(prec > 0)
    while(i++<prec)
      amt+='0';
  return '$'+amt;
  
}
