function matrixManagerFunction(){

    var mat = new Matrix();

    var returnMatrix3D = function(rX, rY, rZ, scaleX, scaleY, scaleZ, tX, tY, tZ) {

        var rotationXMatrix, rotationYMatrix, rotationZMatrix, s, scaleMatrix, transformationMatrix, translationMatrix;
        rotationXMatrix = $M([
            [1, 0, 0, 0],
            [0, Math.cos(rX), Math.sin(-rX), 0],
            [0, Math.sin(rX), Math.cos(rX), 0],
            [0, 0, 0, 1]]);

        rotationYMatrix = $M([
            [Math.cos(rY), 0, Math.sin(rY), 0],
            [0, 1, 0, 0],
            [Math.sin(-rY), 0, Math.cos(rY), 0],
            [0, 0, 0, 1]]);

        rotationZMatrix = $M([
            [Math.cos(rZ), Math.sin(-rZ), 0, 0],
            [Math.sin(rZ), Math.cos(rZ), 0, 0],
            [0, 0, 1, 0],
            [0, 0, 0, 1]]);


        scaleMatrix = $M([[scaleX, 0, 0, 0], [0, scaleY, 0, 0], [0, 0, scaleZ, 0], [0, 0, 0, 1]]);

        transformationMatrix = rotationXMatrix.x(rotationYMatrix).x(rotationZMatrix).x(scaleMatrix);
        transformationMatrix = transformationMatrix.transpose();
        translationMatrix = $M([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [tX, tY, tZ, 1]]);
        transformationMatrix = transformationMatrix.x(translationMatrix); // Apply transformation matrix AFTER transposing rotation and scale

        s = "matrix3d(";
        s += transformationMatrix.e(1, 1).toFixed(5) + "," + transformationMatrix.e(1, 2).toFixed(5) + "," + transformationMatrix.e(1, 3).toFixed(5) + "," + transformationMatrix.e(1, 4).toFixed(5) + ",";
        s += transformationMatrix.e(2, 1).toFixed(5) + "," + transformationMatrix.e(2, 2).toFixed(5) + "," + transformationMatrix.e(2, 3).toFixed(5) + "," + transformationMatrix.e(2, 4).toFixed(5) + ",";
        s += transformationMatrix.e(3, 1).toFixed(5) + "," + transformationMatrix.e(3, 2).toFixed(5) + "," + transformationMatrix.e(3, 3).toFixed(5) + "," + transformationMatrix.e(3, 4).toFixed(5) + ",";
        s += transformationMatrix.e(4, 1).toFixed(5) + "," + transformationMatrix.e(4, 2).toFixed(5) + "," + transformationMatrix.e(4, 3).toFixed(5) + "," + transformationMatrix.e(4, 4).toFixed(5);
        s += ")";

        return s;
    };

    /*var returnMatrix2D = function(rX, scaleX, scaleY, tX, tY){
        var rotationMatrix,  s, scaleMatrix, transformationMatrix, translationMatrix;
        //cos(X), sin(X), -sin(X), cos(X)
        rotationMatrix = $M([
            [Math.cos(-rX), Math.sin(-rX), 0],
            [Math.sin(rX), Math.cos(-rX), 0],
            [0, 0, 1]
        ]);
        scaleMatrix = $M([[scaleX, 0, 0], [0, scaleY, 0], [0, 0, 1]]);
        transformationMatrix = rotationMatrix.x(scaleMatrix);
        transformationMatrix = transformationMatrix.transpose();
        translationMatrix = $M([[1, 0, 0], [0, 1, 0], [tX, tY, 1]]);
        transformationMatrix = transformationMatrix.x(translationMatrix);

        s = "matrix(";
        s += transformationMatrix.e(1, 1).toFixed(5) + "," + transformationMatrix.e(1, 2).toFixed(5) + ",";
        s += transformationMatrix.e(2, 1).toFixed(5) + "," + transformationMatrix.e(2, 2).toFixed(5) + ",";
        s += transformationMatrix.e(3, 1).toFixed(5) + "," + transformationMatrix.e(3, 2).toFixed(5);
        s += ")";

        return s;
    };*/

    var returnMatrix2D = function(rX, scaleX, scaleY, tX, tY){
        return mat.reset().translate(tX,tY).rotate(rX).scale(scaleX,scaleY).toCSS();
    };

    /*var returnMatrix2DArray = function(rX, scaleX, scaleY, tX, tY){
        var rotationMatrix,  scaleMatrix, transformationMatrix, translationMatrix;
        //cos(X), sin(X), -sin(X), cos(X)
        rotationMatrix = $M([
            [Math.cos(-rX), Math.sin(-rX), 0],
            [Math.sin(rX), Math.cos(-rX), 0],
            [0, 0, 1]
        ]);
        scaleMatrix = $M([[scaleX, 0, 0], [0, scaleY, 0], [0, 0, 1]]);
        transformationMatrix = rotationMatrix.x(scaleMatrix);
        transformationMatrix = transformationMatrix.transpose();
        translationMatrix = $M([[1, 0, 0], [0, 1, 0], [tX, tY, 1]]);
        transformationMatrix = transformationMatrix.x(translationMatrix);

        return [transformationMatrix.e(1, 1).toFixed(5),transformationMatrix.e(1, 2).toFixed(5)
            ,transformationMatrix.e(2, 1).toFixed(5),transformationMatrix.e(2, 2).toFixed(5)
            ,transformationMatrix.e(3, 1).toFixed(5),transformationMatrix.e(3, 2).toFixed(5)];
    };*/

    var returnMatrix2DArray = function(rX, scaleX, scaleY, tX, tY){
        return mat.reset().translate(tX,tY).rotate(rX).scale(scaleX,scaleY).toArray();
    };

    var get2DMatrix = function(animData){
        return returnMatrix2D(animData.r
            ,animData.s[0],animData.s[1]
            ,animData.p[0],animData.p[1]);
    };

    var getMatrix = function(animData, isThreeD){
        if(!isThreeD){
            return returnMatrix2D(animData.tr.r[2]
                ,animData.tr.s[0],animData.tr.s[1]
                ,animData.tr.p[0],animData.tr.p[1]);
        }
        return returnMatrix3D(-animData.tr.r[0],animData.tr.r[1],animData.tr.r[2]
            ,animData.tr.s[0],animData.tr.s[1],animData.tr.s[2]
            ,animData.tr.p[0],animData.tr.p[1],animData.tr.p[2])
    };

    var getMatrix2 = function(animData, isThreeD){
        if(!isThreeD){
            return returnMatrix2D(animData.r[2]
                ,animData.s[0],animData.s[1]
                ,animData.p[0],animData.p[1]);
        }
        return returnMatrix3D(-animData.r[0],animData.r[1],animData.r[2]
            ,animData.s[0],animData.s[1],animData.s[2]
            ,animData.p[0],animData.p[1],animData.p[2])
    };

    var getMatrixArray = function(animData, isThreeD){
        if(!isThreeD){
            return returnMatrix2DArray(animData.r[2]
                ,animData.s[0],animData.s[1]
                ,animData.p[0],animData.p[1]);
        }
        return null;
    };

    return {
        get2DMatrix : get2DMatrix,
        getMatrix : getMatrix,
        getMatrix2 : getMatrix2,
        getMatrixArray : getMatrixArray,
        getMatrixArrayFromParams : returnMatrix2DArray,
        getMatrix2FromParams : returnMatrix2D
    }

};
var MatrixManager = matrixManagerFunction;