var constants = new function() {
  this.ascii_lowercase = 'abcdefghijklmnopqrstuvwxyz';
  this.ascii_uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  this.ascii_letters = this.ascii_lowercase + this.ascii_uppercase;
  this.ascii_punctuation = '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~';
  this.digits = '0123456789';
}();

function setCharAt(text,index,character) {
  if (index > text.length-1) 
    return text;
  return text.substr(0,index) + character + text.substr(index+1);
}

function strRemoveOthers(text,valid_chars) {
  var result = "";
  var check_chars = "";
  for (i=0;i<text.length;i++)
    if (valid_chars.indexOf(text[i]) > -1)
      result += text[i];
  return result;
}

function beginswith(begintext,text) {
  return text.substr(0,begintext.length) == begintext;
}

function breakblocks(text, maxlen) {
  return text.match(RegExp('.{1,'+maxlen+'}','g')).join(" ");
}

function breaklines(text, maxlen) {
  if (maxlen <= 0)
    return text;
  var textlen = text.length;
  var pos = 0;
  var output = "";
  while (pos < textlen)
  {
    var chunk = text.substr(pos,maxlen);
    if (pos+maxlen+1 <= textlen)
    {
      tpos = chunk.lastIndexOf("\n");
      if (tpos == -1)
        tpos = chunk.lastIndexOf(" ");
      if (tpos != -1)
        chunk = text.substr(pos,tpos);
    }
    output += trim(chunk) + "\n";
    pos += chunk.length;
    if ((pos < textlen) && (text[pos] == " "))
      pos += 1;
  }
  return trim(output);
}

function calcGraphs(items, length, keepsingles, valid_chars) {
  if (keepsingles == null)
    keepsingles = true;
  if (valid_chars == null)
    valid_chars = constants.ascii_letters;
  if (typeof(items) == 'string')
    items = new Array(items);
  var counts = new Array();
  for (j=0;j<items.length;j++)
  {
    var text = items[j];
    var temp = "";
    for(i=0;i< text.length;i++)
      if (valid_chars.indexOf(text[i]) > -1)
        temp += text[i];
    text = temp;
    for (i=0;i<(text.length-(length-1));i++)
    {
      var graph = text.substr(i,length);
      if (counts[graph] == null)
        counts[graph] = 0;
      counts[graph] += 1;
    }
  }
  if (!keepsingles)
  {
    temp = new Array();
    for (item in counts)
    {
      if (counts[item] > 1)
        temp[item] = counts[item];
    }
    counts = temp;
  }
  return counts;
}

function endswith(endtext,text) {
  return text.substr(-endtext.length) == endtext;
}

function getPattern(text) {
  text = text.toUpperCase();
  var lastnum = 48;
  var values = {};
  var retvalue = "";
  for(i=0;i<text.length;i++)
    if ("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".indexOf(text[i]) > -1)
    {
      if (!(text[i] in values))
      {
        lastnum += 1;
        if (lastnum == 58) 
          lastnum = 65;
        values[text[i]] = String.fromCharCode(lastnum);
      }
      retvalue += values[text[i]];
    }
  return retvalue;
}

function getPatternType(text) {
  text = text.toUpperCase();
  if (text.match(/^[HL]+$/))
    return "hl"
  else if (text.match(/[\-\*\+]+/))
    return "w"
  else
  {
    var hasrepeats = false;
    var temp = "";
    for(i=0;i<text.length;i++)
    {
      temp += (i+1 <= 9) ? (i+1).toString() : String.fromCharCode(56 + i);
      if (text.lastIndexOf(text[i]) > i)
        hasrepeats = true;
    }
    if (hasrepeats || text == temp || (text.match(/^\D+$/) && getPattern(text) == temp))
      return "p"
    else
      return "p2";
  }
}

function numberToStr(number)
{
  number += '';
  x = number.split('.');
  x1 = x[0];
  x2 = x.length > 1 ? '.' + x[1] : '';
  var rgx = /(\d+)(\d{3})/;
  while (rgx.test(x1)) {
    x1 = x1.replace(rgx, '$1' + ',' + '$2');
  }
  return x1 + x2;
}

function padl(value,padstr,len)
{
  if (value.length >= len)
      return value;
  var max = (len - value.length)/padstr.length;
  for (var i = 0; i < max; i++)
      value = padstr + value;
  return value;
}

function padr(value,padstr,len)
{
  if (value.length >= len)
      return value;
  var max = (len - value.length)/padstr.length;
  for (var i = 0; i < max; i++)
      value += padstr;
  return value;
}

function spaceSplit(text) {
  var output = new Array();
  var blocks = new Array();
  var block = "";
  var char_loop = "";
  blocks = text.split(" ");
  for(i=0;i<blocks.length;i++)
  {
    if (char_loop != "")
      block += " ";
    block += blocks[i];
    if (block.length > 2 && ((block[0] == '"' && block[block.length-1] != '"') || (block[0] == '\'' && block[block.length-1] != '\'')))
      char_loop = block[0];
    if (char_loop == "" || (block.length > 0 && block[block.length-1] == char_loop) || i == blocks.length-1)
    {
      if (block.length > 2 && ((block[0] == '"' && block[block.length-1] == '"') || (block[0] == '\'' && block[block.length-1] == '\'')))
        block = block.substring(1,block.length-1);
      output.push(block);
      block = "";
      char_loop = "";
    }
  }
  return output;
}

function strRepeat(text,count) {
  var output = "";
  for (i=0;i<count;i++)
    output += text;
  return output;
}

function trim(str) {
	var	str = str.replace(/^\s\s*/, ''),
		ws = /\s/,
		i = str.length;
	while (ws.test(str.charAt(--i)));
	return str.slice(0, i + 1);
}

function windowMaxWidth() {
  return Math.floor(($(window).width()-30)/8)
}
