/*

	© 2008 Dynamicnet - Tous droits réservés
	David Tourel - contact@dynamicnet.fr

	Ce fichier fait partie d'un ensemble logiciel. Il est protégé par le droit d'auteur (article L. 122-6 du
	Code de la Propriété Intellectuelle)

	Jurisprudence, voir Tribunal de Commerce de Paris, 15ème Chambre, jugement du 15 octobre 2004.

	Toute redistribution, modification, reproduction, traduction, adaptation, arrangement de toute ou partie du
	code source exposé dans ce fichier est interdite sans autorisation expresse de l'auteur.

	La correction d'erreur dans le code source est autorisée. L'ajout de fonctionnalité ne consitue pas une correction d'erreur.

*/

/*

	EXTENSION STRING AU JAVASCRIPT EXISTANT

*/

Object.extend(String.prototype, {

	isEmail: function() {
		return this.match(/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i) ? true : false;
	},

	trim: function() {
		return this.replace(/^\s*/,"").replace(/\s*$/,"");
	},

	//__ renvoi vrai si la chaine ne contient aucun caractère, sinon faux
	empty: function() {
		return (this.length == 0 ? true : false) ;
	},

	isFrenchPhoneNumber: function() {

		var phone = this.replace( / /g, '' ).replace( /\./g, '' ).replace( /\-/g, '' ).replace( /\+/g, '' );

		if( phone.length < 10 ) {
			return false;
		}

		return phone.match(/[0-9]+/);
	},

	ucfirst: function() {
		if (this.length == 0) {
			return this;
		}

		var f = this.charAt(0).toUpperCase();
		return f + this.substr(1, this.length-1);
	},

	ucwords: function () {
	    return this.replace(/^(.)|\s(.)/g, function ( $1 ) { return $1.toUpperCase ( ); } );
	},


	number_format: function( decimals, dec_point, thousands_sep ) {
		// Formats a number with grouped thousands
		//
		// version: 810.114
		// discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_number_format

		// +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
		// +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
		// +     bugfix by: Michael White (http://getsprink.com)
		// +     bugfix by: Benjamin Lupton
		// +     bugfix by: Allan Jensen (http://www.winternet.no)
		// +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
		// +     bugfix by: Howard Yeend
		// *     example 1: number_format(1234.5678, 2, '.', '');
		// *     returns 1: 1234.57
		var n = this, c = isNaN(decimals = Math.abs(decimals)) ? 2 : decimals;
		var d = dec_point == undefined ? "." : dec_point;
		var t = thousands_sep == undefined ? "," : thousands_sep, s = n < 0 ? "-" : "";
		var i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "", j = (j = i.length) > 3 ? j % 3 : 0;

		return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : "");
	},


/*
	valide une date, le format d'entrée est spécifié un utilisant le paramètre format
	Fonctionnement: La validation de la date fonctionne en utilisant le fait que javascript corrige seul les dates incorrectes
	par exemple pour une date telle que 30/02/2008 - javascript comprendra 1/03/2008
	donc en comparant la date d'entrée et la date traitée par javascript on connait la validaité de la date.
*/
	checkDate: function(format) {
		if( this.trim().empty() ) {
			return false;
		}

		//__ extraction des données en fonction du formatage
		switch(format) {
			case "JJ-MM-AAAA" :
			case "DD-MM-YYYY" :
				var tmp = this.split("-");
				var day = tmp[0];
				var month = tmp[1]-1;
				var year = tmp[2];
			break;

			case "JJ/MM/AAAA" :
			case "DD/MM/YYYY" :
				var tmp = this.split("/");
				var day = tmp[0];
				var month = tmp[1]-1;
				var year = tmp[2];
			break;

			default:
				throw new Error("checkDate: le format d'entrée n'est pas reconnu");
		}


		//__ vérification de la validité
		var date = new Date(year,month,day);
		return ( day == date.getDate() && month == date.getMonth() && year == date.getFullYear() );
	},

/*
	Retourne la chaine d'entrée inversée
	Ex: Bonjour => ruojnoB
*/
	reverse: function() {
		return this.split("").reverse().join("");
	}

});




Object.extend(Array.prototype, {
	empty: function() {
		return (this.length == 0 ? true : false) ;
	}
});











/*
		Compare deux dates

		date1 == date2  -> 0
		date1 > date2  -> 1
		date1 < date2  -> -1
*/

	compareDate = function( format , date1 , date2 ) {

		//__ extraction des données en fonction du formatage
		switch(format) {
			case "JJ-MM-AAAA" :
			case "DD-MM-YYYY" :
				var tmp = date1.split("-");
				var oDate1 = new Date( tmp[2] , tmp[1]-1 , tmp[0] );

				tmp = date2.split("-");
				var oDate2 = new Date( tmp[2] , tmp[1]-1 , tmp[0] );
			break;

			case "JJ/MM/AAAA" :
			case "DD/MM/YYYY" :
				var tmp = date1.split("/");
				var oDate1 = new Date( tmp[2] , tmp[1]-1 , tmp[0] );

				tmp = date2.split("/");
				var oDate2 = new Date( tmp[2] , tmp[1]-1 , tmp[0] );
			break;

			default:
				throw new Error("checkDate: le format d'entrée n'est pas reconnu");
		}


		if( oDate1.getTime() == oDate2.getTime() ) {
			return 0;
		} else if( oDate1.getTime() > oDate2.getTime() ) {
			return 1;
		} else if( oDate1.getTime() < oDate2.getTime() ) {
			return -1;
		}

	};

