/*==================================================
 *  Geochrono Unit
 *==================================================
 */

Timeline.GeochronoUnit = new Object();

Timeline.GeochronoUnit.MA     = 0;
Timeline.GeochronoUnit.AGE    = 1;
Timeline.GeochronoUnit.EPOCH  = 2;
Timeline.GeochronoUnit.PERIOD = 3;
Timeline.GeochronoUnit.ERA    = 4;
Timeline.GeochronoUnit.EON    = 5;

Timeline.GeochronoUnit.getParser = function(format) {
    return Timeline.GeochronoUnit.parseFromObject;
};

Timeline.GeochronoUnit.createLabeller = function(locale, timeZone) {
    return new Timeline.GeochronoLabeller(locale);
};

Timeline.GeochronoUnit.wrapMA = function (n) {
    return new Timeline.GeochronoUnit._MA(n);
};

Timeline.GeochronoUnit.makeDefaultValue = function () {
    return Timeline.GeochronoUnit.wrapMA(0);
};

Timeline.GeochronoUnit.cloneValue = function (v) {
    return new Timeline.GeochronoUnit._MA(v._n);
};

Timeline.GeochronoUnit.parseFromObject = function(o) {
    if (o instanceof Timeline.GeochronoUnit._MA) {
        return o;
    } else if (typeof o == "number") {
        return Timeline.GeochronoUnit.wrapMA(o);
    } else if (typeof o == "string" && o.length > 0) {
        return Timeline.GeochronoUnit.wrapMA(Number(o));
    } else {
        return null;
    }
};

Timeline.GeochronoUnit.toNumber = function(v) {
    return v._n;
};

Timeline.GeochronoUnit.fromNumber = function(n) {
    return new Timeline.GeochronoUnit._MA(n);
};

Timeline.GeochronoUnit.compare = function(v1, v2) {
    var n1, n2;
    if (typeof v1 == "object") {
        n1 = v1._n;
    } else {
        n1 = Number(v1);
    }
    if (typeof v2 == "object") {
        n2 = v2._n;
    } else {
        n2 = Number(v2);
    }
    
    return n2 - n1;
};

Timeline.GeochronoUnit.earlier = function(v1, v2) {
    return Timeline.GeochronoUnit.compare(v1, v2) < 0 ? v1 : v2;
};

Timeline.GeochronoUnit.later = function(v1, v2) {
    return Timeline.GeochronoUnit.compare(v1, v2) > 0 ? v1 : v2;
};

Timeline.GeochronoUnit.change = function(v, n) {
    return new Timeline.GeochronoUnit._MA(v._n - n);
};

Timeline.GeochronoUnit._MA = function(n) {
    this._n = n;
};