// override for debugging
function bug_notify(whatever){
  //alert(whatever);
}

// DOM manipulation methods

function show(name){
  var n=document.getElementById(name);
  if(n){
    if(n.nodeName=='SPAN'||n.nodeName=='A'||n.nodeName=='SELECT'||n.nodeName=='BUTTON'){
      n.style.display='inline';
    }else if(n.nodeName=='LI'){
      n.style.display='list-item';
    }else{
      n.style.display='block';
    }
  }
}

function hide(name){
  var n=document.getElementById(name);
  if(n){
    n.style.display='none';
  }
}

function show_detail(name){
  hide('show-'+name);
  show(name);
}

function hide_detail(name){
  hide(name);
  show('show-'+name);
}

function notice_this(node){
  node.focus();
  node.className='notice';
}

// End DOM manipulation


// Cookie stuff 

function cookie_to_list(){
  var cookie_string=document.cookie;
  var cookie_list=cookie_string.split('; ');
  return cookie_list;
}

function cookie_to_dict(){
  var cookie_dict=[];
  var cookie_list=cookie_to_list();
  for(var i in cookie_list){
    var item=cookie_list[i].split('=');
    cookie_dict[item[0]]=item[1];
  }
  return cookie_dict;
}

function get_cookie(key){
  var cookies=cookie_to_dict();
  return cookies[key];
}

function delete_cookie(key){
  document.cookie=key+'=;expires=Thu, 01-Jan-70 00:00:01 GMT;path=/;domain=.'+domain;
}

function set_cookie(key, value){
  var exp=new Date();
  exp.setTime(exp.getTime()+(365*24*60*60*1000));
  document.cookie=key+'='+value+';expires='+exp.toGMTString()+';path=/;domain=.'+domain;
}
// End cookie stuff


// Browser detection

var isInternetExplorer=false;
var isSafari=false;
var isOpera=false;

if(navigator.appName=="Netscape"){
  if(navigator.appVersion.indexOf("Safari")!=-1){
    isSafari=true;
  }
}else if(navigator.appName.indexOf("Microsoft")!=-1){
  if(navigator.platform=="MacPPC"){
    // IE 5 on Mac OS, bullshit, unsupported
  }else if(navigator.platform=="Win32"){
    isInternetExplorer=true;
  }else{
    if(navigator.userAgent.indexOf("Opera")!=-1){
      // Opera in Explorer mode, unsupported
    }
  }
}else if(navigator.userAgent.indexOf("Opera")!=-1){
  isOpera=true;
}else if(navigator.appName.indexOf("Konqueror")!=-1){
}else{
  // unsupported browser
}

// End Browser detection


// Selection stuff

function _get_selection_start(input) {
  if(isInternetExplorer){
    var range = document.selection.createRange();
    var r2 = range.duplicate();
    var start = 0 - r2.moveStart('character', -100000);
    return start;
    // Works in IE6, not IE7
    //var range=document.selection.createRange();
    //var isCollapsed=range.compareEndPoints("StartToEnd",range)===0;
    //if(!isCollapsed)
    //  range.collapse(true);
    //var b=range.getBookmark();
    //return b.charCodeAt(2)-2;
  }else{
    return input.selectionStart;
  }
}

function _get_selection_end(input) {
  if(isInternetExplorer){
    var range = document.selection.createRange();
    var r2 = range.duplicate();
    var start = 0 - r2.moveStart('character', -100000);
    var end = start + range.text.length;
    return end;
    // Works in IE6, not IE7
    //var range=document.selection.createRange();
    //var isCollapsed=range.compareEndPoints("StartToEnd", range)===0;
    //if(!isCollapsed)
    //  range.collapse(false);
    //var b=range.getBookmark();
    //return b.charCodeAt(2)-2;
  }else{
    return input.selectionEnd;
  }
}

function _future_value(code, field){
  var new_char = String.fromCharCode(code);
  var selectionEnd = _get_selection_end(field);
  var selectionStart = _get_selection_start(field);
  if (code == 8 || code == 46){
    if (selectionStart == selectionEnd){
      // nothing is selected, so remove a character
      if (code == 8 && field.selectionStart > 0){ // backspace
        return field.value.slice(0, selectionStart-1) + field.value.slice(selectionEnd);
      } else if (code == 46){ //del 
        return field.value.slice(0, selectionStart) + field.value.slice(selectionEnd+1);
      } else {
        return field.value;
      }
    } else {
      //region is selected, just remove the entire selection
      new_char = '';
    }
  }
  return field.value.slice(0,selectionStart) + new_char + field.value.slice(selectionEnd);
}

// End Selection stuff


// XMLHTTPRequest stuff

function innerTextContent(node){
  // "Why can't we all just get along?" -- Rodney King
  if(node.innerText===undefined && node.textContent!==undefined){
    // Firefox
    return node.textContent;
  }
  if(node.textContent===undefined && node.innerText!==undefined){
    // IE, and Safari are supposed to work this way but Safari 1.3 does not
    return node.innerText;
  }
  if(node.firstChild && node.firstChild.nodeValue!==undefined){
    // Safari,Konqueror?
    return node.firstChild.nodeValue;
  }
  return undefined;
}

function XMLDocProcess(request,callback){
  // only if req shows "loaded"
  if(request.readyState==4){
    // only if "OK"
    if(request.status==200){
      //s("getting responseXML...");
      var rxml=request.responseXML;
      //s("about to call the callback");
      callback(rxml);
    }else{
      bug_notify("There was a problem retrieving the XML data:\n"+request.statusText);
    }
  }
}

function XMLDocLoad(action,url,params){
  // branch for native XMLHttpRequest object
  var request=false;
  if(window.XMLHttpRequest){
    try{
      request=new XMLHttpRequest();
    }catch(e1){
    }
  // branch for IE/Windows ActiveX version
  }else if(window.ActiveXObject){
    try{
      request=new ActiveXObject("Msxml2.XMLHTTP");
    }catch(e2){
      try{
	request=new ActiveXObject("Microsoft.XMLHTTP");
      }catch(e3){
      }
    }
  }
  if(request){
    request.open(action,url,true);
    if(action=='POST'){
      request.setRequestHeader("Content-type","application/x-www-form-urlencoded");
      //request.setRequestHeader("Content-length",params.length);
    }
    request.send(params);
  }
  return request;
}

function XMLDoc(action,url,params,callback){
  var request=XMLDocLoad(action,url,params);
  request.onreadystatechange=function(){
    //s("onreadystatechange handler fired with "+request.readyState);
    XMLDocProcess(request,callback);
  };
  // IE caches XMLHTTPRequests,so we have to check here to see if the callback is ready to fire.
  //s("Calling XMLDocProcess first");
  XMLDocProcess(request,callback);
}

function alert_errors(response){
  var errors=response.getElementsByTagName('error');
  if(errors.length){
    for(var i=0;i<errors.length;i++){
      alert(innerTextContent(errors.item(i)));
    }
  }
  return errors.length>0;
}

// end XMLHTTPRequest stuff
