//	
//	DateProc
//	A small but growing library for date and time processing
//	Copyright (c) 2008 Peter S. May
//	
//	(The MIT License as published by OSI)
//	
//	Permission is hereby granted, free of charge, to any person 
//	obtaining a copy of this software and associated documentation 
//	files (the "Software"), to deal in the Software without 
//	restriction, including without limitation the rights to use, copy, 
//	modify, merge, publish, distribute, sublicense, and/or sell copies 
//	of the Software, and to permit persons to whom the Software is 
//	furnished to do so, subject to the following conditions:
//	
//	The above copyright notice and this permission notice shall be 
//	included in all copies or substantial portions of the Software.
//	
//	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
//	EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
//	MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
//	NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 
//	BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 
//	ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 
//	CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 
//	SOFTWARE.
//	
//	(This software is published with the acknowledgement that 
//	MIT-licensed software may be included at will in GNU-GPL-licensed 
//	code, provided that the terms above are fulfilled.)
//	
var DateProc=(function(){function B(O,N){if(N<1){return""}O+="";var M=O.length*N;--N;while(N>>=1){O+=O}return O+O.substring(0,M-O.length)}function E(N,O,M){N=(""+N).replace(/[^0-9]+/g,"");if((typeof O=="number")&&N.length<O){N=B("0",O-N.length)+N}if((typeof M=="number")&&N.length>M){N=N.substring(N.length-M,N.length)}return N}var C=1000,F=60*C,G=60*F,H=24*G,A=7*H;var I=(function(){var P;function f(r,s,q){return new Date(Date.UTC(r,s,q,0,0,0))}function j(q){var r=f(q,0,4);return(r.getTime()-(H*((r.getUTCDay()+6)%7)))}function p(q,s,r){return(q<12)?s:r}function Q(q){return(typeof q=="number")?q:0}var T=("Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday").split(","),n=("January,February,March,April,May,June,July,August,September,October,November,December").split(",");function m(s,q,r){return((s+(q-r))%q)+r}function Z(s,t,r){var q=Date.UTC(s,t,r,0,0,0)-Date.UTC(s,0,1,0,0,0);return Math.floor(q/H)}function h(r,s,q){return f(r,s,q).getUTCDay()}function i(q){return T[q%7]}function W(q){return n[q%12]}function X(r){var q=r%10;r%=100;if(r-q==10){q=null}switch(q){case 1:return"st";case 2:return"nd";case 3:return"rd";default:return"th"}}function c(t,v,s){var r=Date.UTC(t,v,s),u,q=t+1;for(;;){u=j(q);if(r>=u){break}--q}return{year:q,week:1+Math.floor((r-u)/A)}}function M(q,r){var s=new Date(Date.UTC(q,r,15,0,0,0)+(4*A));s.setUTCDate(1);s.setTime(s.getTime()-(12*G));return s.getUTCDate()}function e(q){return(M(q,1)==29)}function g(q){return p(q,true,false)}function l(q){return p(q,false,true)}function R(q){return p(q,"a","p")}function O(q,r,v,s,t){var u=((G*(Q(r)+1))+(F*(Q(v)+q))+(C*Q(s))+Q(t))%H;return(u/H)*1000}function S(t,v,s,q,x,r){var w=new Date(t,v,s,q,x,r,0),u=new Date(w.getTime());u.setMonth(0);u.setDate(1);return(w.getTimezoneOffset()!=u.getTimezoneOffset())}function b(q,r){var s="-";if(q<=0){s="+";q=-q}return(s+E(Math.floor(q/60),2,2)+(r?":":"")+E(q%60,2,2))}function V(r,u,t,q){var s;if(q<0){s=new Date(Date.UTC(r,u,15,0,0,0,0)+(4*A));s.setUTCDate(1);s.setTime(s.getTime()-A);++q}else{s=new Date(Date.UTC(r,u,1,0,0,0,0))}s=s.getTime()+(((7+t-s.getUTCDay())%7)*H);s=new Date(s+(q*A));return s.getUTCDate()}function N(q){switch(typeof q){case"number":return q;case"string":if(/^(?:w|wk|weeks?|d|days?|h|hrs?|hours?|m|min|minutes?|s|sec|seconds?)$/i.test(q)){switch(q.substring(0,1).toLowerCase()){case"w":return A;case"d":return H;case"h":return G;case"m":return F;case"s":return C}}else{throw new Error('Unit "'+q+'" not recognized')}default:throw new TypeError("Argument must be numeric or week/day/hour/minute/second")}}function a(q){switch(typeof q){case"number":return q;case"object":if(q!==null&&q.getTime&&(typeof q.getTime=="function")){return a(q.getTime())}}throw new TypeError("Argument must be numeric or Date")}function Y(s,r,q){s=a(s);q=(typeof q=="function")?q:Math.floor;r=N(r);return r*q(s/r)}function d(r,q){r=a(r);q=N(q);return r%q}function k(t,q,s,r){q=N(q);s=N(s);q=(q<s)?[q,s]:[s,q];return Y(d(t,q[1]),q[0],r)}function U(t,q,s,r){return t-k(t,q,s,r)}function o(q,r){if(arguments.length<2){r=1}return N(q)*r}return{roll:m,dayOfYear:Z,day:h,dayName:i,monthName:W,ordinalSuffix:X,iso8601WeekYear:c,daysInMonth:M,isLeap:e,isAM:g,isPM:l,meridiem:R,swatchInternetTime:O,inLocalDST:S,timezoneStandardOffset:b,monthNthWeekday:V,truncateTo:Y,truncateAbove:d,clip:k,resetOutside:k,resetBetween:U,unit:o,pad:E}})();var D=(function(){function N(Q){var P=new Date();P.setMonth(0);P.setDate(1);return Q-P.getTimezoneOffset()}function O(Q,S,T){S=S||0;if(!T&&(T!==false)){S=N(S)}var P=T?"getUTC":"get",R=new Date(Q-(S*F));return[S+(T?0:R.getTimezoneOffset()),R[P+"FullYear"](),R[P+"Month"](),R[P+"Date"](),R[P+"Hours"](),R[P+"Minutes"](),R[P+"Seconds"](),R[P+"Milliseconds"]()]}function M(Q){var P=Date.UTC.apply(Date,Q.slice(1));P+=(Q[0]*F);return P}return{relativeDifference:N,stampToFace:O,faceToStamp:M}})();var J=(function(){function N(W){return parseInt(W,10)}function P(W){if(W!==null){W=N(W)}return W}function O(W,X){if(typeof X=="string"){if(X!=""){if(typeof W[W.length-1]!="string"){W.push("")}W[W.length-1]+=X}}else{W.push(X)}return W}function S(W,X,Z){Z=Z||{};for(var Y=0;Y<X.length;++Y){Z[X[Y]]=W[Y]}return Z}function T(W){if(typeof W=="undefined"){return false}else{if((W===null)||(W==="")){return false}}return true}function M(X,Y,W){if(!T(X)){return null}X=N(X);switch(Y){case"+":return{min:X,max:null};case"-":return{min:null,max:X};default:return{min:X,max:T(W)?N(W):X}}}function R(Y){var Z=[],X,W,c,a,b;while(X=/^(.*?)(\{)(.*)$/.exec(Y)){O(Z,X[1]);a=X[2];Y=X[3];if(X=/^([{}])\}(.*)$/.exec(Y)){O(Z,X[1]);Y=X[2]}else{if(X=/^([A-Za-z_$][A-Za-z0-9_$]*)(.*)$/.exec(Y)){b=X[1];Y=X[2];if(X=/^\}(.*)$/.exec(Y)){Y=X[1];O(Z,{property:b})}else{if(X=/^#(d)?(-)?(0)?(?:(\d+)(?:([+-])|,(\d+))?)?(?:\.(\d+)(?:([+-])|,(\d+))?)?\}(.*)$/.exec(Y)){c=S(X,"0,wdo,align,pad,wa1,wax,wa2,wb1,wbx,wb2,trail".split(","));Y=c.trail;a={property:b,type:"number",widthDigitsOnly:(c.wdo==="d"),align:(c.align==="-"),pad:(c.pad=="0")?c.pad:" "};if(W=M(c.wa1,c.wax,c.wa2)){a.min=W.min;a.max=W.max}if(W=M(c.wb1,c.wbx,c.wb2)){a.fracMin=W.min;a.fracMax=W.max}O(Z,a)}else{if(X=/^:(-)?(0)?(?:(\d+)(?:([+-])|,(\d+))?)\}(.*)$/.exec(Y)){c=S(X,"0,align,pad,w1,wx,w2,trail".split(","));Y=c.trail;a={property:b,type:"string",align:(c.align==="-"),pad:(c.pad=="0")?c.pad:" "};if(W=M(c.w1,c.wx,c.w2)){a.min=W.min;a.max=W.max}O(Z,a)}else{if(X=/^\?([^:]*):([^}]*)\}(.*)$/.exec(Y)){c=S(X,"0,ifTrue,ifFalse,trail".split(","));Y=c.trail;a={property:b,type:"boolean",ifTrue:c.ifTrue,ifFalse:c.ifFalse};O(Z,a)}else{O(Z,a+b)}}}}}else{O(Z,a)}}}O(Z,Y);return Z}function V(b,X,W,Y,a){b=""+b;if((typeof X=="number")&&b.length<X){var Z=B(Y,X-b.length);b=a?(b+Z):(Z+b)}if((typeof W=="number")&&b.length>W){b=a?b.substring(0,W):b.substring(b.length-W,b.length)}return b}function Q(X){if(X==0){return""}var W=-Math.floor(Math.log(X)/Math.LN10);if(W<1){return null}X*=Math.pow(10,W);X=(""+X).replace(".","");return B("0",W-1)+X}function U(Z,X){var a,e,W="",d;if(typeof X==="string"){X=R(X)}for(a=0;a<X.length;++a){e=X[a];if(typeof e=="string"){d=e}else{if(e.property){d=Z[e.property];if(typeof d==="function"){d=d.call(Z)}if(e.type=="boolean"){d=d?e.ifTrue:e.ifFalse}else{if(e.type=="string"){d=V(d,e.min,e.max,e.pad,e.align)}else{if(e.type=="number"){d=(typeof d=="number")?d:parseFloat(d);if(!isNaN(d)){var Y,b,c="";Y=(d<0)?"-":"";d=(d<0)?-d:d;if((Y.length!=0)&&e.widthDigitsOnly){if(!isNaN(e.min)){e.min+=Y.length}if(!isNaN(e.max)){e.max+=Y.length}}b=Math.floor(d);if(!(isNaN(e.fracMin)&&isNaN(e.fracMax))){c=Q(d-b)}b=V(b,e.min,e.max,e.pad,false);c=V(c,e.fracMin,e.fracMax,e.pad,true);if(c!=""){c="."+c}d=b+c}else{d=void (0)}}}}}}W+=d}return W}return{parseFormatString:R,executeFormat:U}})();var L=(function(){function S(){var Z,a="",b;for(Z=0;Z<arguments.length;++Z){b=arguments[Z];switch(typeof b){case"string":case"number":case"undefined":case"boolean":case"function":a+=(typeof b).substring(0,1);break;case"object":if(b===null){a+="0"}else{if(b.getTime){a+="D"}else{if(b.length&&b.slice){a+="A"}else{a+="o"}}}break;default:a+="?";break}}return a}function M(b,d){var c,Z=[];d=d||0;for(c=d;c<b.length;++b){Z[c-d]=b[c]}return Z}function U(){return this.init.apply(this,arguments)}var Q=[0,1970,0,1,0,0,0,0];function X(){var d=[],Z=M(arguments),c=S.apply(this,Z);switch(c){case"A":d=Z[0].slice(0,8);break;case"n":d=D.stampToFace(Z[0],0,false);break;case"nn":d=D.stampToFace(Z[0],Z[1]);break;case"nnb":case"nnu":case"nn0":d=D.stampToFace(Z[0],Z[1],Z[2]);break;default:if(/^D/.test(c)){Z[0]=Z[0].getTime();return this.init.apply(this,Z)}else{if(/^n{3,8}/){return this.init.apply(this,[Z])}else{throw new TypeError("Invalid argument types")}}break}for(var b=0;b<8;++b){if(S(d[b])!="n"){d[b]=Q[b]}}this.face=d;this._cache={}}function P(Z){var d=this._cache,a,b;if(!(Z in d)){a=this.face;switch(Z){case"dayOfYear":d[Z]=I.dayOfYear(a[1],a[2],a[3]);break;case"day":d[Z]=I.day(a[1],a[2],a[3]);break;case"dayName":d[Z]=I.dayName(this._get("day"));break;case"monthName":d[Z]=I.monthName(a[2]);break;case"dateSuffix":d[Z]=I.ordinalSuffix(a[3]);break;case"iso8601Week":case"iso8601Year":b=I.iso8601WeekYear(a[1],a[2],a[3]);d.iso8601Week=b.week;d.iso8601Year=b.year;break;case"daysInMonth":d[Z]=I.daysInMonth(a[1],a[2]);break;case"isLeap":d[Z]=I.isLeap(a[1]);break;case"isAM":d[Z]=I.isAM(a[4]);break;case"swatchInternetTime":d[Z]=I.swatchInternetTime(a[0],a[4],a[5],a[6],a[7]);break;case"inLocalDST":d[Z]=I.inLocalDST(a[1],a[2],a[3],a[4],a[5],a[6]);break;case"timezoneHHMM":d[Z]=I.timezoneStandardOffset(a[0]);break;case"timezoneHH:MM":d[Z]=I.timezoneStandardOffset(a[0],true);break;case"msSinceEpoch":d[Z]=D.faceToStamp(this.face);break;case"offset":return a[0];case"year":return a[1];case"month0":return a[2];case"month1":return a[2]+1;case"date":return a[3];case"hour":return a[4];case"minute":return a[5];case"second":return a[6];case"millisecond":return a[7]}}return d[Z]}function Y(Z){this._data=Z}function R(Z){return function(){return this._data._get(Z)}}Y.prototype={yearDay:R("dayOfYear"),weekDay:R("day"),weekDay1:function(){return I.roll(this.weekDay(),7,1)},weekDayName:R("dayName"),monthName:R("monthName"),monthDaySuffix:R("dateSuffix"),iso8601Week:R("iso8601Week"),iso8601Year:R("iso8601Year"),monthDays:R("daysInMonth"),yearIsLeap:R("isLeap"),hourIsAM:R("isAM"),hourIsPM:function(){return !this.hourIsAM()},beats:R("swatchInternetTime"),isLocallyDST:R("inLocalDST"),timezoneHHMM:R("timezoneHHMM"),timezoneHH_MM:R("timezoneHH:MM"),epochMilliseconds:R("msSinceEpoch"),epochSeconds:function(){return this.epochMilliseconds()/1000},jsOffset:R("offset"),year:R("year"),month:R("month1"),monthDay:R("date"),hour:R("hour"),hour12:function(){return I.roll(this.hour(),12,1)},minute:R("minute"),second:R("second"),millisecond:R("millisecond")};function W(Z){return J.executeFormat(new Y(this),Z)}function O(Z){return(""+Z).substring(0,3)}function T(Z){var b=this,c=I.pad;function d(e){return b._get(e)}function a(e){return""+d(e)}switch(Z){case"d":return c(a("date"),2);case"D":return O(a("dayName"));case"j":return a("date");case"l":return a("dayName");case"N":return""+I.roll(d("day"),7,1);case"S":return a("dateSuffix");case"w":return a("day");case"z":return a("dayOfYear");case"W":return a("iso8601Week");case"F":return a("monthName");case"m":return c(d("month1"),2);case"M":return O(a("monthName"));case"n":return a("month1");case"t":return a("daysInMonth");case"L":return a("isLeap");case"o":return a("iso8601Year");case"Y":return a("year");case"y":return I.pad(d("year"),2,2);case"a":return(d("isAM")?"am":"pm");case"A":return(d("isAM")?"AM":"PM");case"B":return I.pad(Math.floor(d("swatchInternetTime")),3,3);case"g":return""+I.roll(d("hour"),12,1);case"G":return a("hour");case"h":return I.pad(I.roll(d("hour"),12,1),2,2);case"H":return I.pad(d("hour"),2,2);case"i":return I.pad(d("minute"),2,2);case"s":return I.pad(d("second"),2,2);case"O":return a("timezoneHHMM");case"P":return a("timezoneHH:MM");case"Z":return""+(d("offset")*-60);case"c":return""+c(d("year"),4)+"-"+c(d("month1"),2)+"-"+c(d("date"),2)+"T"+c(d("hour"),2)+":"+c(d("minute"),2)+":"+c(d("second"),2)+a("timezoneHH:MM");case"r":return""+O(a("dayName"))+", "+c(d("date"),2)+" "+O(a("monthName"))+" "+a("year")+" "+c(d("hour"),2)+":"+c(d("minute"),2)+":"+c(d("second"),2)+" "+a("timezoneHHMM");case"U":return""+Math.floor(d("msSinceEpoch")/1000);default:return Z}}function V(a){var Z,d="",e,b;for(Z=0;Z<a.length;++Z){e=a.charAt(Z);if(b=="\\"){d+=e}else{if(e=="\\"){}else{d+=T.call(this,a.charAt(Z))}}b=e}return d}var N=U.prototype={phpFormat:V,format:W,init:X,getTime:function(){return this._get("msSinceEpoch")},getFace:function(){return this.face.slice(0)},_get:P};return U})();var K=(function(){var N=I;function U(){var W=arguments,X=0;if(W.length==1){X=parseInt(W[0],10)||0}this.interval=X}function P(W){return(W.negative()?-1:1)*W.interval}function M(W,X){W.interval=(W.negative()?-1:1)*X}function V(W){return W.negative()?Math.floor:Math.floor}function Q(X,W){if(W!==null){return function(Y){if(arguments.length==0){return Math.round(N.resetOutside(P(this),W,X)/N.unit(W))}else{M(this,N.resetBetween(P(this),W,X)+N.unit(W,Y))}}}else{return function(Y){if(arguments.length==0){return Math.round(N.truncateTo(P(this),X)/N.unit(X))}else{M(this,N.truncateAbove(P(this),X)+N.unit(X,Y))}}}}function S(){return this.init.apply(this,arguments)}function T(W){return function(X){return new S(this.truncated(W,X))}}var O=S.prototype={negative:function(W){if(arguments.length==0){return(this.interval<0)}else{if(this.negative()===!W){this.interval*=-1}}},sign:function(){return this.negative()?"-":"+"},minus:function(){return this.negative()?"-":""},millisecond:Q(1,null),secondMillisecond:Q("second",1),minuteMillisecond:Q("minute",1),hourMillisecond:Q("hour",1),dayMillisecond:Q("day",1),weekMillisecond:Q("week",1),second:Q("second",null),minuteSecond:Q("minute","second"),hourSecond:Q("hour","second"),daySecond:Q("day","second"),weekSecond:Q("week","second"),minute:Q("minute",null),hourMinute:Q("hour","minute"),dayMinute:Q("day","minute"),weekMinute:Q("week","minute"),hour:Q("hour",null),dayHour:Q("day","hour"),weekHour:Q("week","hour"),day:Q("day",null),weekDay:Q("week","day"),week:Q("week",null),format:function(W){return J.executeFormat(this,W)},truncated:function(X,W){return N.truncateTo(this.interval,X,W)},toSecond:T("second"),toMinute:T("minute"),toHour:T("hour"),toDay:T("day"),toWeek:T("week"),toOpposite:function(){return new S(-this.interval)},init:U};function R(W){return function(){return(W.call(this)!=1)}}O.millisecondPlural=R(O.millisecond);O.secondMillisecondPlural=R(O.secondMillisecond);O.minuteMillisecondPlural=R(O.minuteMillisecond);O.hourMillisecondPlural=R(O.hourMillisecond);O.dayMillisecondPlural=R(O.dayMillisecond);O.weekMillisecondPlural=R(O.weekMillisecond);O.secondPlural=R(O.second);O.minuteSecondPlural=R(O.minuteSecond);O.hourSecondPlural=R(O.hourSecond);O.daySecondPlural=R(O.daySecond);O.weekSecondPlural=R(O.weekSecond);O.minutePlural=R(O.minute);O.hourMinutePlural=R(O.hourMinute);O.dayMinutePlural=R(O.dayMinute);O.weekMinutePlural=R(O.weekMinute);O.hourPlural=R(O.hour);O.dayHourPlural=R(O.dayHour);O.weekHourPlural=R(O.weekHour);O.dayPlural=R(O.day);O.weekDayPlural=R(O.weekDay);O.weekPlural=R(O.week);O.getTime=O.millisecond;return S})();return{Calc:I,Conv:D,Formatter:L,Interval:K}})();