/*****************/
/* SORT MANAGER  */
/*****************/
function SortManager() {
    this.originalItems = new Array();
    this.sortedItems   = new Array();
    this.previousSortMethod = null;
    this.previousSortField = null;
    this.previousSortDirection = null;
    this.originalX = null;
    this.originalY = null;
    this.onComplete;
    this.inProgressIndex;
    this.animationSpeed = .70;

    this.addSortItem = function(sortItemId, sortItemFields){
        this.originalItems[this.originalItems.length] = new SortItem(sortItemId, sortItemFields);
    };
    
    this.updateSortItem = function(sortItemId, sortFieldKey, sortFieldValue) {
        for (var itemId in this.originalItems) {
           if (this.originalItems[itemId].id == sortItemId) {
                this.originalItems[itemId].sortFields[sortFieldKey] = sortFieldValue;
                return;
            } 
        }
    };
        
    this.animateDivs = function(){
        this.inProgressIndex = 0;
        var topCornerXY =  YAHOO.util.Dom.getXY(this.originalItems[0].element.parentNode);
        this.originalX = topCornerXY[0];
        this.originalY = topCornerXY[1];
                    
        var lvMarginTop         = SortUtil.retrieveNumericValue(this.sortedItems[0].element, 'marginTop');
        var lvMarginBottom      = SortUtil.retrieveNumericValue(this.sortedItems[0].element, 'marginBottom');
        var lvSelectedMargin    = (lvMarginTop > lvMarginBottom) ? lvMarginTop : lvMarginBottom;            
        var lnRunningDivHeight  = this.originalY;
                    
        var animations = new Array();
        for(var i = 0; i < this.sortedItems.length; i++){
            var moveDiv = new YAHOO.util.Motion(this.sortedItems[i].element, {sortManager: this, points: { to:[this.originalX, lnRunningDivHeight] }}, this.animationSpeed, YAHOO.util.Easing.easeBoth);                
            moveDiv.onComplete.subscribe(this.doneMoving);
            animations[animations.length] = moveDiv;
            moveDiv.animate();
            lnRunningDivHeight += (this.sortedItems[i].element.offsetHeight + lvSelectedMargin);
        }
    };
    
    this.doneMoving = function(obj) {
        var sm = this.attributes.sortManager;
        if (sm.sortedItems.length-1 == sm.inProgressIndex) {
            if (sm.onComplete) {
                sm.onComplete();
                sm.onComplete = null;
            }
        } else {
            sm.inProgressIndex++;
        }
        //alert("this.attributes.sortManager: " + this.attributes.sortManager);
//        var divId = this.getEl().id;
//        alert("divId: " + divId);
//        if (divId == sortManager.sortedItems[sortManager.sortedItems.length-1].id) {
 //           alert("divId " + divId + " was the last....all done");
 //       }
//        var fade = new YAHOO.util.Anim(divId, { opacity: {to: 1} }, .10, YAHOO.util.Easing.easeBoth);
//        fade.animate();
    };
    
    this.redoSort = function() {
        this.sortedItems = this.previousSortMethod(this.originalItems, this.previousSortField);
        if(this.previousSortDirection == SortUtil.DESCENDING){                        
            this.sortedItems.reverse();
        }
        
        this.animateDivs();
    };
    
    this.performSort = function(pSortField, pSortMethod, pSortDirection){
        if((pSortField != this.previousSortField) || (pSortDirection != this.previousSortDirection)){
            this.sortedItems = pSortMethod(this.originalItems, pSortField);
            if((pSortDirection != undefined) && (pSortDirection == SortUtil.DESCENDING)){
                this.sortedItems.reverse();
                this.previousSortDirection = SortUtil.DESCENDING;
            }
            else if(typeof(pSortDirection) == "undefined" && (pSortField == this.previousSortField)){
                if(this.previousSortDirection == SortUtil.ASCENDING){                        
                    this.sortedItems.reverse();
                }
                this.previousSortDirection = -this.previousSortDirection + 1;
            }
            else{                    
                this.previousSortDirection = SortUtil.ASCENDING;
            }
            this.previousSortField = pSortField;
            this.previousSortMethod = pSortMethod;
            this.animateDivs();
        }
    };
}

/*****************/
/* SORT ITEM     */
/*****************/
function SortItem(pSortItemId, pSortItemFields){
    this.id = pSortItemId;
    this.element = document.getElementById(pSortItemId);
    
    if (typeof(pSortItemFields) == "object" && pSortItemFields.constructor == Array) {
        this.sortFields = {};
        for (var key in pSortItemFields) {
            this.sortFields[key] = pSortItemFields[key];//SortUtil.trim(pSortItemFields[key]);
        }
    } else {
        this.sortFields = pSortItemFields;
    }
}


/*****************/
/* SORT UTIL     */
/*****************/
var SortUtil = new function(){
    this.ASCENDING = 1;
    this.DESCENDING = 0;

    this.sortByNumeric = function(pItems, pField){                
        var loReturnSortArray = new Array();
        for(var i=0; i<pItems.length; i++){
            loReturnSortArray[i] = pItems[i];
        }
        for(x=0; x<loReturnSortArray.length; x++) {
            for(y=0; y<loReturnSortArray.length; y++) {
                if(parseFloat(loReturnSortArray[x].sortFields[pField]) > parseFloat(loReturnSortArray[y].sortFields[pField])) {
                    holder = loReturnSortArray[y];
                    loReturnSortArray[y] = loReturnSortArray[x];
                    loReturnSortArray[x] = holder;
                }
            }
        }
        return loReturnSortArray;            
    };
    
    this.sortByAlpha = function(pItems, pField){
        var loReturnSortArray = new Array();
        for(var i=0; i<pItems.length; i++){
            loReturnSortArray[i] = pItems[i];
        }
        
        for(x=0; x<loReturnSortArray.length; x++) {
            for(y=0; y<loReturnSortArray.length; y++) {
                if(loReturnSortArray[x].sortFields[pField] > loReturnSortArray[y].sortFields[pField]) {
                    holder = loReturnSortArray[y];
                    loReturnSortArray[y] = loReturnSortArray[x];
                    loReturnSortArray[x] = holder;
                }
            }
        }
          
        return loReturnSortArray;
    };
    
    this.sortByDate = function(pItems, pField){
        var loReturnSortArray = new Array();
        for(var i=0; i<pItems.length; i++){
            loReturnSortArray[i] = pItems[i];
        }

        for(x=0; x<loReturnSortArray.length; x++) {
            for(y=0; y<loReturnSortArray.length; y++) {
                if(new Date(loReturnSortArray[x].sortFields[pField]) > new Date(loReturnSortArray[y].sortFields[pField])) {
                    holder = loReturnSortArray[y];
                    loReturnSortArray[y] = loReturnSortArray[x];
                    loReturnSortArray[x] = holder;
                }
            }
        }                

        return loReturnSortArray;
    };

    this.determineFullHeight = function(element) {
        if (typeof(element) == "string") {
            element = document.getElementById(element);
        }
        
        var elementHeight  = element.offsetHeight; 
        var marginTop      = this.retrieveNumericValue(element, 'marginTop');
        var marginBottom   = this.retrieveNumericValue(element, 'marginBottom');
        var selectedMargin = (marginTop > marginBottom) ? marginTop : marginBottom;

        return parseInt(elementHeight + selectedMargin);
    };  

    this.retrieveNumericValue = function(pElement, pRequestedStyle){
        var lsStyleValue = parseInt(YAHOO.util.Dom.getStyle(pElement, pRequestedStyle));

        if(isNaN(lsStyleValue)){
            lsStyleValue = 0;
        }
         
        return lsStyleValue;
    };

    this.displayArraySummary = function(displayMe) {
        var ids = "";
        for (var i in displayMe) {
            ids += displayMe[i].id + " ";
        }
        
        return ids;
    };

    this.trim = function(trimMe) {
        return trimMe.replace(/^|\s*|\s*$/g,"");
    };

};

