/* ********** ********** ********** ********** ********** ********** ********** ********** ********** ********** ********** ********** ********** ********** ********** PN1 */
function PN1() {
	this.config = {};
}

/* ********** ADDEVENTHANDLER ********** */
PN1.prototype.addEventHandler = function(element, eventname, functionname) {
	try {
		element.addEventListener(eventname, functionname, false);
	} catch (e) {
		element.attachEvent('on' + eventname, functionname);		
	}
}

/* ********** GETCLASSNAMES ********** */
PN1.prototype.getClassNames = function(element) {
	var classes = element.className.split(/ /);
	return classes;
}

/* ********** CONTAINSCLASS ********** */
PN1.prototype.containsClass = function(element, classname) {
	return this.getClassNames(element).contains(classname);
}

/* ********** ADDCLASS ********** */
PN1.prototype.addClass = function(element, classname) {
	var classes = this.getClassNames(element);
	
	if (!classes.contains(classname)) {
		classes[classes.length] = classname;
		element.className = classes.join(' ');
	}
}

/* ********** REMOVECLASS ********** */
PN1.prototype.removeClass = function(element, classname) {
	var classes = this.getClassNames(element);
	var newClasses = [];
	
	for (var a = 0; a < classes.length; a++) {
		if (classes[a] != classname) {
			newClasses[newClasses.length] = classes[a];
		}
	}
	
	element.className = classes.join(' ');
}

PN1.prototype.replaceClass = function(element, oldclassname, newclassname) {
	var classes = this.getClassNames(element);
	
	for (var a = 0; a < classes.length; a ++) {
		if (classes[a] == oldclassname) {
			classes[a] = newclassname;
		}
	}
	
	element.className = classes.join(' ');
}

/* ********** GETELEMENTSBYCLASSNAME ********** */
PN1.prototype.getElementsByClassName = function(parent, name, tag) {
	var tags;
	
	if (tag != undefined) {
		tags = parent.getElementsByTagName(tag);
	} else {
		tags = parent.getElementsByTagName('*');
	}
	
	var results = [];
	
	for (var a = 0; a < tags.length; a++) {
		var classes = tags[a].className.split(/ /);
		
		if (classes.contains(name)) {
			results[results.length] = tags[a];
		}
	}
	
	return results;
}

PN1.prototype.swapElements = function(element1,element2) {
	var nextsib1 = element1.nextSibling;
	var nextsib2 = element2.nextSibling;
	var parent1 = element1.parentNode;
	var parent2 = element2.parentNode;
	
	el1 = element1.cloneNode(true);
	el2 = element2.cloneNode(true);
	
	if (nextsib1 != undefined) {
		parent1.insertBefore(el2,nextsib1);
	} else {
		parent1.appendChild(el2);
	}
	
	if (nextsib2 != undefined) {
		alert(nextsib2.innerHTML);
		parent1.insertBefore(el1,nextsib2);
	} else {
		parent2.appendChild(el1);
	}
	
	parent1.removeNode(element1);
	parent2.removeNode(element2);
}

/* ********** LOAD ********** */
PN1.prototype.load = function(arr) {
	if (arr === undefined) {
		return false;
	}
	
	if (arr.script === undefined) {
		return false;
	}
	
	var scripts = document.getElementsByTagName('script');
	var included = {};
	
	for (var a = 0;  a < scripts.length; a++) {
		included[scripts[a].src] = true;
		
		if ( /class\.rpo\.core\.js$/.test(scripts[c].src) && this.config.scriptpath === undefined ) {
			this.config.scriptpath = scripts[c].src.replace(/class\.rpo\.core\.js$/,"");
		}
	}
	
	if (arr.path === undefined) {
		var script = this.config.scriptpath + arr.script;
	} else if (!/^http:\/{2}/.test(arr.path)) {
		var script = this.config.scriptpath + arr.path + arr.script;
	} else {
		var script = arr.path + arr.script;
	}
	
	if (included[script] !== undefined && arr.force === undefined) {
		return true;
	}
	
	var com = document.createElement("script");
	com.setAttribute("type","text/javascript");
	com.setAttribute("src", script);
	
	document.getElementsByTagName("head")[0].appendChild(com);
	return true;
}



/* ********** ********** ********** ********** ********** ********** ********** ********** ********** ********** ********** ********** ********** ********** ********** ARRAY */
/* ********** CONTAINS ********** */
Array.prototype.contains = function(value) {
	for (var a = 0; a < this.length; a++) {
		if (this[a] == value) {
			return true;
		}
	}
	
	return false;
}



/* ********** ********** ********** ********** ********** ********** ********** ********** ********** ********** ********** ********** ********** ********** ********** FUNCTION */
/* ********** BIND ********** */
Function.prototype.bind = function(parent) {
	var f = this;
	var args = [];
	
	for (var a = 1; a < arguments.length; a++) {
		args[args.length] = arguments[a];
	}
	
	var temp = function() {
		return f.apply(parent, args);
	}
	
	return(temp);
}
