// AutoCompleteContainer
// Created by Wesley Friend
// FCV Technologies - 2007


function showRows(cssRule)
{
	$$(cssRule).each(function(e,i)
	{
		e.hide();
		new Effect.Appear(e, { duration: (0.5*(i/2))+0.3 });
	});
}

function hideRows(cssRule,exclude,remove,callBack)
{
	var items = $$(cssRule);
	
	var lastItem = null;
	
	var filteredItems = items.findAll(
		function(e)
		{
			return ( !exclude || (exclude.length > 0 && !exclude.all(function(g){ return g.id == e.id}.bind(this)) ) );
		}.bind(this)
	);
	
	if(filteredItems.length > 0)
	{
		hideRow(filteredItems[0], getOptions(0), remove);
	}
				
	function getOptions(i)
	{
		var options = { from:(1), to:0, duration: 0.8 };
		
		if(i < (filteredItems.length-1))
		{
			options.afterFinish = hideRow(filteredItems[i+1], getOptions(i+1), remove);
		}
		else
		{
			options.afterFinish = callBack;
		}
		
		return options;
	}
}

function hideRow(element, options, remove)
{
	if((element.op && element.op.options.to > 0) || !element.op)
	{
		if(remove)
		{
			element.op = new Effect.Fade(element, options);
		}
		else
		{
			element.op = new Effect.Opacity(element, options);
		}
	
	}
}

var toggleHash = new Array(20);

Effect.MoveAndReSize = Class.create();
Object.extend(Object.extend(Effect.MoveAndReSize.prototype, Effect.Base.prototype), {
    initialize: function(element) {

        this.element = $(element);        
        if(!this.element) throw(Effect._elementDoesNotExistError);

        // AVAILABLE OPTIONS (all is optional) 
        //{opacity: 0.2 ,move:['all:200:300','x:500','y:400','fixed:100:100'], resize: ['all:200:300','y:400','x:500','fixed:100:100'], toggleIndex:1...x}
        var options = Object.extend({move:[], resize: []}, arguments[1] || {});

        var goMove =( options.move.length > 0);
        var goResize = (options.resize.length > 0);
        var goToggle = (options.toggleIndex!=null);
        var goOpacity = (options.opacity!=null);

        var dimension = Element.getDimensions(this.element);
        var position = Position.positionedOffset(this.element);

        if (goToggle) 
        {
            originalElement = toggleHash[options.toggleIndex];

            // Prevent mutliclic on same object
            if (originalElement!=null)        
                if (originalElement.usedNow==true) return;
                    else originalElement.usedNow=true;

            this.goToggle(options,dimension,position);
        }

        options.addToSize = new Object();

        if (goResize)
            this.goResize(options,dimension);    

        if(goOpacity)
            this.goOpacity(options);

        if (goMove)    
            this.goMove(options,position);

        if (goResize || goOpacity) 
            this.start(options);
    },

      initToggle: function(index){
        if (index!=null)
            toggleHash[index].usedNow=false;
    },

    goToggle: function(options,dimension,position){

        index = options.toggleIndex
        originalElement = toggleHash[index];

        if (originalElement==null)
        {            
            toggleHash[index] = new Array(dimension,position,this.element.getStyle('opacity'),this.element.getStyle('z-index'));
        }
        else if (!toggleHash[index].isInitPosition)
        {
            options.resize = new Array('fixed:'  + originalElement[0].width +':'+originalElement[0].height);
            options.move   = new Array('fixed:'  + originalElement[1][0] +':'+originalElement[1][1]);
            options.opacity= originalElement[2];

            this.element.style.zIndex = originalElement[3];
            toggleHash[index].isInitPosition = true;
        }
        else toggleHash[index].isInitPosition = false;
    },  

    goResize: function(options,dimension) {

        this.originalSize = new Object();            

        options.resize.each( 
                function(szd) { 
                    tmp = szd.split(':');
                    if ((tmp[0]=='all') || (tmp[0]=='y')){
                        options.addToSize.changeY = true;
                        options.addToSize.y = parseInt(((tmp[0]=='y')?tmp[1]:tmp[2]));
                    }

                    if ((tmp[0]=='all') || (tmp[0]=='x')){
                        options.addToSize.changeX = true;
                        options.addToSize.x = parseInt(tmp[1]);
                    }

                    if (tmp[0]=='fixed')  {
                        options.addToSize.changeX = true;
                        options.addToSize.changeY = true;

                        options.addToSize.x = parseInt(tmp[1]) - dimension.width;                         
                        options.addToSize.y = parseInt(tmp[2]) - dimension.height;             
                    }
                } 
         );

        this.originalSize.x = dimension.width;
        this.originalSize.y = dimension.height;

    },  

    goMove: function(options,position) {
        var x = 0;
        var y = 0;
        var duration = 0.3;
        options.move.each( 
                function(szd) { 
                    tmp = szd.split(':');

                    if ((tmp[0]=='all') || (tmp[0]=='y')){y = parseInt(((tmp[0]=='y')?tmp[1]:tmp[2]));}                
                    if ((tmp[0]=='all') || (tmp[0]=='x')){x = parseInt(tmp[1]);}

                    if (tmp[0]=='fixed')  {
                        x = parseInt(tmp[1]) - position[0];                     
                        y = parseInt(tmp[2]) - position[1]; 
                    }
                } 
         );

        new Effect.Move(this.element,{x:x,y:y, afterFinish: this.initToggle(options.toggleIndex)});
    },

    goOpacity: function(options){
        this.originalOpacity = parseFloat(this.element.getStyle('opacity'));
        options.changeOpacity = true;
        options.addTOpacity = parseFloat(options.opacity) - this.originalOpacity;
    },

    setOpacity: function(opacity) {
        this.element.style.opacity =''+opacity;
        this.element.style.filter = 'alpha(opacity='+(opacity*100)+')';
    },

    setup: function() {
        if(!this.element.visible()) { this.cancel(); return; }
    },

    update: function(position) {

        if(this.options.addToSize.changeX)
          this.element.setStyle({width: this.originalSize.x+(this.options.addToSize.x*position)+'px'});

        if(this.options.addToSize.changeY)   
          this.element.setStyle({height: this.originalSize.y+(this.options.addToSize.y*position)+'px'});

        if(this.options.changeOpacity)   
          this.setOpacity(this.originalOpacity+(this.options.addTOpacity*position));

    },

    finish: function(){

        if(this.options.addToSize.changeX)
          this.element.setStyle({width: this.originalSize.x+this.options.addToSize.x+'px'});

        if(this.options.addToSize.changeY)  
          this.element.setStyle({height: this.originalSize.y+this.options.addToSize.y+'px'});

        if (this.options.toggleIndex!=null) 
            toggleHash[this.options.toggleIndex].usedNow=false;

        if(this.options.changeOpacity)   
        {
          this.setOpacity(this.originalOpacity+this.options.addTOpacity);
          // Initialize z-index if layer is hidden (opacity = 0.0)                        

          if((this.originalOpacity+this.options.addTOpacity)==0.0)
            this.element.style.zIndex = 1;
        }

    }
});
