HGDatesStartYear = 1423;
HGDatesTable = new Array (
           1016150400,1018742400,1021248000,1023840000,1026345600,1028937600,1031443200,1033948800,1036540800,1039046400,1041638400,1044144000,
           1046736000,1049328000,1051833600,1054425600,1057017600,1059523200,1062115200,1064620800,1067126400,1069718400,1072224000,1074816000,
           1077321600,1079913600,1082419200,1085011200,1087603200,1090108800,1092700800,1095206400,1097798400,1100390400,1102896000,1105488000,
           1107993600,1110499200,1113091200,1115596800,1118188800,1120694400,1123286400,1125878400,1128384000,1130976000,1133568000,1136073600,
           1138665600,1141171200,1143676800,1146268800,1148774400,1151366400,1153872000,1156464000,1159056000,1161561600,1164153600,1166745600,
           1169251200,1171843200,1174348800,1176854400,1179446400,1181952000,1184457600,1187049600,1189641600,1192233600,1194739200,1197331200,
           1199923200,1202428800,1205020800,1207526400,1210032000,1212624000,1215129600,1217635200,1220227200,1222819200,1225324800,1227916800,
           1230508800,1233014400,1235606400,1238198400,1240704000,1243209600,1245801600,1248307200,1250899200,1253404800,1255996800,1258502400,
           1261094400,1263600000,1266192000,1268784000,1271289600,1273881600,1276387200,1278979200,1281484800,1284076800,1286582400,1289088000,
           1291680000,1294185600,1296777600,1299369600,1301961600,1304467200,1307059200,1309564800,1312156800,1314662400,1317254400,1319760000,
           1322265600,1324857600,1327363200,1329955200,1332547200,1335052800,1337644800,1340236800,1342742400,1345334400,1347840000,1350432000,
           1352937600,1355443200,1358035200,1360540800,1363132800,1365638400,1368230400,1370822400,1373328000,1375920000,1378512000,1381017600,
           1383523200,1386115200,1388620800,1391212800,1393718400,1396310400,1398816000,1401408000,1403913600,1406505600,1409097600,1411603200
);

function GtoH(dt) {
        if(dt == '') return "";
        var d = parseInt(dt.substr(6,2),10);
        var m = parseInt(dt.substr(4,2),10);
        var y = parseInt(dt.substr(0,4),10);
        var dofst = 60 * 60 * 24;
        var l = HGDatesTable.length - 1;
        var tsmpx = Date.UTC(y,m-1,d);
        var tsmp = tsmpx.valueOf() / 1000;
        if(tsmp < HGDatesTable[0] || tsmp > HGDatesTable[l]) return "";
        i = FindArrEl(0,l,tsmp);
        yr = intPart(i/12) + HGDatesStartYear;
        dy = intPart((tsmp - HGDatesTable[i-1]) / dofst);
        mn = mode(i,12);
        if(mn == 0) {mn=12;yr--;}
        return formatMyDt(dy,mn,yr);
}

function HtoG(dt) {
        if(dt == '') return "";
        var d = parseInt(dt.substr(6,2),10);
        var m = parseInt(dt.substr(4,2),10);
        var y = parseInt(dt.substr(0,4),10);
        var dofst = 60 * 60 * 24;
        var l = HGDatesTable.length - 1;
        var u = (y - HGDatesStartYear) * 12 + m - 1;
        if(u < 0 || u > l) return '';
        dd = HGDatesTable[(y - HGDatesStartYear) * 12 + m - 1] + d * dofst;
        dd = dd * 1000;
        var md = new Date(dd);
        return formatMyDt(md.getUTCDate(),md.getUTCMonth()+1,md.getUTCFullYear());
}

function FindArrEl(s,e,v) {
        if(e - s < 2) {
                return s+1;
        } else {
                n = intPart((e-s)/2+s);
                if(HGDatesTable[n] > v) return FindArrEl(s,n,v); else return FindArrEl(n,e,v);
        }
}

function greToHij(dt) {
        var tbldt = GtoH(dt);
        if(tbldt != '') return tbldt;
        var d = parseInt(dt.substr(6,2),10);
        var m = parseInt(dt.substr(4,2),10);
        var y = parseInt(dt.substr(0,4),10);

        if ((y>1582)||((y==1582)&&(m>10))||((y==1582)&&(m==10)&&(d>14))) {
                        jd=intPart((1461*(y+4800+intPart((m-14)/12)))/4)+intPart((367*(m-2-12*(intPart((m-14)/12))))/12)-intPart( (3* (intPart(  (y+4900+ intPart( (m-14)/12) )/100) ) ) /4)+d-32075
                } else {
                        jd = 367*y-intPart((7*(y+5001+intPart((m-9)/7)))/4)+intPart((275*m)/9)+d+1729777
                }
        l=jd-1948440+10632
        n=intPart((l-1)/10631)
        l=l-10631*n+354
        j=(intPart((10985-l)/5316))*(intPart((50*l)/17719))+(intPart(l/5670))*(intPart((43*l)/15238))
        l=l-(intPart((30-j)/15))*(intPart((17719*j)/50))-(intPart(j/16))*(intPart((15238*j)/43))+29
        m=intPart((24*l)/709)
        d=l-intPart((709*m)/24)
        y=30*n+j-30
        return formatMyDt(d,m,y)
}

function hijToGre(dt) {
        var tbldt = HtoG(dt);
        if(tbldt != '') return tbldt;
        var d = parseInt(dt.substr(6,2),10);
        var m = parseInt(dt.substr(4,2),10);
        var y = parseInt(dt.substr(0,4),10);

        jd=intPart((11*y+3)/30)+354*y+30*m-intPart((m-1)/2)+d+1948440-385
        if (jd> 2299160 ) {
                l=jd+68569
                n=intPart((4*l)/146097)
                l=l-intPart((146097*n+3)/4)
                i=intPart((4000*(l+1))/1461001)
                l=l-intPart((1461*i)/4)+31
                j=intPart((80*l)/2447)
                d=l-intPart((2447*j)/80)
                l=intPart(j/11)
                m=j+2-12*l
                y=100*(n-49)+i+l
        } else {
                j=jd+1402
                k=intPart((j-1)/1461)
                l=j-1461*k
                n=intPart((l-1)/365)-intPart(l/1461)
                i=l-365*n+30
                j=intPart((80*i)/2447)
                d=i-intPart((2447*j)/80)
                i=intPart(j/11)
                m=j+2-12*i
                y=4*k+n+i-4716
        }
        return formatMyDt(d,m,y)
}

function formatMyDt(d,m,y) {
        var d1 = new String(d); if(d1.length == 1) d1 = '0' + d1;
        var m1 = new String(m); if(m1.length == 1) m1 = '0' + m1;
        var y1 = new String(y);
        return y1+m1+d1
}

function intPart(floatNum) {
        if (floatNum< -0.0000001) {
                 return Math.ceil(floatNum-0.0000001)
        }
        return Math.floor(floatNum+0.0000001)
}

function mode(i,n2) {
       return intPart((i/n2 - intPart(i/n2)) * n2);
}