function unifyRect (rect1, rect2)
{
    if (rect1 && rect2)
        return rect.get_union (rect1, rect2);
    else if (rect1)
        return rect1;
    else if (rect2)
        return rect2;
    else 
        return null;
}


function unifyGeometry (geom1, geom2)
{
    return Extend (geom1, geom2);
}


function unifyArray (arr1, arr2)
{
    var arr3 = [];

    for (var i = 0; i < arr1.length || i < arr2.length; i++)
    {
        if (i < arr1.length && i < arr2.length)
            arr3[i] = unifyMember (arr1[i], arr2[i]);
        else if (i < arr1.length)
            arr3[i] = arr1[i];
        else if (i < arr2.length)
            arr3[i] = arr2[i];
    }            

    return arr3;
}

function unifyObject (m1, m2)
{
    var m3 = {};
    
    for (var m in m1)
    {
        if (typeof m2[m] != "undefined")
            m3[m] = unify (m1[m], m2[m]);
        else
            m3[m] = unify (m1[m], m1[m]);   // Unify to clone
    }
    
    for (var m in m2)
    {
        if (typeof m3[m] == "undefined")
            m3[m] = unify (m2[m], m2[m]);   // Unify to clone
    }
    
    return m3; 
}

function unifyString (m1, m2)
{
    var m3 = "";

    if (m1 == m2)
        return m1;
    else
    {
        var arr = m1.split("|");
        for (var i = 0; i < arr.length; i++)
            if (arr[i] == m2)
                return m1;
                
        return m1 + "|" + m2;
    }            
}

function unifyDate (d1, d2)
{
    if (d1 instanceof Date)
        d1 = dateToString (d1);

    if (d2 instanceof Date)
        d2 = dateToString (d2);
        
    if (d1 == d2)
        return d1;
    else
        return unifyString (d1, d2);
}




function unify (m1, m2)
{
    if ((m1 instanceof i_geometry) && (m2 instanceof i_geometry))   // Se geometria
        return unifyGeometry (m1, m2);
    else if ((m1 instanceof rect) && (m2 instanceof rect))          // Se rettangolo
        return unifyRect (m1, m2);
    else if ((m1 instanceof Array) && (m2 instanceof Array))        // se Array
        return unifyArray ();
    else if ((m1 instanceof Date) || (m2 instanceof Date))
        return unifyDate (m1, m2);
    else if ((m1 instanceof Object) && (m2 instanceof Object))
        return unifyObject (m1, m2);
    else if (typeof (m1) == "string" && typeof (m2) == "string")
        return unifyString (m1, m2);
    else if (typeof (m1) == "number" && typeof (m2) == "number")
        return m1 + m2;
    else if (typeof (m1) != "undefined" && m1 != null)
        return m1;        
    else if (typeof (m2) != "undefined" && m2 != null)
        return m2;        
    else 
        return null;        
}


function groupObjectArrayByMemberName (objectArray, memberName)
{
    var unifiedObject = {};
    for (var i = 0; i < objectArray.length; i++)
    {
        var m = objectArray[i][memberName];
        if (typeof (unifiedObject [m]) != "undefined")
            unifiedObject [m] = unifyObject(unifiedObject [m], objectArray[i]);
        else
            unifiedObject [m] = objectArray[i];
    }				


    var unifiedArray = [];
    for (var m in unifiedObject)
        unifiedArray.push (unifiedObject[m]);

    return unifiedArray;
}


function arrayfy (o, m)
{
    return o instanceof Array?o:(typeof(m) != "undefined" && o[m]?[o[m]]:[o]);
}
