function splitString(st,minlen,maxlen) {
  if (st.length>maxlen) {
    //We split the data in multiple lines
    var st2 = [];
    while (st.length>0) {
      var i = maxlen;
      while (i>=minlen) {
        var ch = st.substring(i,i+1);
        if (ch==' ') break;
        i--;
      }
      if (i < minlen) {
        i = maxlen+1;
        while (i < st.length) {
          var ch = st.substring(i,i+1);
          if (ch==' ') break;
          i++;
        }
      }
      st2[st2.length] = st.substring(0,i);
      st = st.substring(i,st.length);
    }
    return st2;
  } else {
    return [st];
  }
}

function trimString(st,maxlen) {
  if (st.length>maxlen) {
    st = st.substring(0,maxlen)+'...';
  }
  return st;
}

function toJSONString(data,maxdepth) {
  var m = {    // table of character substitutions
    '\b': '\\b',
    '\t': '\\t',
    '\n': '\\n',
    '\f': '\\f',
    '\r': '\\r',
    '"' : '\\"',
    '\\': '\\\\'
  };

  switch (typeof data) {
  case 'string':
    var res = '"';
    for (var i=0; i < data.length; i++) {
      var c = data.charAt(i);
      if (m[c]) {
        res += m[c];
      } else {
        res += c;
      }
    }
    res += '"';
    return res;
  case 'number':
    return isFinite(data) ? String(data) : 'null';
  case 'boolean':
  case 'null':
    return String(data);
  case 'object':
    if (data==null) return 'null';
    var checkarray = (data.length&&data.propertyIsEnumerable);
    if (checkarray&&(typeof data.length === 'number' && !(data.propertyIsEnumerable('length')))) {
      var res = '[';
      var docomma = false;
      for (var i = 0; i < data.length; i++) {
        if (docomma) res += ', ';
        docomma = true;
        if (maxdepth===undefined) {
          res += toJSONString(data[i]);
        } else if (maxdepth>0) {
          res += toJSONString(data[i],maxdepth-1);
        } else {
          res += '0';
        }
      }
      res += ']';
      return res;
    } else {
      var res = '{';
      var docomma = false;
      for (var i in data) {
        if (docomma) res += ', ';
        docomma = true;
        if (maxdepth===undefined) {
          res += toJSONString(i)+':'+toJSONString(data[i]);
        } else if (maxdepth>0) {
          res += toJSONString(i,maxdepth-1)+':'+toJSONString(data[i],maxdepth-1);
        } else {
          res += '0:0';
        }
      }
      res += '}';
      return res;
    }
  }
  return 'null';
}

function numberFiller(num,len,filler) {
  if (filler===undefined) filler = '&nbsp;';
  var res = String(num);
  while (res.length < len) res = filler+res;
  return res;
}

function trim(st) {
  st = String(st);
  return st.replace(/^\s+|\s+$/g,"");
}

function arrayIndexOf(arr, item) {
  for (var i=0; i < arr.length; i++) {
    if (arr[i]==item) return i;
  }
  return -1;
}

//Generates a reference to a specific object method
//to be used for event referencing...
function generateObjMethodRef(obj,method,params) {
  return (function() {
    //alert(toJSONString(params));
    var st = 'obj[method](';
    for (var i = 0; i < params.length; i++) {
      if (i>0) st += ',';
      st += 'params['+i+']';
    }
    st += ')';
    return eval(st);
  });
}
