A Flash Developer Resource Site

Results 1 to 4 of 4

Thread: [F8] sortOn() doesn't work!

  1. #1
    Junior Member
    Join Date
    Aug 2007
    Posts
    24

    [F8] sortOn() doesn't work!

    I'm trying to make a sorted array of an existing array full of objects.

    The constructor for the object is the following:

    PHP Code:
    function Organ(organ:Stringlayer:Numbername:Stringinfo:String) {
        var 
    path:String;
        var 
    dummy_mc:Object;
        if (
    layer == 0) {
            
    path "skin_mc";
        }
        else if (
    layer == 1) {
            
    path "muscles_mc";
        }
        else if (
    layer == 2) {
            
    path "cardio_mc";
        }
        else if (
    layer == 3) {
            
    path "bones_mc";
        }
        else {
            
    path "_parent";
        }
        
    this _root.body_mc[path][organ];
        
    this.type "Organ";
        
    this.active false;
        
    this.blur true;
        
    this.layer layer;
        
    this.name name;
        
    this.info info;
        var 
    overFilter:GlowFilter = new GlowFilter(0xFF000000023falsefalse);
        var 
    overFilters:Array = new Array(overFilter);
        
    this.filters overFilters;
        
    //Dummy creation
        
    dummy_mc _root.dummy_mc[path][organ];
        
    dummy_mc.type "Organ";
        
    dummy_mc.name this.name;
        
    dummy_mc.active this.active;
        
    dummy_mc.blur this.blur;
        
    dummy_mc.filters overFilters;
        
    this.dummy dummy_mc;
        
    //FIRST LEVEL FUNCTION ASSIGNMENT  
        
    this.onRollOver RollOverAnimation;
        
    this.onRollOut RollOutAnimation;
        
    this.onPress ProcessOrgan;
        
    Organ_array.push(this);

    i create these 4 objects, notice the name property is the third argument:

    PHP Code:
    createOrgan("heart_mc"2"Heart""Pumps blood.");
    createOrgan("skull_mc"3"Skull""Bonestructure for protecting the brain");
    createOrgan("heart_mc"4"HeartHeartHeartHeartHeart""Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean sit amet ligula nec tellus convallis luctus. Curabitur sit amet nulla et eros molestie lacinia. Etiam ac purus in leo tempus ornare. Morbi eget felis. Phasellus neque. Morbi at libero. Praesent sapien. Aliquam lacus odio, porta dapibus, nonummy id, pulvinar et, neque. In tempus nisi id diam. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Curabitur euismod. Morbi bibendum. Suspendisse blandit blandit enim. Maecenas tristique, sapien ut mollis dapibus, lorem massa mattis nunc, vitae euismod velit est sed metus. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras non ipsum. Pellentesque luctus, arcu in porta ultricies, nulla tortor nonummy lorem, ac pretium mi leo a arcu. Curabitur tellus. Cras porta interdum odio. In et nibh.");
    createOrgan("qkull_mc"4"SkullySkullySkullySkullySkully""Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean sit amet ligula nec tellus convallis luctus. Curabitur sit amet nulla et eros molestie lacinia. Etiam ac purus in leo tempus ornare. Morbi eget felis. Phasellus neque. Morbi at libero. Praesent sapien. Aliquam lacus odio, porta dapibus, nonummy id, pulvinar et, neque. In tempus nisi id diam. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Curabitur euismod. Morbi bibendum. Suspendisse blandit blandit enim. Maecenas tristique, sapien ut mollis dapibus, lorem massa mattis nunc, vitae euismod velit est sed metus. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras non ipsum. Pellentesque luctus, arcu in porta ultricies, nulla tortor nonummy lorem, ac pretium mi leo a arcu. Curabitur tellus. Cras porta interdum odio. In et nibh."); 
    then i use the following code to sort the Organ_array where they are pushed in:

    PHP Code:
            var char_array:Array = new Array();
            var 
    firstString:String;
            
    //vars for arrays
            
    var sorted_array:Array = new Array();
            
    sorted_array Organ_array.sortOn("name");
            var 
    items:Number sorted_array.length;
            var 
    itemWidth:Number = (this._width 2) / items;
            var 
    start:Number - (0.5 itemWidth * (items 1));
            var 
    item:MovieClip;
            var 
    b:Boolean false;
            for (var 
    k:Number 0sorted_array.lengthk++) {
                
    trace(sorted_array[k].name);
            } 
    but the traces always return:

    PHP Code:
    Skull
    Heart
    HeartHeartHeartHeartHeart
    SkullySkullySkullySkullySkully 
    so anybody has any idea whats going on. im positive im using the method the right way.

  2. #2
    FK'n_dog a_modified_dog's Avatar
    Join Date
    Apr 2003
    Location
    "aaarf"
    Posts
    9,176
    i threw this at a test file and the results appear OK
    can you make use of the method ?
    PHP Code:
    var Organ_array:Array = new Array(); 
    var 
    sorted_array:Array = new Array();

    function 
    createOrgan(organ:Stringlayer:Numbername:Stringinfo:String) { 
    obj = {}; 
    obj.type "Organ";
    obj.clip organ
    obj.layer layer
    obj.name name
    obj.info info
    Organ_array.push(obj); 
    };
     
    createOrgan("heart_mc"2"Heart""Pumps blood."); 
    createOrgan("skull_mc"3"Skull""Bonestructure"); 
    createOrgan("heart_mc"4"HeartHeart""Lorem ipsum"); 
    createOrgan("qkull_mc"4"SkullySkull""Lorem ipsum dolor"); 
     
    sorted_array Organ_array.concat(); 
    sorted_array.sortOn("name");

    for (var 
    k:Number 0sorted_array.lengthk++) { 
    trace(sorted_array[k].name); 


    /* output -
    Heart
    HeartHeart
    Skull
    SkullySkull
    */ 

  3. #3
    Junior Member
    Join Date
    Aug 2007
    Posts
    24
    Ty for looking into this,

    unfortunatly it didn't sort out the problem

    i tried everything but it just won't sort on the name field. i ran the debug, and even in there everything was perfect!

    so i'm really clueless now

    here's the shortened version of the code code, can anybody spot why the sortOn method gives faulty returns?

    PHP Code:
    import flash.filters.GlowFilter;
    //VARIABLES
    //
    //
    //0 = skin, 1 = muscles, 2 = cardiovascular, 3 = nerves
    var body:Number 0;
    //depths voor organs
    var depth:Number 100;
    var 
    mouseListener:Object = new Object();
    var 
    mgScroller:Object = new Object();
    var 
    Organ_array:Array = new Array();
    //FUNCTIONS
    //
    //
    //ORGAN CONSTRUCTOR
    function createOrgan(organ:Stringlayer:Numbername:Stringinfo:String):Void {
        var 
    organ:Object = new Organ(organlayernameinfo);
    }
    function 
    Organ(organ:Stringlayer:Numbername:Stringinfo:String) {
        var 
    path:String;
        var 
    dummy_mc:Object;
        if (
    layer == 0) {
            
    path "skin_mc";
        }
        else if (
    layer == 1) {
            
    path "muscles_mc";
        }
        else if (
    layer == 2) {
            
    path "cardio_mc";
        }
        else if (
    layer == 3) {
            
    path "bones_mc";
        }
        else {
            
    path "_parent";
        }
        
    this _root.body_mc[path][organ];
        
    this.type "Organ";
        
    this.active false;
        
    this.blur true;
        
    this.layer layer;
        
    this.name name;
        
    this.info info;
        var 
    overFilter:GlowFilter = new GlowFilter(0xFF000000023falsefalse);
        var 
    overFilters:Array = new Array(overFilter);
        
    this.filters overFilters;
        
    //Dummy creation
        
    dummy_mc _root.dummy_mc[path][organ];
        
    dummy_mc.type "Organ";
        
    dummy_mc.name this.name;
        
    dummy_mc.active this.active;
        
    dummy_mc.blur this.blur;
        
    dummy_mc.filters overFilters;
        
    this.dummy dummy_mc;
        
    //FIRST LEVEL FUNCTION ASSIGNMENT  
        
    this.onRollOver RollOverAnimation;
        
    this.onRollOut RollOutAnimation;
        
    this.onPress ProcessOrgan;
        
    Organ_array.push(this);
    }
    function 
    ProcessOrgan():Void {
        
    //SECOND SUB LEVEL FUNCTION ASSIGNMENT
        
    Activate.apply(this);
        
    setTitleText.apply(this);
        
    setContentText.apply(this);
    }
    //LEVEL TRANSITION FUNCTIONS
    //
    //
    function transitionInitialize():Void {
        
    _root.body_mc.muscles_mc._visible false;
        
    _root.body_mc.cardio_mc._visible false;
        
    _root.body_mc.bones_mc._visible false;
        
    _root.dummy_mc.muscles_mc._visible false;
        
    _root.dummy_mc.cardio_mc._visible false;
        
    _root.dummy_mc.bones_mc._visible false;
    }
    function 
    fadeOut():Void {
        var 
    100;
        
    this.onEnterFrame = function() {
            
    -= 5;
            
    this._alpha k;
            if (
    <= 0) {
                
    this._visible false;
                
    delete this.onEnterFrame;
            }
        };
    }
    function 
    fadeIn():Void {
        var 
    0;
        
    this._alpha k;
        
    this._visible true;
        
    this.onEnterFrame = function() {
            
    += 5;
            
    this._alpha k;
            if (
    >= 100) {
                
    this._alpha 100;
                
    delete this.onEnterFrame;
            }
        };
    }
    function 
    bodyLevel():Void {
        if (
    _root.LevelScroller_mc.BodyIndicator.lock == false) {
            switch (
    body) {
                
    //SECOND SUB LEVEL FUNCTION ASSIGNMENT
            
    case :
                
    fadeIn.apply(_root.dummy_mc.skin_mc);
                
    fadeOut.apply(_root.dummy_mc.muscles_mc);
                
    fadeOut.apply(_root.dummy_mc.cardio_mc);
                
    fadeOut.apply(_root.dummy_mc.bones_mc);
                break;
            case 
    :
                
    fadeOut.apply(_root.dummy_mc.skin_mc);
                
    fadeIn.apply(_root.dummy_mc.muscles_mc);
                
    fadeOut.apply(_root.dummy_mc.cardio_mc);
                
    fadeOut.apply(_root.dummy_mc.bones_mc);
                break;
            case 
    :
                
    fadeOut.apply(_root.dummy_mc.skin_mc);
                
    fadeOut.apply(_root.dummy_mc.muscles_mc);
                
    fadeIn.apply(_root.dummy_mc.cardio_mc);
                
    fadeOut.apply(_root.dummy_mc.bones_mc);
                break;
            case 
    :
                
    fadeOut.apply(_root.dummy_mc.skin_mc);
                
    fadeOut.apply(_root.dummy_mc.muscles_mc);
                
    fadeOut.apply(_root.dummy_mc.cardio_mc);
                
    fadeIn.apply(_root.dummy_mc.bones_mc);
                break;
            }
        }
    }
    function 
    mgLevel():Void {
        if (
    _root.LevelScroller_mc.MGIndicator.lock == false) {
            switch (
    body) {
                
    //SECOND SUB LEVEL FUNCTION ASSIGNMENT
            
    case :
                
    fadeIn.apply(_root.body_mc.skin_mc);
                
    fadeOut.apply(_root.body_mc.muscles_mc);
                
    fadeOut.apply(_root.body_mc.cardio_mc);
                
    fadeOut.apply(_root.body_mc.bones_mc);
                break;
            case 
    :
                
    fadeOut.apply(_root.body_mc.skin_mc);
                
    fadeIn.apply(_root.body_mc.muscles_mc);
                
    fadeOut.apply(_root.body_mc.cardio_mc);
                
    fadeOut.apply(_root.body_mc.bones_mc);
                break;
            case 
    :
                
    fadeOut.apply(_root.body_mc.skin_mc);
                
    fadeOut.apply(_root.body_mc.muscles_mc);
                
    fadeIn.apply(_root.body_mc.cardio_mc);
                
    fadeOut.apply(_root.body_mc.bones_mc);
                break;
            case 
    :
                
    fadeOut.apply(_root.body_mc.skin_mc);
                
    fadeOut.apply(_root.body_mc.muscles_mc);
                
    fadeOut.apply(_root.body_mc.cardio_mc);
                
    fadeIn.apply(_root.body_mc.bones_mc);
                break;
            }
        }
    }
    //TEXTFIELDS FUNCTION
    //
    //
    function textFieldInitialize(color:Number):Void {
        var 
    tfTitle:TextFormat = new TextFormat(null22);
        var 
    tfContent:TextFormat = new TextFormat(null12);
        var 
    indicatorDownColor:Color = new Color(this.textBoxContent_mc.scrollDown_mc.indicator_mc);
        var 
    indicatorUpColor:Color = new Color(this.textBoxContent_mc.scrollUp_mc.indicator_mc);
        
    this.textBoxContent_mc.title_txt.wordWrap false;
        
    this.textBoxContent_mc.title_txt.multiline false;
        
    this.textBoxContent_mc.title_txt.textColor color;
        
    this.textBoxContent_mc.title_txt.selectable false;
        
    this.textBoxContent_mc.title_txt.setNewTextFormat(tfTitle);
        
    this.textBoxContent_mc.content_txt.wordWrap true;
        
    this.textBoxContent_mc.content_txt.multiline true;
        
    this.textBoxContent_mc.content_txt.textColor color;
        
    this.textBoxContent_mc.content_txt.selectable false;
        
    this.textBoxContent_mc.content_txt.setNewTextFormat(tfContent);
        
    indicatorDownColor.setRGB(color);
        
    indicatorUpColor.setRGB(color);
        
    this.textBoxContent_mc.scrollDown_mc._visible false;
        
    this.textBoxContent_mc.scrollUp_mc._visible false;
        
    //SECOND SUB LEVEL FUNCTION ASSIGNMENT
        
    this.textBoxContent_mc.onEnterFrame updateScroll;
        
    //STARTING TEXT
        
    var dummy:Object = new Object();
        
    dummy.name "Welcome to BodyCheck v1.0";
        
    dummy.type "Organ";
        
    dummy.info "This is the body parts panel. Information of selected body parts will be displayed here.\n\nUse the magnifying glass on the dummy, or use the body parts piece bar below to select a body part. Use your scroll to cycle through the different layers of the human body.";
        
    setTitleText.apply(dummy);
        
    setContentText.apply(dummy);
    }
    function 
    setTitleText():Void {
        var 
    tf:TextField;
        if (
    this.type == "Organ") {
            
    tf _root.organTextBox_mc.textBoxContent_mc.title_txt;
            
    tf.text this.name;
            while (
    tf.maxhscroll 0) {
                var 
    tfTitle:TextFormat tf.getTextFormat();
                
    tfTitle.size--;
                
    tf.setTextFormat(tfTitle);
            }
        }
    }
    function 
    setContentText():Void {
        var 
    tf:TextField;
        if (
    this.type == "Organ") {
            
    tf _root.organTextBox_mc.textBoxContent_mc.content_txt;
            
    tf.text this.info;
            
    //SECOND SUB LEVEL FUNCTION ASSIGNMENT
            
    checkScroll.apply(tf, [tf]);
        }
    }
    function 
    checkScroll(tf:TextField):Void {
        if (
    tf.maxscroll 1) {
            
    tf._parent.scrollDown_mc._visible true;
            
    tf._parent.scrollUp_mc._visible true;
        }
        else {
            
    tf._parent.scrollDown_mc._visible false;
            
    tf._parent.scrollUp_mc._visible false;
        }
    }
    function 
    updateScroll():Void {
        
    this.scrollUp_mc._alpha = (((this.content_txt.scroll 1) / (this.content_txt.maxscroll 1)) * 100);
        
    this.scrollDown_mc._alpha = (100 - (((this.content_txt.scroll 1) / (this.content_txt.maxscroll 1)) * 100));
        
    this.scrollUp_mc.onPress = function() {
            
    this.onEnterFrame = function() {
                
    this._parent.content_txt.scroll--;
            };
        };
        
    this.scrollUp_mc.onRelease = function() {
            
    delete this.onEnterFrame;
        };
        
    this.scrollUp_mc.onReleaseOutside = function() {
            
    delete this.onEnterFrame;
        };
        
    this.scrollDown_mc.onPress = function() {
            
    this.onEnterFrame = function() {
                
    this._parent.content_txt.scroll++;
            };
        };
        
    this.scrollDown_mc.onRelease = function() {
            
    delete this.onEnterFrame;
        };
        
    this.scrollDown_mc.onReleaseOutside = function() {
            
    delete this.onEnterFrame;
        };
    }
    //SCROLLBAR FUNCTIONS
    //
    //
    function scrollBarInitialize(type:Stringsort:StringactiveC:NumberinactiveC:Number):Void {
        if ((
    type == "Organ") && (sort == "Alphabetic")) {
            
    //vars for placing letters
            
    var char_array:Array = new Array();
            var 
    firstString:String;
            
    //vars for arrays
            
    var sorted_array:Array = new Array();
            
    //sorted_array = Organ_array.sortOn("name");
            
    var items:Number sorted_array.length;
            var 
    itemWidth:Number = (this._width 2) / items;
            var 
    start:Number - (0.5 itemWidth * (items 1));
            var 
    item:MovieClip;
            var 
    b:Boolean false;
            
    //for (var k:Number = 0; k < sorted_array.length; k++) {
            //trace(sorted_array[k].name);
            //}
            
    for (var i:Number 0itemsi++) {
                
    item this.scrollBarFill_mc.attachMovie("ScrollItem""ScrollItem" i200 i, {_width:itemWidth_x:start_y:1});
                
    //SECOND SUB LEVEL FUNCTION ASSIGNMENT
                /*b = false;
                firstString = sorted_array[i].name.charAt(0);
                for (var j:Number = 0; j < char_array.length; j++) {
                if (firstString == char_array[j]) {
                b = true;
                }
                }
                if (b == false) {
                var mc:MovieClip = this.attachMovie("ScrollLetter", "ScrollLetter", depth, {_x:item._x});
                mc.letter_txt.text = firstString;
                trace("created " + firstString + " on " + mc._x);
                char_array.push(firstString);
                }*/
                
    scrollBarItemInitialize.apply(item, [sorted_array[i], activeCinactiveC]);
                
    start += itemWidth;
            }
        }
        else {
            
    trace("error");
        }
    }
    function 
    scrollBarItemInitialize(obj:ObjectactiveC:NumberinactiveC:Number):Void {
        var 
    inactiveColor:Color = new Color(this);
        var 
    activeColor:Color = new Color(this);
        var 
    reset:Boolean false;
        
    inactiveColor.setRGB(activeC);
        
    this._alpha 25;
        
    //THIRD SUB LEVEL FUNCTION ASSIGNMENT
        
    this.onRollOver = function() {
            
    this._alpha 50;
            
    RollOverAnimation.apply(obj);
        };
        
    this.onRollOut = function() {
            
    this._alpha 25;
            
    RollOutAnimation.apply(obj);
        };
        
    this.onPress = function() {
            
    ProcessOrgan.apply(obj);
        };
        
    this.onEnterFrame = function() {
            if (
    obj.active == true) {
                
    this._alpha 100;
                
    delete this.onRollOver;
                
    delete this.onRollOut;
                
    reset false;
            }
            else if ((
    obj.active == false) && (reset == false)) {
                
    this._alpha 25;
                
    reset true;
            }
            else {
                
    this.onRollOver = function() {
                    
    this._alpha 50;
                    
    RollOverAnimation.apply(obj);
                };
                
    this.onRollOut = function() {
                    
    this._alpha 25;
                    
    RollOutAnimation.apply(obj);
                };
            }
        };
    }
    //MAIN CODE
    //
    //
    Mouse.addListener(mouseListener);
    //ORGANS OBJECTS
    createOrgan("heart_mc"2"Heart""Pumps blood.");
    createOrgan("skull_mc"3"Skull""Bonestructure for protecting the brain");
    createOrgan("heart_mc"4"HeartHeartHeartHeartHeart""Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean sit amet ligula nec tellus convallis luctus. Curabitur sit amet nulla et eros molestie lacinia. Etiam ac purus in leo tempus ornare. Morbi eget felis. Phasellus neque. Morbi at libero. Praesent sapien. Aliquam lacus odio, porta dapibus, nonummy id, pulvinar et, neque. In tempus nisi id diam. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Curabitur euismod. Morbi bibendum. Suspendisse blandit blandit enim. Maecenas tristique, sapien ut mollis dapibus, lorem massa mattis nunc, vitae euismod velit est sed metus. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras non ipsum. Pellentesque luctus, arcu in porta ultricies, nulla tortor nonummy lorem, ac pretium mi leo a arcu. Curabitur tellus. Cras porta interdum odio. In et nibh.");
    createOrgan("qkull_mc"4"SkullySkullySkullySkullySkully""Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean sit amet ligula nec tellus convallis luctus. Curabitur sit amet nulla et eros molestie lacinia. Etiam ac purus in leo tempus ornare. Morbi eget felis. Phasellus neque. Morbi at libero. Praesent sapien. Aliquam lacus odio, porta dapibus, nonummy id, pulvinar et, neque. In tempus nisi id diam. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Curabitur euismod. Morbi bibendum. Suspendisse blandit blandit enim. Maecenas tristique, sapien ut mollis dapibus, lorem massa mattis nunc, vitae euismod velit est sed metus. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras non ipsum. Pellentesque luctus, arcu in porta ultricies, nulla tortor nonummy lorem, ac pretium mi leo a arcu. Curabitur tellus. Cras porta interdum odio. In et nibh.");
    //SCROLLER OBJECTS
    createScroller(_root.LevelScroller_mc"BodyIndicator");
    createScroller(_root.LevelScroller_mc"MGIndicator");
    //INITIALIZATIONS/FIRST LEVEL FUNCTION ASSIGNMENT
    mouseTrack("mg");
    textFieldInitialize.apply(_root.organTextBox_mc, [0xFF0000]);
    textFieldInitialize.apply(_root.diseaseTextBox_mc, [0x0000FF]);
    scrollBarInitialize.apply(_root.organAlphabeticScroller_mc, ["Organ""Alphabetic"0xFF00000x00FFFF]);
    transitionInitialize();
    scollerIndicator();
    //TESTING
    //
    //
    //this.onEnterFrame = function() {
    //trace(_root.organTextBox_mc.textBoxContent_mc.content_txt.scroll + "/" + _root.organTextBox_mc.textBoxContent_mc.content_txt.maxscroll);
    //};
    Organ_array.sortOn("name");
    for (var 
    k:Number 0Organ_array.lengthk++) {
        
    trace(Organ_array[k].name);


  4. #4
    Junior Member
    Join Date
    Aug 2007
    Posts
    24
    sooooo i found some interesting stuff regarding this most irritating issue

    i traced the 'objects' and it seems, i'm not dealing with objects (that's a nasty suprise to find out when working several weeks on this ). it looks like im dealing with movieclips, but with several added properties.

    i came to this conclusion when i traced the content of the Organ_array. when dealing with objects, the traces always output [Object object]. but the Organ_array outputs movieclip paths!

    PHP Code:
    for (var k:Number 0Organ_array.lengthk++) {
        
    trace(Organ_array[k]);
    }
    trace(" ");
    Organ_array.sortOn("name");
    for (var 
    k:Number 0Organ_array.lengthk++) {
        
    trace(Organ_array[k]);

    generates the following outputs:

    PHP Code:
    _level0.body_mc.cardio_mc.heart_mc
    _level0
    .body_mc.bones_mc.skull_mc
    _level0
    .heart_mc
    _level0
    .aqkull_mc
     
    _level0
    .aqkull_mc
    _level0
    .body_mc.bones_mc.skull_mc
    _level0
    .body_mc.cardio_mc.heart_mc
    _level0
    .heart_mc 
    so i think i must eeehmmm tunr my movieclips into objects?? is it possible to attach a graphic appearance of a movieclip to an object??

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  




Click Here to Expand Forum to Full Width

HTML5 Development Center