

/* -- Attempting to load:/includes/jslib/WSDOM/Format/format.js */


/**
 * This lib takes VB Format strings and formats numbers/dates.
 * It could benefit from the addition of caching parsed format strings.
 * 
 * @author Matt.Dunlap
 * Managed through Subversion, no VSS
 */

if(WSDOM == undefined) var WSDOM = {};
WSDOM.Format = {};

/**
 * Format numbers!
 * @param {number} value Number to be formatted
 * @param {string} format VB format string
 */
WSDOM.Format.formatNumber = function(value, format) {
    var type = 'default';
    if(format instanceof Array) {
        if(value == 0 && format.length > 2 && format[2]) {
            return format[2];
        } else if(value < 0 && format.length > 1 && format[1]) {
            format = format[1];
            type = 'neg';
        } else {
            format = format[0];
        }
    }
    
    var parsedFormat = format.match(/([^#0]*)([#0][#0,]*)(\.?)([#0]*)([\s\S]*)/);
    
    var headFormat = parsedFormat[1];  // Prepended string
    var leftFormat = parsedFormat[2];  // Format to left of decimal place
    var rightFormat = parsedFormat[4]; // Format to right of decimal place
    var tailFormat = parsedFormat[5];  // Appended string
    
    var negative = (value < 0);
    if(negative) value *= -1;
    
    var reComma = /,/g;
    var showCommas = reComma.test(leftFormat);
	if(showCommas)
	{
		leftFormat = leftFormat.replace(reComma, '');
		reComma.lastIndex = 0;
	}

    var isPercentage = /^\s*%/.test(tailFormat);
    if(isPercentage) value *= 100;
    
    var magSuffixes = tailFormat.match(/^\s*\[([\w\s\\|]+)\]/);
    var magBase = 1000, suffix = '';
    if(magSuffixes) {
        if(value) {
            magSuffixes = magSuffixes[1];
            if(magSuffixes.toLowerCase() == 'bytes') {
                magSuffixes = ['b','KB','MB','GB','TB','PB','EB','ZB'];
                magBase = 1024;
            } else {
                magSuffixes = magSuffixes.split('|');
            }
            var mag = Math.floor(Math.log(value) / Math.log(magBase));
            mag = Math.max(0, Math.min(magSuffixes.length - 1, mag));
            suffix = magSuffixes[mag];
            if(suffix.length) value /= Math.pow(magBase, mag);
        }
        tailFormat = tailFormat.replace(/\[([\w\s|]+)\]/, suffix);
    }
    
    var unescape = /\\([\s\S])/g;
    tailFormat = tailFormat.replace(unescape, '$1');
    headFormat = headFormat.replace(unescape, '$1');
    
    var leftFixed = leftFormat.match(/0*$/)[0].length; // The minimum number of digits to left of decimal (we pad with zeros)

    parsedFormat = rightFormat.match(/^(0*)#*/);
    var rightAllowed = parsedFormat[0].length; // The maximum number of digits to right of decimal (we round here)
    var rightFixed = parsedFormat[1].length; // The minimum number of digits to right of decimal (we pad with zeros)

    // Perform any rounding and pad right with zeros
    value = value.toFixed(rightAllowed);

    // Prepended string
    var result = [ headFormat ];
    
    // Left of decimal
	var leftValue = parseInt("0"+value, 10).toString();
    if(leftValue == '0' && leftFixed < 1) {
        leftValue = '';
    } else {
        while(leftValue.length < leftFixed) leftValue = '0' + leftValue;
        if(showCommas) {
            var reCommatize = /(\d+)(\d{3}[\d,]*)$/g;
            while(reCommatize.test(leftValue)) {
                leftValue = leftValue.replace(reCommatize, '$1,$2');
                reCommatize.lastIndex=0;
            }
        }
    }
    result.push(negative && type != 'neg' ? '-' : '', leftValue);

    // Decimal point plus digits to right of decimal
    if(rightFixed > 0 || (rightAllowed > 0 && (value % 1) != 0)) {
        var rightValue = value.match(/\.\d*$/)[0];
        if(rightFixed < rightAllowed) rightValue = rightValue.replace(new RegExp('0{0,' + (rightAllowed - rightFixed) + '}$'), '');
        result.push(rightValue);
    }
    
    // Appended string
    result.push(tailFormat);

    return result.join('');
};


/**
 * Format dates! 
 * @param {number} value Date to be formatted 
 * @param {string} format VB Format string
 */
WSDOM.Format.formatDate = function(value, format) {
    var result = [];
    
    var hasAMPM = /A(M?)\/?P\1/i.test(format);
    
    var nextToken = /^(?:([DM])\1{0,3}|(?:Y{4}|YY?)|([WHNS])\2?|Q|(A)(M?)\/?P\4|\\?([^\\]))/i;  // What about 'C', 'ddddd', 'dddddd' and 'ttttt'?  Build 'em yourself.
    
    function fixCase(value, token) {
        var checkCase = /^(?:([MD]+)|([md]+))$/;
        var result = token.match(checkCase);
        if(!result) return value;
        if(result[1]) return value.toUpperCase();
        return value.toLowerCase();
    }
    
    var parsedToken, curVal;
    
    while(parsedToken = format.match(nextToken)) {
        if(parsedToken[5]) { // Raw text case
            result.push(parsedToken[5]);
        } else if (parsedToken[3]) {
            if(value.getHours() < 12) { // Ante/Post Meridiem (a/p | A/P | am/pm | AM/PM)
                curVal = 'a' + parsedToken[4];
            } else {
                curVal = 'p' + parsedToken[4];
            }
            result.push(parsedToken[3] == 'A' ? curVal.toUpperCase() : curVal.toLowerCase());
        } else {
            parsedToken = parsedToken[0];
            switch(parsedToken.toLowerCase()) {
                case 'd': // Single digit day (1 - 31)
                    result.push(value.getDate());
                    break;
                    
                case 'dd': // Two digit day (01 - 31)
                    curVal = value.getDate();
                    if(curVal < 10) result.push('0');
                    result.push(curVal);
                    break;
                    
                case 'ddd': // Abbreviated day (Sun - Sat)
                    result.push(fixCase(WSDOM.Format._days[value.getDay()].substring(0, 3), parsedToken));
                    break;
                    
                case 'dddd': // Full day (Sunday - Saturday)
                    result.push(fixCase(WSDOM.Format._days[value.getDay()], parsedToken));
                    break;
                    
                case 'm': // Single digit month (1 - 12)
                    result.push(value.getMonth() + 1);
                    break;
                    
                case 'mm': // Two digit month (01 - 12)
                    curVal = value.getMonth() + 1;
                    if(curVal < 10) result.push('0');
                    result.push(curVal);
                    break;
                    
                case 'mmm': // Abbreviated month (Jan - Dec)
                    result.push(fixCase(WSDOM.Format._months[value.getMonth()].substring(0, 3), parsedToken));
                    break;
                    
                case 'mmmm': // Full month (January - December)
                    result.push(fixCase(WSDOM.Format._months[value.getMonth()], parsedToken));
                    break;
                    
                case 'y': // Day of the year (1 - 366)
                    curVal = new Date(value.getFullYear(), 0, 1);
                    result.push(Math.ceil((value - curVal) / 86400000) + 1);
                    break;
                    
                case 'yy': // Two digit year (00 - 99)
                    curVal = value.getFullYear().toString();
                    result.push(curVal.substring(curVal.length - 2));
                    break;
                    
                case 'yyyy': // Four digit year (100 - 9666)
                    result.push(value.getFullYear());
                    break;
                    
                case 'w': // Day of the week (1 - 7)
                    result.push(value.getDay() + 1);
                    break;
                    
                case 'ww': // Week of the year (1 - 53)
                    curVal = new Date(value.getFullYear(), 0, 1);
                    result.push(Math.ceil(((value - curVal) / 86400000 + curVal.getDay() + 1) / 7));
                    break;
                    
                case 'h': // Single digit (0 - 23)
                    curVal = value.getHours();
                    if(hasAMPM) {
                        if(curVal == 0) {
                            curVal = 12;
                        } else if(curVal > 12) {
                            curVal -= 12;
                        }
                    }
                    result.push(curVal);
                    break;
                    
                case 'hh': // Two digit (00 - 23)
                    curVal = value.getHours();
                    if(hasAMPM) {
                        if(curVal == 0) {
                            curVal = 12;
                        } else if(curVal > 12) {
                            curVal -= 12;
                        }
                    }
                    if(curVal < 10) result.push('0');
                    result.push(curVal);
                    break;
                    
                case 'n': // Single digit (0 - 59)
                    result.push(value.getMinutes());
                    break;
                    
                case 'nn': // Two digit (00 - 59)
                    curVal = value.getMinutes();
                    if(curVal < 10) result.push('0');
                    result.push(curVal);
                    break;
                    
                case 's': // Single digit (0 - 59)
                    result.push(value.getSeconds());
                    break;
                    
                case 'ss': // Two digit second (00 - 59)
                    curVal = value.getSeconds();
                    if(curVal < 10) result.push('0');
                    result.push(curVal);
                    break;
                    
                case 'q': // Quarter of the year (1 - 4)
                    result.push(Math.floor(value.getMonth() / 3) + 1);
                    break;
                    
                default:
                    result.push(parsedToken);
            }
        }
        
        format = format.replace(nextToken, '');
    }
    
    return result.join('');
};

WSDOM.Format._days = [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ];
WSDOM.Format._months = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ];

/* -- Loaded:/includes/jslib/WSDOM/Format/format.js*/




/* -- Attempting to load:/includes/jslib/WSDOM/Format/format.js */




WSDOM.Format.formatNumber = function(value, format, colorVal) {
	var type = 'default';
	if(format instanceof Array) {
		if(value == 0 && format.length > 2 && format[2]) {
			return format[2];
		} else if(value < 0 && format.length > 1 && format[1]) {
			format = format[1];
			type = 'neg';
		} else {
			format = format[0];
		}
	}
	
	var color;
	
	if(colorVal)
		
		color = value > 0? 'positive' : 'negative';
		
	
	var parsedFormat = format.match(/([^#0]*)([#0][#0,]*)(\.?)([#0]*)([\s\S]*)/);
	
	var headFormat = parsedFormat[1];  // Prepended string
	var leftFormat = parsedFormat[2];  // Format to left of decimal place
	var rightFormat = parsedFormat[4]; // Format to right of decimal place
	var tailFormat = parsedFormat[5];  // Appended string
	
	var negative = (value < 0);
	if(negative) value *= -1;
	
	var reComma = /,/g;
	var showCommas = reComma.test(leftFormat);
	if(showCommas)
	{
		leftFormat = leftFormat.replace(reComma, '');
		reComma.lastIndex = 0;
	}

	var isPercentage = /^\s*%/.test(tailFormat);
	if(isPercentage) value *= 100;
	
	var magSuffixes = tailFormat.match(/^\s*\[([\w\s\\|]+)\]/);
	var magBase = 1000, suffix = '';
	if(magSuffixes) {
		if(value) {
			magSuffixes = magSuffixes[1];
			if(magSuffixes.toLowerCase() == 'bytes') {
				magSuffixes = ['b','KB','MB','GB','TB','PB','EB','ZB'];
				magBase = 1024;
			} else {
				magSuffixes = magSuffixes.split('|');
			}
			var mag = Math.floor(Math.log(value) / Math.log(magBase));
			mag = Math.max(0, Math.min(magSuffixes.length - 1, mag));
			suffix = magSuffixes[mag];
			if(suffix.length) value /= Math.pow(magBase, mag);
		}
		tailFormat = tailFormat.replace(/\[([\w\s|]+)\]/, suffix);
	}
	
	var unescape = /\\([\s\S])/g;
	tailFormat = tailFormat.replace(unescape, '$1');
	headFormat = headFormat.replace(unescape, '$1');
	
	var leftFixed = leftFormat.match(/0*$/)[0].length; // The minimum number of digits to left of decimal (we pad with zeros)

	parsedFormat = rightFormat.match(/^(0*)#*/);
	var rightAllowed = parsedFormat[0].length; // The maximum number of digits to right of decimal (we round here)
	var rightFixed = parsedFormat[1].length; // The minimum number of digits to right of decimal (we pad with zeros)

	// Perform any rounding and pad right with zeros
	value = value.toFixed(rightAllowed);

	// Prepended string
	var result = [ headFormat ];
	
	// Left of decimal
	var leftValue = parseInt("0"+value, 10).toString();
	if(leftValue == '0' && leftFixed < 1) {
		leftValue = '';
	} else {
		while(leftValue.length < leftFixed) leftValue = '0' + leftValue;
		if(showCommas) {
			var reCommatize = /(\d+)(\d{3}[\d,]*)$/g;
			while(reCommatize.test(leftValue)) {
				leftValue = leftValue.replace(reCommatize, '$1,$2');
				reCommatize.lastIndex=0;
			}
		}
	}
	result.push(negative && type != 'neg' ? '-' : '', leftValue);

	// Decimal point plus digits to right of decimal
	if(rightFixed > 0 || (rightAllowed > 0 && (value % 1) != 0)) {
		var rightValue = value.match(/\.\d*$/)[0];
		if(rightFixed < rightAllowed) rightValue = rightValue.replace(new RegExp('0{0,' + (rightAllowed - rightFixed) + '}$'), '');
		result.push(rightValue);
	}
	
	// Appended string
	result.push(tailFormat);
	
	//if you want it colored, color it!
	if(color) {
		
		result.unshift('<span class="'+color+'">');
		result.push('</span>');	
	}

	return result.join('');
};

/* -- Loaded:/tdameritrade/markets/overview/modules/format.additions.js*/




/* -- Attempting to load:/includes/jslib/WSDOM/Format/format.js */



MarketsSummary_class = function(args) {
	this.imgSrc= "charts/OverviewCharts.asp";
	this.cachedCharts = [];		
	this.init();
}

MarketsSummary_class.prototype.init = function () {	
	
	this.__moduleLoader = Element.get("marketSummaryLoader");	
	this.__contents		= Element.parseSelector(".content", "markets_Summary", "first");
	this.__tabItems     = Element.parseSelector('ul li', 'TabNav');
	this.__tabLinks     = Element.parseSelector('ul a', 'TabNav');
	this.__module = Element.get("markets_Summary");
	Common.addTopLink(Element.create("a",{id:"tdamPageHelp", className:"iconWhatsNew", href:"#", Events:{type:"click",context:this,handler:this.popWhatsNew}}, "What's New?"));



	var marketDiaries = Element.get("markets_marketDiaries");
	
	if(marketDiaries) {
		this.initMarketDiaries();	
	}
}

MarketsSummary_class.prototype.initMarketDiaries = function() {
	
	var marketDiaries = new MarketDiaries();
		marketDiaries.init(this, "markets_Summary");
}

MarketsSummary_class.prototype.showModuleLoading = function () {	

	var hw = Element.getSize(this.__contents);
	var content = Element.parseSelector(".content", this.__moduleLoader);	

	Element.setStyle(this.__moduleLoader, "height:" + hw.height + "px");
	Element.setStyle(this.__moduleLoader, "width:" + hw.width + "px");
	Element.setStyle(content, "margin-top:"+ ((hw.height/2) - 40) + "px");
	Element.removeClass( this.__moduleLoader, "none" );
}

MarketsSummary_class.prototype.hideModuleLoading = function () {	
	
	Element.addClass( this.__moduleLoader, "none" );
}

MarketsSummary_class.prototype.attachEvents = function(args) {
	
	this.tabEvents = 
		this.tabEvents ||
		Events.add({
			element: this.__tabLinks,
			type: 'click',
			handler: this.loadData,
			context: this
		});
		
	Events.add({
		 element:this.__module
		,type:'mouseover'
		,handler:this.showMStarData
		,context:this	
	});
};

MarketsSummary_class.prototype.showMStarData = function(e, el) {
	
	var elem = e.getTarget();
	
	if(Element.hasClass(elem, "mstar")) {
	
		Common.showMstarRatingModule(elem, elem.getAttribute('symbol'), true);
		
		Events.add({
			 element:elem
			,type:'mouseout'
			,handler:this.hideMStarData
			,context:this
		});
	}
};


MarketsSummary_class.prototype.hideMStarData = function(e, el) {
	
	Common.showMstarRatingModule(false, false, false);
	
	Events.remove( el, this.hideMStarData );
};


MarketsSummary_class.prototype.initModule = function(module){
	this.attachEvents();
	
	switch (module) {
		case 'US Markets':
			this.dropDown = new DropDown({
				onChange: this.selectTimeFrame,
				parent: Element.get('markets_Summary'),
				context: this
			});			
			this.dropDown.init();
			
			Events.add({
				element: Element.parseSelector('a.chart', Element.get('markets_Summary')),
				type: 'click',
				handler: this.loadIndexChart,
				context: this
			});			
			
			break;
			
		case 'Currencies':
			this.dropDown = new DropDown({
				onChange: this.selectTimeFrame,
				parent: Element.get('markets_Summary'),
				context: this
			});			
			
			this.dropDown.init();			
			break;
			
		case 'Fixed Income':
		
			this.dropDown = new DropDown({
				type: 'pickMulti',
				parent: Element.get('markets_Summary'),
				onChange: this.loadFixedIncomeChart,
				context: this
			});			
			
			this.dropDown.init();
					
			Events.add({
				element: Element.parseSelector('a.chart', Element.get('markets_Summary')),
				type: 'click',
				handler: this.loadFixedIncomeChart,
				context: this
			});
			
			break;
	}
}

MarketsSummary_class.prototype.selectTimeFrame = function(e, el){
	switch (this.getActiveTab()){
		case "US Markets":
			this.loadIndexChart(e, el);
			break;
		case "Currencies":
			this.loadCurrencyChart(e, el);
			break;
	}
}

MarketsSummary_class.prototype.loadData = function(e, el){
	
	e.cancel();
	el.blur();
	
	Element.removeClass(this.__tabItems, "current");
	Element.addClass(el.parentNode, "current");
	
	this.showModuleLoading();
	
	var data = {
		'action': el.getAttribute('action'),
		'module': el.getAttribute('module'),
		'content': el.getAttribute('content')
	};
	
	Common.contentBufferAbortRequests();
		
	Common.loadContentBuffer({
		debug: true,
		page: ("modules/summary/buffer.asp"),
		context: this,
		preventEval: true,
		contentType: 'text/javascript',
		data: data,		
		onload: this.loadCallBack
	});
} 

MarketsSummary_class.prototype.loadIndexChart = function(e, el){
	e.cancel();
	el.blur();	
	this.showModuleLoading();
	if (symbol = el.getAttribute('symbol')) {
		Element.removeClass(Element.parseSelector('div.indexChart li a', 'markets_Summary'), 'active')
		Element.addClass(Element.parseSelector('div.indexChart  li a[symbol="' + symbol + '"]'), 'active');
	}
	var activeIndex = Element.parseSelector('div.indexChart a.active', Element.get('markets_Summary'))[0];
	console.log
	var duration = Element.parseSelector('div.arrowDDContainer li.selected a', Element.get('markets_Summary'))[0].getAttribute('val');
	var priceOrPerc = Element.parseSelector('div.arrowDDContainer li.selected a', Element.get('markets_Summary'))[1].getAttribute('val');
	var data = {
		'action': 'drawChart',
		'type': activeIndex.getAttribute('type'),
		'symbol': activeIndex.getAttribute('symbol'),
		'duration': duration,
		'priceOrPerc': priceOrPerc
	};
		
	Common.contentBufferAbortRequests();
	
	Common.loadContentBuffer({
		debug: true,
		page: ("modules/summary/bufferChart.asp"),
		context: this,
		preventEval: true,
		contentType: 'text/javascript',
		data: data,		
		onload: this.loadCallBack
	});
}

MarketsSummary_class.prototype.loadCurrencyChart = function(e, el){
	e.cancel();
	el.blur();
	this.showModuleLoading();
	if (symbol = el.getAttribute('symbol')) {
		Element.removeClass(Element.parseSelector('div.indexChart li a', 'markets_Summary'), 'active')
		Element.addClass(Element.parseSelector('div.indexChart  li a[symbol="' + symbol + '"]'), 'active');
	}

	var duration = Element.parseSelector('div.arrowDDContainer li.selected a', Element.get('markets_Summary'))[0].getAttribute('val');
	var data = {
		'action': 'drawChart',
		'type': 'Currencies',
		'duration': duration
	};
	
	Common.contentBufferAbortRequests();
		
	
	Common.loadContentBuffer({
		debug: true,
		page: ("modules/summary/bufferChart.asp"),
		context: this,
		preventEval: true,
		contentType: 'text/javascript',
		data: data,		
		onload: this.loadCallBack
	});	
}

MarketsSummary_class.prototype.loadFixedIncomeChart = function(e, el, chosenItems){
	this.showModuleLoading();
	var subType;
	if (el.getAttribute('subtype')) {
		Element.removeClass(Element.parseSelector('ul.chartTypeLinks a', Element.get('markets_Summary')), 'active');
		Element.addClass(el, 'active')		
		el.getAttribute('subtype') == 'Key Rates'
			? Element.addClass(Element.parseSelector('div.arrowDDContainer', Element.get('markets_Summary'), 'first'), 'none')
			: Element.removeClass(Element.parseSelector('div.arrowDDContainer', Element.get('markets_Summary'), 'first'), 'none');
	}
	
	subType = Element.parseSelector('ul.chartTypeLinks a.active', Element.get('markets_Summary'), 'first').getAttribute('subtype');
	
	if(!chosenItems){
		chosenItems = [];
		var els = Element.parseSelector('ul.pickList li.selected a', Element.get('markets_Summary'));
		for(var i=0; i<els.length; i++){
			chosenItems.push(els[i].getAttribute('val'));
		}
	}
	chosenItems.push('last');

	var data = {
		'action': 'drawChart',
		'type': 'FixedIncome',
		'subType': subType,
		'timeFrames': chosenItems.join('|')
	};

	Common.contentBufferAbortRequests();
	
	Common.loadContentBuffer({
		debug: true,
		page: ("modules/summary/bufferChart.asp"),
		context: this,
		preventEval: true,
		contentType: 'text/javascript',
		data: data,		
		onload: this.loadCallBack
	});
}  


MarketsSummary_class.prototype.gutContents = function(elem){
	
	if(this.__commoditiesInstance) {
			
		this.__commoditiesInstance.remove();
		this.__commoditiesInstance = null;
	}
	
	this.__contents = this.__contents  || Element.parseSelector(".content","markets_Summary", "first");

	while(this.__contents.lastChild) {
		
		Element.remove(this.__contents.lastChild);	
	}
}


/**
 * Lambda the callback's .action property
 */
MarketsSummary_class.prototype.loadCallBack = function(data){	
	var result = DataFunctions.deserialize(data.getResult());	
	var action = result.action;		

	this[action](result);
}

MarketsSummary_class.prototype.renderCommodities = function (data) {
	this.gutContents();
	
	var smartTextEl   = Element.create("div", {className:"smaller"}, [
						    Element.create("h3", {}, data.smartText.name)
						    ,data.smartText.text
	]);
	var upperData	  = Element.create("div", {className:"upperData"}, null);
	var menuContainer = Element.create("div", {className:"hasLayout submenu"}, null, upperData);
	var submenu 	  = Element.create("ul", {className:"menu"}, null, menuContainer); 
	
	
	var count = 0;
	var triggers = [];
	var tables   = {};
	
	for(var i in data.data) {
		
		if(i == "etf") {
			continue;
		}
		
		var li 		= Element.create("li",  {className:count? "" : "first"}, null , submenu);
		var trigger = Element.create("a", {className:count? "" : "active", table:i, href:"javascript:void(0);"}, data.data[i].name, li);
		
		triggers.push(trigger);
		
		var table = new TableCreator_class({
			 parent:upperData
			,name:"commodity_" + i
			,data:data.data[ i ].data
			,headings:data.commodityHeadings
			,sort:true
		
		}).draw();
		
		if(count) {
			Element.addClass(table, "none");	
		}
		
		tables[i] = table;
		count++;
	}

	this.__commoditiesInstance = new Commodities_class({
			 triggers:triggers
			,tables:tables	
		}).init();
	
	var lowerData = Element.create("div", {className:"hasLayout"}, [
			 Element.create("div", {className:"fleft delayedDisclaimer"},  data.commodityFooter)
			,data.etfFooter.link? Element.create("div", {className:"fright"}, Element.create("a", {href:data.etfFooter}, "Screen for commodity ETFs &raquo;")):''
	]);
	
	Element.addChild( this.__contents, [ 
		 smartTextEl
		,upperData
		,lowerData
	]);
	
	this.hideModuleLoading();
};

MarketsSummary_class.prototype.renderFixedIncome = function (data) {
	
	this.gutContents();
		
	var smartTextEl = Element.create("div", {id:"fixedIncomeSmartText"}, [
			 Element.create("h3", {}, data.smartText.title)
			,Element.create('div', {className:"smartText"}, data.smartText.text )
			,data.reports
	]);
	
	var chartMarkup = Element.create("div", {id: "fixedIncomeChart"});
	Element.setHTML(chartMarkup, data.chartMarkup);
	
	var topData = Element.create("div", {className:"hasLayout"}, [smartTextEl, chartMarkup]);

	Element.addChild(chartMarkup, Element.create("div", {className:"alignRight margBot5"},
		Element.create("a", {href:data.mfFooter.link}, "Screen for bond mutual funds &raquo;")
	));

	Element.addChild(chartMarkup, Element.create("div", {className:"alignRight"}, 
		Element.create("a", {href:data.etfFooter.link}, "Screen for bond ETFs &raquo;")
	));	
	
	Element.addChild(this.__contents, topData);
	
	this.initModule('Fixed Income');
	this.hideModuleLoading();
}



MarketsSummary_class.prototype.renderCurrencyModule = function (data) {
	
	this.gutContents();

	var upperData	= Element.create("div", {className:"upperData hasLayout"}, null);
	var leftTable   = Element.create("div", {className:"dataLeft"}, null, upperData);
	var currencyChart = Element.create("div", {className:"dataRight"}, null, upperData);
	
	Element.setHTML(currencyChart, data.currencyChartData.html, true);
	
	Element.addChild(leftTable, Element.create("div", {}, Element.create("h3", {}, data.exchangeHeader)));
	
	new TableCreator_class({
		 parent:leftTable
		,name:"exchangeTable"
		,headings:data.exchangeHeadings
		,data:data.exchangeData
		,sort:true
		
	}).draw();
	
	
	Element.addChild( leftTable, Element.create("div", {className:"delayedDisclaimer"}, data.exchangeDate) );
	Element.addChild( this.__contents, [ 
		 upperData
		,data.screenerlink ? Element.create("div", {className:"fleft"}, Element.create("a", {href:data.screenerlink}, "Screen for currency ETFs &raquo;")) : ''
		
	]);
	
	this.hideModuleLoading();
	this.initModule("Currencies");
};


/**
 * Buffer callback actions
 */
MarketsSummary_class.prototype.drawChart = function(result){		
	
	var container = Element.parseSelector('div.content div.chartContent', 'markets_Summary')[0];
	
	Element.removeChildNodes(container);
	Element.setHTML(container, result.html);
	
	if(result.smartText) {
	
		var smartTextContainer = Element.parseSelector('div.smartText', 'markets_Summary')[0];
		var smartTextTitle     = Element.parseSelector('h3', 'markets_Summary')[0];
		
		Element.setHTML(smartTextTitle, result.smartText.title);
		Element.setHTML(smartTextContainer, result.smartText.text);
	}
	this.initModule(result.content);
	this.hideModuleLoading();
}


MarketsSummary_class.prototype.loadTab = function(result){
	var container = Element.get('markets_Summary');
	var content = Element.parseSelector('div.content', container)[0];	
	Element.removeChildNodes(content);
	Element.setHTML(content, result.html);	
	var oldTab = Element.parseSelector("li.current", container);	
	Element.removeClass(oldTab, "current");		
	var newTab = Element.getParent(
		Element.parseSelector('a[content="' + result.content + '"]', container)[0],
		"li"
	);
	Element.addClass(newTab, "current");
	if(result.table){
		this.renderTable(result.table)
	}
	this.initModule(result.content)
	this.hideModuleLoading();	
}

MarketsSummary_class.prototype.getActiveTab = function(){
	var tab = Element.parseSelector("li.current a", Element.get('markets_Summary'))[0];
	return tab.getAttribute("content");	
}

MarketsSummary_class.prototype.renderTable = function(table){
	
	this.table= new TableCreator_class({
		name: table.name,
		headings: table.headings,
		data: table.data,
		parent:table.name,
		sort:true
	});
	this.table.draw();	
}

MarketsSummary_class.prototype.popWhatsNew = function(e, el){
	e.cancel();
	window.open("modules/tour/index.asp", "tourWindow", "location=1, status=1, scrollbars=1, width=1100, height=1000");
}

/* for commodities menu */
var Commodities_class = function ( oArgs ) {
	
	this.__triggers = oArgs.triggers;
	this.__tables   = oArgs.tables;
	
	return this; 
};

Commodities_class.prototype.init = function () {
	
	this.events = new EventManager();
	
	this.events.add({
		 element:this.__triggers
		,type:'click'
		,handler:this.toggleTables
		,context:this	
	});
	
	return this;
};

Commodities_class.prototype.toggleTables = function (ev, el) {

	Element.removeClass( this.__triggers, "active");
	Element.addClass(el, "active");

	for(var i in this.__tables) {

		Element.addClass(this.__tables[i], "none");
	}
	
	var table = this.__tables[ el.getAttribute("table") ];
	
	Element.removeClass(table, "none");
};

Commodities_class.prototype.remove = function () {
	
	this.events.removeAll();
	
	return;
};

loadBuffer.add(function () {
	
	Common.initSymbolHover();
	
	overview = new MarketsSummary_class();	
	overview.initModule("US Markets");	
	overview.renderTable(USMarketsTable);	
});


/* -- Loaded:/tdameritrade/markets/overview/modules/summary/markets.summary.js*/




/* -- Attempting to load:/includes/jslib/WSDOM/Format/format.js */




var SectorOutlook_Module = function () {
	
};


SectorOutlook_Module.prototype.BUFFER_PATH = 'modules/sectorOutlook/markets.sectorOutlook.data.asp';

SectorOutlook_Module.prototype.init = function () {
	
	this._tableContainer = Element.get( "markets_sectorOutlookTable" );
	this._loader		 = Element.get( "markets_sectorOutlookLoader" );
	this._menuLinks 	 = Element.parseSelector("a", "markets_sectorOutlookMenu" );
	
	this.attachEvents();
};

SectorOutlook_Module.prototype.attachEvents = function () {

	Events.add({
		 element:this._menuLinks
		,type:"click"
		,handler:this.getNewData
		,context:this
	});
};

SectorOutlook_Module.prototype.getNewData = function ( ev, el, data ) {
	
	Events.cancel( ev );
	
	el.blur();
	
	if(Element.hasClass(el, "active")) {
		
		return;	
	}
	
	var item = this.currentItem = el.getAttribute("item").replace(/\s+/, '').toLowerCase();
	
	Element.removeClass( this._menuLinks, "active" );
	Element.addClass( el, "active" );
	
	this.retrieveData( item );
};

SectorOutlook_Module.prototype.retrieveData = function ( item ) {
	
	Element.removeClass( this._loader, "none" );
	
	Common.loadContentBuffer({
		 page:this.BUFFER_PATH
		,prevenEval:true
		,onload:this.handleData
		,onerror:this.renderError
		,context:this
		,data:{
			 dataType:item || 'shortterm'
			,action:'retrieveData'	
		}
	});
};

SectorOutlook_Module.prototype.handleData = function ( oData ) {

	var data = DataFunctions
					.serializer
						.deserialize( oData.getResult() );
	
	var tableHeadings = data.tableHeadings;
	var tableData 	  = data.tableData;
	var dates		  = data.dates

	this.createTable( tableHeadings, tableData, dates );
};

SectorOutlook_Module.prototype.createTable = function ( headings, data, dates ) {

	var oldTable = Element.get("table-Markets_SectorOutlookTable");

	if( oldTable )  {
		
		Events.remove(Element.parseSelector("thead a", oldTable));
		Element.remove( oldTable );	
	}
	
	
	var newTable = new TableCreator_class({
		
		 name:"Markets_SectorOutlookTable"
		,parent:this._tableContainer
		,data:data
		,headings:headings
		,sort:true
	});
	
	newTable.draw();
	
	this._contentSection = Element.parseSelector( "tbody", "markets_sectorOutlookTable", "first" );
	
	var disclaimer = Element.parseSelector("div.delayedDisclaimer", "markets_sectorOutlook", "first");
	
	switch(this.currentItem == "shortterm") {
		
		case false:
			Element.setHTML(disclaimer, "6mo, 1yr price performance data as of " 
					+ dates.quote 
					+ '<br />'
					+ '3yr price performance data as of ' + dates.qid
			);
			break;
		default:
			Element.setHTML(disclaimer, "As of " + dates.quote);
	}
	
	Element.addClass( this._loader, "none" );
};

SectorOutlook_Module.prototype.removeChildren = function ( elem ) {

	while( elem.lastChild ) {
		
		Element.remove( elem.lastChild );	
	}
};

SectorOutlook_Module.prototype.renderError = function ( ) {

	this.removeChildren( this._contentSection );
	
	Element.create("tr", {}, [
		Element.create("td", {colspan:"4"}, "The data you requested is currently unavailible.")
	], this._contentSection );
	
};

loadBuffer.add(function () {
	
	sectorOutlook = new SectorOutlook_Module();
	sectorOutlook.init();
});

/* -- Loaded:/tdameritrade/markets/overview/modules/sectorOutlook/markets.sectorOutlook.js*/




/* -- Attempting to load:/includes/jslib/WSDOM/Format/format.js */



var StockMovers_Module = function () {};

StockMovers_Module.prototype.BUFFER_PATH = 'modules/stockMovers/markets.stockMovers.data.asp';

StockMovers_Module.prototype.WLIST_URL = '/cgi-bin/apps/u/WatchListCreate?symbols=';

StockMovers_Module.prototype.init = function () {

	this._module = Element.get("markets_stockMovers");
	
	if(!this._module) {
		return;	
	}
	
	this._loader   		 = Element.get("markets_stockMoversLoader");
	this._tableContainer = Element.get("markets_stockMoversTableContainer");
	this._menuItems 	 = Element.parseSelector("a", "markets_stockMoversMenu");
	
	Common.renderTDAMButtons( "markets_stockMoversWathclistButton" );
		
	this.addEvents();
};

StockMovers_Module.prototype.addEvents = function () {
	
	Events.add({
		 element:this._menuItems
		,type:"click"
		,handler:this.retrieveData
		,context:this
	});

	Events.add({
		 element:Element.get( "watchlistCreator" )
		,type:"click"
		,handler:this.addToWatchList
		,context:this
	});
	
	this.dropDown = new DropDown({
		onChange: this.retrieveDataWithPriceChange,
		parent: Element.get('markets_stockMovers'),
		context: this
	});			
	this.dropDown.init();
};


StockMovers_Module.prototype.retrieveDataWithPriceChange = function (ev, el, data) {	
	el.blur();	
	this.priceVal = Element.parseSelector('div.arrowDDContainer li.selected a', Element.get('markets_stockMovers'))[0].getAttribute('val');
	this.priceLabel =
		Element.parseSelector('div.arrowDDContainer li.selected a', Element.get('markets_stockMovers'))[1].innerHTML + '/' +  
		Element.parseSelector('div.arrowDDContainer li.selected a', Element.get('markets_stockMovers'))[0].innerHTML;	
	this.exchange = Element.parseSelector('div.arrowDDContainer li.selected a', Element.get('markets_stockMovers'))[1].getAttribute('val');
	var dropDownHeader = Element.parseSelector('div.currentDropDown a', Element.get('markets_stockMovers'));	
	Element.setHTML(dropDownHeader, this.priceLabel); 
	this.loadBuffer();
};



StockMovers_Module.prototype.retrieveData = function (ev, el, data) {
		
	ev.cancel();
	el.blur();
		
	if(Element.hasClass(el, "active")) {
	
		return;
	}
		
	Element.removeClass( this._menuItems, "active" );
	Element.addClass( el, "active" );
	
	var symbolHovers = Element.parseSelector("div.symbolHover", document.body);
	
	if(symbolHovers && symbolHovers.length) {
		Element.remove(symbolHovers);
	}
	
	var rankingsType = el.getAttribute("item");
	
	this.rankingsType = rankingsType;
	this.loadBuffer();
};


StockMovers_Module.prototype.loadBuffer = function ( ) {
	
	var hw = Element.getSize( this._tableContainer );
	var newTop = ((hw.height /2) - 50);
	
	if(newTop < 0) {
	
		newTop = 20;
	}
	
	Element.removeClass( this._loader, "none" );
	
	this._innerLoader = this._innerLoader || Element.parseSelector("div.content", this._loader);
	this._innerLoader[0].style.top = newTop + 'px';	
	Common.loadContentBuffer({		
		 page:this.BUFFER_PATH
		,prevenEval:true
		,onload:this.handleData
		,onerror:this.renderError
		,context:this
		,data:{
			 dataType:this.rankingsType || 'Actives'
			,price:this.priceVal
			,exchange:this.exchange
			,action:'retrieveData'	
		}
	});
};


StockMovers_Module.prototype.handleData = function ( oBuffer ) {
	
	var data = DataFunctions
				.serializer
					.deserialize( oBuffer.getResult() );
				
				
	var oldTable = Element.get("table-markets_stockMoversTable");

	if(oldTable) {
	
		Events.remove( Element.parseSelector("thead a", oldTable) );
		Element.remove( oldTable );
	}

	var newTable = new TableCreator_class({
			 name:"markets_stockMoversTable"
			,data:data.data
			,headings:data.tableHeadings
			,sort:true
			,parent:"markets_stockMoversTableContainer"
			,RT:data.RT
	}).draw();
	
	var footer = Element.parseSelector(".stockMoversFooter .delayedDisclaimer", this._module);
	
	Element.setHTML(footer, data.date);
	
	Element.addClass( this._loader, "none" );
};


StockMovers_Module.prototype.removeChildren = function ( elem ) {

	while( elem.lastChild ) {
		Element.remove( elem.lastChild );	
	}
};


StockMovers_Module.prototype.renderError = function () {
	
	this.removeChildren( this._contentSection );
	
	Element.create("tr", {}, [
		Element.create("td", {colspan:"4"}, "The data you requested is currently unavailible.")
	], this._contentSection );
};

StockMovers_Module.prototype.addToWatchList = function () {

	var symbols 		= Element.parseSelector( "input[type='checkbox']", "table-markets_stockMoversTable" ),
		selectedSymbols = new Array(),
		i 				= 0,
		len				= symbols.length;
		
	if(!symbols.length) {
		
		alert("Sorry, There are no companies to create a Watchlist.");
		return;	
	}
	
	for( ; i < len; i++ ) {
		if( symbols[i].checked ) {
			selectedSymbols.push( symbols[i] );
		}
	}
	
	

	if(!selectedSymbols || !selectedSymbols.length) {
		
		alert("There are no symbols selected for your Watchlist.");
		return;	
	}
	
	
	
	
	var wListSymbols = new Array();
	
	i    = 0;
	len	 = selectedSymbols.length;
		
	for( ; i < len; i++ ) {
		
		var symbol = selectedSymbols[i].getAttribute("name");
			symbol = symbol.replace(/^\w+\_(\w+)$/, "$1");
			
		wListSymbols.push( symbol );
	}

	if ( gSessionSeedDomain ) {
		
		var wURL = gSessionSeedDomain + this.WLIST_URL + wListSymbols.join(",");
		
		location.href = wURL;
		
		if(Element.hasClass(document.body, "msie")) { /* IE6 bug */
			window.event.returnValue = false;
			location.href = wURL;	
		}
		return;
	}
	
	alert("This would go to the watch list create page for:\n"+ wListSymbols.join(", ") + " but an error occured. Please try again later.");
};

loadBuffer.add(function(){
	
	var StockMovers = new StockMovers_Module();
		StockMovers.init();	
});

/* -- Loaded:/tdameritrade/markets/overview/modules/stockMovers/markets.stockMovers.js*/




/* -- Attempting to load:/includes/jslib/WSDOM/Format/format.js */



var MostPopular_Module = function () {

};

MostPopular_Module.prototype.BUFFER_PATH = 'modules/mostPopular/markets.mostPopular.data.asp';

MostPopular_Module.prototype.MAX_NEWS_STORIES = 5;

MostPopular_Module.prototype.init = function () {
	
	this._module    	  = Element.get("markets_mostPopular");
	
	if(!this._module) {
		return;	
	}
	
	this._menuItems 	  = Element.parseSelector("a", "mostPopularMenu");
	this._descriptionArea = Element.get("mostPopularDescription");
	this._moduleBody 	  = Element.parseSelector(".moduleBody", "markets_mostPopular", "first");
	this._body			  = Element.get("cloud");
	this._loader		  = Element.get("markets_mostPopularLoader");
	this._loadingGraphic	  = Element.get("markets_mostPopularLoadingGraphic");
	
	this.addEvents();
};

MostPopular_Module.prototype.addEvents = function () {
	
	Events.add({
		 element:this._menuItems
		,type:"click"
		,handler:this.retrieveData
		,context:this
	});
};

MostPopular_Module.prototype.retrieveData = function ( ev, el ) {
	
	if(Element.hasClass(el, "active")) {
		
		return;	
	}
	
	Element.removeClass(this._menuItems, "active");
	Element.addClass(el, "active");
	
	this.dataType = el.getAttribute("item");
	
	this.showLoading();
	
	Common.loadContentBuffer({
		 page:this.BUFFER_PATH
		,prevenEval:true
		,onload:this.handleData
		,context:this
		,data:{
			 dataType:this.dataType || 'quotes'
			,action:'retrieveData'
		}
	});
};

MostPopular_Module.prototype.handleData = function ( oBuffer ) {
	
	var data = DataFunctions
				.serializer
					.deserialize( oBuffer.getResult() );

	
	Element.setHTML( this._descriptionArea, data.description );
	
	var i  		 = 0,
		len 	 = data.data.length,
		tagArray = new Array();

	for(; i < len; i++) {
		
		if(this.dataType == "mostViewed") {
		
			if(i == this.MAX_NEWS_STORIES) {
			
				break;
			}
		
			tagArray.push(this.createNewsLink(i, len, data.data[i]));
			continue;
		}
		
		tagArray.push(this.createTagCloudLink( i, len, data.data[i] ));
	}
	
	
	if(this.dataType == "mostViewed") {
		
		var ol = Element.create("ul", {className:"mostViewedNews"}, tagArray);
		
		tagArray.splice(0,tagArray.length);
		tagArray.push(ol, '<br class="clear" />');
	}

	while(this._body.lastChild) {
		
		Element.remove(this._body.lastChild);
	}
	
	Element.addChild(this._body, tagArray);
	
	this.hideLoading();
};


MostPopular_Module.prototype.createTagCloudLink = function( i, total, data ) {

	return Element.create("a", {href:data.path,className:"tag"+(i+1)}, [
			data.text + ( i+1 == total? '':', ' )
	]);
};


MostPopular_Module.prototype.createNewsLink = function( i, total, data ) {

	var elem = Element.create("li", {}, [
			Element.create("div", {className:"headline hasLayout"}, [
			  Element.create("span", {className:"olHack"}, i+1)
			 ,Element.create("div", {className:"link fleft"}, [
			 	Element.create("a", {href:data.path}, [
			 	 	 data.text
			 		,data.altText? Element.create("span", {className:"moduleHasIcon smallArrow"}, "&nbsp;&nbsp;") : ""
			 		,"<br />"
			 	])
			 	,Element.create("span", {className:"subtext"}, data.subtext)
			 ])
		])
	]);
	return elem;
};

MostPopular_Module.prototype.showLoading = function () {
	
	var w = this._moduleBody.offsetWidth;
	var h = this._moduleBody.offsetHeight;
	
	Element.setStyle(this._loader, "width:"+w+"px");
	Element.setStyle(this._loader, "height:"+h+"px");
	Element.removeClass(this._loader, "none");
	
	Element.setStyle(this._loadingGraphic, "margin-top:"+((h / 2)-10)+"px");
	Element.setStyle(this._loadingGraphic, "margin-left:"+((w / 2)-10)+"px");
};

MostPopular_Module.prototype.hideLoading = function () {
	
	Element.addClass(this._loader, "none");
};

loadBuffer.add(function(){
	
	var MostPopular = new MostPopular_Module();
		MostPopular.init();
});

/* -- Loaded:/tdameritrade/markets/overview/modules/mostPopular/markets.mostPopular.js*/




/* -- Attempting to load:/includes/jslib/WSDOM/Format/format.js */



var EventCalendar_Module;

EventCalendar_Module = function () {};

EventCalendar_Module.prototype.BUFFER_PATH = 'modules/eventCalendar/markets.eventCalendar.data.asp';

EventCalendar_Module.prototype.init = function () {
	
	this.menuItems 		= Element.parseSelector("a", "eventCalendarModule");
	this.curElement		= Element.parseSelector("a.active", "eventCalendarModule", "first");
	this.body			= Element.parseSelector(".moduleBody", "markets_eventCalendar", "first");
	this.loader			= Element.get("markets_calenderLoader");
	this.curItem    	= this.curElement.getAttribute("name");
	this.loadingGraphic = Element.get("markets_calendarLoadingGraphic");
	
	
	this.calendarLinks  = Element.parseSelector(".calendarLink", "markets_calendarTableContainer");
	this.descriptions   = Element.get("markets_calendarDescription");
	
	this.attachEvents();
};


EventCalendar_Module.prototype.attachEvents = function () {
	
	Events.add({
		 element:this.menuItems
		,type:"click"
		,handler:this.getNewCalendarEvents
		,context:this
	});
	
	if(this.calendarLinks.length) {
		
		Events.add({
			 element:this.calendarLinks
			,type:"click"
			,handler:this.openLink
			,context:this	
		});	
	}
};

EventCalendar_Module.prototype.openLink = function (ev, el) {
		
	ev.cancel();
		
	try {
		window.open(el.href, "", "width=800,height=600,scrollbars=yes,resize=yes,0");	
	}
	catch(e) {}
};



EventCalendar_Module.prototype.getNewCalendarEvents = function (ev, el, data) {
	
	el.blur();
	
	var eventType  = el.getAttribute("name");
	
	if(this.curItem == eventType) {
	
		return;
	}
	
	if(this.curItem) {
		
		Element.setHTML(this.curElement, this.curElement.getAttribute("shortname"));
		Element.removeClass(this.curElement, "active");
	}
	
	
	Element.setHTML(el, eventType);
	Element.addClass(el, "active");
	
	
	this.curElement = el;
	this.curItem 	= eventType;
	
	this.loadData(eventType);
};


EventCalendar_Module.prototype.loadData = function (item) {

	this.showLoading();
		
	Common.loadContentBuffer({
		 page:this.BUFFER_PATH
		,prevenEval:true
		,onload:this.renderData
		,context:this
		,data:{
			 item:item.toLowerCase()
			,action:'retrieveData'	
		}
	});
};


EventCalendar_Module.prototype.renderData = function ( oData ) {

	var data = DataFunctions
					.serializer
						.deserialize( oData.getResult() );
	
	var oldTable = Element.get("table-markets_calendarTable");
	
	if(oldTable) {
		Element.remove(oldTable);
	}
	
	
	Element.setHTML("markets_calendarDates", data.currDay.data + data.currWeek.data);
	Element.setHTML("markets_calendarFooter", data.item.footer.join(''));
	Element.setHTML(this.descriptions, data.item.description);
	
	this.hideLoading();
	
	if(!data.data.length) {
		return;	
	}
	
	new TableCreator_class({
			 data:data.data
			,headings:data.headings
			,parent:"markets_calendarTableContainer"
			,name:"markets_calendarTable"
			
	}).draw();
};

EventCalendar_Module.prototype.showLoading = function () {
	
	var w = this.body.offsetWidth;
	var h = this.body.offsetHeight;
	
	Element.setStyle(this.loader, "width:"+w+"px");
	Element.setStyle(this.loader, "height:"+h+"px");
	Element.removeClass(this.loader, "none");
	
	Element.setStyle(this.loadingGraphic, "margin-top:"+((h / 2)-10)+"px");
	Element.setStyle(this.loadingGraphic, "margin-left:"+((w / 2)-10)+"px");
};


EventCalendar_Module.prototype.hideLoading = function () {
	
	Element.addClass(this.loader, "none");
};


loadBuffer.add(function(){
	
	var eventCalendar = new EventCalendar_Module();
		eventCalendar.init();
});

/* -- Loaded:/tdameritrade/markets/overview/modules/eventCalendar/markets.eventCalendar.js*/




/* -- Attempting to load:/includes/jslib/WSDOM/Format/format.js */


/*
 * onChange will be the action called after popup is hidden 
 * 
 * Create client side:
 * 
 * 	 this.dropDown = new DropDown({
 *		onChange: this.selectTimeFrame,
 *		parent: Element.get('markets_Summary'),
 *		context: this
 *	});			
	this.dropDown.init();		
 */
var DropDown= function(params){
	this.type = params.type || 'pickSingle';
	this.onChange = params.onChange;
	this.parent = params.parent;
	this.context = params.context	
}

DropDown.prototype.init = function(){
	this.attachEvents();
}

DropDown.prototype.attachEvents = function(){
	Events.add({
		element: Element.parseSelector('div.dropDownArrow, div.currentDropDown', this.parent),
		type: 'click',
		handler: this.expand,
		context: this
	});
	
	Events.add({
		element: Element.parseSelector('ul.dropDown li', this.parent),
		type: 'click',
		handler: this.collapse,
		context: this
	});
}


DropDown.prototype.expand = function(e, el){	
	e.cancel();
	el.blur();
	var ul = Element.parseSelector('ul.dropDown', this.parent);
	var items = Element.parseSelector('ul.dropDown li', this.parent);	
	var container = Element.parseSelector('div.listContainer', this.parent);
	var dropDownArrow = Element.parseSelector('div.dropDownArrow', this.parent)
	
	Element.replaceClass(dropDownArrow, "closed", "open")
	Element.removeClass(container, 'none');
	Events.add({
		element: Element.get('siteContainer'),
		type: 'click',
		handler: this.collapse,
		context: this
	});
}

DropDown.prototype.collapse = function(e, el){
	e.cancel();
	el.blur();		
	Events.remove(
		Element.get('siteContainer')
	);
	var container = Element.parseSelector('div.listContainer', this.parent);
	var ul = Element.getParentBySelector(el, "ul");
	var items = Element.parseSelector('li', ul);	
	var dropDownArrow = Element.parseSelector('div.dropDownArrow', this.parent);
	var currentLabel = Element.parseSelector('div.currentDropDown a', this.parent)[0];
	
	Element.addClass(container, 'none');
	Element.replaceClass(dropDownArrow, "open", "closed");
		
	var itemClicked = Element.parseSelector('>a[val]', el)
	if (itemClicked.length) {
		if (this.type == 'pickMulti') {
			Element.toggleClass(el, 'selected');
			var chosenItems = [];
			var items = Element.parseSelector('li.selected a', this.parent);
			var subType;
			for (var i = 0; i < items.length; i++) {
				chosenItems.push(items[i].getAttribute('val'));
			}
			this.onChange.call(this.context, e, el, chosenItems);
		}
		else {
			Element.removeClass(items, 'selected');
			Element.addClass(el, 'selected');
			this.onChange.call(this.context, e, el);
		}
	}
}


/* -- Loaded:/tdameritrade/common/widgets/dropdown.js*/




/* -- Attempting to load:/includes/jslib/WSDOM/Format/format.js */


/*----------------------------
	MarketDiaries ToolTips
-----------------------------*/

var MarketDiaries = function() {}

/*----------------------------
	dataCache 
	Cache ajax request data
-----------------------------*/

MarketDiaries.prototype.dataCache = {};

/*----------------------------
	init
	initialize object and
	events
-----------------------------*/

MarketDiaries.prototype.init = function( superClass, parentID ) {
	
	this.SuperClass = superClass;
	this.parent = Element.get(parentID);
	this.body = Element.get("markets_marketDiaries");
	this.attachEvents();
	
	this.Buffer = new ContentBuffer();
	
	this.Buffer.debug = false;
	this.Serializer   = DataFunctions.serializer;
}

/*----------------------------
	attachEvents
	attach the events used
	for this module
-----------------------------*/

MarketDiaries.prototype.attachEvents = function() {
	
	Events.add({
		 element:this.parent
		,type:'click'
		,handler:this.updateDiaries
		,context:this	
	});
	
	Events.add({
		 element:document
		,type:'mousemove'
		,handler:this.getToolTip
		,context:this
	});
}

/*----------------------------
	updateDiaries
	Menu was clicked and either
	same symbol updates are 
	requested, or a new symbol
	is requested.
-----------------------------*/

MarketDiaries.prototype.updateDiaries = function( e, el ) {
		
	var elem = e.getTarget();
	var parent = Element.getParentBySelector(elem, "#markets_marketDiariesMenu");
	
	if(parent && elem.tagName == "A") {
		
		var attr = elem.getAttribute("key");
		
		var links = Element.parseSelector("a", parent);
		
		Element.removeClass(links, "active");
		Element.addClass(elem, "active");
		
		this.SuperClass.showModuleLoading();
		
		Common.contentBufferAbortRequests();
			
		Common.loadContentBuffer({
			debug: true,
			page: ("modules/marketDiaries/markets.diaries.data.asp"),
			context: this,
			preventEval: true,
			contentType: 'text/javascript',
			data:{symbol:attr},		
			onload: this.replaceDiaries
		});
	}
}

/*----------------------------
	replaceDiaries
	we inject the new data
	into the module.
	We dont need to worry 
	about events being erased
	b/c it runs off of
	delegation.
-----------------------------*/

MarketDiaries.prototype.replaceDiaries = function( buffer ) {
	
	var data = buffer.getResult();
		data = DataFunctions.serializer.deserialize(data);
	
	Element.get("markets_marketDiariesTitle").innerHTML = data.title;
	Element.get("markets_marketDiariesLeft").innerHTML  = data.advanceDeclineData + data.highLowData;
	Element.get("markets_marketDiariesRight").innerHTML = data.chart;
	
	Element.remove(Element.parseSelector(".disclaimer", "markets_marketDiaries"));
	Element.addChild("markets_marketDiaries", Element.create("div", {className:"disclaimer"}, data.text));
	
	this.SuperClass.hideModuleLoading();
}

/*----------------------------
	getToolTip
	
	set a timer for mousemove
	since its a heavy event.
	
	Either show or hide the
	tooltip. 
	
	Load the buffer
	and create the tooltip
	if it doesnt exist. 
	
	Also get the positions of 
	the mouse.
-----------------------------*/

MarketDiaries.prototype.getToolTip = function(e) {
	
	if(this.timer) {
		clearTimeout(this.timer);
		this.timer = null;
	}
	
	var ev   = e.nativeEvent;
	var x    = ev.clientX;
	var y    = ev.clientY;
	var targ = e.getTarget();
	
	this.timer = setTimeout(function() {
		
		var key  = targ.getAttributeNode("hoverkey");
		
		if(key) {
			
			if(!this.tooltip) {
				this.tooltip = this.createToolTip();
			}
			
			this.getPositions(x,y);
			
			key = key.value;
			
			var parent   = Element.getParentBySelector(targ, ".barGraph");
			var title    = Element.parseSelector(".barGraphHeading", parent, "first");
			var dataType = title.firstChild.innerHTML;
			
			if(this.dataCache[key+" "+dataType]) {
				return this.injectData(this.dataCache[key+" "+dataType]);
			}
			
			this.Buffer.abortRequests();
			
			this.Buffer.load({
				 url:buildAbsolutePath('/markets/overview/modules/marketDiaries/markets.diaries.tooltip.asp')
				,context:this
				,preventEval:true
				,data:{symbol:key, dataType:dataType}
				,onload:this.renderTooltip
				,contentType:'text/html'
			});
			return;
		}
		
		this.hideToolTip(targ);
		
	}.Context(this), 500);
}

/*---------------------------
	getPositions
	get mouse positions
---------------------------*/

MarketDiaries.prototype.getPositions = function(x,y) {

	x += document.body.scrollLeft;
	y += document.body.scrollTop;

	this.x = x;
	this.y = y;
}

/*---------------------------
	createToolTip
	create tool tip
---------------------------*/

MarketDiaries.prototype.createToolTip = function() {
	
	var el = Element.create('div', {id:'marketDiaryToolTip'}, [
				 Element.create('div', {id:'marketDiaryTitle', className:"margBot10"})
				,Element.create('div', {id:'marketDiaryBody'}, "Loading...")
				,Element.create('div', {id:'marketDiaryFooter'})
	], document.body);
	
	Events.add({
		 element:el
		,type:'mouseover'
		,context:this	
		,handler:this.hideToolTip
	});
		
	return el;
}

/*---------------------------
	renderTooltip
	deserialize and inject
	the html with data
---------------------------*/

MarketDiaries.prototype.renderTooltip = function( Buffer ) {
	
	var data = this.Serializer.deserialize( Buffer.getResult() );
	
	this.dataCache[data.title] = data;
	this.injectData(data);
}

/*---------------------------
	injectData
	inject the data with 
	html accordingly
---------------------------*/

MarketDiaries.prototype.injectData = function( data ) {

	var title  = Element.get("marketDiaryTitle");
	var body   = Element.get("marketDiaryBody");
	var footer = Element.get("marketDiaryFooter");
	
	Element.setHTML([title, body, footer], "");
	
	Element.create("h3", {}, data.title, title);
	
	Element.create("div", {className:"dottedTop hasLayout"}, [
		Element.create("div", {className:"fright"}, "Total: " + data.total)
	], footer);
	
	var points = data.points;
	var i      = 0;
	var len    = points.length;
	
	for(; i < len; i++) {
		
		Element.create("div", {className:"hasLayout row"}, [
			 Element.create("div", {className:"fleft keyItemColor "+points[i].klass})
			,Element.create("div", {className:"fleft"}, points[i].name)
			,Element.create("div", {className:"fright"}, points[i].value)
		], body);
	}

	var h = this.tooltip.offsetHeight;
	
	this.tooltip.style.left = this.x + 10 + 'px';
	this.tooltip.style.top  = (this.y) - (h) + 'px';
	
	Element.removeClass(this.tooltip, "hidden");
}

/*---------------------------
	hideToolTip
	hide the tooltip
	and move it off screen
---------------------------*/

MarketDiaries.prototype.hideToolTip = function(targ) {
	
	if(targ.getTarget) {
		targ = targ.getTarget();	
	}
	
	var key  = targ.getAttributeNode("hoverkey");
	
	if(!key) {
		
		this.Buffer.abortRequests();
	
		if(this.tooltip) {
			Element.addClass(this.tooltip, "hidden");
			this.tooltip.style.left = "-1000px";
		}
	}
}

/* -- Loaded:/tdameritrade/markets/overview/modules/marketDiaries/markets.diaries.js*/


