(function ($) {
    jQuery.fn.daterangepicker=function(s){
	var c=jQuery(this);
	var d=jQuery.extend({
	    presetRanges:[{
		text:"Today",
		dateStart:"today",
		dateEnd:"today"
	    },{
		text:"Last 7 days",
		dateStart:"today-7days",
		dateEnd:"today"
	    },{
		text:"Month to date",
		dateStart:function(){
		    return Date.parse("today").moveToFirstDayOfMonth()
		},
		dateEnd:"today"
	    },{
		text:"Year to date",
		dateStart:function(){
		    var w=Date.parse("today");
		    w.setMonth(0);
		    w.setDate(1);
		    return w
		},
		dateEnd:"today"
	    },{
		text:"The previous Month",
		dateStart:function(){
		    return Date.parse("1 month ago").moveToFirstDayOfMonth()
		},
		dateEnd:function(){
		    return Date.parse("1 month ago").moveToLastDayOfMonth()
		}
	    }],
	    presets:{
		specificDate:"Specific Date",
		allDatesBefore:"All Dates Before",
		allDatesAfter:"All Dates After",
		dateRange:"Date Range"
	    },
	    rangeStartTitle:"Start date",
	    rangeEndTitle:"End date",
	    nextLinkText:"Next",
	    prevLinkText:"Prev",
	    doneButtonText:"Done",
	    earliestDate:Date.parse("-15years"),
	    latestDate:Date.parse("+15years"),
	    constrainDates:false,
	    rangeSplitter:"-",
	    dateFormat:"m/d/yy",
	    closeOnSelect:true,
	    arrows:false,
	    appendTo:"body",
	    onClose:function(){},
	    onOpen:function(){},
	    onChange:function(){},
	    datepickerOptions:null
	},s);
	var f={
	    onSelect:function(z,y){
		if(i.find(".ui-daterangepicker-specificDate").is(".ui-state-active")){
		    i.find(".range-end").datepicker("setDate",i.find(".range-start").datepicker("getDate"))
		}
		$(this).trigger("constrainOtherPicker");
		var x=a(i.find(".range-start").datepicker("getDate"));
		var w=a(i.find(".range-end").datepicker("getDate"));
		if(c.length==2){
		    c.eq(0).val(x);
		    c.eq(1).val(w)
		}else{
		    c.val((x!=w)?x+" "+d.rangeSplitter+" "+w:x)
		}
		if(d.closeOnSelect){
		    if(!i.find("li.ui-state-active").is(".ui-daterangepicker-dateRange")&&!i.is(":animated")){
			j()
		    }
		}
		d.onChange()
	    },
	    defaultDate:+0
	};

	c.bind("change",d.onChange);
	d.datepickerOptions=(s)?jQuery.extend(f,s.datepickerOptions):f;
	var l,k=Date.parse("today");
	var n,h;
	if(c.size()==2){
	    n=Date.parse(c.eq(0).val());
	    h=Date.parse(c.eq(1).val());
	    if(n==null){
		n=h
	    }
	    if(h==null){
		h=n
	    }
	}else{
	    n=Date.parse(c.val().split(d.rangeSplitter)[0]);
	    h=Date.parse(c.val().split(d.rangeSplitter)[1]);
	    if(h==null){
		h=n
	    }
	}
	if(n!=null){
	    l=n
	}
	if(h!=null){
	    k=h
	}
	var i=jQuery('<div class="ui-daterangepicker ui-widget ui-helper-clearfix ui-widget-content ui-corner-all"></div>');
	var u=(function(){
	    var y=jQuery('<ul class="ui-widget-content"></ul>').appendTo(i);
	    jQuery.each(d.presetRanges,function(){
		jQuery('<li class="ui-daterangepicker-'+this.text.replace(/ /g,"")+' ui-corner-all"><a href="#">'+this.text+"</a></li>").data("dateStart",this.dateStart).data("dateEnd",this.dateEnd).appendTo(y)
	    });
	    var w=0;
	    jQuery.each(d.presets,function(x,z){
		jQuery('<li class="ui-daterangepicker-'+x+" preset_"+w+' ui-helper-clearfix ui-corner-all"><span class="ui-icon ui-icon-triangle-1-e"></span><a href="#">'+z+"</a></li>").appendTo(y);
		w++
	    });
	    y.find("li").hover(function(){
		jQuery(this).addClass("ui-state-hover")
	    },function(){
		jQuery(this).removeClass("ui-state-hover")
	    }).click(function(){
		i.find(".ui-state-active").removeClass("ui-state-active");
		jQuery(this).addClass("ui-state-active");
		p(jQuery(this),i,m,e);
		return false
	    });
	    return y
	})();
	function a(y){
	    if(!y.getDate()){
		return""
	    }
	    var x=y.getDate();
	    var A=y.getMonth();
	    var z=y.getFullYear();
	    A++;
	    var w=d.dateFormat;
	    return jQuery.datepicker.formatDate(w,y)
	}
	jQuery.fn.restoreDateFromData=function(){
	    if(jQuery(this).data("saveDate")){
		jQuery(this).datepicker("setDate",jQuery(this).data("saveDate")).removeData("saveDate")
	    }
	    return this
	};
    
	jQuery.fn.saveDateToData=function(){
	    if(!jQuery(this).data("saveDate")){
		jQuery(this).data("saveDate",jQuery(this).datepicker("getDate"))
	    }
	    return this
	};
    
	function t(){
	    if(i.data("state")=="closed"){
		v();
		i.fadeIn(300).data("state","open");
		d.onOpen()
	    }
	}
	function j(){
	    if(i.data("state")=="open"){
		i.fadeOut(300).data("state","closed");
		d.onClose()
	    }
	}
	function b(){
	    if(i.data("state")=="open"){
		j()
	    }else{
		t()
	    }
	}
	function v(){
	    var w=o||c;
	    var A=w.offset(),y="left",z=A.left,x=jQuery(window).width()-z-w.outerWidth();
	    if(z>x){
		y="right",z=x
	    }
	    i.parent().css(y,z).css("top",A.top+w.outerHeight())
	}
	function p(z,y,A,w){
	    if(z.is(".ui-daterangepicker-specificDate")){
		w.hide();
		A.show();
		y.find(".title-start").text(d.presets.specificDate);
		y.find(".range-start").restoreDateFromData().css("opacity",1).show(400);
		y.find(".range-end").restoreDateFromData().css("opacity",0).hide(400);
		setTimeout(function(){
		    w.fadeIn()
		},400)
	    }else{
		if(z.is(".ui-daterangepicker-allDatesBefore")){
		    w.hide();
		    A.show();
		    y.find(".title-end").text(d.presets.allDatesBefore);
		    y.find(".range-start").saveDateToData().datepicker("setDate",d.earliestDate).css("opacity",0).hide(400);
		    y.find(".range-end").restoreDateFromData().css("opacity",1).show(400);
		    setTimeout(function(){
			w.fadeIn()
		    },400)
		}else{
		    if(z.is(".ui-daterangepicker-allDatesAfter")){
			w.hide();
			A.show();
			y.find(".title-start").text(d.presets.allDatesAfter);
			y.find(".range-start").restoreDateFromData().css("opacity",1).show(400);
			y.find(".range-end").saveDateToData().datepicker("setDate",d.latestDate).css("opacity",0).hide(400);
			setTimeout(function(){
			    w.fadeIn()
			},400)
		    }else{
			if(z.is(".ui-daterangepicker-dateRange")){
			    w.hide();
			    A.show();
			    y.find(".title-start").text(d.rangeStartTitle);
			    y.find(".title-end").text(d.rangeEndTitle);
			    y.find(".range-start").restoreDateFromData().css("opacity",1).show(400);
			    y.find(".range-end").restoreDateFromData().css("opacity",1).show(400);
			    setTimeout(function(){
				w.fadeIn()
			    },400)
			}else{
			    w.hide();
			    y.find(".range-start, .range-end").css("opacity",0).hide(400,function(){
				A.hide()
			    });
			    var B=(typeof z.data("dateStart")=="string")?Date.parse(z.data("dateStart")):z.data("dateStart")();
			    var x=(typeof z.data("dateEnd")=="string")?Date.parse(z.data("dateEnd")):z.data("dateEnd")();
			    y.find(".range-start").datepicker("setDate",B).find(".ui-datepicker-current-day").trigger("click");
			    y.find(".range-end").datepicker("setDate",x).find(".ui-datepicker-current-day").trigger("click")
			}
		    }
		}
	    }
	    return false
	}
	var m=jQuery('<div class="ranges ui-widget-header ui-corner-all ui-helper-clearfix"><div class="range-start"><span class="title-start">Start Date</span></div><div class="range-end"><span class="title-end">End Date</span></div></div>').appendTo(i);
	m.find(".range-start, .range-end").datepicker(d.datepickerOptions);
	m.find(".range-start").datepicker("setDate",l);
	m.find(".range-end").datepicker("setDate",k);
	m.find(".range-start, .range-end").bind("constrainOtherPicker",function(){
	    if(d.constrainDates){
		if($(this).is(".range-start")){
		    i.find(".range-end").datepicker("option","minDate",$(this).datepicker("getDate"))
		}else{
		    i.find(".range-start").datepicker("option","maxDate",$(this).datepicker("getDate"))
		}
	    }
	}).trigger("constrainOtherPicker");
	var e=jQuery('<button class="btnDone ui-state-default ui-corner-all">'+d.doneButtonText+"</button>").click(function(){
	    i.find(".ui-datepicker-current-day").trigger("click");
	    j()
	}).hover(function(){
	    jQuery(this).addClass("ui-state-hover")
	},function(){
	    jQuery(this).removeClass("ui-state-hover")
	}).appendTo(m);
	jQuery(this).click(function(){
	    b();
	    return false
	});
	m.hide().find(".range-start, .range-end, .btnDone").hide();
	i.data("state","closed");
	m.find(".ui-datepicker").css("display","block");
	jQuery(d.appendTo).append(i);
	i.wrap('<div class="ui-daterangepickercontain"></div>');
	if(d.arrows&&c.size()==1){
	    var g=jQuery('<a href="#" class="ui-daterangepicker-prev ui-corner-all" title="'+d.prevLinkText+'"><span class="ui-icon ui-icon-circle-triangle-w">'+d.prevLinkText+"</span></a>");
	    var q=jQuery('<a href="#" class="ui-daterangepicker-next ui-corner-all" title="'+d.nextLinkText+'"><span class="ui-icon ui-icon-circle-triangle-e">'+d.nextLinkText+"</span></a>");
	    jQuery(this).addClass("ui-rangepicker-input ui-widget-content").wrap('<div class="ui-daterangepicker-arrows ui-widget ui-widget-header ui-helper-clearfix ui-corner-all"></div>').before(g).before(q).parent().find("a").click(function(){
		var x=m.find(".range-start").datepicker("getDate");
		var w=m.find(".range-end").datepicker("getDate");
		var y=Math.abs(new TimeSpan(x-w).getTotalMilliseconds())+86400000;
		if(jQuery(this).is(".ui-daterangepicker-prev")){
		    y=-y
		}
		m.find(".range-start, .range-end ").each(function(){
		    var z=jQuery(this).datepicker("getDate");
		    if(z==null){
			return false
		    }
		    jQuery(this).datepicker("setDate",z.add({
			milliseconds:y
		    })).find(".ui-datepicker-current-day").trigger("click")
		});
		return false
	    }).hover(function(){
		jQuery(this).addClass("ui-state-hover")
	    },function(){
		jQuery(this).removeClass("ui-state-hover")
	    });
	    var o=c.parent()
	}
	jQuery(document).click(function(){
	    if(i.is(":visible")){
		j()
	    }
	});
	i.click(function(){
	    return false
	}).hide();
	return this
    };

    Date.CultureInfo={
	name:"en-US",
	englishName:"English (United States)",
	nativeName:"English (United States)",
	dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],
	abbreviatedDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],
	shortestDayNames:["Su","Mo","Tu","We","Th","Fr","Sa"],
	firstLetterDayNames:["S","M","T","W","T","F","S"],
	monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],
	abbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],
	amDesignator:"AM",
	pmDesignator:"PM",
	firstDayOfWeek:0,
	twoDigitYearMax:2029,
	dateElementOrder:"mdy",
	formatPatterns:{
	    shortDate:"M/d/yyyy",
	    longDate:"dddd, MMMM dd, yyyy",
	    shortTime:"h:mm tt",
	    longTime:"h:mm:ss tt",
	    fullDateTime:"dddd, MMMM dd, yyyy h:mm:ss tt",
	    sortableDateTime:"yyyy-MM-ddTHH:mm:ss",
	    universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",
	    rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",
	    monthDay:"MMMM dd",
	    yearMonth:"MMMM, yyyy"
	},
	regexPatterns:{
	    jan:/^jan(uary)?/i,
	    feb:/^feb(ruary)?/i,
	    mar:/^mar(ch)?/i,
	    apr:/^apr(il)?/i,
	    may:/^may/i,
	    jun:/^jun(e)?/i,
	    jul:/^jul(y)?/i,
	    aug:/^aug(ust)?/i,
	    sep:/^sep(t(ember)?)?/i,
	    oct:/^oct(ober)?/i,
	    nov:/^nov(ember)?/i,
	    dec:/^dec(ember)?/i,
	    sun:/^su(n(day)?)?/i,
	    mon:/^mo(n(day)?)?/i,
	    tue:/^tu(e(s(day)?)?)?/i,
	    wed:/^we(d(nesday)?)?/i,
	    thu:/^th(u(r(s(day)?)?)?)?/i,
	    fri:/^fr(i(day)?)?/i,
	    sat:/^sa(t(urday)?)?/i,
	    future:/^next/i,
	    past:/^last|past|prev(ious)?/i,
	    add:/^(\+|after|from)/i,
	    subtract:/^(\-|before|ago)/i,
	    yesterday:/^yesterday/i,
	    today:/^t(oday)?/i,
	    tomorrow:/^tomorrow/i,
	    now:/^n(ow)?/i,
	    millisecond:/^ms|milli(second)?s?/i,
	    second:/^sec(ond)?s?/i,
	    minute:/^min(ute)?s?/i,
	    hour:/^h(ou)?rs?/i,
	    week:/^w(ee)?k/i,
	    month:/^m(o(nth)?s?)?/i,
	    day:/^d(ays?)?/i,
	    year:/^y((ea)?rs?)?/i,
	    shortMeridian:/^(a|p)/i,
	    longMeridian:/^(a\.?m?\.?|p\.?m?\.?)/i,
	    timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\s*(\+|\-)\s*\d\d\d\d?)|gmt)/i,
	    ordinalSuffix:/^\s*(st|nd|rd|th)/i,
	    timeContext:/^\s*(\:|a|p)/i
	},
	abbreviatedTimeZoneStandard:{
	    GMT:"-000",
	    EST:"-0400",
	    CST:"-0500",
	    MST:"-0600",
	    PST:"-0700"
	},
	abbreviatedTimeZoneDST:{
	    GMT:"-000",
	    EDT:"-0500",
	    CDT:"-0600",
	    MDT:"-0700",
	    PDT:"-0800"
	}
    };

    Date.getMonthNumberFromName=function(b){
	var e=Date.CultureInfo.monthNames,a=Date.CultureInfo.abbreviatedMonthNames,d=b.toLowerCase();
	for(var c=0;c<e.length;c++){
	    if(e[c].toLowerCase()==d||a[c].toLowerCase()==d){
		return c
	    }
	}
	return -1
    };

    Date.getDayNumberFromName=function(b){
	var f=Date.CultureInfo.dayNames,a=Date.CultureInfo.abbreviatedDayNames,e=Date.CultureInfo.shortestDayNames,d=b.toLowerCase();
	for(var c=0;c<f.length;c++){
	    if(f[c].toLowerCase()==d||a[c].toLowerCase()==d){
		return c
	    }
	}
	return -1
    };

    Date.isLeapYear=function(a){
	return(((a%4===0)&&(a%100!==0))||(a%400===0))
    };
    
    Date.getDaysInMonth=function(a,b){
	return[31,(Date.isLeapYear(a)?29:28),31,30,31,30,31,31,30,31,30,31][b]
    };
    
    Date.getTimezoneOffset=function(a,b){
	return(b||false)?Date.CultureInfo.abbreviatedTimeZoneDST[a.toUpperCase()]:Date.CultureInfo.abbreviatedTimeZoneStandard[a.toUpperCase()]
    };
    
    Date.getTimezoneAbbreviation=function(b,d){
	var c=(d||false)?Date.CultureInfo.abbreviatedTimeZoneDST:Date.CultureInfo.abbreviatedTimeZoneStandard,a;
	for(a in c){
	    if(c[a]===b){
		return a
	    }
	}
	return null
    };

    Date.prototype.clone=function(){
	return new Date(this.getTime())
    };
    
    Date.prototype.compareTo=function(a){
	if(isNaN(this)){
	    throw new Error(this)
	}
	if(a instanceof Date&&!isNaN(a)){
	    return(this>a)?1:(this<a)?-1:0
	}else{
	    throw new TypeError(a)
	}
    };

    Date.prototype.equals=function(a){
	return(this.compareTo(a)===0)
    };
    
    Date.prototype.between=function(c,a){
	var b=this.getTime();
	return b>=c.getTime()&&b<=a.getTime()
    };
    
    Date.prototype.addMilliseconds=function(a){
	this.setMilliseconds(this.getMilliseconds()+a);
	return this
    };
    
    Date.prototype.addSeconds=function(a){
	return this.addMilliseconds(a*1000)
    };
    
    Date.prototype.addMinutes=function(a){
	return this.addMilliseconds(a*60000)
    };
    
    Date.prototype.addHours=function(a){
	return this.addMilliseconds(a*3600000)
    };
    
    Date.prototype.addDays=function(a){
	return this.addMilliseconds(a*86400000)
    };
    
    Date.prototype.addWeeks=function(a){
	return this.addMilliseconds(a*604800000)
    };
    
    Date.prototype.addMonths=function(a){
	var b=this.getDate();
	this.setDate(1);
	this.setMonth(this.getMonth()+a);
	this.setDate(Math.min(b,this.getDaysInMonth()));
	return this
    };
    
    Date.prototype.addYears=function(a){
	return this.addMonths(a*12)
    };
    
    Date.prototype.add=function(b){
	if(typeof b=="number"){
	    this._orient=b;
	    return this
	}
	var a=b;
	if(a.millisecond||a.milliseconds){
	    this.addMilliseconds(a.millisecond||a.milliseconds)
	}
	if(a.second||a.seconds){
	    this.addSeconds(a.second||a.seconds)
	}
	if(a.minute||a.minutes){
	    this.addMinutes(a.minute||a.minutes)
	}
	if(a.hour||a.hours){
	    this.addHours(a.hour||a.hours)
	}
	if(a.month||a.months){
	    this.addMonths(a.month||a.months)
	}
	if(a.year||a.years){
	    this.addYears(a.year||a.years)
	}
	if(a.day||a.days){
	    this.addDays(a.day||a.days)
	}
	return this
    };
    
    Date._validate=function(d,c,a,b){
	if(typeof d!="number"){
	    throw new TypeError(d+" is not a Number.")
	}else{
	    if(d<c||d>a){
		throw new RangeError(d+" is not a valid value for "+b+".")
	    }
	}
	return true
    };

    Date.validateMillisecond=function(a){
	return Date._validate(a,0,999,"milliseconds")
    };
    
    Date.validateSecond=function(a){
	return Date._validate(a,0,59,"seconds")
    };
    
    Date.validateMinute=function(a){
	return Date._validate(a,0,59,"minutes")
    };
    
    Date.validateHour=function(a){
	return Date._validate(a,0,23,"hours")
    };
    
    Date.validateDay=function(c,a,b){
	return Date._validate(c,1,Date.getDaysInMonth(a,b),"days")
    };
    
    Date.validateMonth=function(a){
	return Date._validate(a,0,11,"months")
    };
    
    Date.validateYear=function(a){
	return Date._validate(a,1,9999,"seconds")
    };
    
    Date.prototype.set=function(b){
	var a=b;
	if(!a.millisecond&&a.millisecond!==0){
	    a.millisecond=-1
	}
	if(!a.second&&a.second!==0){
	    a.second=-1
	}
	if(!a.minute&&a.minute!==0){
	    a.minute=-1
	}
	if(!a.hour&&a.hour!==0){
	    a.hour=-1
	}
	if(!a.day&&a.day!==0){
	    a.day=-1
	}
	if(!a.month&&a.month!==0){
	    a.month=-1
	}
	if(!a.year&&a.year!==0){
	    a.year=-1
	}
	if(a.millisecond!=-1&&Date.validateMillisecond(a.millisecond)){
	    this.addMilliseconds(a.millisecond-this.getMilliseconds())
	}
	if(a.second!=-1&&Date.validateSecond(a.second)){
	    this.addSeconds(a.second-this.getSeconds())
	}
	if(a.minute!=-1&&Date.validateMinute(a.minute)){
	    this.addMinutes(a.minute-this.getMinutes())
	}
	if(a.hour!=-1&&Date.validateHour(a.hour)){
	    this.addHours(a.hour-this.getHours())
	}
	if(a.month!==-1&&Date.validateMonth(a.month)){
	    this.addMonths(a.month-this.getMonth())
	}
	if(a.year!=-1&&Date.validateYear(a.year)){
	    this.addYears(a.year-this.getFullYear())
	}
	if(a.day!=-1&&Date.validateDay(a.day,this.getFullYear(),this.getMonth())){
	    this.addDays(a.day-this.getDate())
	}
	if(a.timezone){
	    this.setTimezone(a.timezone)
	}
	if(a.timezoneOffset){
	    this.setTimezoneOffset(a.timezoneOffset)
	}
	return this
    };
    
    Date.prototype.clearTime=function(){
	this.setHours(0);
	this.setMinutes(0);
	this.setSeconds(0);
	this.setMilliseconds(0);
	return this
    };
    
    Date.prototype.isLeapYear=function(){
	var a=this.getFullYear();
	return(((a%4===0)&&(a%100!==0))||(a%400===0))
    };
    
    Date.prototype.isWeekday=function(){
	return !(this.is().sat()||this.is().sun())
    };
    
    Date.prototype.getDaysInMonth=function(){
	return Date.getDaysInMonth(this.getFullYear(),this.getMonth())
    };
    
    Date.prototype.moveToFirstDayOfMonth=function(){
	return this.set({
	    day:1
	})
    };
    
    Date.prototype.moveToLastDayOfMonth=function(){
	return this.set({
	    day:this.getDaysInMonth()
	})
    };
    
    Date.prototype.moveToDayOfWeek=function(a,b){
	var c=(a-this.getDay()+7*(b||+1))%7;
	return this.addDays((c===0)?c+=7*(b||+1):c)
    };
    
    Date.prototype.moveToMonth=function(c,a){
	var b=(c-this.getMonth()+12*(a||+1))%12;
	return this.addMonths((b===0)?b+=12*(a||+1):b)
    };
    
    Date.prototype.getDayOfYear=function(){
	return Math.floor((this-new Date(this.getFullYear(),0,1))/86400000)
    };
    
    Date.prototype.getWeekOfYear=function(a){
	var h=this.getFullYear(),c=this.getMonth(),f=this.getDate();
	var j=a||Date.CultureInfo.firstDayOfWeek;
	var e=7+1-new Date(h,0,1).getDay();
	if(e==8){
	    e=1
	}
	var b=((Date.UTC(h,c,f,0,0,0)-Date.UTC(h,0,1,0,0,0))/86400000)+1;
	var i=Math.floor((b-e+7)/7);
	if(i===j){
	    h--;
	    var g=7+1-new Date(h,0,1).getDay();
	    if(g==2||g==8){
		i=53
	    }else{
		i=52
	    }
	}
	return i
    };

    Date.prototype.isDST=function(){
	return this.toString().match(/(E|C|M|P)(S|D)T/)[2]=="D"
    };
    
    Date.prototype.getTimezone=function(){
	return Date.getTimezoneAbbreviation(this.getUTCOffset,this.isDST())
    };
    
    Date.prototype.setTimezoneOffset=function(b){
	var a=this.getTimezoneOffset(),c=Number(b)*-6/10;
	this.addMinutes(c-a);
	return this
    };
    
    Date.prototype.setTimezone=function(a){
	return this.setTimezoneOffset(Date.getTimezoneOffset(a))
    };
    
    Date.prototype.getUTCOffset=function(){
	var b=this.getTimezoneOffset()*-10/6,a;
	if(b<0){
	    a=(b-10000).toString();
	    return a[0]+a.substr(2)
	}else{
	    a=(b+10000).toString();
	    return"+"+a.substr(1)
	}
    };

    Date.prototype.getDayName=function(a){
	return a?Date.CultureInfo.abbreviatedDayNames[this.getDay()]:Date.CultureInfo.dayNames[this.getDay()]
    };
    
    Date.prototype.getMonthName=function(a){
	return a?Date.CultureInfo.abbreviatedMonthNames[this.getMonth()]:Date.CultureInfo.monthNames[this.getMonth()]
    };
    
    Date.prototype._toString=Date.prototype.toString;
    Date.prototype.toString=function(c){
	var a=this;
	var b=function b(d){
	    return(d.toString().length==1)?"0"+d:d
	};
	
	return c?c.replace(/dd?d?d?|MM?M?M?|yy?y?y?|hh?|HH?|mm?|ss?|tt?|zz?z?/g,function(d){
	    switch(d){
		case"hh":
		    return b(a.getHours()<13?a.getHours():(a.getHours()-12));
		case"h":
		    return a.getHours()<13?a.getHours():(a.getHours()-12);
		case"HH":
		    return b(a.getHours());
		case"H":
		    return a.getHours();
		case"mm":
		    return b(a.getMinutes());
		case"m":
		    return a.getMinutes();
		case"ss":
		    return b(a.getSeconds());
		case"s":
		    return a.getSeconds();
		case"yyyy":
		    return a.getFullYear();
		case"yy":
		    return a.getFullYear().toString().substring(2,4);
		case"dddd":
		    return a.getDayName();
		case"ddd":
		    return a.getDayName(true);
		case"dd":
		    return b(a.getDate());
		case"d":
		    return a.getDate().toString();
		case"MMMM":
		    return a.getMonthName();
		case"MMM":
		    return a.getMonthName(true);
		case"MM":
		    return b((a.getMonth()+1));
		case"M":
		    return a.getMonth()+1;
		case"t":
		    return a.getHours()<12?Date.CultureInfo.amDesignator.substring(0,1):Date.CultureInfo.pmDesignator.substring(0,1);
		case"tt":
		    return a.getHours()<12?Date.CultureInfo.amDesignator:Date.CultureInfo.pmDesignator;
		case"zzz":case"zz":case"z":
		    return""
	    }
	}):this._toString()
    };
    
    Date.now=function(){
	return new Date()
    };
    
    Date.today=function(){
	return Date.now().clearTime()
    };
    
    Date.prototype._orient=+1;
    Date.prototype.next=function(){
	this._orient=+1;
	return this
    };
    
    Date.prototype.last=Date.prototype.prev=Date.prototype.previous=function(){
	this._orient=-1;
	return this
    };
    
    Date.prototype._is=false;
    Date.prototype.is=function(){
	this._is=true;
	return this
    };
    
    Number.prototype._dateElement="day";
    Number.prototype.fromNow=function(){
	var a={};
    
	a[this._dateElement]=this;
	return Date.now().add(a)
    };
    
    Number.prototype.ago=function(){
	var a={};
    
	a[this._dateElement]=this*-1;
	return Date.now().add(a)
    };
    (function(){
	var g=Date.prototype,a=Number.prototype;
	var p=("sunday monday tuesday wednesday thursday friday saturday").split(/\s/),o=("january february march april may june july august september october november december").split(/\s/),n=("Millisecond Second Minute Hour Day Week Month Year").split(/\s/),m;
	var l=function(i){
	    return function(){
		if(this._is){
		    this._is=false;
		    return this.getDay()==i
		}
		return this.moveToDayOfWeek(i,this._orient)
	    }
	};
    
	for(var f=0;f<p.length;f++){
	    g[p[f]]=g[p[f].substring(0,3)]=l(f)
	}
	var h=function(i){
	    return function(){
		if(this._is){
		    this._is=false;
		    return this.getMonth()===i
		}
		return this.moveToMonth(i,this._orient)
	    }
	};

	for(var d=0;d<o.length;d++){
	    g[o[d]]=g[o[d].substring(0,3)]=h(d)
	}
	var e=function(i){
	    return function(){
		if(i.substring(i.length-1)!="s"){
		    i+="s"
		}
		return this["add"+i](this._orient)
	    }
	};

	var b=function(i){
	    return function(){
		this._dateElement=i;
		return this
	    }
	};

	for(var c=0;c<n.length;c++){
	    m=n[c].toLowerCase();
	    g[m]=g[m+"s"]=e(n[c]);
	    a[m]=a[m+"s"]=b(m)
	}
    }());
    Date.prototype.toJSONString=function(){
	return this.toString("yyyy-MM-ddThh:mm:ssZ")
    };
    
    Date.prototype.toShortDateString=function(){
	return this.toString(Date.CultureInfo.formatPatterns.shortDatePattern)
    };
    
    Date.prototype.toLongDateString=function(){
	return this.toString(Date.CultureInfo.formatPatterns.longDatePattern)
    };
    
    Date.prototype.toShortTimeString=function(){
	return this.toString(Date.CultureInfo.formatPatterns.shortTimePattern)
    };
    
    Date.prototype.toLongTimeString=function(){
	return this.toString(Date.CultureInfo.formatPatterns.longTimePattern)
    };
    
    Date.prototype.getOrdinal=function(){
	switch(this.getDate()){
	    case 1:case 21:case 31:
		return"st";
	    case 2:case 22:
		return"nd";
	    case 3:case 23:
		return"rd";
	    default:
		return"th"
	}
    };
    (function(){
	Date.Parsing={
	    Exception:function(i){
		this.message="Parse error at '"+i.substring(0,10)+" ...'"
	    }
	};
    
	var a=Date.Parsing;
	var c=a.Operators={
	    rtoken:function(i){
		return function(j){
		    var k=j.match(i);
		    if(k){
			return([k[0],j.substring(k[0].length)])
		    }else{
			throw new a.Exception(j)
		    }
		}
	    },
	    token:function(i){
		return function(j){
		    return c.rtoken(new RegExp("^s*"+j+"s*"))(j)
		}
	    },
	    stoken:function(i){
		return c.rtoken(new RegExp("^"+i))
	    },
	    until:function(i){
		return function(j){
		    var k=[],m=null;
		    while(j.length){
			try{
			    m=i.call(this,j)
			}catch(l){
			    k.push(m[0]);
			    j=m[1];
			    continue
			}
			break
		    }
		    return[k,j]
		}
	    },
	    many:function(i){
		return function(j){
		    var m=[],k=null;
		    while(j.length){
			try{
			    k=i.call(this,j)
			}catch(l){
			    return[m,j]
			}
			m.push(k[0]);
			j=k[1]
		    }
		    return[m,j]
		}
	    },
	    optional:function(i){
		return function(j){
		    var k=null;
		    try{
			k=i.call(this,j)
		    }catch(l){
			return[null,j]
		    }
		    return[k[0],k[1]]
		}
	    },
	    not:function(i){
		return function(j){
		    try{
			i.call(this,j)
		    }catch(k){
			return[null,j]
		    }
		    throw new a.Exception(j)
		}
	    },
	    ignore:function(i){
		return i?function(j){
		    var k=null;
		    k=i.call(this,j);
		    return[null,k[1]]
		}:null
	    },
	    product:function(){
		var k=arguments[0],l=Array.prototype.slice.call(arguments,1),m=[];
		for(var j=0;j<k.length;j++){
		    m.push(c.each(k[j],l))
		}
		return m
	    },
	    cache:function(k){
		var i={},j=null;
		return function(l){
		    try{
			j=i[l]=(i[l]||k.call(this,l))
		    }catch(m){
			j=i[l]=m
		    }
		    if(j instanceof a.Exception){
			throw j
		    }else{
			return j
		    }
		}
	    },
	    any:function(){
		var i=arguments;
		return function(k){
		    var l=null;
		    for(var j=0;j<i.length;j++){
			if(i[j]==null){
			    continue
			}
			try{
			    l=(i[j].call(this,k))
			}catch(m){
			    l=null
			}
			if(l){
			    return l
			}
		    }
		    throw new a.Exception(k)
		}
	    },
	    each:function(){
		var i=arguments;
		return function(k){
		    var n=[],l=null;
		    for(var j=0;j<i.length;j++){
			if(i[j]==null){
			    continue
			}
			try{
			    l=(i[j].call(this,k))
			}catch(m){
			    throw new a.Exception(k)
			}
			n.push(l[0]);
			k=l[1]
		    }
		    return[n,k]
		}
	    },
	    all:function(){
		var j=arguments,i=i;
		return i.each(i.optional(j))
	    },
	    sequence:function(i,j,k){
		j=j||c.rtoken(/^\s*/);
		k=k||null;
		if(i.length==1){
		    return i[0]
		}
		return function(o){
		    var p=null,t=null;
		    var v=[];
		    for(var n=0;n<i.length;n++){
			try{
			    p=i[n].call(this,o)
			}catch(u){
			    break
			}
			v.push(p[0]);
			try{
			    t=j.call(this,p[1])
			}catch(m){
			    t=null;
			    break
			}
			o=t[1]
		    }
		    if(!p){
			throw new a.Exception(o)
		    }
		    if(t){
			throw new a.Exception(t[1])
		    }
		    if(k){
			try{
			    p=k.call(this,p[1])
			}catch(l){
			    throw new a.Exception(p[1])
			}
		    }
		    return[v,(p?p[1]:o)]
		}
	    },
	    between:function(j,k,i){
		i=i||j;
		var l=c.each(c.ignore(j),k,c.ignore(i));
		return function(m){
		    var n=l.call(this,m);
		    return[[n[0][0],r[0][2]],n[1]]
		}
	    },
	    list:function(i,j,k){
		j=j||c.rtoken(/^\s*/);
		k=k||null;
		return(i instanceof Array?c.each(c.product(i.slice(0,-1),c.ignore(j)),i.slice(-1),c.ignore(k)):c.each(c.many(c.each(i,c.ignore(j))),px,c.ignore(k)))
	    },
	    set:function(i,j,k){
		j=j||c.rtoken(/^\s*/);
		k=k||null;
		return function(B){
		    var l=null,n=null,m=null,o=null,t=[[],B],A=false;
		    for(var v=0;v<i.length;v++){
			m=null;
			n=null;
			l=null;
			A=(i.length==1);
			try{
			    l=i[v].call(this,B)
			}catch(y){
			    continue
			}
			o=[[l[0]],l[1]];
			if(l[1].length>0&&!A){
			    try{
				m=j.call(this,l[1])
			    }catch(z){
				A=true
			    }
			}else{
			    A=true
			}
			if(!A&&m[1].length===0){
			    A=true
			}
			if(!A){
			    var w=[];
			    for(var u=0;u<i.length;u++){
				if(v!=u){
				    w.push(i[u])
				}
			    }
			    n=c.set(w,j).call(this,m[1]);
			    if(n[0].length>0){
				o[0]=o[0].concat(n[0]);
				o[1]=n[1]
			    }
			}
			if(o[1].length<t[1].length){
			    t=o
			}
			if(t[1].length===0){
			    break
			}
		    }
		    if(t[0].length===0){
			return t
		    }
		    if(k){
			try{
			    m=k.call(this,t[1])
			}catch(x){
			    throw new a.Exception(t[1])
			}
			t[1]=m[1]
		    }
		    return t
		}
	    },
	    forward:function(i,j){
		return function(k){
		    return i[j].call(this,k)
		}
	    },
	    replace:function(j,i){
		return function(k){
		    var l=j.call(this,k);
		    return[i,l[1]]
		}
	    },
	    process:function(j,i){
		return function(k){
		    var l=j.call(this,k);
		    return[i.call(this,l[0]),l[1]]
		}
	    },
	    min:function(i,j){
		return function(k){
		    var l=j.call(this,k);
		    if(l[0].length<i){
			throw new a.Exception(k)
		    }
		    return l
		}
	    }
	};

	var h=function(i){
	    return function(){
		var j=null,m=[];
		if(arguments.length>1){
		    j=Array.prototype.slice.call(arguments)
		}else{
		    if(arguments[0] instanceof Array){
			j=arguments[0]
		    }
		}
		if(j){
		    for(var l=0,k=j.shift();l<k.length;l++){
			j.unshift(k[l]);
			m.push(i.apply(null,j));
			j.shift();
			return m
		    }
		}else{
		    return i.apply(null,arguments)
		}
	    }
	};

	var g="optional not ignore cache".split(/\s/);
	for(var d=0;d<g.length;d++){
	    c[g[d]]=h(c[g[d]])
	}
	var f=function(i){
	    return function(){
		if(arguments[0] instanceof Array){
		    return i.apply(null,arguments[0])
		}else{
		    return i.apply(null,arguments)
		}
	    }
	};

	var e="each any all".split(/\s/);
	for(var b=0;b<e.length;b++){
	    c[e[b]]=f(c[e[b]])
	}
    }());
    (function(){
	var f=function(j){
	    var k=[];
	    for(var g=0;g<j.length;g++){
		if(j[g] instanceof Array){
		    k=k.concat(f(j[g]))
		}else{
		    if(j[g]){
			k.push(j[g])
		    }
		}
	    }
	    return k
	};

	Date.Grammar={};

	Date.Translator={
	    hour:function(g){
		return function(){
		    this.hour=Number(g)
		}
	    },
	    minute:function(g){
		return function(){
		    this.minute=Number(g)
		}
	    },
	    second:function(g){
		return function(){
		    this.second=Number(g)
		}
	    },
	    meridian:function(g){
		return function(){
		    this.meridian=g.slice(0,1).toLowerCase()
		}
	    },
	    timezone:function(g){
		return function(){
		    var j=g.replace(/[^\d\+\-]/g,"");
		    if(j.length){
			this.timezoneOffset=Number(j)
		    }else{
			this.timezone=g.toLowerCase()
		    }
		}
	    },
	    day:function(g){
		var j=g[0];
		return function(){
		    this.day=Number(j.match(/\d+/)[0])
		}
	    },
	    month:function(g){
		return function(){
		    this.month=((g.length==3)?Date.getMonthNumberFromName(g):(Number(g)-1))
		}
	    },
	    year:function(g){
		return function(){
		    var j=Number(g);
		    this.year=((g.length>2)?j:(j+(((j+2000)<Date.CultureInfo.twoDigitYearMax)?2000:1900)))
		}
	    },
	    rday:function(g){
		return function(){
		    switch(g){
			case"yesterday":
			    this.days=-1;
			    break;
			case"tomorrow":
			    this.days=1;
			    break;
			case"today":
			    this.days=0;
			    break;
			case"now":
			    this.days=0;
			    this.now=true;
			    break
		    }
		}
	    },
	    finishExact:function(g){
		g=(g instanceof Array)?g:[g];
		var j=new Date();
		this.year=j.getFullYear();
		this.month=j.getMonth();
		this.day=1;
		this.hour=0;
		this.minute=0;
		this.second=0;
		for(var k=0;k<g.length;k++){
		    if(g[k]){
			g[k].call(this)
		    }
		}
		this.hour=(this.meridian=="p"&&this.hour<13)?this.hour+12:this.hour;
		if(this.day>Date.getDaysInMonth(this.year,this.month)){
		    throw new RangeError(this.day+" is not a valid value for days.")
		}
		var l=new Date(this.year,this.month,this.day,this.hour,this.minute,this.second);
		if(this.timezone){
		    l.set({
			timezone:this.timezone
		    })
		}else{
		    if(this.timezoneOffset){
			l.set({
			    timezoneOffset:this.timezoneOffset
			})
		    }
		}
		return l
	    },
	    finish:function(g){
		g=(g instanceof Array)?f(g):[g];
		if(g.length===0){
		    return null
		}
		for(var m=0;m<g.length;m++){
		    if(typeof g[m]=="function"){
			g[m].call(this)
		    }
		}
		if(this.now){
		    return new Date()
		}
		var j=Date.today();
		var p=null;
		var n=!!(this.days!=null||this.orient||this.operator);
		if(n){
		    var o,l,k;
		    k=((this.orient=="past"||this.operator=="subtract")?-1:1);
		    if(this.weekday){
			this.unit="day";
			o=(Date.getDayNumberFromName(this.weekday)-j.getDay());
			l=7;
			this.days=o?((o+(k*l))%l):(k*l)
		    }
		    if(this.month){
			this.unit="month";
			o=(this.month-j.getMonth());
			l=12;
			this.months=o?((o+(k*l))%l):(k*l);
			this.month=null
		    }
		    if(!this.unit){
			this.unit="day"
		    }
		    if(this[this.unit+"s"]==null||this.operator!=null){
			if(!this.value){
			    this.value=1
			}
			if(this.unit=="week"){
			    this.unit="day";
			    this.value=this.value*7
			}
			this[this.unit+"s"]=this.value*k
		    }
		    return j.add(this)
		}else{
		    if(this.meridian&&this.hour){
			this.hour=(this.hour<13&&this.meridian=="p")?this.hour+12:this.hour
		    }
		    if(this.weekday&&!this.day){
			this.day=(j.addDays((Date.getDayNumberFromName(this.weekday)-j.getDay()))).getDate()
		    }
		    if(this.month&&!this.day){
			this.day=1
		    }
		    return j.set(this)
		}
	    }
	};

	var b=Date.Parsing.Operators,e=Date.Grammar,d=Date.Translator,i;
	e.datePartDelimiter=b.rtoken(/^([\s\-\.\,\/\x27]+)/);
	e.timePartDelimiter=b.stoken(":");
	e.whiteSpace=b.rtoken(/^\s*/);
	e.generalDelimiter=b.rtoken(/^(([\s\,]|at|on)+)/);
	var a={};

	e.ctoken=function(m){
	    var l=a[m];
	    if(!l){
		var n=Date.CultureInfo.regexPatterns;
		var k=m.split(/\s+/),j=[];
		for(var g=0;g<k.length;g++){
		    j.push(b.replace(b.rtoken(n[k[g]]),k[g]))
		}
		l=a[m]=b.any.apply(null,j)
	    }
	    return l
	};
    
	e.ctoken2=function(g){
	    return b.rtoken(Date.CultureInfo.regexPatterns[g])
	};
    
	e.h=b.cache(b.process(b.rtoken(/^(0[0-9]|1[0-2]|[1-9])/),d.hour));
	e.hh=b.cache(b.process(b.rtoken(/^(0[0-9]|1[0-2])/),d.hour));
	e.H=b.cache(b.process(b.rtoken(/^([0-1][0-9]|2[0-3]|[0-9])/),d.hour));
	e.HH=b.cache(b.process(b.rtoken(/^([0-1][0-9]|2[0-3])/),d.hour));
	e.m=b.cache(b.process(b.rtoken(/^([0-5][0-9]|[0-9])/),d.minute));
	e.mm=b.cache(b.process(b.rtoken(/^[0-5][0-9]/),d.minute));
	e.s=b.cache(b.process(b.rtoken(/^([0-5][0-9]|[0-9])/),d.second));
	e.ss=b.cache(b.process(b.rtoken(/^[0-5][0-9]/),d.second));
	e.hms=b.cache(b.sequence([e.H,e.mm,e.ss],e.timePartDelimiter));
	e.t=b.cache(b.process(e.ctoken2("shortMeridian"),d.meridian));
	e.tt=b.cache(b.process(e.ctoken2("longMeridian"),d.meridian));
	e.z=b.cache(b.process(b.rtoken(/^(\+|\-)?\s*\d\d\d\d?/),d.timezone));
	e.zz=b.cache(b.process(b.rtoken(/^(\+|\-)\s*\d\d\d\d/),d.timezone));
	e.zzz=b.cache(b.process(e.ctoken2("timezone"),d.timezone));
	e.timeSuffix=b.each(b.ignore(e.whiteSpace),b.set([e.tt,e.zzz]));
	e.time=b.each(b.optional(b.ignore(b.stoken("T"))),e.hms,e.timeSuffix);
	e.d=b.cache(b.process(b.each(b.rtoken(/^([0-2]\d|3[0-1]|\d)/),b.optional(e.ctoken2("ordinalSuffix"))),d.day));
	e.dd=b.cache(b.process(b.each(b.rtoken(/^([0-2]\d|3[0-1])/),b.optional(e.ctoken2("ordinalSuffix"))),d.day));
	e.ddd=e.dddd=b.cache(b.process(e.ctoken("sun mon tue wed thu fri sat"),function(g){
	    return function(){
		this.weekday=g
	    }
	}));
	e.M=b.cache(b.process(b.rtoken(/^(1[0-2]|0\d|\d)/),d.month));
	e.MM=b.cache(b.process(b.rtoken(/^(1[0-2]|0\d)/),d.month));
	e.MMM=e.MMMM=b.cache(b.process(e.ctoken("jan feb mar apr may jun jul aug sep oct nov dec"),d.month));
	e.y=b.cache(b.process(b.rtoken(/^(\d\d?)/),d.year));
	e.yy=b.cache(b.process(b.rtoken(/^(\d\d)/),d.year));
	e.yyy=b.cache(b.process(b.rtoken(/^(\d\d?\d?\d?)/),d.year));
	e.yyyy=b.cache(b.process(b.rtoken(/^(\d\d\d\d)/),d.year));
	i=function(){
	    return b.each(b.any.apply(null,arguments),b.not(e.ctoken2("timeContext")))
	};
    
	e.day=i(e.d,e.dd);
	e.month=i(e.M,e.MMM);
	e.year=i(e.yyyy,e.yy);
	e.orientation=b.process(e.ctoken("past future"),function(g){
	    return function(){
		this.orient=g
	    }
	});
	e.operator=b.process(e.ctoken("add subtract"),function(g){
	    return function(){
		this.operator=g
	    }
	});
	e.rday=b.process(e.ctoken("yesterday tomorrow today now"),d.rday);
	e.unit=b.process(e.ctoken("minute hour day week month year"),function(g){
	    return function(){
		this.unit=g
	    }
	});
	e.value=b.process(b.rtoken(/^\d\d?(st|nd|rd|th)?/),function(g){
	    return function(){
		this.value=g.replace(/\D/g,"")
	    }
	});
	e.expression=b.set([e.rday,e.operator,e.value,e.unit,e.orientation,e.ddd,e.MMM]);
	i=function(){
	    return b.set(arguments,e.datePartDelimiter)
	};
    
	e.mdy=i(e.ddd,e.month,e.day,e.year);
	e.ymd=i(e.ddd,e.year,e.month,e.day);
	e.dmy=i(e.ddd,e.day,e.month,e.year);
	e.date=function(g){
	    return((e[Date.CultureInfo.dateElementOrder]||e.mdy).call(this,g))
	};
    
	e.format=b.process(b.many(b.any(b.process(b.rtoken(/^(dd?d?d?|MM?M?M?|yy?y?y?|hh?|HH?|mm?|ss?|tt?|zz?z?)/),function(g){
	    if(e[g]){
		return e[g]
	    }else{
		throw Date.Parsing.Exception(g)
	    }
	}),b.process(b.rtoken(/^[^dMyhHmstz]+/),function(g){
	    return b.ignore(b.stoken(g))
	}))),function(g){
	    return b.process(b.each.apply(null,g),d.finishExact)
	});
	var h={};

	var c=function(g){
	    return h[g]=(h[g]||e.format(g)[0])
	};
    
	e.formats=function(j){
	    if(j instanceof Array){
		var k=[];
		for(var g=0;g<j.length;g++){
		    k.push(c(j[g]))
		}
		return b.any.apply(null,k)
	    }else{
		return c(j)
	    }
	};

	e._formats=e.formats(["yyyy-MM-ddTHH:mm:ss","ddd, MMM dd, yyyy H:mm:ss tt","ddd MMM d yyyy HH:mm:ss zzz","d"]);
	e._start=b.process(b.set([e.date,e.time,e.expression],e.generalDelimiter,e.whiteSpace),d.finish);
	e.start=function(g){
	    try{
		var j=e._formats.call({},g);
		if(j[1].length===0){
		    return j
		}
	    }catch(k){}
	    return e._start.call({},g)
	}
    }());
    Date._parse=Date.parse;
    Date.parse=function(a){
	var b=null;
	if(!a){
	    return null
	}
	try{
	    b=Date.Grammar.start.call({},a)
	}catch(c){
	    return null
	}
	return((b[1].length===0)?b[0]:null)
    };
    
    Date.getParseFunction=function(b){
	var a=Date.Grammar.formats(b);
	return function(c){
	    var d=null;
	    try{
		d=a.call({},c)
	    }catch(f){
		return null
	    }
	    return((d[1].length===0)?d[0]:null)
	}
    };

    Date.parseExact=function(a,b){
	return Date.getParseFunction(b)(a)
    };
    
    var TimeSpan=function(m,h,e,j,d){
	var l="days hours minutes seconds milliseconds".split(/\s+/);
	var c=function(i){
	    return function(){
		return this[i]
	    }
	};
    
	var k=function(i){
	    return function(n){
		this[i]=n;
		return this
	    }
	};

	for(var g=0;g<l.length;g++){
	    var b=l[g],a=b.slice(0,1).toUpperCase()+b.slice(1);
	    TimeSpan.prototype[b]=0;
	    TimeSpan.prototype["get"+a]=c(b);
	    TimeSpan.prototype["set"+a]=k(b)
	}
	if(arguments.length==4){
	    this.setDays(m);
	    this.setHours(h);
	    this.setMinutes(e);
	    this.setSeconds(j)
	}else{
	    if(arguments.length==5){
		this.setDays(m);
		this.setHours(h);
		this.setMinutes(e);
		this.setSeconds(j);
		this.setMilliseconds(d)
	    }else{
		if(arguments.length==1&&typeof m=="number"){
		    var f=(m<0)?-1:+1;
		    this.setMilliseconds(Math.abs(m));
		    this.setDays(Math.floor(this.getMilliseconds()/86400000)*f);
		    this.setMilliseconds(this.getMilliseconds()%86400000);
		    this.setHours(Math.floor(this.getMilliseconds()/3600000)*f);
		    this.setMilliseconds(this.getMilliseconds()%3600000);
		    this.setMinutes(Math.floor(this.getMilliseconds()/60000)*f);
		    this.setMilliseconds(this.getMilliseconds()%60000);
		    this.setSeconds(Math.floor(this.getMilliseconds()/1000)*f);
		    this.setMilliseconds(this.getMilliseconds()%1000);
		    this.setMilliseconds(this.getMilliseconds()*f)
		}
	    }
	}
	this.getTotalMilliseconds=function(){
	    return(this.getDays()*86400000)+(this.getHours()*3600000)+(this.getMinutes()*60000)+(this.getSeconds()*1000)
	};
    
	this.compareTo=function(o){
	    var n=new Date(1970,1,1,this.getHours(),this.getMinutes(),this.getSeconds()),i;
	    if(o===null){
		i=new Date(1970,1,1,0,0,0)
	    }else{
		i=new Date(1970,1,1,o.getHours(),o.getMinutes(),o.getSeconds())
	    }
	    return(n<i)?-1:(n>i)?1:0
	};
    
	this.equals=function(i){
	    return(this.compareTo(i)===0)
	};
    
	this.add=function(i){
	    return(i===null)?this:this.addSeconds(i.getTotalMilliseconds()/1000)
	};
    
	this.subtract=function(i){
	    return(i===null)?this:this.addSeconds(-i.getTotalMilliseconds()/1000)
	};
    
	this.addDays=function(i){
	    return new TimeSpan(this.getTotalMilliseconds()+(i*86400000))
	};
    
	this.addHours=function(i){
	    return new TimeSpan(this.getTotalMilliseconds()+(i*3600000))
	};
    
	this.addMinutes=function(i){
	    return new TimeSpan(this.getTotalMilliseconds()+(i*60000))
	};
    
	this.addSeconds=function(i){
	    return new TimeSpan(this.getTotalMilliseconds()+(i*1000))
	};
    
	this.addMilliseconds=function(i){
	    return new TimeSpan(this.getTotalMilliseconds()+i)
	};
    
	this.get12HourHour=function(){
	    return(this.getHours()>12)?this.getHours()-12:(this.getHours()===0)?12:this.getHours()
	};
    
	this.getDesignator=function(){
	    return(this.getHours()<12)?Date.CultureInfo.amDesignator:Date.CultureInfo.pmDesignator
	};
    
	this.toString=function(n){
	    this._toString=function(){
		if(this.getDays()!==null&&this.getDays()>0){
		    return this.getDays()+"."+this.getHours()+":"+this.p(this.getMinutes())+":"+this.p(this.getSeconds())
		}else{
		    return this.getHours()+":"+this.p(this.getMinutes())+":"+this.p(this.getSeconds())
		}
	    };
    
	    this.p=function(o){
		return(o.toString().length<2)?"0"+o:o
	    };
    
	    var i=this;
	    return n?n.replace(/dd?|HH?|hh?|mm?|ss?|tt?/g,function(o){
		switch(o){
		    case"d":
			return i.getDays();
		    case"dd":
			return i.p(i.getDays());
		    case"H":
			return i.getHours();
		    case"HH":
			return i.p(i.getHours());
		    case"h":
			return i.get12HourHour();
		    case"hh":
			return i.p(i.get12HourHour());
		    case"m":
			return i.getMinutes();
		    case"mm":
			return i.p(i.getMinutes());
		    case"s":
			return i.getSeconds();
		    case"ss":
			return i.p(i.getSeconds());
		    case"t":
			return((i.getHours()<12)?Date.CultureInfo.amDesignator:Date.CultureInfo.pmDesignator).substring(0,1);
		    case"tt":
			return(i.getHours()<12)?Date.CultureInfo.amDesignator:Date.CultureInfo.pmDesignator
		}
	    }):this._toString()
	};

	return this
    };

    Date.prototype.getTimeOfDay=function(){
	return new TimeSpan(0,this.getHours(),this.getMinutes(),this.getSeconds(),this.getMilliseconds())
    };
    
    var TimePeriod=function(n,f,e,q,o,k,g){
	var m="years months days hours minutes seconds milliseconds".split(/\s+/);
	var j=function(i){
	    return function(){
		return this[i]
	    }
	};
    
	var b=function(i){
	    return function(v){
		this[i]=v;
		return this
	    }
	};

	for(var p=0;p<m.length;p++){
	    var d=m[p],c=d.slice(0,1).toUpperCase()+d.slice(1);
	    TimePeriod.prototype[d]=0;
	    TimePeriod.prototype["get"+c]=j(d);
	    TimePeriod.prototype["set"+c]=b(d)
	}
	if(arguments.length==7){
	    this.years=n;
	    this.months=f;
	    this.setDays(e);
	    this.setHours(q);
	    this.setMinutes(o);
	    this.setSeconds(k);
	    this.setMilliseconds(g)
	}else{
	    if(arguments.length==2&&arguments[0] instanceof Date&&arguments[1] instanceof Date){
		var u=n.clone();
		var t=f.clone();
		var s=u.clone();
		var h=(u>t)?-1:+1;
		this.years=t.getFullYear()-u.getFullYear();
		s.addYears(this.years);
		if(h==+1){
		    if(s>t){
			if(this.years!==0){
			    this.years--
			}
		    }
		}else{
		    if(s<t){
			if(this.years!==0){
			    this.years++
			}
		    }
		}
		u.addYears(this.years);
		if(h==+1){
		    while(u<t&&u.clone().addDays(Date.getDaysInMonth(u.getYear(),u.getMonth()))<t){
			u.addMonths(1);
			this.months++
		    }
		}else{
		    while(u>t&&u.clone().addDays(-u.getDaysInMonth())>t){
			u.addMonths(-1);
			this.months--
		    }
		}
		var l=t-u;
		if(l!==0){
		    var a=new TimeSpan(l);
		    this.setDays(a.getDays());
		    this.setHours(a.getHours());
		    this.setMinutes(a.getMinutes());
		    this.setSeconds(a.getSeconds());
		    this.setMilliseconds(a.getMilliseconds())
		}
	    }
	}
	return this
    };
})(jQuery)
