// --------------------------------------------------------------------------------------------------------- CONSTRUCTOR
function Tools() { }

// --------------------------------------------------------------------------------------------------- ADDEVENT-FUNCTION
Tools.addEvent = function (element, event, f, params) {
  if (Tools.isEmpty(element) || Tools.isEmpty(f) || Tools.isEmpty(event) || !Tools.isString(event)) {
    return;
  }

  var oldEvent;
  switch (event.toLowerCase()) {

    case 'onfocus':
      oldEvent = element.onfocus;
      if (Tools.isEmpty(element.onfocus)) {
        if (Tools.isEmpty(params)) { element.onfocus = f; }
        else { element.onfocus = function () { f(params); }; }
      }
      else if (typeof element.onfocus == 'function') {
        element.onfocus = function () { oldEvent(); f(params); };
      }
      break;

    case 'onchange':
      oldEvent = element.onchange;
      if (Tools.isEmpty(element.onchange)) {
        if (Tools.isEmpty(params)) { element.onchange = f; }
        else { element.onchange = function () { f(params); }; }
      }
      else if (typeof element.onchange == 'function') {
        element.onchange = function () { oldEvent(); f(params); };
      }
      break;

    case 'onclick':
      oldEvent = element.onclick;
      if (Tools.isEmpty(element.onclick)) {
        if (Tools.isEmpty(params)) { element.onclick = f; }
        else { element.onclick = function () { f(params); }; }
      }
      else if (typeof element.onclick == 'function') {
        element.onclick = function () { oldEvent(); f(params); };
      }
      break;

    case 'onresize':
      oldEvent = element.onresize;
      if (Tools.isEmpty(element.onresize)) {
        if (Tools.isEmpty(params)) { element.onresize = f; }
        else { element.onresize = function () { f(params); }; }
      }
      else if (typeof element.onresize == 'function') {
        element.onresize = function () { oldEvent(); f(params); };
      }
      break;

    case 'onload':
      oldEvent = element.onload;
      if (Tools.isEmpty(element.onload)) {
        if (Tools.isEmpty(params)) { element.onload = f; }
        else { element.onload = function () { f(params); }; }
      }
      else if (typeof element.onload == 'function') {
        element.onload = function () { oldEvent(); f(params); };
      }
      break;
  } 
};

//----------------------------------------------------------------------------------------------------- ISEMPTY-FUNCTION
Tools.isEmpty = function (object) {
  if (typeof object == 'undefined' || object == undefined || object == null || object == "undefined") { return true; }
  if (Tools.isString(object) && object.replace(" ", "") == "") { return true; }
  return false;
};

// ---------------------------------------------------------------------------------------------- ISEMPTYOBJECT-FUNCTION
Tools.isEmptyObject = function (object) {
	if (Tools.isEmpty(object) || ($.isPlainObject(object) && $.isEmptyObject(object))) { return true; }
	return false;
};

//----------------------------------------------------------------------------------------------------- ISARRAY-FUNCTION
Tools.isArray = function (object) {
  if (!Tools.isEmpty(object) &&
      !Tools.isEmpty(object.constructor) &&
      object.constructor.toString().toLowerCase().indexOf("array") >= 0) {
	  return true;
  }
  return false;
};

//---------------------------------------------------------------------------------------------------- ISOBJECT-FUNCTION
Tools.isObject = function (object) {
  if (!Tools.isEmpty(object) && typeof(object) == "object") {
	  return true;
  }
  return false;
};

// --------------------------------------------------------------------------------------------------- ISSTRING-FUNCTION
Tools.isString = function (object) {
  return (typeof(object) == "string" || object instanceof String);
};

// ------------------------------------------------------------------------------------------------------ ISINT-FUNCTION
Tools.isInt = function (object) {
  return (!Tools.isEmpty(object) && object == parseInt(object));
};

// --------------------------------------------------------------------------------------------------- ISNUMBER-FUNCTION
Tools.isNumber = function (object) {
  return (!Tools.isEmpty(object) && object == parseFloat(object));
};

Tools.dump = function(object, title) {
    
    var out = '';
    
    if (!Tools.isEmpty(title) && Tools.isString(title)) {
        out += title + '\n';
    }
    
    if (Tools.isEmpty(object) || Tools.isEmptyObject(object)) {
        out += '\tempty';
    }
    else if (Tools.isString(object) || Tools.isNumber(object)) {
        out += object.toString();
    }
    else {
        out += "\ttypeof = " + typeof(object) + "\n";
        for (var i in object) {
            out += "\t" + i + ": " + object[i] + "\n";
        }
    }

    console.debug(out);
};

Tools.cutString = function(originalString, charsFromBeginning, endString) {
    if (Tools.isEmpty(originalString) || !Tools.isString(originalString)) { return ''; }
    
    if (Tools.isEmpty(charsFromBeginning) || !Tools.isInt(charsFromBeginning) ||
        charsFromBeginning < 0 || charsFromBeginning >= originalString.length) {
        return originalString;
    }
    
    if (Tools.isEmpty(endString) || !Tools.isString(endString)) {
        endString = '';
    }
    
    return originalString.substr(0, charsFromBeginning) + endString;
};

Tools.format = function (str) {
    if (Tools.isEmpty(str) || !Tools.isString(str)) {
        return '';
    }
    for (i = 1; i < arguments.length; i++)
        str = str.replace('{' + (i - 1) + '}', arguments[i]);
    return str;
};
