text: BOARDFUL.core.Namespace("BOARDFUL.core");
  
  // get function from string, with or without scopes
  BOARDFUL.core.getFunctionFromString = function (string) {
  	var scope = window;
  	var scopeSplit = string.split('.');
  	for (i = 0; i < scopeSplit.length - 1; i++)
  	{
  		scope = scope[scopeSplit[i]];
  		if (scope == undefined) return;
  	}
  	return scope[scopeSplit[scopeSplit.length - 1]];
  };
  // convert to string
  BOARDFUL.core.toString = function (value) {
  	var str = value;
  	try {
  		str = JSON.stringify(value);
  	}
  	catch (err) {
  		// circular json, convert two levels
  		if ("array" == typeof value || "object" == typeof value || "function" == typeof value) {
  			str = "{";
  			for (var i in value) {
  				str += i + ":";
  				if ("array" == typeof value[i] || "object" == typeof value[i] || "function" == typeof value[i]) {
  					str += "{";
  					for (var j in value[i]) {
  						str += j + ":";
  						if ("array" == typeof value[i][j] || "object" == typeof value[i][j] || "function" == typeof value[j]) {
  							str += typeof value[i][j];
  						} else {
  							str += value[i][j];
  						}
  						str += ",";
  					}
  					str += "}";
  				} else {
  					str += value[i];
  				}
  				str += ",";
  			}
  			str += "}";
  		} else {
  			str = "" + value;
  		}
  	}
  	return str;
  };
  
  // shuffle
  BOARDFUL.core.shuffle = function (o) {
      for(var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
      return o;
  };