 /************************
 	Visual effects for m.com
 	Author: Aaron Curry
 	Version: May 28, 2007
 ************************/
 
 /**
 * These methods extend the YAHOO.widget namespace into YAHOO.widget.Effect
 * Yahoo UI Dependancies
 * yahoo-min.js	
 * event-min.js
 * dom-min.js
 * animation-min.js
 **/
(function() {
if (typeof YAHOO != "undefined") {
	YAHOO.widget.Effect = function(el) {
		this.oEl = el;
		this.height = this.oEl.offsetHeight;
	};
	YAHOO.widget.Effect.prototype.Collapse = function(iTimer, onComplete) {
		var timer = iTimer || 0.5;
		this.oEl.style.overflow = 'hidden';
		var slider = new YAHOO.util.Anim(this.oEl, { height: { to:0} }, timer, YAHOO.util.Easing.easeOutStrong);
		if ( onComplete ) {
			slider.onComplete.subscribe(onComplete);
		}
		slider.animate();
	};
	YAHOO.widget.Effect.prototype.Expand = function(iTimer, onComplete) {
		this.oEl.style.visibility = 'visible'
		this.oEl.style.overflow = 'hidden';
		this.oEl.style.height = '';
		var height = this.oEl.offsetHeight;
		this.oEl.style.height = '0';
		this.oEl.style.visibility = 'visible';
		var timer = iTimer || 1;
		var slider = new YAHOO.util.Anim(this.oEl, { height: { to:height, from:0} }, timer, YAHOO.util.Easing.easeOutStrong);
		if ( onComplete ) {
			slider.onComplete.subscribe(onComplete);
		}
		slider.animate();
	};
	YAHOO.widget.Effect.prototype.ChildCollapse = function(iTimer) {
		var $D = YAHOO.util.Dom;
		var $E = YAHOO.util.Event;
		var timer = iTimer || 0.5;
		this.oEl.style.overflow = 'hidden';
		
		var childHeight = this.oEl.scrollHeight;  // get the child height		
		var parentContainer = $D.getAncestorByClassName(this.oEl, "parent-expandable-container"); //gets its parent Element
		var parentHeight = parseInt ($D.getStyle(parentContainer, 'height'));	
		if(isNaN(parentHeight)){
			parentHeight = parentContainer.offsetHeight;
		}	
		$D.setStyle(parentContainer, 'overflow', 'visible');	
		var parentAnimationToHeight = parentHeight-childHeight;  //parent animation to: height
		var childSlider = new YAHOO.util.Anim(this.oEl, { height: { to:0} }, timer, YAHOO.util.Easing.easeOutStrong);
		var parentSlider = new YAHOO.util.Anim(parentContainer, { height: { to:parentAnimationToHeight, from: parentHeight} }, timer, YAHOO.util.Easing.easeOutStrong);
		
		childSlider.onStart.subscribe(function(){				
			parentSlider.animate();
		});
		
		childSlider.animate();
	};
	YAHOO.widget.Effect.prototype.ChildExpand = function(iTimer) {
		var $D = YAHOO.util.Dom;
		var $E = YAHOO.util.Event;
		this.oEl.style.visibility = 'visible'
		this.oEl.style.overflow = 'hidden';
		var childHeight = this.oEl.scrollHeight;  // get the child height
		this.oEl.style.height = '0';
		this.oEl.style.visibility = 'visible';
		var parentContainer = $D.getAncestorByClassName(this.oEl, "parent-expandable-container"); //gets its parent Element
		var parentHeight = parseInt ($D.getStyle(parentContainer, 'height'));
		if(isNaN(parentHeight)){
			parentHeight = parentContainer.offsetHeight;
		}
		$D.setStyle(parentContainer, 'overflow', 'visible');
		var parentAnimationToHeight = parentHeight+childHeight;  //parent animation to: height
		var timer = iTimer || 0.5;
		var parentSlider = new YAHOO.util.Anim(parentContainer, { height: { to:parentAnimationToHeight, from:parentHeight} }, timer, YAHOO.util.Easing.easeOutStrong);
		var childSlider = new YAHOO.util.Anim(this.oEl, { height: { to:childHeight } }, timer, YAHOO.util.Easing.easeOutStrong);
		
		parentSlider.onStart.subscribe(function(){				
			childSlider.animate();
		});
		
		parentSlider.animate();
	};
	}
})();

 	var effects = {
	externalLinks: function() {
		if(!document.getElementById || !document.createTextNode){return;}
		var linkHook ='pop-up-window'; 
		var linkPic='/Images/Arrows/icon_newwindow_9x8.gif';
		var beforeLink=0;

		var links=utils.getElementsByClass(linkHook); 
		if(!links){return;}
		
		for(var i=0;i<links.length;i++)
		{
			var newimg=document.createElement('img');
			newimg.setAttribute('src',linkPic);
			newimg.className = "double-window-icon";
			if(beforeLink)
			{
				links[i].insertBefore(newimg,links[i].firstChild);
			} else {
				links[i].appendChild(newimg);
			}
			links[i].style.backgroundImage = "none";
			links[i].style.paddingRight = "0";
		}
	},
	matchHeight : function(adjustHeight) {
 	// Make elements with the same class name the same height
	
	     // Get all elements that match the adjustHeight
	     var adjustUs = utils.getElementsByClass(adjustHeight);
	
	     // Initialize maximum height value
	     var maxHeight = 0;
	     var elementHeight = 0;
	
		// Iterate over all elements to be adjusted
		for(var i=0; i<adjustUs.length; i++){
	
			// Determine height of the element
        	if(adjustUs[i].offsetHeight){
            	elementHeight = adjustUs[i].offsetHeight;
        	}
        	else if(adjustUs[i].style.pixelHeight){
            	elementHeight = adjustUs[i].style.pixelHeight;
        	}
	
            // Calculate maximum height
            maxHeight = Math.max(maxHeight,elementHeight);
	     }
	
	     // Iterate through and adjust the elements to the maxHeight
	     for(var i=0; i<adjustUs.length; i++){
	          adjustUs[i].style.height = (maxHeight) + 'px';
	     }
	},
	
	alignBottom : function(elementsToAdjust) {
 	// Takes elements of a certain class name and pushes its children to the bottom
		
		// Get all elements that match the elementsToAdjust
	    var adjustUs = utils.getElementsByClass(elementsToAdjust);
		var maxHeight = 0;
		
		// Find the maximum height of the parent elements
		for(var i=0; i<adjustUs.length; i++){
			// Determine height of the element
        	if(adjustUs[i].offsetHeight){
            	elementHeight = adjustUs[i].offsetHeight;
        	}
        	else if(adjustUs[i].style.pixelHeight){
            	elementHeight = adjustUs[i].style.pixelHeight;
        	}
        	// Calculate maximum height
            maxHeight = Math.max(maxHeight,elementHeight);
        }
	
		// Iterate over all elements to be adjusted
		for(var i=0; i<adjustUs.length; i++){
	     	var elementHeight = 0;
	     	var childrensHeight = 0;
	     	var elementsChildren = adjustUs[i].childNodes;
	     	var adjustedPadding = 0;
	     	var elementsFirstChild = utils.findChildNode(adjustUs[i]);
	     	
        	// Loop through the children to determine their height
			for(var j=0; j<elementsChildren.length; j++){
				// Determine height of the element's children
				if(elementsChildren[j].nodeType == 1) {
		        	if(elementsChildren[j].offsetHeight){
		            	childrensHeight += elementsChildren[j].offsetHeight;
		        	}
		        	else if(elementsChildren[j].style.pixelHeight){
		            	childrensHeight += elementsChildren[j].style.pixelHeight;
		        	}
		        }
			}
			
        	adjustedPadding = maxHeight - childrensHeight;
        	if(adjustedPadding > 0){
	        	adjustUs[i].style.paddingTop = (adjustedPadding) + 'px';
	        }
	     }
	},
	
	fillParentContainer : function(adjustHeight) {
 	// Make an element the same height as its parent
		
	    // Get all elements that match the adjustHeight
	    var adjustMe = document.getElementById(adjustHeight);
		var parentElement = utils.findParentNode(adjustMe);
		
		// Determine height of the element
    	if(parentElement.offsetHeight){
        	var elementHeight = parentElement.offsetHeight;
    	}
    	else if(parentElement.style.pixelHeight){
        	var elementHeight = parentElement.style.pixelHeight;
    	}
		
	    // Adjust the height of the element
	    adjustMe.style.height = (elementHeight) + 'px';
	},
	
	initializeExpandableContent : function(hiddenElementTag, controlTag) {
 		hiddenContent = document.getElementsByTagName(hiddenElementTag);
		controlElements = document.getElementsByTagName(controlTag);
	
		for(var i = 0; i < hiddenContent.length; i++) {
			if(hiddenContent[i].className == "expandable-content-container") {
				hiddenContent[i].style.display = "none";
			}
    	}

    	for(var i = 0; i < controlElements.length; i++) {
			if(controlElements[i].className.match("expandable-content-control")) {
				if(controlElements[i].className.match("open")) {
					controlElements[i].onclick = effects.hideContent;
					controlElements[i].className = "expanded";
				}
				else {
					controlElements[i].onclick = effects.showContent;
					controlElements[i].className = "collapsed";
				}
			}
    	}
	},

	showContent : function() {
	// Requires utilities.js
	// Shows expandable content

		dojo.lfx.html.explode(this,utils.findNextNode(this),100).play();

		this.className="expanded";
		this.onclick = effects.hideContent;
		// don't follow links
		if(this.tagName == 'A'){ return false };
	},

	hideContent : function() {
	// Requires utilities.js
	// Hides expandable content
		dojo.lfx.html.implode(utils.findNextNode(this),this,100).play();

		this.className="collapsed";
		this.onclick = effects.showContent;
		// don't follow links
		if(this.tagName == 'A'){ return false };
	},
	controller : function(e) {
		var $D = YAHOO.util.Dom;
		var $E = YAHOO.util.Event;
		var target = $E.getTarget(e);
		var z = new YAHOO.widget.Effect(this);
		if ( !$D.hasClass(this,'content-collapsed') ) {
			target.className = 'collapsed';
			$D.addClass(this,'content-collapsed')
			if($D.hasClass(this,'child-expandable-container')){
				z.ChildCollapse();
			}
			else{
				z.Collapse();
			}
			
		}
		else {
			target.className = 'expanded';
			$D.removeClass(this,'content-collapsed')
			if($D.hasClass(this,'child-expandable-container')){
				z.ChildExpand();
			}
			else{
				z.Expand();
			}			
		}
		$E.stopEvent(e);
	},
			
	loadExpandableContent : function () {
		
		 // Hide hidden content and add in show/hide controls
		var collapsedControlEl = YAHOO.util.Dom.getElementsByClassName("expandable-content-control");
		var expandedControlEl = YAHOO.util.Dom.getElementsByClassName("open-expandable-content-control");
		var collapsedContent = YAHOO.util.Dom.getElementsByClassName("expandable-content-container");
		var expandedContent = YAHOO.util.Dom.getElementsByClassName("open-expandable-content-container");

		var controller = collapsedControlEl.concat(expandedControlEl);
		var content = collapsedContent.concat(expandedContent);

		for(var i = 0; i < content.length; i++) {
			if(content[i].className == 'expandable-content-container') {
				content[i].style.visibility = 'hidden';
				content[i].style.overflow = 'hidden';
				content[i].style.height = '0';
				YAHOO.util.Dom.addClass(content[i],'content-collapsed')
			}
		}
		for(var i = 0; i < controller.length; i++) {
			if (controller[i].className == 'open-expandable-content-control') {
				YAHOO.util.Dom.addClass(controller[i], 'expanded');
			}
			else {
				YAHOO.util.Dom.addClass(controller[i], 'collapsed');
			}
			YAHOO.util.Event.on(controller[i],'click',effects.controller,content[i],true);
		}
	}
}
