﻿var TINY={};

function T$(i, useChild){
    var element = null;

    if (useChild) {
        element = T$$('ul',document.getElementById(i))[0];
    } else {
        element = document.getElementById(i);
    }

    return element;
}

function T$$$(i){
    return document.getElementById(i).childNodes[1];
}


function T$$(e,p){
    return p.getElementsByTagName(e)
}

TINY.accordion=function(){

	function slider(n){
	    this.n = n; 
	    this.a = []
	    this.children = new Array();
	    this.siblings = new Array();
	    this.isOpen = false;
	}

    // Store the parent menu node of this menu object
    slider.prototype.setParent = function(parent) {
    
        this.parent = parent;
    };

    // Store the child meneu nodes of this menu object
    slider.prototype.setChild = function(child) {
    
        this.children[this.children.length] = child;
    };

    // Store the sibling menu nodes of the menu object
    slider.prototype.setSibling = function(sibling) {
    
        this.siblings[this.siblings.length] = sibling;
    };

    // Return whether the current menu object is opened
    slider.prototype.opened = function() {
    
        return this.isOpen;
    };

	slider.prototype.init=function(t,e,m,o,k,useChild){
		var a = T$(t, useChild), i = s = 0, n = a.childNodes, l = n.length; 
		this.s = k||0; 
		this.m = m||0;

		for(i; i < l; i++){
			var v = n[i];

			if(v.nodeType != 3){
				this.a[s] = {}; 
				this.a[s].h = h = T$$(e,v)[0]; 
				this.a[s].c = c = T$$('div',v)[0]; 
				this.a[s].d = d = T$$('div',c)[0]; 
				
				// Store the class name for the acc-content div
				this.a[s].e = this.a[s].d.className;
				
				h.onclick = new Function(this.n + '.pr(0,' + s + ')');
				
				if(o == s){
				    h.className = this.s; 
				    c.style.height = 'auto'; 
				    c.d = 1
				}else{
				    if (c != null) {
    				    c.style.height = 0; 
	    			    c.d = -1
	    			}
				} 
				
				s++
			}
		}

		this.l = s
	};
	
	slider.prototype.pr=function(f,d){
		for(var i = 0; i < this.l; i++){
			var h = this.a[i].h, c = this.a[i].c, k = c.style.height; 
			k = k == 'auto' ? 1 : parseInt(k); 
			clearInterval(c.t);

			if((k != 1 && c.d == -1) && (f == 1 || i == d)){
			    // Set a flag identifying that this object is currently opened
			    this.isOpen = true;
			
				c.style.height = ''; 
				c.m = c.offsetHeight; 
				c.style.height = k + 'px'; 
				c.d = 1; 
				h.className = this.s; 

                // If this menu object has a parent node, adjust it's styles				
				if (this.parent != null) {
    				this.parent.a[i].h.className = this.parent.a[i].h.className + ' no-top-line'; 
    				this.parent.a[i].d.className = this.parent.a[i].d.className + ' no-bottom-line'; 
    		    }

				// Loop through all sibling nodes, close any that are open
				for (var siblingCount = 0; siblingCount < this.siblings.length; siblingCount++) {
				    this.siblings[siblingCount].pr(-1);
				}
				
				su(c,1)
			}else if(k>0&&(f==-1||this.m||i==d)){
			    // Set a flag identifying that this object is currently closed
			    this.isOpen = false;

                // Close all child menu objects
				for (var j = 0; j < this.children.length; j++) {
				    this.children[j].pr(-1);
				}
				
				// Default our flag to true, basically if no other sibling nodes are opened, we
				// need to style the parent node accordingly, if a sibling node is open, let that
				// node style the parent when it's closed
				var styleParent = true;
				
				// Loop through all sibling nodes
				for (var siblingCount = 0; siblingCount < this.siblings.length; siblingCount++) {
				    // If a sibling is open exit, we don't want to style the parent
				    if (this.siblings[siblingCount].opened()) {
				        styleParent = false;
				        break;
				    }
				}

				c.d = -1; 
				h.className = ''; 
				this.a[i].d.className = this.a[i].e; 
				
				// If no other siblings are open we can style the parent node
				if (styleParent) {
				    if (this.parent != null) {
    				    this.parent.a[i].h.className = this.parent.s; 
    				    this.parent.a[i].d.className = this.parent.a[i].e; 
    		        }
				}
				
				su(c,-1)
			}
		}
	};
	
	function su(c){
	    c.t = setInterval(function(){sl(c)},20)
	}; 
	
	function sl(c){
		var h = c.offsetHeight, d = c.d == 1 ? c.m - h : h; 
		c.style.height = h + (Math.ceil(d/5) * c.d) + 'px';
		c.style.opacity = h / c.m; 
		c.style.filter = 'alpha(opacity=' + h * 100 / c.m + ')';
		
		if((c.d == 1 && h >= c.m) || (c.d != 1 && h == 1)){
		    if(c.d == 1){
		        c.style.height = 'auto'
		    } 
		    
		    clearInterval(c.t)
		}
	};
	
	return{slider:slider}
}();