(function () {
    function recursiveHideElement(element, element_fade_tween) {
        element_fade_tween = element_fade_tween || element.retrieve('fade_tween');
        
        element_fade_tween.set(0);
        
        flow_to_element = $(element.get('flow_to_id'));
        
        if (flow_to_element) {
            flow_to_element_fade_tween = flow_to_element.retrieve('fade_tween') || new Fx.Tween(flow_to_element, {
                'property' : 'opacity',
                'duration' : 'short',
                'link'     : 'ignore'
            });
            
            flow_to_element.store('fade_tween', flow_to_element_fade_tween);
            
            recursiveHideElement(flow_to_element, flow_to_element_fade_tween);
        }
    }
    
    function recursiveShowElement(element, element_fade_tween) {
        element_fade_tween = element_fade_tween || element.retrieve('fade_tween');
        
        element_fade_tween.set(1);
        
        flow_to_element = $(element.get('flow_to_id'));
        
        if (flow_to_element) {
            flow_to_element_fade_tween = flow_to_element.retrieve('fade_tween') || new Fx.Tween(flow_to_element, {
                'property' : 'opacity',
                'duration' : 'short',
                'link'     : 'ignore'
            });
            
            flow_to_element.store('fade_tween', flow_to_element_fade_tween);
            
            recursiveShowElement(flow_to_element);
        }
    }
    
    function redirectTextFlow(element) {
        var parent_element, words, last_word, flow_text_words, flow_text, flow_to_element, truncated;
        
        truncated = false;
        
        parent_element = element.getParent();
        flow_text_words = [];
        
        flow_to_element = $(element.get('flow_to_id'));
        
        var orig_height = element.getSize().y;
        
        while (element.getSize().y > parent_element.getSize().y) {
            truncated = true;
            words = element.get('html').split(" ");
            last_word = words.pop();
            element.set('html', words.join(" "));
            if (element.getSize().y < orig_height) {
                var foo = 0;
            }
            flow_text_words.unshift(last_word);
        }
        
        if (flow_to_element) {
            flow_text = flow_text_words.join(" ");
            flow_to_element.set('html', flow_text);
            redirectTextFlow(flow_to_element);
        }
        else if (truncated) {
            words = element.get('html').split(" ");
            words.pop();
            words.push('...');
            element.set('html', words.join(" "));
        }
    }
    
    window.element_activators.push(function (element) {
        var element_fade_tween;
        
        element.getElements('*[flow_to_id]').each(function (flow_element) {
            if (!flow_element.get('id') || ($$('*[flow_to_id="' + flow_element.get('id') + '"]').length === 0)) {
                element_fade_tween = new Fx.Tween(flow_element, {
                    'property' : 'opacity',
                    'duration' : 'short',
                    'link'     : 'ignore'
                });
                
                recursiveHideElement(flow_element, element_fade_tween);
                redirectTextFlow(flow_element);
                recursiveShowElement(flow_element, element_fade_tween);
            }
        });
    });
})();

