


//	STRINGS
//*******************************************************************************

// Trim String
String.prototype.trim = function() {
	var a = this.replace(/^\s+/, "");
	return a.replace(/\s+$/, "");
};


// Reverse String
String.prototype.reverse = function() { 
	return this.split("").reverse().join("");
};


// Rot13
String.prototype.rot13 = function(){
		return this.replace(/[a-zA-Z]/g, function(c){
				return String.fromCharCode((c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) ? c : c - 26);
		});
};



//	NODE CLASSNAME
//*******************************************************************************

function hasClass(anode, aclass) {
	var myClasses = " " + anode.className + " ";
	return (myClasses.indexOf(" " + aclass + " ") >= 0);
};

function addClass(anode, aclass) {
	var myClasses = " " + anode.className + " ";
	if (myClasses.indexOf(" " + aclass + " ") < 0) {
		myClasses += " " + aclass;
		myClasses.trim();
		anode.className = myClasses;
	}
};

function removeClass(anode, aclass) {
	var myClasses = " " + anode.className + " ";
	var idx = myClasses.indexOf(" " + aclass + " ");
	if (idx >= 0) {
		myClasses = myClasses.substring(0, idx) + myClasses.substring(idx + aclass.length + 1);
		myClasses.trim();
		anode.className = myClasses;
	}
};

function removeClasses(anode, classArray) {
	for (var i = 0; i < classArray.length; i++) {
		removeClass(anode, classArray[i]);
	}
};

function toggleClass(anode, classA, classB) {
	if (hasClass(anode, classA)) {
		removeClass(anode, classA);
		addClass(anode, classB);
	} else {
		removeClass(anode, classB);
		addClass(anode, classA);
	}
}



//	COOKIES
//*******************************************************************************

function writeCookie(name, value, days) {
	var expires = "";
	if (days) {
		var date = new Date();
		date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
		expires = "; expires=" + date.toGMTString();
	}
	var myExp = /^\w+:\/\/[^\/]+((\/[^\/]+)+\/)[^\/]+$/;
	var loc = "" + window.location;
	var match = loc.match(myExp);
	var path = (match) ? match[1] : "/";
	document.cookie = name + "=" + escape(value) + expires + "; path=" + path;
}

function readCookie(name) {
	var cook = " " + document.cookie;
	var idx0 = cook.indexOf(" " + name + "=");
	if (idx0 < 0)  return null;
	var idx1 = idx0 + name.length + 2;
	var idx2 = cook.indexOf(";", idx1);
	if (idx2 < 0)  idx2 = cook.length;
	return unescape(cook.substring(idx1, idx2));
}



//	EVENT MODELS
//*******************************************************************************

function stopPropagation(e) {
	if (!e) var e = window.event;
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
}



//	DEBUG
//*******************************************************************************

function debugObject(obj, separator) {
	if (! typeof obj === "object" ) return false;
	if (! separator) separator = "\n";
	var msg = "";
	for (var key in obj) {
		msg += separator + "[" + key + " : " + obj[key] + "]";
	}
	return msg;
}



