/**
* Class DateUtils
* @author Tiago Vasconcelos
* @version 1.0
*/

var DateUtils = {
	Class: function(){
		//Objects
		this.dayName = new Array();
			this.dayName[0] = "Sunday";
			this.dayName[1] = "Monday";
			this.dayName[2] = "Tuesday";
			this.dayName[3] = "Wednesday";
			this.dayName[4] = "Thursday";
			this.dayName[5] = "Friday";
			this.dayName[6] = "Saturday";
		
		this.monthName = new Array();
			this.monthName[1] = "January";
			this.monthName[2] = "February";
			this.monthName[3] = "March";
			this.monthName[4] = "April";
			this.monthName[5] = "May";
			this.monthName[6] = "June";
			this.monthName[7] = "July";
			this.monthName[8] = "August";
			this.monthName[9] = "September";
			this.monthName[10] = "October";
			this.monthName[11] = "November";
			this.monthName[12] = "December";
		
		//Methods
		/**
		 * Method get month name
		 * @param String/Number/Date
		 * @return String
		 * @author Tiago Vasconcelos
		 */
		this.getMonthName = function(month){
			return this.getMonthName[
				arguments[0].constructor
			].apply(this, arguments);
		},
		this.getMonthName[String] = function(string){
			var number = Math.abs(string);
			return this.getMonthName(number);
		},
		this.getMonthName[Number] = function(number){
			return i18n.message(this.monthName[number]);
		}
		this.getMonthName[Date] = function(date){
			var number = Math.abs(date.getMonth()+1);
			return this.getMonthName(number);
		},
		
		/**
		 * Method convert string to date
		 * @param String
		 * @return Date
		 * @author Tiago Vasconcelos
		 */
		this.stringToDate = function(value){
			if(value.indexOf('/')!=-1)
				var arrDate = value.split('/');
			else if(value.indexOf('-')!=-1)
				var arrDate = value.split('-');
			if(arrDate[0].length<4){
				//Brazilian Standard
				var day = arrDate[0];
				var month = arrDate[1];
				var year = arrDate[2];
			}else if(arrDate[0].length>2){
				//American Standard
				var day = arrDate[2];
				var month = arrDate[1];
				var year = arrDate[0];
			}
			var date = new Date(year,month-1,day);
			return date;
		},
		
		/**
		 * Method verify if its a brazilian holiday
		 * @param Date
		 * @return false/next working date
		 * @author Tiago Vasconcelos
		 */
		this.isBrazilianHolidays = function(date){
			brazilianHolidays = new Array();
			brazilianHolidays.push(String(new Date(date.getFullYear(),'0','01')));
			brazilianHolidays.push(String(new Date(date.getFullYear(),'3','21')));
			brazilianHolidays.push(String(new Date(date.getFullYear(),'4','01')));
			brazilianHolidays.push(String(new Date(date.getFullYear(),'8','07')));
			brazilianHolidays.push(String(new Date(date.getFullYear(),'9','12')));
			brazilianHolidays.push(String(new Date(date.getFullYear(),'10','02')));
			brazilianHolidays.push(String(new Date(date.getFullYear(),'10','15')));
			brazilianHolidays.push(String(new Date(date.getFullYear(),'11','25')));
			if(brazilianHolidays.contains(String(date))){
				workingDayDate = new Date(date.getFullYear(),date.getMonth(),date.getDate()+1);
				if(this.workingDay(workingDayDate)==true)
					return workingDayDate;
				else
					return this.workingDay(workingDayDate);
			}else
				return false;
		}
		
		/**
		 * Method verify if its a working day
		 * @param Date
		 * @return false/next working date
		 * @author Tiago Vasconcelos
		 */
		this.workingDay = function(date){
			if(date.getDay()==6 || date.getDay()==0)
				return this.nextWorkingDay(date);
			else
				return true;
		},
		
		/**
		 * Method return the next working date
		 * @param Date
		 * @return Date
		 * @author Tiago Vasconcelos
		 */
		this.nextWorkingDay = function(date){
			var workingDayDate;
			if(date.getDay()==6)
				workingDayDate = new Date(date.getFullYear(),date.getMonth(),date.getDate()+2);
			else if(date.getDay()==0)
				workingDayDate = new Date(date.getFullYear(),date.getMonth(),date.getDate()+1);
			return workingDayDate;
		},
		
		/**
		 * Method verify if its a valid date
		 * @param String
		 * @return true/false
		 * @author Tiago Vasconcelos
		 */
		this.isValidDate = function(date){
			return this.isValidDate[
				arguments[0].constructor
			].apply(this, arguments);
		},
		this.isValidDate[String] = function(date){
			date = date.split('/');
			day = date[0];
			month = date[1];
			year = date[2];
			originalDate = year+'/'+Math.abs(month)+'/'+day;
			objectDate = new Date(originalDate);
			objectDate = objectDate.getFullYear()+'/'+(Math.abs(objectDate.getMonth())+1)+'/'+objectDate.getDate();
			if(originalDate!=objectDate)
				return false;
			else
				return true;	
		},
		this.isValidDate[Date] = function(date){
			day = date.getDate();
			month = date.getMonth();
			year = date.getFullYear();
			originalDate = year+'/'+Math.abs(month)+'/'+day;
			objectDate = new Date(originalDate);
			objectDate = objectDate.getFullYear()+'/'+(Math.abs(objectDate.getMonth())+1)+'/'+objectDate.getDate();
			if(originalDate!=objectDate)
				return false;
			else
				return true;			
		}
	}
}
