// *** Delegate & CallBack ***
function Delegate (obj, method, preArgs) {
	if (!preArgs) preArgs = [];
	eval("var d=function(v){obj." + method + "(" + _preArgs(preArgs.length) + "v)}");
	return d;
};

function CallBack (func, preArgs) {
	if (!preArgs) preArgs = [];
	eval("var cb=function(v){func(" + _preArgs(preArgs.length) + "v)}");
	return cb;
};

function _preArgs (n) {
	var p = "";
	for (var i=0; i<n; i++) p += "preArgs[" + i + "],";
	return p;
};


// *** Util functions ***
function cE (type,params) {
	var el = document.createElement(type);
	if (params != null)
		for (var k in params) {
			if (k == "style") for (var k2 in params[k]) el[k][k2] = params[k][k2];
			else el[k] = params[k];
		}
	return el;
};

function cTN (text) {
	return document.createTextNode(text);
};

function aC (parent, child){
	parent.appendChild(child);
};

function cSpan (params) {
	return cE("span", params);
};

function cDiv (params) {
	return cE("div", params);
};

function cImg (params) {
	return cE("img", params);
};

function cA (params, text) {
	var a = cE("a", params);
	if (text!=null) aC(a, cTN(text));
	return a;
};


// *** Array ***
Array.prototype.correctDelete = function (index) {
  var newArr = [];
  for (var i = 0; i < this.length; i++) if (i != index) newArr.push(this[i]);
  return newArr;
};

Array.prototype.correctDeleteByValue = function (val) {
	var newArr = [];
	for (var i = 0; i < this.length; i++) if (this[i] != val) newArr.push(this[i]);
	return newArr;
};
