String.prototype.trim = function() {
	return this.replace('/^\s+|\s+$/g',"");
}
String.prototype.ltrim = function() {
	return this.replace('/^\s+/',"");
}
String.prototype.rtrim = function() {
	return this.replace('/\s+$/',"");
}

var numb = '0123456789';
var lwr = 'abcdefghijklmnopqrstuvwxyz';
var upr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';

function isValid(parm,val) 
{
    if (parm == "") 
        return true;
    for (i=0; i<parm.length; i++) 
    { 
        if (val.indexOf(parm.charAt(i),0) == -1) 
            return false;
    }
    return true;
}

function isNumber(parm) {return isValid(parm,numb);}
function isLower(parm) {return isValid(parm,lwr);}
function isUpper(parm) {return isValid(parm,upr);}
function isAlpha(parm) {return isValid(parm,lwr+upr);}
function isAlphanum(parm) {return isValid(parm,lwr+upr+numb);} 

function SelectFieldById(id)
{
    var elm = el(id);
    if(elm)
    {
        elm.focus(id);
        elm.select(id);
    }
}

function ExtractStylePart(txt, part, def)
{                
    if(!def)
        def= "";
    var needle = part + ":";
    var at = txt.indexOf(needle);
    if(at >= 0)
    {
        txt = txt.substring(at + needle.length);
        at = txt.indexOf(";");
        if(at >= 0)
        {
            txt = txt.substring(0, at);
        }

        while(txt.charCodeAt(0) == 32)
        {
            txt = txt.substring(1);
        }

        return txt;
    }

    return def;
}

function htmlspecialchars (string, quote_style) {
    // http://kevin.vanzonneveld.net
    // +   original by: Mirek Slugen
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   bugfixed by: Nathan
    // +   bugfixed by: Arno
    // +    revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // -    depends on: get_html_translation_table
    // *     example 1: htmlspecialchars("<a href='test'>Test</a>", 'ENT_QUOTES');
    // *     returns 1: '&lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;'
 
    var histogram = {}, symbol = '', tmp_str = '', i = 0;
    tmp_str = string.toString();
    
    if (false === (histogram = get_html_translation_table('HTML_SPECIALCHARS', quote_style))) {
        return false;
    }
    
    for (symbol in histogram) {
        entity = histogram[symbol];
        tmp_str = tmp_str.split(symbol).join(entity);
    }
    
    return tmp_str;
}     

function get_html_translation_table(table, quote_style) {
    // http://kevin.vanzonneveld.net
    // +   original by: Philip Peterson
    // +    revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   bugfixed by: noname
    // %          note: It has been decided that we're not going to add global
    // %          note: dependencies to php.js. Meaning the constants are not
    // %          note: real constants, but strings instead. integers are also supported if someone
    // %          note: chooses to create the constants themselves.
    // %          note: Table from http://www.the-art-of-web.com/html/character-codes/
    // *     example 1: get_html_translation_table('HTML_SPECIALCHARS');
    // *     returns 1: {'"': '&quot;', '&': '&amp;', '<': '&lt;', '>': '&gt;'}
    
    var entities = {}, histogram = {}, decimal = 0, symbol = '';
    var constMappingTable = {}, constMappingQuoteStyle = {};
    var useTable = {}, useQuoteStyle = {};
    
    useTable      = (table ? table.toUpperCase() : 'HTML_SPECIALCHARS');
    useQuoteStyle = (quote_style ? quote_style.toUpperCase() : 'ENT_COMPAT');
    
    // Translate arguments
    constMappingTable[0]      = 'HTML_SPECIALCHARS';
    constMappingTable[1]      = 'HTML_ENTITIES';
    constMappingQuoteStyle[0] = 'ENT_NOQUOTES';
    constMappingQuoteStyle[2] = 'ENT_COMPAT';
    constMappingQuoteStyle[3] = 'ENT_QUOTES';
    
    // Map numbers to strings for compatibilty with PHP constants
    if (!isNaN(useTable)) {
        useTable = constMappingTable[useTable];
    }
    if (!isNaN(useQuoteStyle)) {
        useQuoteStyle = constMappingQuoteStyle[useQuoteStyle];
    }
    
    if (useTable == 'HTML_SPECIALCHARS') {
        // ascii decimals for better compatibility
        entities['38'] = '&amp;';
        entities['60'] = '&lt;';
        entities['62'] = '&gt;';
    } else if (useTable == 'HTML_ENTITIES') {
        // ascii decimals for better compatibility
      entities['38'] = '&amp;';
      entities['60'] = '&lt;';
      entities['62'] = '&gt;';
      entities['160'] = '&nbsp;';
      entities['161'] = '&iexcl;';
      entities['162'] = '&cent;';
      entities['163'] = '&pound;';
      entities['164'] = '&curren;';
      entities['165'] = '&yen;';
      entities['166'] = '&brvbar;';
      entities['167'] = '&sect;';
      entities['168'] = '&uml;';
      entities['169'] = '&copy;';
      entities['170'] = '&ordf;';
      entities['171'] = '&laquo;';
      entities['172'] = '&not;';
      entities['173'] = '&shy;';
      entities['174'] = '&reg;';
      entities['175'] = '&macr;';
      entities['176'] = '&deg;';
      entities['177'] = '&plusmn;';
      entities['178'] = '&sup2;';
      entities['179'] = '&sup3;';
      entities['180'] = '&acute;';
      entities['181'] = '&micro;';
      entities['182'] = '&para;';
      entities['183'] = '&middot;';
      entities['184'] = '&cedil;';
      entities['185'] = '&sup1;';
      entities['186'] = '&ordm;';
      entities['187'] = '&raquo;';
      entities['188'] = '&frac14;';
      entities['189'] = '&frac12;';
      entities['190'] = '&frac34;';
      entities['191'] = '&iquest;';
      entities['192'] = '&Agrave;';
      entities['193'] = '&Aacute;';
      entities['194'] = '&Acirc;';
      entities['195'] = '&Atilde;';
      entities['196'] = '&Auml;';
      entities['197'] = '&Aring;';
      entities['198'] = '&AElig;';
      entities['199'] = '&Ccedil;';
      entities['200'] = '&Egrave;';
      entities['201'] = '&Eacute;';
      entities['202'] = '&Ecirc;';
      entities['203'] = '&Euml;';
      entities['204'] = '&Igrave;';
      entities['205'] = '&Iacute;';
      entities['206'] = '&Icirc;';
      entities['207'] = '&Iuml;';
      entities['208'] = '&ETH;';
      entities['209'] = '&Ntilde;';
      entities['210'] = '&Ograve;';
      entities['211'] = '&Oacute;';
      entities['212'] = '&Ocirc;';
      entities['213'] = '&Otilde;';
      entities['214'] = '&Ouml;';
      entities['215'] = '&times;';
      entities['216'] = '&Oslash;';
      entities['217'] = '&Ugrave;';
      entities['218'] = '&Uacute;';
      entities['219'] = '&Ucirc;';
      entities['220'] = '&Uuml;';
      entities['221'] = '&Yacute;';
      entities['222'] = '&THORN;';
      entities['223'] = '&szlig;';
      entities['224'] = '&agrave;';
      entities['225'] = '&aacute;';
      entities['226'] = '&acirc;';
      entities['227'] = '&atilde;';
      entities['228'] = '&auml;';
      entities['229'] = '&aring;';
      entities['230'] = '&aelig;';
      entities['231'] = '&ccedil;';
      entities['232'] = '&egrave;';
      entities['233'] = '&eacute;';
      entities['234'] = '&ecirc;';
      entities['235'] = '&euml;';
      entities['236'] = '&igrave;';
      entities['237'] = '&iacute;';
      entities['238'] = '&icirc;';
      entities['239'] = '&iuml;';
      entities['240'] = '&eth;';
      entities['241'] = '&ntilde;';
      entities['242'] = '&ograve;';
      entities['243'] = '&oacute;';
      entities['244'] = '&ocirc;';
      entities['245'] = '&otilde;';
      entities['246'] = '&ouml;';
      entities['247'] = '&divide;';
      entities['248'] = '&oslash;';
      entities['249'] = '&ugrave;';
      entities['250'] = '&uacute;';
      entities['251'] = '&ucirc;';
      entities['252'] = '&uuml;';
      entities['253'] = '&yacute;';
      entities['254'] = '&thorn;';
      entities['255'] = '&yuml;';
    } else {
        throw Error("Table: "+useTable+' not supported');
        return false;
    }
    
    if (useQuoteStyle != 'ENT_NOQUOTES') {
        entities['34'] = '&quot;';
    }
    
    if (useQuoteStyle == 'ENT_QUOTES') {
        entities['39'] = '&#039;';
    }
    
    // ascii decimals to real symbols
    for (decimal in entities) {
        symbol = String.fromCharCode(decimal)
        histogram[symbol] = entities[decimal];
    }
    
    return histogram;
}

function AppendTo(s1, s2, conj)
{
  if(s1 && s2)
  {
    s1 += conj;
  }
  s1 += s2;

  return s1;
}

var isIe = (window.getSelection == null);
var isFf = !this.isIe;
function IsFF()
{
  return isFf;
}


function ShowElm(nam, sho)
{
  var elm = el(nam);
  elm.style.display = (sho ? "" : "none");
}

function ShowElement(nam, sho)
{
  return ShowElm(nam, sho);
}

function IsNumeric(sText)
{
 var ValidChars = "0123456789.";
 var IsNumber=true;
 var Char;


 for (i = 0; i < sText.length && IsNumber == true; i++) 
    { 
    Char = sText.charAt(i); 
    if (ValidChars.indexOf(Char) == -1) 
       {
       IsNumber = false;
       }
    }
 return IsNumber;
}

function GetFirstChildOfType(node, nam, cls)
{
  nam = nam.toLowerCase();
  if(cls) cls = cls.toLowerCase();
  var result = null;
  var list = node.getElementsByTagName(nam);
  for(var i = 0; i < list.length; i++)
  {
    node = list[i];
    if(node.nodeName.toLowerCase() == nam)
    {
      if(cls == null)
        return node;
      var nodeClass = node.getAttribute("class");
      if(nodeClass && nodeClass.toLowerCase() == cls)
        return node;  
    }
  }

  return null;
}

function GetFirstParentOfType(node, nam, cls)
{
  nam = nam.toLowerCase();
  if(cls) cls = cls.toLowerCase();
  while(node)
  {
    if(node.nodeName.toLowerCase() == nam)
    {
      if(cls == null)
        return node;
      var nodeClass = node.getAttribute("class");
      if(nodeClass && nodeClass.toLowerCase() == cls)
        return node;  
    }
    node = node.parentNode;
  }

  return null;
}

function el(nam)
{
  return document.getElementById(nam);
}

// Find the position of an element in the page
// From www.quirksmode.com
function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}

function GetElementClass(el) {
	var theClass = el.getAttribute('class');
	if (theClass == null) {
		theClass = el.getAttribute('className');
	}
	return theClass;
}

function GetElementValue(nam)
{
  var elm = document.getElementById(nam);
  return elm.value;
}

function SetElementValue(nam, val)
{
  var elm = document.getElementById(nam);
  elm.value = val;
}

function AddOption(elm, val, label, currentVal)
{
  var i = elm.options.length;
  elm.options[i] = new Option(label, val);
  elm.options[i].selected = (currentVal == val);
}

function GetSelectValue(elm, defValue)
{
  var i = elm.selectedIndex;
  if(i >= 0 && i < elm.options.length)
  {
    return elm.options[i].value;
  }

  return defValue;
}

function GetAttribOr(elm, nam, def)
{
  var result = null;

  if(elm)
  {
    result = elm.getAttribute(nam);
  }

  if(result == null)
  {
    if(def != null)
      result = def;
    else
      result = "";
  }
  return result;
}

/*
function GetNearestElement(node)
{
  while(node && node.nodeType == 3)
  {
    node = node.parentNode;
  }

  alert(node.nodeType);

  return node;
}
*/

