/* CULTURE MANAGER */
if(Yke.Culture == null) Yke.Culture = {};
Yke.Culture._currentCulture = 'en-uk';
Yke.Culture._cultures = {};


/* + */Yke.Culture.registerCulture = function (cultureDescription)
{
	Yke.Culture._cultures[cultureDescription.name]=cultureDescription;
}

/* + */Yke.Culture.setCurrentCulture = function (name)
{
	
	if(Yke.Culture._cultures[name] == null)
	{
		$YDEBUG('CULTURE NOT FOUND', 'impossible to set the culture to ____, which does not exist', name, 4);
	}
	Yke.Culture._currentCulture = name;
}

/* + */Yke.Culture.getCurrentCulture = function ()
{
	return Yke.Culture._cultures[Yke.Culture._currentCulture];
}

/* + */Yke.Culture.strToDate = function(str, mode)
{
	
	// renvoi le numero correspondant
	function getItemInDateArray(objn, label)
	{
		var oo = Yke.Culture.getCurrentCulture().date[objn];
		var ret = -1;
		for(var p in oo)
		{
			try
			{
				if(oo[p] == label)
				{
					ret = p;
					break;
				}
			}
			catch(e)
			{
			}
		}
		return ret;
	}

	var cc = Yke.Culture.getCurrentCulture();
	var sep = ' ';
	var bag = null;
	
	if(mode == null || mode == 1 || mode.toString().toLowerCase().charAt(0) == 's')
	{
		bag = cc.date.shortorder;
		sep = cc.date.dateSeparator;
	}
	else if(mode == 2 || mode.toString().toLowerCase().charAt(0) == 'd')
	{
		bag = cc.date.order;
	}
	else if(mode == 3 || mode.toString().toLowerCase().charAt(0) == 'l')
	{
		bag = cc.date.longorder;
	}
	
	var parts = str.split(sep);
	
	var d = -1;
	var m = -1;
	var y = -1;
	
	for(var i=0; i<bag.length; i++)
	{
		// valeur sures ^^
		if(bag[i] == 'd') d = parseInt(parts[i]);
		else if(bag[i] == 'm') m = parseInt(parts[i]);
		else if(bag[i] == 'y') y = parseInt(parts[i]);
		
		// mieux que rien
		if( (bag[i].toLowerCase() == 'dcard') && d == -1) d = parseInt(parts[i]);
		else if( (bag[i].toLowerCase() == 'mshortlabel') && m == -1)  m = getItemInDateArray('mShortLabel', parts[i]);
		else if( (bag[i].toLowerCase() == 'mlabel') && m == -1)  m = getItemInDateArray('mLabel', parts[i]);
	}
	
	var ret = new Date(y, m, d, 0, 0, 0);
	return ret;
}

/* + */Yke.Culture.dateToStr = function(date, mode)
{
	if(date == null)
	{
		$YDEBUG('date OBJECT is NULL', 'Yke.Culture.dateToStr error : you cant convert a null object', date, 3);
		return null;
	}
	else if(typeof(date) == 'object')
	{
		if(date.getDate == null || date.getDay == null || date.getMonth == null)
		{
			$YDEBUG('INVALID date OBJECT', 'Yke.Culture.dateToStr error : you cant convert a non-date object', date, 3);
			return null;
		}
	}

	var cc = Yke.Culture.getCurrentCulture();
	var bag = null;
	var l = null;
	var shortformat = false;
	
	if(mode == null || mode == 1 || mode.toString().toLowerCase().charAt(0) == 's')
	{
		bag = cc.date.shortorder;
		shortformat = true;
	}
	else if(mode == 2 || mode.toString().toLowerCase().charAt(0) == 'd')
	{
		bag = cc.date.order;
	}
	else if(mode == 3 || mode.toString().toLowerCase().charAt(0) == 'l')
	{
		bag = cc.date.longorder;
	}
	
	
	var str = '';
	for(var i=0; i<bag.length; i++)
	{
		l = bag[i];
		
		
		if(l.toLowerCase() == 'dshortlabel') 
		{
			var dayIndex = date.getDay();
			if(dayIndex==0) dayIndex = '7';
			str +=  cc.date.dShortLabel[dayIndex];
		}
		else if(l.toLowerCase() == 'dlabel') 
		{
			var dayIndex = date.getDay();
			if(dayIndex==0) dayIndex = '7';
			str +=  cc.date.dLabel[dayIndex];
		}
		else if(l.toLowerCase() == 'dcard')
		{
			var day = date.getDate();
			str += cc.date.dayCard(day);
		}
		else if(l.toLowerCase() == 'mshortlabel')
		{
			var m = date.getMonth()+1;
			str += cc.date.mShortLabel[m];
		}
		else if(l.toLowerCase() == 'mlabel')
		{
			var m = date.getMonth()+1;
			str += cc.date.mLabel[m];
		}
		else if(l.toLowerCase() == 'd') str += Yke.String.numToStr(date.getDate(), 2);
		else if(l.toLowerCase() == 'm') str += Yke.String.numToStr( (date.getMonth() + 1), 2);
		else if(l.toLowerCase() == 'y') str += Yke.String.numToStr( date.getFullYear() , 4 );
		
		if(i < bag.length-1)
		{
			if(shortformat) str += cc.date.dateSeparator;
			else str += ' ';
			
		}
	}
	return str;
}

/* + */Yke.Culture.strToNum = function(str)
{
	var cult = Yke.Culture.getCurrentCulture();
	str = Yke.String.replace(str, cult.number.digitsGroupingSymbol, '');
	str = Yke.String.replace(str, cultFrFr.number.decimalSymbol, '.');
	if(str.substr(0,1) == ".") str = "0"+str;
	if(str.substr(0,1) == cult.number.negativeSymbol)
	{
		str = "-" + str.substr(1,str.length-1);
		if(str.substr(1,1) == ".")
		{
			str = "-0." + str.substr(2, str.length);
		}
	}
	if(str=="") return str;
	else return 1*(str);
}

/* + */Yke.Culture.numToStr = function(num, bSeparators)
{
	if(bSeparators==null) bSeparators=true;
	var negative = (num<0);
	num = Math.abs(num);


	var cult = Yke.Culture.getCurrentCulture();
	
	var entPart = Math.floor(num);
	
	var decimPart = num.toString().substr(entPart.toString().length + 1);
	decimPart = decimPart/**1*/;
	

	
	var str = '';
	if(negative==true) str = cult.number.negativeSymbol;
	
	if(entPart>0)
	{
		entPart = entPart.toString();
		
		//groupement des chiffres
		if(bSeparators)
		{
			if(cult.number.digitsGrouping.toString() == '3')
			{
				var temp = '';
				var j =0;
				for(var i=0; i<entPart.length; i++)
				{
					temp = entPart.charAt(entPart.length-i-1) + temp;
					if(j==2)
					{
						j=-1;
						temp = cult.number.digitsGroupingSymbol + temp ;
					}
					j++;
				}
				if(temp.charAt(0) == cult.number.digitsGroupingSymbol) temp = temp.substr(1);
				entPart = temp;
			}
			
			
			if(cult.number.digitsGrouping.toString() == '3-2')
			{
				if(entPart.length>3)
				{
					var lg = entPart.substr(entPart.length-3, 3);
					entPart = entPart.substr(0, entPart.length-3);
					
					var temp = '';
					var j =0;
					for(var i=0; i<entPart.length; i++)
					{
						temp = entPart.charAt(entPart.length-i-1) + temp;
						if(j==1)
						{
							j=-1;
							temp = cult.number.digitsGroupingSymbol + temp ;
						}
						j++;
					}
					if(temp.charAt(0) == cult.number.digitsGroupingSymbol) temp = temp.substr(1);
					entPart = temp + ' ' + lg;
				}
			}
		}
		str += entPart;
	}
	else
	{
		// 0.  ou  . ??
		if(cult.number.displayLeadingZero==true)
		{
			str += "0";
		}
	}
	
	if(decimPart>0)
	{
		str += cult.number.decimalSymbol;
		str += decimPart;
	}
	
	return str;
}

/* cultures descriptions */
var cultEnUk = new Yke.Culture.Description('en-uk');
Yke.Culture.registerCulture(cultEnUk);


/* culture fr */
var cultFrFr = new Yke.Culture.Description('fr-fr'); 
cultFrFr.number.decimalSymbol = ',';
cultFrFr.number.decimalKeyCode = 188;
cultFrFr.number.digitsGrouping = '3';
cultFrFr.number.listSeparator = ';';
cultFrFr.time.amSymbol = 'AM';
cultFrFr.time.pmSymbol = 'PM';
cultFrFr.time.m24H = true;
cultFrFr.time.order = new Array();
cultFrFr.time.order[0]= 'H';
cultFrFr.time.order[1]= 'M';
cultFrFr.time.order[2]= 'S';
cultFrFr.time.labels = {H: 'heures', M:'minutes', S:'secondes'};
cultFrFr.date.dateSeparator = '/';
cultFrFr.date.dayCard = function (d) { return d; };
cultFrFr.date.longorder[1] = 'd';
cultFrFr.date.order[0] = 'dShortLabel';
cultFrFr.date.order[1] = 'd';
cultFrFr.date.order[2] = 'mShortLabel';
cultFrFr.date.order[3] = 'y';
cultFrFr.date.shortorder[0]= 'd';
cultFrFr.date.shortorder[1]= 'm';
cultFrFr.date.dLabel  = {1: 'lundi', 2: 'mardi', 3: 'mercredi', 4: 'jeudi', 5: 'vendredi', 6: 'samedi', 7:'dimanche'};
cultFrFr.date.dShortLabel = {1: 'lun', 2: 'mar', 3: 'mer', 4: 'jeu', 5: 'ven', 6: 'sam', 7:'dim'};
cultFrFr.date.dLetter = {1: 'l', 2: 'm', 3: 'm', 4: 'j', 5: 'v', 6: 's', 7:'d'};
cultFrFr.date.mLabel = {1: 'janvier', 2: 'février', 3: 'mars', 4: 'avril', 5: 'mai', 6: 'juin', 7: 'juillet', 8: 'août', 9: 'septembre', 10: 'octobre', 11: 'novembre', 12: 'décembre' };
cultFrFr.date.mShortLabel = {1: 'jan', 2: 'fév', 3: 'mar', 4: 'avr', 5: 'mai', 6: 'jui', 7: 'juil', 8: 'aoû', 9: 'sept', 10: 'oct', 11: 'nov', 12: 'déc' };

Yke.Culture.registerCulture(cultFrFr);
