Number.implement({
	/*
	Property: numberFormat
		Format a number with grouped thousands.

	Arguments:
		decimals, optional - integer, number of decimal percision; default, 2
		dec_point, optional - string, decimal point notation; default, '.'
		thousands_sep, optional - string, grouped thousands notation; default, ','

	Returns:
		a formatted version of number.

	Example:
		>(36432.556).numberFormat()  // returns 36,432.56
		>(36432.556).numberFormat(2, '.', ',')  // returns 36,432.56
	*/

	numberFormat: function(decimals, dec_point, thousands_sep) {
		decimals = Math.abs(decimals) + 1 ? decimals : 2;
		dec_point = dec_point || '.';
		thousands_sep = thousands_sep || ',';

		var matches = /(-)?(\d+)(\.\d+)?/.exec((isNaN(this) ? 0 : this) + ''); // returns matches[1] as sign, matches[2] as numbers and matches[2] as decimals
		var remainder = matches[2].length > 3 ? matches[2].length % 3 : 0;
		return (matches[1] ? matches[1] : '') + (remainder ? matches[2].substr(0, remainder) + thousands_sep : '') + matches[2].substr(remainder).replace(/(\d{3})(?=\d)/g, "$1" + thousands_sep) + (decimals ? dec_point + (+matches[3] || 0).toFixed(decimals).substr(2) : '');
	}
});
Array.implement({
	//compares two arrays and returns true if exactly the same
	compare: function(otherArr){
		if(!otherArr) return false;
		if(this.length!=otherArr.length) return false;
		return this.every(function(item,index){ return otherArr[index]==item; })
	}
});
String.implement({
	//encode urls like php
	urlencode: function(noplus){
		str = escape(this);
		str = str.replace('+', '%2B');
		str = (noplus == true) ? str : str.replace('%20', '+');
		str = str.replace('*', '%2A');
		str = str.replace('/', '%2F');
		str = str.replace('@', '%40');
		return str;
	},
	//decode urls like php
	urldecode: function(){
		str = this.replace('+', ' ');
		str = unescape(str);
		return str;
	}
});
var ajaxMail = new Class({
	Implements: [Options, Events],
	options: {
		'url': "./inc/mailer.php",
		onSuccess: function(){ alert("Your message was successfully sent!"); },
		onFailure: function(){ alert("Attempt to send message failed. Please try again."); }
	},
	initialize: function(options){
		this.setOptions(options);
	},
	send: function(headers){
		new Request({
			url:this.options.url,
			onSuccess: function(text,xml){ this.onSuccess(text, xml); }.bind(this),
			onFailure: function(xhr){ this.onFailure(xhr); }.bind(this)
		}).send("name="+headers.name+"&email="+headers.email+"&subject="+headers.subject+"&message="+headers.message);
	},
	onSuccess: function(text,xml){
		this.options.success(text,xml);
	},
	onFailure: function(xhr){
		this.options.failure(xhr);
	}
});

