function meIndexOf(array,value){
	if($.browser.msie && ($.browser.version == "7.0" || $.browser.version == "8.0")){
		for(i in array){
			if(array[i]==value)
				return i;
		}
		return -1;
	}
	else
		return array.indexOf(value);
}
var meDate ={
	monthNames: {
				 1:'Январь',
				 2:'Февраль',
				 3:'Март',
				 4:'Апрель',
				 5:'Май',
				 6:'Июнь',
				 7:'Июль',
				 8:'Август',
				 9:'Сентябрь',
				 10:'Октябрь',
				 11:'Ноябрь',
				 12:'Декабрь'
				},
	bigMonths: [1,3,5,7,8,10,12],
	smallMonths: [4,6,9,11],
	toString: function(date){
		var day,month;
		day = date.getDate();
		month = date.getMonth()+1;
		if(day<10)
			day = '0'+day;
		if(month<10)
			month = '0'+month;
		return day+'.'+month+'.'+date.getFullYear();
	},
	fullMonthsInPeriod: function(days){ //Полных месяцев во временном периоде в днях
		return Math.floor(days/30);
	},
	isLeap: function(year){//возвращает true, если year високосный
		if(year%4 == 0 && !(year%100 == 0 && year%400 != 0))
			return true;
		else
			return false;
	},
	getDaysInMonth: function(month,year){ //принимает в качестве аргумента month и год, если месяц второй. Если year в булевом типе, то тогда он считается за признак високосности
		if(month==2){
			var isLeap;
			if(typeof(year) === 'number')
				isLeap = this.isLeap(year);
			else if(typeof(year) === 'boolean')
				isLeap = year;
			else
				throw "Должен быть указан год, чтобы вычислить количество дней в феврале.";
			if(isLeap)
				return 29;
			else
				return 28;
		}
		if(meIndexOf(this.bigMonths,month) >=0)
			return 31;
		else if(meIndexOf(this.smallMonths,month) >=0)
			return 30;
	},
	getDaysInMonthDate:function(date){
		var month = date.getMonth()+1;
		var year  = date.getFullYear();
		return this.getDaysInMonth(month,year);
	},
	getDays: function(beginD,endD){ // beginD и endD должны быть объектами Date
		return Math.floor((endD.getTime() - beginD.getTime()/*+24*3600*1000*/)/(24*3600*1000));

	},
	addDays2Date: function(date, days) {
		var d = new Date();	
		d.setTime(date.getTime() + days * 24 * 60 * 60 * 1000 + 60 * 60 * 1000);
		return d;
	},
	getFullCalendarYears:function(beginD,endD){
		return endD.getFullYear() - beginD.getFullYear()-1;
	},
	getFullCalendarMonths:function(beginD, endD){
		var monthCount = 0; 
		if(this.getFullCalendarYears(beginD,endD) > 0)
			monthCount += this.getFullCalendarYears(beginD,endD)*12;
		else if (this.getFullCalendarYears(beginD,endD) == 0){
			monthCount += 12 - beginD.getMonth()-1;
			monthCount += endD.getMonth();
		}
		else
			monthCount += endD.getMonth() - beginD.getMonth() - 1;
		return monthCount;
	},
	getFCMbDwDC: function(beginD, endD, dayNumber){ //get full calendar  months with exact number of days between dates. Day number may be 28,29,30 or 31
		var count = 0;
		if(this.getFullCalendarYears(beginD,endD) >= 0){
			switch(dayNumber){
			case 28: 
				count+=this.getNotLeapCount(beginD.getFullYear(),endD.getFullYear()); 
				if(beginD.getMonth()+2 == 1 && !this.isLeap(beginD.getFullYear())) count++; 
				if(endD.getMonth() > 2 && !this.isLeap(endD.getFullYear())) count++;
				break;
			case 29: 
				count+=this.getLeapCount(beginD.getFullYear(),endD.getFullYear()); 
				if(beginD.getMonth()+2 == 1 && this.isLeap(beginD.getFullYear())) count++; 
				if(endD.getMonth() > 2 && this.isLeap(endD.getFullYear())) count++;
				break;
			case 30: 
				count+=4*this.getFullCalendarYears(beginD,endD);
				for(var i=0;i<4;i++){
					if(beginD.getMonth()+2<this.smallMonths[i])
						count++;
					if(endD.getMonth()>this.smallMonths[i])
						count++;
				}
				break;
			case 31: 
				count+=7*this.getFullCalendarYears(beginD,endD);
				for(var i=0;i<7;i++){
					if(beginD.getMonth()+2<this.bigMonths[i])
						count++;
					if(endD.getMonth()>this.bigMonths[i])
						count++;
				}
				break;
			}
		}
		else if(this.getFullCalendarYears(beginD,endD) == -1){
			switch(dayNumber){
			case 28:
				if(!this.isLeap(beginD.getFullYear()) && beginD.getMonth()==0 && endD.getMonth>1){
					count++;
				}
				break;
			case 29:
				if(this.isLeap(beginD.getFullYear()) && beginD.getMonth()==0 && endD.getMonth>1){
					count++;
				}
				break;
			case 30:
				for(var i=0;i<endD.getMonth()-beginD.getMonth()-1;i++)

					if(meIndexOf(this.smallMonths,i+beginD.getMonth()+2) >= 0)
						count++;
				break;
			case 31:
				for(var i=0;i<endD.getMonth()-beginD.getMonth()-1;i++){
					if(meIndexOf(this.bigMonths,i+beginD.getMonth()+2) >= 0){
						count++;
					}
				}
				break;
			}
		}

		return count;
	},
	getDays2MonthEnd:function(date){
		return this.getDaysInMonth(date.getMonth()+1,date.getFullYear()) - date.getDate();
	},
	getLeapCount: function(beginY, endY){
		var count = 0;
		for(var i=1;i<endY-beginY;i++)
			if(this.isLeap(beginY+i))
				count++;
		return count;
	},
	getNotLeapCount: function(beginY,endY){
		var count = 0;
		for(var i=1;i<endY-beginY;i++)
			if(!this.isLeap(beginY+i))
				count++;
		return count;
	}
};