

function Controller() {
    this.AddContainer = _AddContainer;
    this.SelectContainer = _SelectContainer;

    var self = this;
    var mb_updating = false;

    this.Expand = _Expand;

    this.Resize = _Resize;
    this.ResizeRecurse = _ResizeRecurse;



    //var mi_minSize = 20;
    //var mi_maxSize = 100;

    //this.MinSize = mi_minSize;
    //this.MaxSize = mi_maxSize;

    var ms_id = "";

    var mo_containers = new Array();

    function _Expand(ai_pos) {
        var lo_container = mo_containers[ai_pos - 1];

        lo_container.ExpansionSpeed = 1000;
        lo_container.Expand();
        lo_container.UpdateDisplay();
        lo_container.ExpansionSpeed = 5;
    }

    function _SelectContainer(as_id) {
        ms_id = as_id;
        //if (_GetContainer(as_id).IsExpanding)
        //    return;

        for(var i = 0; i < mo_containers.length; i++) {

            if( mo_containers[i].ControlId == as_id )
                mo_containers[i].Expand();
            else
                mo_containers[i].Collapse();
        }

        _Resize();
    }

    function _AddContainer(as_container) {
        var lo_container = new Container();
        var lo_obj = document.getElementById (as_container);
        lo_container.AttachControl(lo_obj );
        lo_container.ControlId = as_container;
        mo_containers[mo_containers.length] = lo_container;
    }


    function _Resize() {
        if (!mb_updating)
            _ResizeRecurse();

    }

    function _ResizeRecurse() {

        var li_expansionSpeed = 0;

        //Get the total speed of collapse
        for(var i = 0; i < mo_containers.length; i++)
        {
            if (mo_containers[i].IsContracting)
                li_expansionSpeed = li_expansionSpeed + mo_containers[i].ContractionSpeed;
        }

        //if (li_expansionSpeed> 5)
        //    alert(li_expansionSpeed);

        if (li_expansionSpeed > 0) {
            //Set the correct expansion speed for the expanding box
            for(var i = 0; i < mo_containers.length; i++)
            {
                if (mo_containers[i].ControlId == ms_id)
                    mo_containers[i].ExpansionSpeed = li_expansionSpeed;
            }
        }


        //Update Controls
        for(var i = 0; i < mo_containers.length; i++)
        {
            //if (mo_containers[i].IsContracting)
            //    mo_containers[i].Collapse();
            //if (mo_containers[i].IsExpanding)
            //    mo_containers[i].Expand();

            if (mo_containers[i].ControlId == ms_id)
                mo_containers[i].Expand();
            else
                mo_containers[i].Collapse();

            mo_containers[i].UpdateDisplay();
        }


        var lb_stillUpdating = false;
        //Set the correct expansion speed for the expanding box
        for(var i = 0; i < mo_containers.length; i++)
        {
            if (mo_containers[i].IsExpanding || mo_containers[i].IsContracting) {
                lb_stillUpdating = true;
            }
        }

        //alert(lb_stillUpdating);
        if (lb_stillUpdating) {
            setTimeout(function () { self.ResizeRecurse() }, 20 );
            mb_updating = true;
        }
        else {
            mb_updating = false;
        }
    }

    function _GetContainer(as_container) {
        for(var i = 0; i < mo_containers.length; i++)
            if( mo_containers[i].ControlId == as_container )
                return mo_containers[i];

        return null;
    }
}

function Container() {
    var self = this;

    var mi_currentSize = 0;
    var mi_frequency = 20;
    var mi_minSize = 0;
    var mi_maxSize = 83;


    var mb_isExpanding = false;
    var mb_isContracting = false;

    var mi_expansionSpeed = 5;
    var mi_contractionSpeed = 5;

	var ms_defaultColor = "#D3E39C";
	var ms_highlightColor = "#E7F0C9";

    var ms_id = "";

    this.AttachControl = _AttachControl;
    this.Expand = _Expand;
    this.Collapse = _Collapse;
    this.UpdateDisplay = _UpdateDisplay;
    this.ControlId = ms_id;

    this.IsExpanding = mb_isExpanding;
    this.IsContracting = mb_isContracting;

	this.FadeImage = _FadeImage;

    mi_currentSize = mi_currentSize;

     this.ExpansionSpeed = mi_expansionSpeed;
    this.ContractionSpeed = mi_contractionSpeed;


    var mo_control = null;
    var mo_controlImage = null;
    var mo_controlHeader = null;

    function _AttachControl(ao_control) {
        mo_control = ao_control;
        
		mo_controlImage = document.getElementById('img_' + mo_control.id);
		mo_controlHeader = document.getElementById('hdr_' + mo_control.id);
      //alert(mb_currentSize);
    }

    function _Reset() {
        this.ExpansionSpeed = 5;
        this.ContractionSpeed = 5;
    }



    function _Expand() {
    	mo_controlHeader.style.backgroundColor = ms_highlightColor;
        this.IsExpanding = true; //mb_isExpanding = true;
        mi_currentSize += this.ExpansionSpeed;

        //bounds check
        if (mi_currentSize >= mi_maxSize) {
            mi_currentSize = mi_maxSize;

             this.IsExpanding = false;
            _ShowImage();
            _Reset();
        }

    }

    function _ShowImage() {

	        //document.getElementById('img_' + mo_control.id).style.display='block';
	        //alert('test');
	        var lo_obj = document.getElementById('img_' + mo_control.id)

	        var li_value = 0; //parseInt(lo_obj.style.opacity);

	        //lo_obj.style.opacity = 0;
			//lo_obj.style.filter = 'alpha(opacity=0)';


	       lo_obj.style.visibility='visible';

       	 //setTimeout(function () { self.FadeImage() }, 50 );
    }

	function _FadeImage() {

	        var lo_obj = document.getElementById('img_' + mo_control.id)

	        //var li_value = eval(parseFloat(lo_obj.style.opacity) ) * 10  + 1;

  			lo_obj.style.visibility='visible';

			return;
	        lo_obj.style.opacity = li_value/10;
			lo_obj.style.filter = 'alpha(opacity=' + li_value*10 + ')';



			if (li_value <= 10)
     			setTimeout(function () { self.FadeImage() }, 50 );
	}


    function _HideImage() {
        //document.getElementById('img_' + mo_control.id).style.display='none';
		var lo_obj = document.getElementById('img_' + mo_control.id)
		lo_obj.style.visibility='hidden';
		//lo_obj.style.opacity = 0;
		//lo_obj.style.filter = 'alpha(opacity=0)';

    }

    function _Collapse() {

        if (!this.IsContracting) {
        _HideImage();
        mo_controlHeader.style.backgroundColor = ms_defaultColor;
        }

        this.IsContracting = true;

        mi_currentSize -= this.ContractionSpeed;

        //bounds check
        if (mi_currentSize <= mi_minSize) {
            mi_currentSize = mi_minSize;

            this.IsContracting = false;
            _Reset();
        }

    }

    function _UpdateDisplay() {
        //mo_control.style.height= (mi_currentSize.toString() + 'px') ;
        mo_controlImage.style.height= (mi_currentSize.toString() + 'px') ;
    }

}
