//************************************************************
//************************************************************
//
function CFoldingBlock(unfoldedId,unfoldedUrl,unfoldedLoaded,foldedId,foldedUrl,foldedLoaded,groupName)
{
	//properies
    this.groupName = groupName?groupName:'default';
	this.unfoldedId = unfoldedId;
	this.unfoldedDetailsId = this.unfoldedId+'_details';
	this.unfoldedUrl = unfoldedUrl;
	this.unfoldedLoaded = unfoldedLoaded;
    this.unfoldedDiv = null;

	this.foldedId = foldedId;
	this.foldedUrl = foldedUrl;
	this.foldedLoaded = foldedLoaded;
    this.foldedDiv = null;

	this.animated = true;

	this.isExpanding = false;
	this.isCollapsing = false;

    CFoldingBlock.getBlock = function (group,block_id)
    {
        var blocks = CFoldingBlock.blocksList[group];
        if(!blocks) return null;
        return blocks[block_id];
    };

	this.getBlocksList = function(){
        return CFoldingBlock.blocksList[this.groupName];
	}

	this.isCollapsed = function(){
        var div = this.getUnfolded();
        return (!div || div.style.display != 'block');
	}

	this.toggle = function(){
	    if(this.isCollapsed())
	       this.expand();
	    else
	       this.collapse();
	}

	this.expandInternal = function(){
        var oThis = this;
	    //check id unfolded details is folded
        e = this.getUnfoldedDetails();
        if(e) e.style.display = 'none';

        //hide folded block
        e = this.getFolded();
        if(e) e.style.display = 'none';

        //show unfolded block
        e = this.getUnfolded();
        if(e) e.style.display = 'block';

        e = this.getUnfoldedDetails();
        if ( $('loader_' + this.unfoldedId) ) {
            $('loader_' + this.unfoldedId).style.display = 'none';
        }
        if(e)
        {
            if(this.animated)
    	    {
        	    Effect.BlindDown(this.unfoldedDetailsId, {afterFinish:function() {
        	            oThis.collapsed = false;
        	            oThis.isExpanding = false;
        	       } }) //{duration:3.0, fps:16}
    	    }else
        	{
        	   e.style.display = 'block';
        	}
        }
	}
	this.expand = function(){
	    if(this.isExpanding || this.isCollapsing) return false;
        var list = this.getBlocksList();
        for (var block_id in list) {
            if(list[block_id] != this && (list[block_id].isExpanding || list[block_id].isCollapsing)) return false;
        }
	    this.isExpanding = true;
        for (var block_id in list) {
            if(list[block_id] != this && !list[block_id].isCollapsed())
            {
                list[block_id].collapse();
            }
        }

        var oThis = this;
	    //if unfolded not loaded then load
	    if(!this.unfoldedLoaded)
	       this.loadUnfolded(function(){oThis.expandInternal()});
	    else
	       this.expandInternal();
	}

	this.collapseInternal = function(){
        var oThis = this;
        e = this.getUnfoldedDetails();
        if(e)
        {
            if(this.animated)
    	    {
        	    //slide details
        	    Effect.BlindUp(this.unfoldedDetailsId, {afterFinish:function() {
                        //hide unfolded
                        e = oThis.getUnfolded();
                        if(e) e.style.display = 'none';
                        //show folded
                        e = oThis.getFolded();
                        if(e) e.style.display = 'block';
        	            oThis.collapsed = true;
        	            oThis.isCollapsing = false;
        	       } })
    	    }
        	else
        	{
        	   e.style.display = 'block';
        	}
        }
	}

	this.collapse = function(){
	    if(this.isExpanding || this.isCollapsing) return false;
	    this.isCollapsing = true;
        var oThis = this;
	    //if folded not loaded then load
	    if(!this.foldedLoaded)
	       this.loadFolded(function(){oThis.collapseInternal()});
	    else
	       this.collapseInternal();
	}
	this.loadUnfolded = function(onCompl){
	    if ( $('loader_' + this.unfoldedId) ) {
            $('loader_' + this.unfoldedId).style.display = 'block';
        }
		new Ajax.Updater(this.unfoldedId,this.unfoldedUrl,{onComplete:onCompl, evalScripts:true});
		this.unfoldedLoaded = true;
	}

	this.loadFolded = function(onCompl){
		new Ajax.Updater(this.foldedId,this.foldedUrl,{onComplete:onCompl, evalScripts:true});
		this.foldedLoaded = true;
	}

	this.getUnfolded = function(){
	    if(true || !this.unfoldedDiv) this.unfoldedDiv = document.getElementById(this.unfoldedId);
	    if(!this.unfoldedDiv || !this.unfoldedDiv.tagName) this.unfoldedDiv = null;
	    return this.unfoldedDiv;
	}
	this.getUnfoldedDetails = function(){
	    if(true || !this.unfoldedDetails) this.unfoldedDetails = document.getElementById(this.unfoldedDetailsId);
	    if(!this.unfoldedDetails || !this.unfoldedDetails.tagName) this.unfoldedDetails = null;
	    return this.unfoldedDetails;
	}
	this.getFolded = function(){
	    if(true || !this.foldedDiv) this.foldedDiv = document.getElementById(this.foldedId);
	    if(!this.foldedDiv || !this.foldedDiv.tagName) this.foldedDiv = null;
	    return this.foldedDiv;
	}

	this.init = function(){
    	if(!CFoldingBlock.blocksList) CFoldingBlock.blocksList = new Object();
    	if(!CFoldingBlock.blocksList[this.groupName]) CFoldingBlock.blocksList[this.groupName] = new Object();
        CFoldingBlock.blocksList[this.groupName][foldedId] = this;
	}

	//init code
	this.init();
	return this;
}