

// ---------------------------------------------------------------------------------
// Just get the element by ID.  Handier than you might imagine.
// ---------------------------------------------------------------------------------
function e(id){return document.getElementById(id);}

// Trim functions
function  trim(s) { if (s.value != "" && s.length > 0) { return s.replace(/^\s+|\s+$/g,""); }}
function ltrim(s) { if (s.value != "" && s.length > 0) { return s.replace(/^\s+/,""); }}
function rtrim(s) { if (s.value != "" && s.length > 0) { return s.replace(/\s+$/,""); }}

// Count a single character in a string
function charCount(s,c) {
  if (c.length > 1) { return -1; }
  var n = 0;
  for (i = 0; i < s.length; i++) {
    if (s.charAt(i) == c) { n++; }
  }
  return n;
}

// Split a string on the the LAST occurrence of a given character
function splitLast(s,c) {
  var words = new Array("","");
  if (c.length < 1) { return words; }
  var n = 0;
  var p = 0;
  for (i = 0; i < s.length; i++) {
    if (s.charAt(i) == c) { n++; p = i;}
  }
  
  if (n > 0) {
    words[0] = s.substring(0,p);
    words[1] = s.substring(p);
  }
  return words;
}

// Return the substring past a given character
function getSubString(s,c) {
  if (c.length > 1) { return -1; }
  for (i = 0; i < s.length; i++) {
    if (s.charAt(i) == c) { return s.substring(i); }
  }
  return "";
}

// Test to see if it is all numeric
function isNumeric(s) { 
  var objRegExp = /^[0-9]+$/;
  return objRegExp.test(s.value);
}


function isAlphabetic(s) { 
  var objRegExp = /^[A-Za-z]+$/;
  return objRegExp.test(s.value);
}

function isAlphabeticWC(s) { 
  var objRegExp = /^[A-Za-z, ]+$/;
  return objRegExp.test(s.value);
}



// -----------------------------------------------------------------------------------
// Browser Detect
// Use
// Browser name: BrowserDetect.browser
// Browser version: BrowserDetect.version
// OS name: BrowserDetect.OS
// -----------------------------------------------------------------------------------
var BrowserDetect = {
  init: function () {
    this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
    this.version = this.searchVersion(navigator.userAgent)
      || this.searchVersion(navigator.appVersion)
      || "an unknown version";
    this.OS = this.searchString(this.dataOS) || "an unknown OS";
  },
  searchString: function (data) {
    for (var i=0;i<data.length;i++)	{
      var dataString = data[i].string;
      var dataProp = data[i].prop;
      this.versionSearchString = data[i].versionSearch || data[i].identity;
      if (dataString) {
        if (dataString.indexOf(data[i].subString) != -1)
          return data[i].identity;
      }
      else if (dataProp)
        return data[i].identity;
    }
  },
  searchVersion: function (dataString) {
    var index = dataString.indexOf(this.versionSearchString);
    if (index == -1) return;
    return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
  },
  dataBrowser: [
    { string: navigator.userAgent, subString: "OmniWeb", versionSearch: "OmniWeb/", identity: "OmniWeb"},
    { string: navigator.vendor, subString: "Apple", identity: "Safari"},
    { prop: window.opera, identity: "Opera"},
    { string: navigator.vendor, subString: "iCab", identity: "iCab" },
    { string: navigator.vendor, subString: "KDE", identity: "Konqueror"},
    { string: navigator.userAgent, subString: "Firefox", identity: "Firefox"},
    { string: navigator.vendor, subString: "Camino", identity: "Camino"},
    { string: navigator.userAgent, subString: "Netscape", identity: "Netscape"}, // for newer Netscapes (6+)
    { string: navigator.userAgent, subString: "MSIE", identity: "Explorer", versionSearch: "MSIE"},
    { string: navigator.userAgent, subString: "Gecko", identity: "Mozilla", versionSearch: "rv"},
    { string: navigator.userAgent, subString: "Mozilla", identity: "Netscape", versionSearch: "Mozilla"} // for older Netscapes (4-)
  ],
  dataOS : [
    { string: navigator.platform, subString: "Win", identity: "Windows"},
    { string: navigator.platform, subString: "Mac", identity: "Mac"},
    { string: navigator.platform, subString: "Linux", identity: "Linux"}
  ]

};
BrowserDetect.init();



// -----------------------------------------------------------------------------------
// Create XML request.
// -----------------------------------------------------------------------------------
var Ajax = new Object();
Ajax.isUpdating = true;

Ajax.Request = function(method, url, callback) {
  this.isUpdating = true;
  this.callbackMethod = callback;
  this.request = (window.XMLHttpRequest)? new XMLHttpRequest(): new ActiveXObject("MSXML2.XMLHTTP");
  this.request.onreadystatechange = function() { Ajax.checkReadyState(); };
  this.request.open(method, url, true);
  this.request.send(url);
}

Ajax.checkReadyState = function(_id) {
  switch(this.request.readyState) {
    case 1: break;
    case 2: break;
    case 3: break;
    case 4:
      this.isUpdating = false;
      this.callbackMethod(this.request.responseXML.documentElement);
  }
}




// ---------------------------------------------------------------------------------
// Get the height of the window.
// ---------------------------------------------------------------------------------
function getWindowHeight() {
  if (window.self && self.innerHeight) {
    return self.innerHeight;
  }
  if (document.documentElement && document.documentElement.clientHeight) {
    return document.documentElement.clientHeight;
  }
  return 0;
}




/* ---------------------------------------------------------------------------------
* cssjs
* written by Christian Heilmann (http://icant.co.uk)
* eases the dynamic application of CSS classes via DOM
* parameters: action a, object o and class names c1 and c2 (c2 optional)
* actions: swap exchanges c1 and c2 in object o
*     add adds class c1 to object o
*     remove removes class c1 from object o
*     check tests if class c1 is applied to object o
* example:  cssjs('swap',document.getElementById('foo'),'bar','baz');
* ---------------------------------------------------------------------------------*/
function cssjs(a,o,c1,c2) {
  switch (a){
    case 'swap':
      o.className=!cssjs('check',o,c1)?o.className.replace(c2,c1):o.className.replace(c1,c2);
      // mine ... o.className=o.className.replace(c2,c1);
      break;
    case 'add':
      if(!cssjs('check',o,c1)){o.className+=o.className?' '+c1:c1;}
      break;
    case 'remove':
      var rep=o.className.match(' '+c1)?' '+c1:c1;
      o.className=o.className.replace(rep,'');
      break;
    case 'check':
      return new RegExp('\\b'+c1+'\\b').test(o.className)
      break;
  }
}


// ---------------------------------------------------------------------------------
// Take and ID and an HTML element and add a class for CSS use. Suckerfish
// ---------------------------------------------------------------------------------
function sfHover2(theID,theEl) {
  var sfEls = e(theID).getElementsByTagName(theEl);
  for (var n=0; n<sfEls.length; n++) {
    sfEls[n].onmouseover=function() {
      this.className+=" sfhover";
    }
    sfEls[n].onmouseout=function() {
      this.className=this.className.replace(new RegExp(" sfhover\\b"), "");
    }
  }
}