import { hooks } from '../utils/hooks'; import hasOwnProp from '../utils/has-own-prop'; import isUndefined from '../utils/is-undefined'; import getParsingFlags from '../create/parsing-flags';

// Plugins that add properties should also add the key here (null value), // so we can properly clone ourselves. var momentProperties = hooks.momentProperties = [];

export function copyConfig(to, from) {

var i, prop, val;

if (!isUndefined(from._isAMomentObject)) {
    to._isAMomentObject = from._isAMomentObject;
}
if (!isUndefined(from._i)) {
    to._i = from._i;
}
if (!isUndefined(from._f)) {
    to._f = from._f;
}
if (!isUndefined(from._l)) {
    to._l = from._l;
}
if (!isUndefined(from._strict)) {
    to._strict = from._strict;
}
if (!isUndefined(from._tzm)) {
    to._tzm = from._tzm;
}
if (!isUndefined(from._isUTC)) {
    to._isUTC = from._isUTC;
}
if (!isUndefined(from._offset)) {
    to._offset = from._offset;
}
if (!isUndefined(from._pf)) {
    to._pf = getParsingFlags(from);
}
if (!isUndefined(from._locale)) {
    to._locale = from._locale;
}

if (momentProperties.length > 0) {
    for (i = 0; i < momentProperties.length; i++) {
        prop = momentProperties[i];
        val = from[prop];
        if (!isUndefined(val)) {
            to[prop] = val;
        }
    }
}

return to;

}

var updateInProgress = false;

// Moment prototype object export function Moment(config) {

copyConfig(this, config);
this._d = new Date(config._d != null ? config._d.getTime() : NaN);
if (!this.isValid()) {
    this._d = new Date(NaN);
}
// Prevent infinite loop in case updateOffset creates new moment
// objects.
if (updateInProgress === false) {
    updateInProgress = true;
    hooks.updateOffset(this);
    updateInProgress = false;
}

}

export function isMoment (obj) {

return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);

}