/*
Javascript Library by Kim Ronemus Design
version 0.5
*/

/*-----------------------------------
	Utility Functions
------------------------------------*/

/* 
	The Bind utility
*/
Function.prototype.bind = function(scope) {
	var _function = this;
	
	return function() {
		return _function.apply(scope, arguments);
	}
}

/*
	Get element by Id (Prototype style)
*/
function $(id) {
	var element = document.getElementById(id);
	return element;
}

/*
	check if class exists
*/
function hasClassName(element, classname) {
	if(element.className == classname) {
		return true;
	} else {
		return false;
	}
}

function hasClassNames(element, classname) {

	search_class = new String(element.className);
	var r = classname;
	var i = search_class.indexOf(classname);

	if(i != -1) {
		return true;
	} else {
		return false;
	}
	
}

function removeClassName(id, className) {
	var ele = $(id);
	var classes = new String(ele.className);
	if(typeof classes !== 'undefined') {
		
		var c = classes.split(" ");
		for(i=0; i<c.length; i++) {
			if(c[i] === className) {
				c.splice(i, 1, '');
			}
		}
		
	}
	
	classes = c.join(' ');
	$(id).className = classes;
}

function addClassName(id, className) {
	var ele = $(id);
	var classes = ele.className;
	
	if(typeof classes === 'undefined') {
		//alert('no classes');
	} else {
		classes = classes+" "+className;
	}
	
	$(id).className = classes;
}



/*-----------------------------------
	Event Handler function
------------------------------------*/
function addEvent(event, callback, list) {
	if(typeof list === 'object') {
		for( var item in list ){
			var element = list[item];
			if( element.addEventListener ) {
				element.addEventListener(event, callback , false );
			} else if( element.attachEvent ) {
			  	element.attachEvent( "on" + event, callback );
			}
		}
	} else {
		var element = $(list);
		if( element.addEventListener ) {
			element.addEventListener(event, callback , false );
		} else if( element.attachEvent ) {
		  	element.attachEvent( "on" + event, callback );
		}
	}
	
	
}

/*-----------------------------------
	Http Request
------------------------------------*/

Ajax_Request = {
	method: 'get',
	async: true,
	request_complete: false,
	
	init: function(url, options) {
		if(typeof url !== 'undefined') {
			this.url = url;
		} else {
			return false;
		}

		if(typeof options.method !== 'undefined') {
			this.method = options.method;
		} else {
			this.method = 'get';
		}

		if(typeof options.parameters !== 'undefined') {
			this.parameters = options.parameters;
		} else {
			this.parameters = null;
		}

		if(typeof options.async !== 'undefined') {
			this.async = true;
		} else {
			this.async = false;
		}
		
		if(typeof options.onSuccess != 'undefined') {
			this.onSuccess = options.onSuccess;
		}
		
		if(typeof options.onLoading != 'undefined') {
			this.onLoading = options.onLoading;
		} else {
			this.onLoading = function(){}
		}
	},
	
	makeRequest: function() {
		if(navigator.appName == 'Netscape') {
			this.request = new XMLHttpRequest();
		} else {
			this.request = new ActiveXObject("Microsoft.XMLHTTP");
		}
		
		//set headers
		
		this.request.onreadystatechange = this.checkReadyState.bind(Ajax_Request);
		this.request.open(this.method, this.url, this.async);
		
		this.request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		//this.request.setRequestHeader("Content-length", this.parameters.length);
		
		this.request.send(this.parameters);
	},
	
	checkReadyState: function(r) {
		
		switch(this.request.readyState) {
			
			case 4:
				if(this.request.status == 200 && this.request.status < 299) {
					this.responseComplete();
					this.onSuccess(this.request.responseText);
				}
			break
			
			case 3:
				this.onLoading();
			break;
			
			case 2:
				this.onLoading();
			break;
			
			case 1:
				this.onLoading();
			break;
			
			case 0:
				this.onLoading();
			break;
			
		}
		
	},
	
	responseComplete: function() {
		return this.request_complete = true;
	},
	
	setResponse: function(r) {
		this.response = r;
	},
	
	getResponse: function() {
		return this.responser;
	}
	
}


/*-----------------------------------
	Loads overlay for other 
	elements to be insert into
------------------------------------*/

function loadOverlay() {
	var ol	=	document.createElement('div');
	var body = document.getElementsByTagName('body')[0];
	ol.setAttribute('id', 'overlay');
	body.appendChild(ol);
}

function removeOverlay(e) {
	var cb = e.parentNode;
	var body = document.getElementsByTagName('body')[0];
	var overlay = $('overlay');
	
	if(hasClassName(cb, 'closebox') && cb.tagName == 'A') {
		body.removeChild(overlay);
	}
}

