function __LZ(x){return(x<0||x>9?"":"0")+x}

function __iI(val) {
	var digits="1234567890";
	for (var i=0;i < val.length;i++) {
		if (digits.indexOf(val.charAt(i))==-1) {
			return false;
		}
	}
	return true;
}

function __gI(str,i,minlength,maxlength) {
	for (var x=maxlength;x>=minlength;x--) {
		var token=str.substring(i,i+x);
		if (token.length < minlength) { 
			return null;
		}
		if (__iI(token)) {
			return token;
		}
	}
	return null;
}

var __MONTH_NAMES=new Array('January','February','March','April','May','June','July','August','September','October','November','December','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
var __DAY_NAMES=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat');


function getDateFromString(val,format) {
	
	val=val+"";
	format=format+"";
	var i_val=0;
	var i_format=0;
	var c="";
	var token="";
	var token2="";
	var x,y;
	var now=new Date();
	var year=now.getFullYear();
	var month=now.getMonth()+1;
	var date=1;
	var hh=0;
	var mm=0;
	var ss=0;
	var ampm="";
	while (i_format < format.length){
		c=format.charAt(i_format);
		token="";
		while ((format.charAt(i_format)==c) && (i_format < format.length)){
			token += format.charAt(i_format++);
		}
		if (token=="yyyy" || token=="yy" || token=="y"){
			if (token=="yyyy"){
				x=2;
				y=4;
			}
			if (token=="yy"){
				x=2;
				y=2;
			}
			if (token=="y"){
				x=2;
				y=4;
			}
			year=__gI(val,i_val,x,y);
			if (year==null){
				year = new Date().getFullYear();
				
				continue;
			}
			else{
				i_val += year.length;
			}
			if (year.length==2){
				if (year > 70){
					year=1900+(year-0);
				}
				else{
					year=2000+(year-0);
				}
			}
		}
		else if (token=="MMM"||token=="NNN"){
			month=0;
			for (var i=0; i<__MONTH_NAMES.length; i++){
				var month_name=__MONTH_NAMES[i];
				if (val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase()){
					if (token=="MMM"||(token=="NNN"&&i>11)){
						month=i+1;
						if (month>12){
							month -= 12;
						}
						i_val += month_name.length;
						break;
					}
				}
			}
			if ((month < 1)||(month>12)){
				return 0;
			}
		}
		else if (token=="EE"||token=="E"){
			for (var i=0; i<__DAY_NAMES.length;	i++){
				var day_name=__DAY_NAMES[i];
				if (val.substring(i_val,i_val+day_name.length).toLowerCase()==day_name.toLowerCase()){
					i_val += day_name.length;
					break;
				}
			}
		}
		else if (token=="MM"||token=="M"){
			month=__gI(val,i_val,1,2);
			if(month==null||(month<1)||(month>12)){
				return 0;
			}
			i_val+=month.length;
		}
		else if (token=="dd"||token=="d"){
			date=__gI(val,i_val,1,2);
			if(date==null||(date<1)||(date>31)){
				return 0;
			}
			i_val+=date.length;
		}
		else if (token=="hh"||token=="h"){
			hh=__gI(val,i_val,1,2);
			if(hh==null){
				if (date>0){
					hh=mm=ss=0;
					break;
				}
				return 0;
			}
			if (hh<1||hh>12){
				return 0;
			}
			i_val+=hh.length;
		}
		else if (token=="HH"||token=="H"){
			hh=__gI(val,i_val,1,2);
			if(hh==null){
				if (date > 0){
					hh=mm=ss=0;
					break;
				}
				return 0;
			}
			if (hh<0||hh>23){
				return 0;
			}
			i_val+=hh.length;
		}
		else if (token=="KK"||token=="K"){
			hh=__gI(val,i_val,token.length,2);
			if(hh==null||(hh<0)||(hh>11)){
				return 0;
			}
			i_val+=hh.length;
		}
		else if (token=="kk"||token=="k"){
			hh=__gI(val,i_val,token.length,2);
			if(hh==null||(hh<1)||(hh>24)){
				return 0;
			}
			i_val+=hh.length;
			hh--;
		}
		else if (token=="mm"||token=="m"){
			mm=__gI(val,i_val,1,2);
			if(mm==null||(mm<0)||(mm>59)){
				return 0;
			}
			i_val+=mm.length;
		}
		else if (token=="ss"||token=="s"){
			ss=__gI(val,i_val,1,2);
			if(ss==null||(ss<0)||(ss>59)){
				if ( i_val<val.length ){
					return 0;
				}
				ss ="00";
			}
			i_val+=ss.length;
		}
		else if (token=="a"){
			if (val.substring(i_val,i_val+2).toLowerCase()=="am"){
				ampm="AM";
			}
			else if (val.substring(i_val,i_val+2).toLowerCase()=="pm"){
				ampm="PM";
			}
			else{
				return 0;
			}
			i_val+=2;
		}
		else{
			var tokenGot=val.substring(i_val,i_val+token.length);
			if (tokenGot!="" && tokenGot!=token){
				if ( !((token=="/" && tokenGot=="-") || (token=="-" && tokenGot=="/")) ){
					return 0;
				}
			}
			i_val+=token.length;
		}
	}
	if (i_val < val.length){
		return 0;
	}
	if (month==2){
		if ( ( (year%4==0)&&(year%100 != 0) ) || (year%400==0) ){
		
			if (date > 29){
				return 0;
			}
		}
		else{
			if (date > 28){
				return 0;
			}
		}
	}
	if ((month==4)||(month==6)||(month==9)||(month==11)){
		if (date > 30){
			return 0;
		}
	}
	if (hh<12 && ampm=="PM"){
		hh=hh-0+12;
	}
	else if (hh>11 && ampm=="AM"){
		hh-=12;
	}
	return new Date(year,month-1,date, hh, mm, ss);
}

function getStringFromDate(date,format){
	format=format+"";

	var result="";
var i_format=0;
var c="";
var token="";
var y=date.getFullYear()+"";
var M=date.getMonth()+1;
var d=date.getDate();
var E=date.getDay();
var H=date.getHours();
var m=date.getMinutes();
var s=date.getSeconds();
var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;
var value=new Object();
if (y.length < 4){y=""+(y-0+1900);
}value["y"]=""+y;
value["yyyy"]=y;
value["yy"]=y.substring(2,4);
value["M"]=__LZ(M);
value["MM"]=__LZ(M);
value["MMM"]=__MONTH_NAMES[M-1];
value["NNN"]=__MONTH_NAMES[M+11];
value["d"]= __LZ(d);
value["dd"]=__LZ(d);
value["E"]=__DAY_NAMES[E+7];
value["EE"]=__DAY_NAMES[E];
value["H"]=H;
value["HH"]=__LZ(H);
if (H==0){value["h"]=12;
}else if (H>12){value["h"]=H-12;
}else{value["h"]=H;
}value["hh"]=__LZ(value["h"]);
if (H>11){value["K"]=H-12;
}else{value["K"]=H;
}value["k"]=H+1;
value["KK"]=__LZ(value["K"]);
value["kk"]=__LZ(value["k"]);
if (H > 11){value["a"]="PM";
}else{value["a"]="AM";
}value["m"]=m;
value["mm"]=__LZ(m);
value["s"]=s;
value["ss"]=__LZ(s);
while (i_format < format.length){c=format.charAt(i_format);
token="";
while ((format.charAt(i_format)==c) && (i_format < format.length)){token += format.charAt(i_format++);
}if (value[token] != null){result=result + value[token];
}else{result=result + token;
}}return result;
}
function addMonth(d,month){
    var t=new Date(d);
    t.setMonth(d.getMonth()+month);
    if(t.getDate()<d.getDate()){t.setDate(0);}
    return t;
}
function endLastMonth(d){
    var md=[31,28,31,30,31,30,31,31,30,31,30,31];
    var t=d;
    var y=t.getYear();
    var eolm;
    if(y<1000){y+=1900;}
    if(t.getMonth()===0){eolm=new Date(y-1,11,md[11]);}
    else{
        var lm=t.getMonth()-1;
        var dlm=md[lm];
        if(lm===1){
            if(y%400===0||(y%4===0&&y%100!==0)){dlm+=1;}
        }
        eolm=new Date(y,t.getMonth()-1,dlm);
    }
    return eolm;
}