﻿(function(){
    /*
    */
    var Toggle = function(el,attr){
        attr = attr || {};
        this.constructor.superclass.constructor.call(this,el,attr);
        _init.call(this);
    };
    YAHOO.extend(Toggle,YAHOO.util.Element);
    var proto = Toggle.prototype;
    var $E = YAHOO.util.Event;
    var $D = YAHOO.util.Dom;
    var $A = YAHOO.util.Anim;
    /*
    */
    proto.initAttributes = function(attr){
        attr = attr || {};
        var el = this.get('element');
        this.constructor.superclass.initAttributes.call(this,attr);
        this.setAttributeConfig('speed',{
            value:attr.speed || 0.2,
            validator:YAHOO.lang.isNumber
        });
        this.setAttributeConfig('anim',{
            value:attr.anim || true,
            validator:YAHOO.lang.isBoolean
        });
        this.setAttributeConfig('anim',{
            value:attr.anim || true,
            validator:YAHOO.lang.isBoolean
        });
        this.setAttributeConfig('wording',{
            value:attr.wording || ['Expand','Shrink'],
            validator:YAHOO.lang.isArray
        });
        this.setAttributeConfig('easingMethod',{
            value:attr.easingMethod || YAHOO.util.Easing.easeNone,
            validator:YAHOO.lang.isArray
        });
        this.setAttributeConfig('isShrink',{
            value:attr.isShrink || false,
            validator:YAHOO.lang.isBoolean
        });
        this.setAttributeConfig('triggerEl',{
            value:attr.tiggerEl || null
        });
    };
    var _height = 0;
    var _locked = false;
    /*
    */
    var _init = function(){
        if(!this.get('triggerEl')||this.get('element')===undefined){return;}
        var self = this;
        var el = this.get('element');
        this.onToggleComplete = new YAHOO.util.CustomEvent('togglecomplete', this);
        this.onTriggerClick = new YAHOO.util.CustomEvent('toggleclick', this);
        this.setStyle('overflow','hidden');
        this.setStyle('position','relative');
        var triggerEl = this.get('triggerEl');
        triggerEl.innerHTML = (!this.get('isShrink'))?this.get('wording')[1]:this.get('wording')[0];
        if(this.get('isShrink')){
            this.setStyle('display','none');
        }
        else {
            this.setStyle('display','block');
        };
        $E.on(triggerEl,'click',function(e){
            self.onTriggerClick.fire();
            if(self.get('isShrink')){
                self.expand();
            }
            else {
                self.shrink();
            };
            $E.stopEvent(e);
            return false;
        });
        $E.on(triggerEl,'keyup',function(e){
            if(e.keyCode=='13'){;
                self.onTriggerClick.fire();
                if(self.get('isShrink')){
                    self.expand();
                }
                else {
                    self.shrink();
                };
            };
            $E.stopEvent(e);
            return false;
        });
    };
    /*
    */
    proto.expand = function() {
        var doAfterExpand = function(){
            self.get('triggerEl').innerHTML = self.get('wording')[1];
            self.set('isShrink',false);
            self.onToggleComplete.fire();
        };
        if(!this.get('isShrink')||_locked){return;};
        var self = this;
        var el = this.get('element');
        this.setStyle('display','block');
        if(this.get('anim')){
            var attr = {
                height:{from:0,to:_height,unit:'px'}
            };
            var anim = new $A(el,attr,this.get('speed'),this.get('easingMethod'));
            _locked = true;
            anim.animate();
            anim.onComplete.subscribe(function(e){
                _locked = false;
                doAfterExpand();
            });
        }
        else {
            doAfterExpand();
        };
    };
    /*
    */
    proto.shrink = function() {
        var doAfterShrink = function(){
            self.setStyle('display','none');
            self.get('triggerEl').innerHTML = self.get('wording')[0];
            self.set('isShrink',true);
            self.onToggleComplete.fire();
        }
        if(this.get('isShrink')||_locked){return;};
        var self = this;
        var el = this.get('element');
        _height = $D.getRegion(el)['bottom'] - $D.getRegion(el)['top'];
        if(this.get('anim')){
            var attr = {
                height:{from:_height,to:0,unit:'px'}
            };
            var anim = new $A(el,attr,this.get('speed'),this.get('easingMethod'));
            _locked = true;
            anim.animate();
            anim.onComplete.subscribe(function(){
                _locked = false;
                doAfterShrink();
            });
        }
        else {
            doAfterShrink();
        };
    };
    YAHOO.util.Toggle = Toggle;
}()); 



