function CDegree(type)
{
    var degr = null;
    if(type == 0)
        degr = new CDegreeOrdinary(1);
    else if(type == 1)
        degr = new CDegreeOrdinary(-1);
    else if(type == 2)
        degr = new CDegreeSubSup(0);
    else if(type == 3)
        degr = new CDegreeSubSup(1);

    return degr;
}

function CDegreeOrdinary(index)
{
    this.index = index;
    this.constPos = null;
    CMathBase.call(this, 1, 2);
}
extend(CDegreeOrdinary, CMathBase);
CDegreeOrdinary.prototype.SH_DEGR = 2/3;
CDegreeOrdinary.prototype.setContent = function()
{
    var oBase = null;
    if(arguments.length > 0)
        oBase = arguments[0];
    else
    {
        oBase = new CMathBase(1, 1);
        oBase.init( this.params );
        oBase.relate(this);
        oBase.fillPlaceholders();
    }

    var oDegree = new CMathBase(1, 1);
    oDegree.init( this.params );
    oDegree.relate(this);
    oDegree.fillPlaceholders();
    oDegree.setFont(getTypeDegree(this.params.font), -1);

    CDegreeOrdinary.superclass.setContent.call(this, oBase, oDegree);

}
CDegreeOrdinary.prototype.recalculateSize = function()
{
    var Widths = this.getWidthsHeights().widths;
    var Heights = [this.elements[0][0].size.height, this.elements[0][1].size.height];
    var _center;

    var middle = ((Heights[0] > Heights[1]) ? Heights[1] : Heights[0])*this.SH_DEGR;
    
    var _height = Heights[0] + Heights[1] - middle;

    var _width = 0;
    for( var i = 0; i < Widths.length; i++ )
        _width += Widths[i];

    _width += this.dW;

    if(this.index === 1 )
    {
        this.constPos = 0;
        _center = _height - (this.elements[0][0].size.height - this.elements[0][0].size.center);
    }
    else if(this.index === -1 )
    {
        this.constPos = _height - this.elements[0][1].size.height;
        _center = this.elements[0][0].size.center;
    }

    this.size = {width: _width,height: _height, center: _center};
}
CDegreeOrdinary.prototype.setPosition = function(_pos)
{
    var pos = _pos;
    if(this.bMObjs === true)
    {
        pos = {x: pos.x, y: pos.y + this.size.center };
    }

    this.elements[0][0].setPosition({x: pos.x, y: pos.y - this.elements[0][0].size.center });
    this.elements[0][1].setPosition({x: pos.x + this.elements[0][0].size.width + this.dW, y: pos.y + this.constPos - this.size.center});
    /*this.elements[0][0].setPosition({x: pos.x, y: pos.y });
    this.elements[0][1].setPosition({x: pos.x + this.elements[0][0].size.width + this.dW, y: pos.y + this.constPos - this.size.center + this.elements[0][1].size.center});*/
}
CDegreeOrdinary.prototype.findDisposition = function( mCoord )
{
    var posCurs = null, mouseCoord = null, flag = false;

    if( mCoord.x < this.elements[0][0].size.width )
    {
        if( this.elements[this.CurPos_X][this.CurPos_Y].IsJustDraw() )
        {
            posCurs = {x: 0, y: 1};
            mouseCoord = {x: 0, y: mCoord.y - this.constPos};
            flag = false;
        }
        else
        {
            posCurs = {x: 0, y: 0};
            mouseCoord = {x: mCoord.x, y: mCoord.y - ( this.size.center - this.elements[0][0].size.center)};
            flag = true;
        }
    }
    else if(mCoord.x < (this.elements[0][0].size.width + this.dW ) )
    {
        posCurs = {x:0, y:1};
        mouseCoord = {x: 0, y:  mCoord.y - this.constPos};
        flag = false;

    }
    else
    {
        posCurs = {x:0, y:1};
        mouseCoord = {x: mCoord.x - (this.elements[0][0].size.width + this.dW ), y: mCoord.y - this.constPos};
        flag = true;
    }

    return {pos: posCurs, mCoord: mouseCoord, flag: flag};
}

function CDegreeSubSup(type)
{
    CSubMathBase.call(this, 1, 2);
    this.type = type;
}
extend(CDegreeSubSup, CSubMathBase);
CDegreeSubSup.prototype.setContent = function()
{

    var oBase = null;
    if(arguments.length > 0)
        oBase = arguments[0];
    else
    {
        oBase = new CMathBase(1, 1);
        oBase.init( this.params );
        oBase.relate(this);
        oBase.fillPlaceholders();
    }

    var oDegree = new CMathBase(2, 1);
    oDegree.init( this.params );
    oDegree.relate(this);
    oDegree.fillPlaceholders();
    oDegree.setFont(getTypeDegree(this.params.font), -1);

    oDegree.setDistance = function() {

        var metrics = this.params.font.metrics;
        var descF = this.elements[0][0].size.height - this.elements[0][0].size.center ,
            ascS = this.elements[1][0].size.center ;

        var up = 0;
        var down = 0;
        if(this.lUp  > descF)
            up = this.lUp - descF;
        if( this.lD > ascS )
            down = this.lD - ascS;

        this.dH = up + down;
        this.dW = 0;

    };
    oDegree.getCenter = function()
    {
        var center = 0;
        var descF = this.elements[0][0].size.height - this.elements[0][0].size.center;

        if( this.lUp > descF )
            center = this.elements[0][0].size.center + this.lUp;
        else
            center = this.elements[0][0].size.height;

        return center;
    };

    oDegree.lUp = 0;
    oDegree.lD = 0;

    if(this.type == 0)
    {
        oDegree.alignHor(-1, 0);
        CDegreeSubSup.superclass.setContent.call(this, oBase, oDegree);
    }
    else
    {
        oDegree.alignHor(-1, 1);
        CDegreeSubSup.superclass.setContent.call(this, oDegree, oBase);
    }
}
CDegreeSubSup.prototype.recalculateSize = function()
{
    if(this.type == 0)
    {
        this.elements[0][1].lUp = this.elements[0][0].size.center;
        this.elements[0][1].lD = this.elements[0][0].size.height - this.elements[0][0].size.center;
        this.elements[0][1].setDistance();
        this.elements[0][1].recalculateSize();
    }
    else
    {
        this.elements[0][0].lUp = this.elements[0][1].size.center;
        this.elements[0][0].lD = this.elements[0][1].size.height - this.elements[0][1].size.center;
        this.elements[0][0].setDistance();
        this.elements[0][0].recalculateSize();
    }

    CSubMathBase.superclass.recalculateSize.call(this);
}
//выяcнить: почему и с этой ф-ией и без нее работает всё ok...
//всё ok, т.к. в контенте 2 элемента, и их center сравниваем
/*CDegreeSubSup.prototype.getCenter = function()
{
    var center = 0;
    if(this.type == 0)
        center = this.elements[0][1].size.center;
    else
        center = this.elements[0][0].size.center;

    return center;
}*/