gmJsFormExpression = (function (){
  //private functions not for use in expressions 
  function _F(field_name)
  {
    return jQuery('#'+field_name);
  }

  function rawV(field_name)
  {
    return _F(field_name).val();
  }

  //public functions
  function V(field_name)
  {
    var val = rawV(field_name);
    if(!is_empty(field_name) && is_numeric(field_name))
    {
      val = parseFloat(val);
    }
    return val;
  }

  function precision(field_name, max_decimals, min_decimals)
  {
    var max_decimals = (max_decimals === undefined)? null: max_decimals;
    var min_decimals = (min_decimals === undefined)? null: min_decimals;
    
    var val = rawV(field_name);

    var re_s ="^\\d+\\.?\\d{"+(min_decimals === null?0:min_decimals)+","+(max_decimals === null?0:max_decimals)+"}$";
    var re = new RegExp(re_s);
    return val.match(re);
    
  }

  function is_empty(field_name)
  {
    var val = rawV(field_name);
    if(val == null || val.length == 0)
    {
       return true;
    }

    return false;
  }

  function is_numeric(field_name)
  {
    var val = rawV(field_name);
    if(is_empty(field_name) || !val.match(/[^0-9\.\ ]/))
    {
      return true;
    }
    return false;
  }

  function round(num, dec)
  {
    var dec = (dec === undefined)? 0: dec;

    var mult = 1;
    if(dec != 0)
    {
      mult = Math.pow(10, dec);
    }

    return (Math.round(num*mult)/mult);
    
  }

  function number_format(a, b, c, d) {
    // number_format(number, decimals, dec_point, thousands_sep)
    var b = (b === undefined)? 0: b;
    var c = (c === undefined)? '.': c;
    var d = (d === undefined)? ',': d;
    
    a = round(a, b);
    e = a + '';
    f = e.split('.');
    if(!f[0]) f[0] = '0';
    if(!f[1]) f[1] = '';
    if(f[1].length < b){
      g = f[1];
      for(i = f[1].length + 1; i <= b; i++) {
        g += '0';
      }
      f[1] = g;
    }
    if(d != '' && f[0].length > 3) {
      h = f[0];
      f[0] = '';
      for(j = 3; j < h.length; j += 3) {
        i = h.slice(h.length - j, h.length - j + 3);
        f[0] = d + i +  f[0] + '';
      }
      j = h.substr(0, (h.length % 3 == 0) ? 3 : (h.length % 3));
      f[0] = j + f[0];
    }
    c = (b <= 0) ? '': c;
    return f[0] + c + f[1];
  }

  return (function (expr){
     return eval(expr);
  });

})();

