/********************************************************
Including html utils.
*********************************************************/

String.prototype.endsWith = function(suffix) {
    return this.indexOf(suffix, this.length - suffix.length) !== -1;
};


/**
 * String buffer implementation for js.
 * @returns {StringBuffer}
 */
function StringBuffer() {
   this.buffer = [];
}
 StringBuffer.prototype.append = function append(string) {
   this.buffer.push(string);
   //return this;
 };
 
 StringBuffer.prototype.toString = function toString() {
   return this.buffer.join("");
 };

 StringBuffer.prototype.join = function join(ch) {
   return this.buffer.join(ch);
 };

 var email_reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;

/**
 * html rendering util functions.
 */ 
function tag(name, content, attributes) {
	return {name: name, content: content, attributes: attributes };
}

function link(text, attribs) {
	return tag("a", [text], attribs);
}

function pg(text, attribs) {
	return tag("p", [text], attribs);
}
function img(text, attribs) {
	return tag("img", [text], attribs);
}

function tableData(text, attribs) {
	return tag("td", [text], attribs);
}

function htmlDoc(title, bodyContent) {
	return tag("html", [tag("head", [tag("title", [title])]),
						tag("body", bodyContent)]);
}

function escapeHTML(text) {
	var replacements = [[/&/g, "&amp;"], [/"/g, "&quot;"],
					[/</g, "&lt;"], [/>/g, "&gt;"]];
	
	forEach(replacements, function(replace) {
		text = text.replace(replace[0], replace[1]);
	});
	
	return text;
}

function forEach(array, action) {
	for (var i = 0; i < array.length; i++)
	action(array[i]);
}

function renderHTML(element) {
	var pieces = [];

	function renderAttributes(attributes) {
		var result = [];
		if (attributes) {
		for (var name in attributes)
			result.push(" " + name + "=\"" +
						escapeHTML(attributes[name]) + "\"");
		}
		return result.join("");
	}
	
	function render(element) {
		// Text node
		if (typeof element == "string") {
		pieces.push(escapeHTML(element));
		}
		// Empty tag
		else if (!element.content || element.content.length == 0) {
		pieces.push("<" + element.name +
					renderAttributes(element.attributes) + "/>");
		}
		// Tag with content
		else {
		pieces.push("<" + element.name +
					renderAttributes(element.attributes) + ">");
		forEach(element.content, render);
		pieces.push("</" + element.name + ">");
		}
	}

	render(element);
	return pieces.join("");
}

function getUrlVars(str)
{
	
	if (!str)
		str = '';
    var vars = [], hash;
    var hashes = str.slice(str.indexOf('?') + 1).split('&');
    for(var i = 0; i < hashes.length; i++)
    {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }
 
    
    if(str.indexOf('lstId=') > 0){
    	var lstId = str.substring(str.indexOf('lstId=') +6, str.indexOf('?') > 0  ? str.indexOf('?') : str.length);
        vars.lstId = lstId;
    }

    if(str.indexOf('alysId=') > 0){
        var alysId = str.substring(str.indexOf('alysId=')+7, str.length);
        vars.alysId = alysId;
    }
    
    return vars;
}	

function readCookie(cookieName) {
	 var theCookie=" "+document.cookie;
	 var ind=theCookie.indexOf(" "+cookieName+"=");
	 if (ind==-1) ind=theCookie.indexOf(";"+cookieName+"=");
	 if (ind==-1 || cookieName=="") return "";
	 var ind1=theCookie.indexOf(";",ind+1);
	 if (ind1==-1) ind1=theCookie.length; 
	 return unescape(theCookie.substring(ind+cookieName.length+2,ind1));
}

function createLinkObj(type, config){
	var cnt = getCountry();
	var obj = {};
	switch(type)
	{
		case 'an':
			var data = config.analData;
				var anlName = data.alysName.replace(/\s+/g, '-');
				var firmName = data.alysFirm.replace(/\s+/g, '-');

				obj.href = '/'+getCountry()+'/analyst/'+anlName+'/'+firmName+'/alysId='+data["id"];
			if(config.className)
				obj['class'] = "anLink "+config.className;
			else
				obj['class'] = 'anLink';
			
			break;
		case 'st':
			var lstData = config.stkData;
			var recoData = config.recoData;
			var cnt = config.cnt;
			var recoId = '';
			if(recoData && recoData["id"]){
				recoId = recoData["id"]
			}
			var lstId = '';
			if(lstData){
				lstId =lstData["id"]; 
			}
			var recoIdStr = recoId !='' ? '?recoId='+recoId : ''; 
				var stkName = lstData.stkName.replace(/\s+/g, '-');
				//stkName = stkName.replace('&', '&amp;')
				var exchgTkr = lstData.exchgTkr;
				//exchgTkr = exchgTkr.replace('&', '&amp;');
				
				obj.href = '/'+getCountry()+'/stock/'+stkName+'/'+exchgTkr+'/lstId='+lstId;
				obj.href = obj.href + recoIdStr;
				if(config.className)
					obj['class'] = "tickerLink "+config.className;
				else
					obj['class'] = 'tickerLink';
			break;
		case 're':

			break;
		case 'sec':
			var data = config.data;
			var name = data.secName.replace(/\s+/g, '-');
			obj.href = '/'+getCountry()+'/top-rated-analysts-in-'+name+'-sector/'+data["id"];
			if(config.className1)
				obj['class'] = "seLink "+config.className1;
			else
				obj['class'] = 'seLink';
			break;

		case 'disc':
			obj.href = '/'+getCountry()+'/s/Disclaimer.htm';
			obj['class'] = "bannerDisc";
			break;
	}
	
	return obj;
}

function getImgUrl(i){
	return '/MilkOrWater/images/'+i;
}
function getStkImg(data){
	return '/MilkOrWater/images/spark/'+data["priExchg"]+'_'+data["exchgTkr"]+'.png';
}

var monthNames=new Array(12);
monthNames[0]="Jan";
monthNames[1]="Feb";
monthNames[2]="Mar";
monthNames[3]="Apr";
monthNames[4]="May";
monthNames[5]="Jun";
monthNames[6]="Jul";
monthNames[7]="Aug";
monthNames[8]="Sep";
monthNames[9]="Oct";
monthNames[10]="Nov";
monthNames[11]="Dec";

var formatDateString = function(s, fmt) {
	  var pad = function(x) { return ((x.length<2) ? "0" : "") + x; } , dt = new Date("" + s), d, m, y;
	  
	  if (dt.getTime()) {
	    d = pad(""+dt.getDate());
	    m = dt.getMonth();
	    y = ""+dt.getFullYear();
	    
	    if(fmt == 'cmp'){
		    return [d, monthNames[m]].join('-');
	    }else{
		    return [d, monthNames[m], (""+y.substr(2, y.length))].join('-');
	    }
	  }
	  return '';
};



/********************************************************
Including html utils Ends here.
*********************************************************/
cntry="india";
function getCountry(){
	return cntry;
}
function setCountry(pcntry){
	cntry = pcntry;
}

function getAnalystById(idStr, dataObj){
	var data = formatJson(dataObj);
	return data.analystBase[data["id"]]["AlysName"];
}


function getStkById(dataObj){
	var data = formatJson(dataObj);
	return "";
}

/**
 * Top rated stocks dash board
 * @param dataObj
 * @param logger
 * @returns
 */
function tpRtdStks_home(dataObj, logger){
	logDebug(logger, '***********************************Inside tpRtdStks_home');
	var buff = new StringBuffer();
	var data = formatJson(dataObj);
	var recoRelation = data.recoRelation;
	var recoBase = data.recoBase;
	var analystBase = data.analystBase;
	var stockBase = data.stockBase;
	var sectorBase = data.sectorBase;
	var context = data.context;
	var type = data.type;
	logDebug(logger, '***********************************country : '+ data["cnt"]);
	buff.append('<div class="tabledesc tpStkReco"><h3>Stock Recommendations by Top Analysts</h3></div><div class="topstocks borderall"><table class ="tablepadding10" ><tbody>');
	
	var min_count = data.bannerRows > recoRelation.length ? 0  : data.bannerRows;
	for (var k = min_count; k < recoRelation.length; k++)
	{

		try{
			var x = calculateRecoAgeClassCode(recoBase[recoRelation[k].id]['recoDt']);
			buff.append("<tr>");
			buff.append('<td rel="tooltip1" class="' + x.classname + '" title="' + x.tip + '" />');
			var td_tamplate = '<td class="td1 tdline  borderb"><p class="comp_name boldtext">'+renderHTML(link(stockBase[recoRelation[k].lstId]["exchgTkr"], 
					createLinkObj("st", {"cnt": data["cnt"] ,"recoData":recoBase[recoRelation[k].id], "stkData":stockBase[recoRelation[k].lstId]})))+
					'</p><p class="comp_namefull">'+stockBase[recoRelation[k].lstId]["stkName"]+
					'</p>'+getStockImgHtmlLanding(stockBase[recoRelation[k].lstId])+'</td><td class="td2 tdline  borderb">'+createAnHtmReco(analystBase, recoRelation[k], data)+'</td><td class="td3 borderb buydetails">'+createRecoWidget(data, recoRelation[k])+'</td>';

			buff.append(td_tamplate);
			buff.append("</tr>");
		}catch(e){
			logDebug(logger, e);
		}
	}
	buff.append('</tbody></table></div>'+createMoreLink(type, data.cnt));

	return buff.toString();
}

function typeOf(obj) {
	  if ( typeof(obj) == 'object' )
	    if (obj.length)
	      return 'array';
	    else
	      return 'object';
	    else
	  return typeof(obj);
	}



function createAnHtmBanner(analystBase, recorelation, analystRank, sectorBase, analystSectorRank){
	
	var buff = new StringBuffer();
	buff.append('<div class  ="ban_an_con" id ="reco_'+recorelation.id+'">');
	var buff2 = new StringBuffer();
	var alysIds = recorelation.alysId;
	
	if (typeOf(alysIds) != "array"){
		alysIds= new Array();
		alysIds[0] = recorelation.alysId;
	}

	buff.append('<span id ="analNamesBanner" class="s2gtitle1">');
	for ( var i = 0; i < alysIds.length; i++) {
		buff.append(renderHTML(link(analystBase[alysIds[i]]['alysName'], createLinkObj('an', {"className":"bannerLinks", "cnt": data["cnt"] , 'analData':analystBase[alysIds[i]]}))));
		buff2.append('<p class="bannerAns">'+renderHTML(link(analystBase[alysIds[i]]['alysName'], createLinkObj('an', {"className":"bannerLinks", "cnt": data["cnt"] , 'analData':analystBase[alysIds[i]]})))+'</p>');
		buff2.append('<p/>');
		if(i != (alysIds.length-1))
		buff.append(',&nbsp;');
	}
	buff.append('</span>');
	
	buff.append('</div>');
	buff.append('<div class="s2gtitle1 tooltip" id ="reco_'+recorelation.id+'" >'+buff2.toString()+'</div>');
	buff.append('<p class="s1gtitle2 ">'+analystBase[alysIds[0]]['alysFirm']+'</p>');
	
	
	return buff.toString();
}

function createAnalystLink(dataObj, logger){
	var data = formatJson(dataObj);
	var analystBase = data.analystBase;
	//logDebug(logger, analystBase['alysName']);
	return renderHTML(link(analystBase['alysName'], createLinkObj('an', {'analData':analystBase})));
}

function createStockLink(dataObj, logger){
	var data = formatJson(dataObj);
	var stockBase = data.stockBase;
	//logDebug(logger, analystBase['alysName']);
	return renderHTML(link(stockBase['exchgTkr'], createLinkObj('st', {'stkData':stockBase})));
}

function createAnHtmReco(analystBase, recorelation, dataObj){
	
	var buff = new StringBuffer();
	var data = formatJson(dataObj);
	
	buff.append('<div >');
	var alysIds = recorelation.alysId;
	var secId = recorelation.secId;
	var lstId = recorelation.lstId;
	
	var analystStkRank = data.analystStkRank;
	if (typeOf(alysIds) != "array"){
		alysIds= new Array();
		alysIds[0] = recorelation.alysId;
	}
	for ( var i = 0; i < alysIds.length; i++) {
		buff.append('<p class="person_name">'
		+renderHTML(link(analystBase[alysIds[i]]['alysName'], createLinkObj('an', {"cnt": data["cnt"] , 'analData':analystBase[alysIds[i]]})))+'</p>');
		
		// create an stk rank
		var currRank = analystStkRank && analystStkRank[alysIds[i]+'-'+lstId] ? analystStkRank[alysIds[i]+'-'+lstId] : null;
		if(currRank){
			buff.append('<span class = person_rang>Stock Rank&nbsp;<span class="boldtext">'+currRank.rank+'</span></span>');
		}else{
			buff.append('<span class = person_rang>Not Ranked</span></span>');
		}
	}
	
	buff.append('<p class="comp_capition ">'+analystBase[alysIds[0]]['alysFirm']+'</p>');
	buff.append('</div>');
	return buff.toString();
}

function createAnHtmRecoHover(analystBase, recorelation, dataObj){
	
	var buff = new StringBuffer();
	var data = formatJson(dataObj);
	
	buff.append('<br /><br /><div class ="clear analystDetails" style ="display: none;  text-align: center;" ><hr color="AAAAAA" align="center">');
	var alysIds = recorelation.alysId;
	var secId = recorelation.secId;
	var lstId = recorelation.lstId;
	
	var analystStkRank = data.analystStkRank;
	if (typeOf(alysIds) != "array"){
		alysIds= new Array();
		alysIds[0] = recorelation.alysId;
	}
	for ( var i = 0; i < alysIds.length; i++) {
		buff.append('<p class="person_name left">'
		+renderHTML(link(analystBase[alysIds[i]]['alysName'], createLinkObj('an', {"cnt": data["cnt"] , 'analData':analystBase[alysIds[i]]})))+'</p>');
		
		// create an stk rank
		var currRank = analystStkRank && analystStkRank[alysIds[i]+'-'+lstId] ? analystStkRank[alysIds[i]+'-'+lstId] : null;
		if(currRank){
			buff.append('<p class = "person_rang right">Stock Rank&nbsp;<span class="boldtext">'+currRank.rank+'</span></p>');
		}else{
			buff.append('<p class = "person_rang right">Not Ranked</span></p>');
		}
		buff.append('<br class="clear">');
		
	}
	
	buff.append('<p class="comp_capition clear">'+analystBase[alysIds[0]]['alysFirm']+'</p>');
	buff.append('</div>');
	return buff.toString();
}


function createAnHtm(analystBase, recorelation, analystRank, sectorBase, analystSectorRank){
	
	var buff = new StringBuffer();
	buff.append('<div >');
	var alysIds = recorelation.alysId;
	
	if (typeOf(alysIds) != "array"){
		alysIds= new Array();
		alysIds[0] = recorelation.alysId;
	}
	
	for ( var i = 0; i < alysIds.length; i++) {
		buff.append('<p class="person_name">'
		+renderHTML(link(analystBase[alysIds[i]]['alysName'], createLinkObj('an', {"cnt": data["cnt"] , 'analData':analystBase[alysIds[i]]})))+'</p>');
		
		if(analystRank && analystRank[alysIds[i]]){
			buff.append('<span class = person_rang>Overall Rank&nbsp;<span class="boldtext">'+analystRank[alysIds[i]]["currRk"]+'</span></span>');
		}else if(analystRank){
			buff.append('<span class="">Not Ranked</span>');
		}
		if(analystSectorRank && analystSectorRank[alysIds[i]]){
			buff.append('|<span class = person_rang>Sector Rank&nbsp;<span class="boldtext">'+analystRank[alysIds[i]]["rank"]+'</span></span>');
		}else if(analystSectorRank){
			buff.append('|<span class="">Not Ranked</span>');
		}
		
		
	}
	
	buff.append('<p class="comp_capition ">'+analystBase[alysIds[0]]['alysFirm']+'</p>');
	
	if(sectorBase && sectorBase[recorelation.secId]){
		buff.append('<p class="blacktext">'+sectorBase[recorelation.secId]['secName']+'</p>');
	}
	buff.append('</div>');
	
	return buff.toString();
}

/**
 * Utility to create Three circles Reco widget
 * @param dataObj
 * @param recoRelation
 * @param logger
 * @returns
 */
function createRecoWidget(dataObj, recoRelation, logger){
	var data = formatJson(dataObj);
	//var recoRelation = data.recoRelation;
	var recoBase = data.recoBase?data.recoBase : data.recosBase;
	var analystBase = data.analystBase;
	var stockBase = data.stockBase;
	var sectorBase = data.sectorBase;
	var context = data.context;
	var type = data.type;
	var buff = new StringBuffer();
	if(recoBase[recoRelation.id]["actn"] == 'SELL')
		buff.append('<div class="sellprocess wraper">');
	else if(recoBase[recoRelation.id]["actn"] == 'BUY')
		buff.append('<div class="buyprocess wraper">');
	else 
		buff.append('<div class="holdprocess wraper">');
		
		buff.append('<p class="buyprecent1 blacktext left">'+calculateRoi(getCMP(recoRelation.lstId, data.cmp), recoBase[recoRelation.id]['recoDtPx'], recoBase[recoRelation.id]['actn'])+
		'</p><p class="buyprecent2 blacktext left">'+calculateRoi(recoBase[recoRelation.id]['tgtPx'], getCMP(recoRelation.lstId, data.cmp), recoBase[recoRelation.id]['actn'])+
		'</p><p class="buyprecent3 boldtext left">'+createRecoAction(recoBase[recoRelation.id]["actn"])+
		'</p></div><div class="rupee left">'+getCurrSym()+'</div><div class="buyinfo_1 left"><p class="price boldtext">'+calculatePx(recoBase[recoRelation["id"]]['recoDtPx'], true)+
		'</p><p>Reco given</p><p class="blacktext">'+calculateHorizonTillNow(recoBase[recoRelation["id"]]['recoDt'])+
		'</p></div><div class="buyinfo_2 left">'+getCMPHtml(recoRelation.lstId, data.cmp, logger, null,true)+'</div><div class="buyinfo_3 left"><p class=" greentext bigtext">'+calculatePx(recoBase[recoRelation["id"]]['tgtPx'], true)+'</p><p>Target </p><p class="blacktext">'+calculateHorizonFromNow(recoBase[recoRelation["id"]]['tgtDt'])+'</p></div>');

	return buff.toString();
}

/**
 * function to find currency symbol based on country.
 */
function getCurrSym(){
	switch (getCountry()) 
	{
		case 'india': return "<img src = "+getImgUrl('rupee-symbol.png')+" />";
		case 'usa': return '&#36';
		default: return '&#8377';
	}
}

function calculatePx(px, dontShowSym, decimalPlcs){
	if(!px || px==='' || px===null || px==='NA' || px==='-'){
		return px;
	}
	if(dontShowSym == true){
		if(isNaN(decimalPlcs))
			return ((""+px).indexOf('.') > 0 ? parseFloat(px).toFixed(2) : px);
		else
			return (parseFloat(px).toFixed(2));
	}else{
		if(isNaN(decimalPlcs))
			return ""+getCurrSym()+"&nbsp;"+((""+px).indexOf('.') > 0 ? parseFloat(px).toFixed(2) : px);
		else
			return ""+getCurrSym()+"&nbsp;"+(parseFloat(px).toFixed(2));
	}
}

function getCMPDate(tradeDate,tradeTime){
	var cmpdate = { day:'',time:''};
	
	
	//new Date(year, month, day, hours, minutes, seconds, milliseconds);
	
	var split = tradeDate.split('-');

	var     year= split[0];
	var     month = split[1];
	var    day = split[2];
	
	var dt = new Date(year, month-1, day);
	
	var todayDate = new Date();

	if(todayDate.getDate()  == dt.getDate() &&  todayDate.getMonth() == dt.getMonth() && todayDate.getYear()== dt.getYear()){
		day = 'Today';
	}else{
		day = 	formatDateString(dt, 'cmp');
	}
	
	var time = tradeTime;
	
	cmpdate.day = day;
	cmpdate.time = time;
	return cmpdate;
}

/**
 * Utility to create CMP html
 * @param lstId
 * @param cmp
 * @param logger
 * @returns
 */
function getCMPHtml(lstId, cmp, logger, layout, dontShowSym){
	var buff = new StringBuffer();
	var obj = getCMPWithDate(lstId, cmp);
	var cmpdate = getCMPDate(obj.tradeDate,obj.tradeTime);
	
	if(layout == "banner"){
		obj.cmp = getCurrSym()+calculatePx(obj.cmp, true, 2);
		buff.append(obj.cmp+', <span class ="s1gtitle3 ">'+cmpdate.day+',&nbsp;'+cmpdate.time+'</span>');
	}else{
		obj.cmp = calculatePx(obj.cmp, dontShowSym, 2);
		
		buff.append('<p class="price boldtext">'+obj.cmp+'</p>');
		if(cmpdate.day != "")
			buff.append('<p>'+cmpdate.day+'</p>')
		
		if(cmpdate.time != "")
		buff.append('<p class="blacktext">'+cmpdate.time+'</p>');
	}
	return buff.toString();

}
/**
 * Utility to create performance widget. 
 * @param perf
 * @returns
 */
function createPerformanceWidget(perf){
	
	var buff = new StringBuffer();
	
	if(perf){
		buff.append('<div class="ranks" title="'+makePercent(perf.roi,0)+'%"><p>ROI</p><div class="strength-bar"><div class="filled-green" style="width:'+makePercent(perf.roi,0)+
				'%"></div></div></div><div class="ranks" title="'+makePercent(perf.accuracy,0)+'%"><p>Accuracy</p><div class="strength-bar"><div class="filled-blue" style="width:'+makePercent(perf.accuracy,0)+'%"></div></div></div><div class="ranks" title="'+makePercent(perf.sharpe,0)+'%"><p>Sharpe Ratio</p><div class="strength-bar"><div class="filled-red" style="width:'+makePercent(perf.sharpe,0)+'%"></div></div></div>');
	}
	else{
		buff.append('<p>Insufficient price history</p>');
		buff.append('<p>to assess this recommendation</p>');
		
	}
	return buff.toString();
}

/*
function createRecoIndvHeader(data){
	
	var buff = new StringBuffer();
	
	buff.append('<div class="margint"><div class="indraco_title left">RELIANCE.NS <span>Reliance Industries Ltd.</span></div><div class="icon3 borderall left"><p class="borderr left"><img src="star_icon.png" width="16" height="16"></p><p class="left"><img src="add_icon.png" width="16" height="16"></p></div><div class="rec_history right"><a href="#">Recommendation History</a><div class="rechis_box"><table class="tablepadding10"><thead><th class="borderb">Target Dt./Horiz.</th><th class="borderb">TP/ Proj. Ret</th></thead><tbody><tr><td class="">May 30, 2011<br>6 Months</td><td class="">1200<br>+20 %</td></tr></tbody></table></div></div><div class="clear"></div></div><div class="borderb sectorrank "><table class="tablepadding10"><tr><td class="td1"><p class="person_name">Bala Subrahmanyam</p><p class="">Rank <span class="blacktext boldtext">100</span> | Sector Rank  <span class="blacktext boldtext">50</span></p></td><td class=" td2"><div class="top_buyprecent1 buyprecent90"><p class="buyleft bigtext greentext boldtext left">1600</p><p class="buyprecent blacktext boldtext right">+36%</p><br class="clear"></div><div class="top_buyprecent2 buyprecent90"><p class="buyleft left"><img src='+getImgUrl("buy.png")+' width="28" height="28"></p><p class="buytarget">Target<br><span class="blacktext right">+ 6 Mos</span></p><br class="clear"></div></td><td ></td></tr></table></div><div class="totalreca"><table class="tablepadding10"><tr><td rowspan="2" class="td1">Total <span class="blacktext boldtext"> 25 </span> Recommendations </td><td class="td2 greentext"><p><img src='+getImgUrl("buy.gif")+' width="35" height="15"></p><p>8</p></td><td class="td2 redtext"><p><img src='+getImgUrl("sale.gif")+' width="35" height="15"></p><p>7</p></td><td class="td2"><p><img src='+getImgUrl("hold.gif")+' width="35" height="15"></p><p>6</p></td></tr></table></div> ');	
	return buff.toString();
}
*/
function tpRtdAnl_home(dataObj, logger){
	logDebug(logger, '***********************************Inside tpRtdAnl_home');

	var buff = new StringBuffer();
	var data = formatJson(dataObj);
	if(!data)
		return '';
	var analystSectors = data.analystSectors;
	var analystBase = data.analystBase;
	var analystsRank = data.analystsRank;
	var sectorBase = data.sectorBase;
	var context = data.context;
	var type = data.type;

	buff.append('<div class="topanalyst right"> <div class="tabledesc tpRankAlys"><h3>Top Ranked Analysts</h3></div><div class="borderall"><table class="tablepadding10"><tbody>');
	
	if(analystSectors){
		for (k = 0; k < (analystSectors.length); k++)
		{
			try{
				var alid = analystSectors[k].id;
				buff.append('<tr>');
				var tamplate = '<td class="td1 tdline borderb"><p class="person_name">'+renderHTML(link(analystBase[alid]['alysName'], createLinkObj('an', {"cnt": data["cnt"] ,'analData':analystBase[alid]})))+
				'</p>'+getAnalRank(analystsRank, alid)+'<p class="comp_capition">'+analystBase[alid]['alysFirm']+
				'</p></td><td class="borderb td6">'+createPerformanceWidget(data.analystPerf[alid])+'</td></tr>';
				
				buff.append(tamplate);
			}catch(e){
				logDebug(logger, e);
				continue;
			}
		}
	}
	buff.append('</tbody></table></div>'+createMoreLink(type, data.cnt) +'</div>');
	logDebug(logger, '***********************************Exiting  tpRtdAnl_home');
	return buff.toString();
}

function stkBySec_home(dataObj, logger){
	logDebug(logger, '***********************************Inside stkBySec_home');
	var buff = new StringBuffer();
	var data = formatJson(dataObj);
	var stkRecoSummary = data.stkRecoSummary;
	var stkBase = data.stkBase;
	var context = data.context;
	var allSecs = data.allSeckts;
	var sectSummary = data.sectSummary;
	var type = data.type;
	var totalSummaryMap = data.totalSummaryMap;
	var template = '<div class="stockwecover"><div class="tabledesc stockCover"><h3>Stocks we Cover</h3></div>'+
						'<div id ="stk_by_sect_home_head" class="stockrecommands bordert">%%SECT_WE_COV_HEAD%%'+
						'</div>'+
						'<div class="borderall">'+
							'<div class="stockcoverlist left"><h4>SECTOR</h4>'+
								'<div class ="stockcoverlistWrap" style ="height:288px;overflow:hidden;" ><ul class="stockswebover">%%SECTORS_LIST%%</ul>'+
								'</div>'+
							'</div>'+
							'<div class="stockcoverinfo borderl right">'+
								'<div class="stockcovertitles borderb"><table><tbody><tr><td>Stocks</td><td style="text-align:right;">Recommendations</td><td class="swc_buy"><p class="in_buy mrl6">BUY</p></td><td class="swc_sell"><p class="in_sall mrl6">SEll</p></td><td class="swc_hold"><p class="in_hold mrl6">Hold</p></td></tr></tbody></table>'+
								'</div>'+
								'<div id ="stk_by_sec_home_data" class="stockcovertablebox" >%%STKS_BY_SECOTRS_LIST%%'+
								'</div>'+
							'</div><br class="clear">'+
					     '</div>'+
					 '</div>';

	
	template = template.replace('%%SECTORS_LIST%%', secList(allSecs.allSectors, 'stk'));
	template = template.replace('%%STKS_BY_SECOTRS_LIST%%', secStk_data(data, logger));
	template = template.replace('%%INDUS_LIST%%', '');
	template = template.replace('%%SECT_WE_COV_HEAD%%', sec_stk_head(allSecs.allSectors[0].secName, sectSummary, totalSummaryMap));
	buff.append(template);
	return buff.toString();
}
function AnlBySec_home(dataObj, logger){
	logDebug(logger, '***********************************Inside AnlBySec_home');

	var buff = new StringBuffer();
	var data = formatJson(dataObj);
	var analystBase = data.analystBase;
	var alysRecoSummary = data.alysRecoSummary;
	var context = data.context;
	var allSecs = data.allSeckts;
	var sectSummary = data.sectSummary;
	var type = data.type;
	var totalSummaryMap = data.totalSummaryMap;
	
	var template = '<div class="tabledesc analyCover"><h3>Analyst Coverage By Sector</h3></div><div id ="anl_by_sect_home_head" class="stockrecommands bordert">%%ANAL_SEC_HEAD%%</div><div class="stockswebover borderall"><div class="stockcoverlist left"><h4>SECTOR</h4><div class ="anlcoverlistWrap" style ="height:288px;overflow:hidden;"><ul class="stockswebover">%%SEC_LIST%%</ul></div></div><div class="analystwecover borderl right"><div class="analystcovertitles borderb"><p class="left">Analyst</p><p class="right">Recommendations</p><br class="clear"></div><div id ="anl_by_sec_home_data" class="analystwecovertablebox" >%%ANAL_DATA%%</div></div><br class="clear"></div>';
	template = template.replace('%%ANAL_SEC_HEAD%%', sec_stk_head(allSecs.allSectors[0].secName, sectSummary, totalSummaryMap));
	template = template.replace('%%SEC_LIST%%', secList(allSecs.allSectors, 'anl'));
	template = template.replace('%%ANAL_DATA%%', secAnl_data(data, logger));
	buff.append(template);
	return buff.toString();
}

function tpRtdStks_rd(dataObj, logger){
	logDebug(logger, '***********************************Inside tpRtdStks_rd');
	var buff = new StringBuffer();
	var data = formatJson(dataObj);
	var recoRelation = data.recoRelation;
	var recoBase = data.recoBase;
	var analystBase = data.analystBase;
	var stockBase = data.stockBase;
	var sectorBase = data.sectorBase;
	var context = data.context;
	var cmp = data.cmp;
	var type = data.type;
	buff.append('<h3>'+data.widg_head+'</h3>');
	buff.append('<div class="border3"><table class="tablepadding10">');
	if(!recoRelation)
		return '';
	for (k = 0; k < recoRelation.length; k++)
	{
		try{
			if(k == 0 && data.renderMsg){
				buff.append(data.msgText);
			}
			var x = calculateRecoAgeClassCode(recoBase[recoRelation[k].id]['recoDt']);
			buff.append('<tr>');
			buff.append('<td rel="tooltip1" class="' + x.classname + '" title="' + x.tip + '" />');
			var td_tamplate = '<td class="companydetails tdline borderb td1"><p class="comp_name boldtext">'+renderHTML(link(stockBase[recoRelation[k].lstId]["exchgTkr"], 
					createLinkObj("st", {"cnt": data["cnt"] ,"recoData":recoBase[recoRelation[k]["id"]],"stkData":stockBase[recoRelation[k].lstId]})))+ '</p><p class="comp_namefull marginb">'+stockBase[recoRelation[k].lstId]["stkName"]+ '</p><p class="cmpprice blacktext">'
					+getCMPHtml(recoRelation[k].lstId ,data.cmp)+	'</p></td><td class="persondetails tdline borderb td2">'+createAnHtmReco(analystBase, recoRelation[k], data)+'</td> <td class="borderb td3">'+createRecoWidgetDash(data, recoRelation[k])+'</td><tr>';
			buff.append(td_tamplate);
		}catch(e){
			logDebug(logger, e);
		}
	}
	buff.append('</tbody></table></div>'+createMoreLink(type, data.cnt));
	logDebug(logger, '***********************************Exiting  createRecoListings : '+ context);

	return buff.toString();
}

/**
 * Creates reco display widget for dashboard pages.
 * @param recoBase
 * @param recoRelation
 * @returns
 */
function createRecoWidgetDash(data, recoRelation){
	var buff = new StringBuffer();
	
	buff.append('<div class="addicon"><div class="top_buyprecent1 buyprecent90"><p class="buyleft bigtext greentext boldtext left">'+calculatePx(data.recoBase[recoRelation.id]['tgtPx'])+
					'</p><p class="buyprecent blacktext right">'+calculateRoi(data.recoBase[recoRelation.id]['tgtPx'], getCMP(recoRelation.lstId, data.cmp), data.recoBase[recoRelation.id]["actn"])+
					'</p><br class="clear"></div><div class="top_buyprecent2 buyprecent90"><div class="buyleft mleft6 left">'+getRecoActionHtml(data.recoBase[recoRelation.id]["actn"])+
					'</div><div class="buytarget right"><p>Target</p><p class="blacktext right">'+calculateHorizonFromNow(data.recoBase[recoRelation.id]['tgtDt'])+
					'</p></div><br class="clear"></div><div class="moreoption icon1 borderlb">'+getAddIcon(recoRelation.lstId,recoRelation.alysId ,recoRelation.id, recoRelation.secId  )+'</div></div></div>');
	
	return buff.toString();
}

/**
 * Creates reco display widget for dashboard pages.
 * @param recoBase
 * @param recoRelation
 * @returns
 */
function createRecoWidgetOpen(data, recoRelation){
	var buff = new StringBuffer();
	if(!data.recoBase){
		data.recoBase = data.recosBase;
	}
	
	if((recoRelation.id != 0) && data.recoBase[recoRelation.id]['recoState'] == "OPEN" ){
		buff.append('<div><div class="top_buyprecent1"><p class="buyleft bigtext greentext boldtext left">'+calculatePx(data.recoBase[recoRelation.id]['tgtPx'])+
				'</p><p class="buyprecent blacktext right">'+calculateRoi(data.recoBase[recoRelation.id]['tgtPx'], getCMP(recoRelation.lstId, data.cmp), data.recoBase[recoRelation.id]["actn"])+
				'</p><br class="clear"></div><div class="top_buyprecent2 buyprecent90"><div class="buyleft mleft6 left">'+getRecoActionHtml(data.recoBase[recoRelation.id]["actn"])+
				'</div><div class="buytarget right"><p>Target</p><p class="blacktext right">'+calculateHorizonFromNow(data.recoBase[recoRelation.id]['tgtDt'])+
				'</p></div><br class="clear"></div></div></div>');
		
	}else{
		buff.append(Messages["AR_NO_OPEN_RECO"]);
	}
	
	return buff.toString();
}


/**
 * Not logged in warning for fav recos .
 * @returns
 */
function favRecoNotLoggedIn_rd(){
	var buff = new StringBuffer();
	buff.append('<h3>My Favorites</h3><table class=" se_re borderall"><tbody><tr><td><div class="waringbox_fav"><p>To set up your favorite stocks, analysts, sectors and the recommendations, sign-up for free or <a href="#" class="loginlink">Login</a>.</p></div><div class="singfree"> <a id="various" class="singup" href="#inline1">Sign-up For Free</a></div></td></tr></tbody></table>');
	return buff.toString();
	
}

function stk_most_reco(dataObj, logger){
	logDebug(logger, '***********************************Inside createStockWithMostRecos');
	var buff = new StringBuffer();
	var data = formatJson(dataObj);favRecoNotLoggedIn_rd
	var stockBase = data.stockBase;
	var recoBase = data.recoBase;
	//var recoPerf = data.recoPerf;
	var analystBase = data.analystBase;
	var stockTopRecoAnalyst  = data.stockTopRecoAnalyst;
	var stockRecoSumm  = data.stockRecoSumm;
	var context = data.context;
	var type = data.type;

	buff.append('<h3>'+data.widg_head+'</h3><div class="border3"><table class="tablepadding10">');
	for (var k = 0; k < stockTopRecoAnalyst.length; k++ )
	{
			try{		
			buff.append('<tr>');
			buff.append('<td class="companydetails borderb td1"><p class="comp_name boldtext">'+renderHTML(link(stockBase[stockTopRecoAnalyst[k].id]["exchgTkr"], 
					createLinkObj("st", {"cnt": data["cnt"] ,"stkData":stockBase[stockTopRecoAnalyst[k].id]})))+
					'</p><p class="comp_namefull marginb">'+stockBase[stockTopRecoAnalyst[k].id]["stkName"]+
					'</p><p class="cmpprice margint blacktext">'+getCMPHtml(stockTopRecoAnalyst[k].id, data.cmp)+
					'</p></td><td class="borderb">'+createMostRecoLandWidget_rd(stockRecoSumm[stockTopRecoAnalyst[k].id])+'</td><td class="borderb td5"><div class="addicon"><div class="moreoption icon1 borderlb">'+getAddIcon(stockTopRecoAnalyst[k].id,"","", "")+'</div></div></td></tr>');	
			}catch(e){
				logDebug(logger, e);
				continue;
			}
	}

	buff.append('</table></div>'+createMoreLink(type, data.cnt));
	logDebug(logger, '***********************************Exiting  createStockWithMostRecos');
	return buff.toString();
}


function stkMostRecoLanding(dataObj, logger){
	logDebug(logger, '***********************************Inside stkMostRecoLanding');
	var buff = new StringBuffer();
	var data = formatJson(dataObj);
	var stockBase = data.stockBase;
	var recoBase = data.recoBase;
	//var recoPerf = data.recoPerf;
	var analystBase = data.analystBase;
	var stockTopRecoAnalyst  = data.stockTopRecoAnalyst;
	var stockRecoSumm  = data.stockRecoSumm;
	var context = data.context;
	var type = data.type;

	buff.append('<div class="border3"><table class=" tablepadding10 borderall">');
	for (var k = 0; (stockTopRecoAnalyst && k < stockTopRecoAnalyst.length); k++ )
	{
			try{	
			buff.append('<tr>');
					buff.append('<td class="ex_downcname borderb  tdline"><p class="comp_name boldtext">'+renderHTML(link(stockBase[stockTopRecoAnalyst[k]]["exchgTkr"], 
					createLinkObj("st", {"cnt": data["cnt"] ,"stkData":stockBase[stockTopRecoAnalyst[k]]})))+'</p><p class="comp_namefull marginb">'+stockBase[stockTopRecoAnalyst[k]]["stkName"]+
					'</p></td><td class="ex_downmap borderb tdline"><p class="comp_chart"><img src='+getStkImg(stockBase[stockTopRecoAnalyst[k]])+
					' width="100" height="40"></p></td><td class="ex_downcmp tdline borderb"><p class="blacktext">'+getCMPHtml(stockTopRecoAnalyst[k], data.cmp)+
					'</p></td><td class ="borderb tdline" >'+createMostRecoLandWidget_rd(stockRecoSumm[stockTopRecoAnalyst[k]])+'</td><td class="td7 borderb  "><div class="icon2 borderall wraper"><p class="borderr left">'
					+getStarIcon(stockTopRecoAnalyst[k] ,'', '', '', data.userFav, "STOCK")+'</p><p class="left">'+
					getLandingAddIcon(stockTopRecoAnalyst[k] ,'', '', '', data.userFav)+'</p></div></td></tr>');
			
			}catch(e){
				logDebug(logger, e);
				continue;
			}
	}
	buff.append('</table></div>');
	logDebug(logger, '***********************************Exiting  stkMostRecoLanding ');
	return buff.toString();
}
/*
function createMostRecoLandWidget(stockRecoSumm){
	var buff = new StringBuffer();
	buff.append('<div class="pl_50"><span class="blacktext boldtext">'+(stockRecoSumm["totalBuy"] + stockRecoSumm["totalSell"] + stockRecoSumm["totalHold"])+'</span> Recommendations</div><div class="bsh pl_50"><div class="left"><p class="in_buy">BUY</p><p>'+stockRecoSumm["totalBuy"]+'</p></div><div class="left"><p class="in_sall">SEll</p><p>'+stockRecoSumm["totalSell"]+'</p></div><div class="left"><p class="in_hold">Hold</p><p>'+stockRecoSumm["totalHold"]+'</p></div><div class="clear"></div></div>');
	return buff.toString();
}
*/
function createMostRecoLandWidget_rd(stockRecoSumm){
	var buff = new StringBuffer();
	buff.append('<div><span class="blacktext boldtext">'+(stockRecoSumm["totalBuy"] + stockRecoSumm["totalSell"] + stockRecoSumm["totalHold"])+'</span> Recommendations</div><div class="bsh"><div class="left"><p class="in_buy">BUY</p><p>'+stockRecoSumm["totalBuy"]+'</p></div><div class="left"><p class="in_sall">SEll</p><p>'+stockRecoSumm["totalSell"]+'</p></div><div class="left"><p class="in_hold">Hold</p><p>'+stockRecoSumm["totalHold"]+'</p></div><div class="clear"></div></div>');
	return buff.toString();
}

function exStks_rd(dataObj, logger){
	logDebug(logger, '***********************************Inside exStks_rd');
	var buff = new StringBuffer();
	var data = formatJson(dataObj);
	var recoRelation = data.recoRelation;
	var recoBase = data.recoBase;
	var analystBase = data.analystBase;
	var stockBase = data.stockBase;
	var sectorBase = data.sectorBase;
	var context = data.context;
	var type = data.type;
	buff.append('<h3>'+data.widg_head+'</h3><div class="border3"><table class="tablepadding10">');
	for (k = 0; k < recoRelation.length; k++)
	{
		try{
			var x = calculateRecoAgeClassCode(recoBase[recoRelation[k].id]['recoDt']);
			buff.append('<tr>');
			buff.append('<td rel="tooltip1" class="' + x.classname + '" title="' + x.tip + '" />');
			var tamplate = '<td class="companydetails tdline borderb td1"><p class="comp_name boldtext">'+renderHTML(link(stockBase[recoRelation[k].lstId]["exchgTkr"], 
					createLinkObj("st", {"cnt": data["cnt"] ,"recoData":recoBase[recoRelation[k].id],"stkData":stockBase[recoRelation[k].lstId]})))+ 
					'</p><p class="comp_namefull marginb">'+stockBase[recoRelation[k].lstId]["stkName"]+ 
					'</p><p class="cmpprice blacktext">'+getCMPHtml(recoRelation[k].lstId, data.cmp)+
					'</p></td><td class="persondetails tdline borderb td2">'+createAnHtmReco(analystBase, recoRelation[k], data)+'</td><td class="borderb td3">'+getExIcon(type)+''+ calculateRoi(recoBase[recoRelation[k].id]['tgtPx'], getCMP(recoRelation[k].lstId, data.cmp), recoBase[recoRelation[k].id]['actn'])+'</span><div class="moreoption icon1 borderlb">'
					+getAddIcon(recoRelation[k].lstId,recoRelation[k].alysId,recoRelation[k].id, recoRelation[k].secId)+'</div></div></td></tr>';
			buff.append(tamplate);
				}catch(e){
			logDebug(logger, e);
		}
	}
	buff.append('</table></div>'+createMoreLink(type, data.cnt));
	logDebug(logger, '***********************************Exiting  createRecoListings');

	return buff.toString();
}

function getMissingPerfHtm(){
	return '<td class="borderb td4">&nbsp;</td><td style="vertical-align: middle;" class="met borderb"><img alt="Insufficient price history for this stock" src="'+getImgUrl("alert.png")+'" style="margin-left: -165px;"></td><td class="tdline borderb" style="vertical-align: middle; font-size: 12px;"><div class="ranks" title="75%" style="margin-left: -92px; margin-bottom: 0px;"><p>Insufficient price history to score recommendation</p></div></td>';
}

function recClose_rd(dataObj, logger){

	var buff = new StringBuffer();
	var data = formatJson(dataObj);

	var recoRelation = data.recoRelation;
	var recoBase = data.recoBase;
	var analystBase = data.analystBase;
	var stockBase = data.stockBase;
	var sectorBase = data.sectorBase;
	var analystRank = data.analystRank;
	var analystSectorRank = data.analystSectorRank;
	var stockRecoSummary = data.stockRecoSummary;
	var recoPerf = data.recoPerf;
	var type = data.type;

	buff.append('<h3>'+data.widg_head+'</h3><div class="border3"><table>');
	for (k = 0; k < recoRelation.length; k++ )
	{
			try{
				var x = calculateRecoAgeClassCode(recoBase[recoRelation[k].id]['recoDt']);
				buff.append('<tr>');
				buff.append('<td rel="tooltip1" class="' + x.classname + '" title="' + x.tip + '" />');
						buff.append('<td class="companydetails tdline borderb td1"><p class="comp_name boldtext">'+renderHTML(link(stockBase[recoRelation[k].lstId]["exchgTkr"], 
						createLinkObj("st", {"cnt": data["cnt"] ,"recoData":recoBase[recoRelation[k].id],"stkData":stockBase[recoRelation[k].lstId]})))+ 
						'</p><p class="comp_namefull">'+stockBase[recoRelation[k].lstId]["stkName"]+
						'</p>'+getStockImgHtmlLanding(stockBase[recoRelation[k].lstId])+'</td><td class="persondetails tdline borderb td2">'+createAnHtmReco(analystBase, recoRelation[k], data)+'</td><td class="tdline borderb td3">'+createClosedRecoWidget(recoRelation[k], data)+'</td>');
						
						if(recoPerf[recoRelation[k]["id"]]){
							buff.append('<td class="tdline borderb td4">'+createClosedRecoCompare(recoPerf, recoBase, recoRelation[k]["id"])+'<td class="tdline borderb td6">'+createPerformanceWidget(recoPerf[recoRelation[k].id])+'</td>');
						}else{
							buff.append('<td class="borderb td4">&nbsp;</td><td style="vertical-align: middle;" class="met borderb"><img alt="Insufficient price history for this stock" src="'+getImgUrl("alert.png")+'" style="margin-left: -165px;"></td><td class="tdline borderb" style="vertical-align: middle; font-size: 12px;"><div class="ranks" title="75%" style="margin-left: -92px; margin-bottom: 0px;"><p>Insufficient price history to score recommendation</p></div></td>');
						}
						
						buff.append('<td class="td7 borderb"><div class="icon1 borderall">'+getLandingAddIcon(recoRelation[k].lstId, recoRelation[k].alysId, recoRelation[k].id, recoRelation[k].secId, data.userFav)+'</div></td></tr>');
				
			}catch(e){
				logDebug(logger, e);
				continue;
			}
			
	}

	buff.append('</tbody></table></div>'+createMoreLink(type, data.cnt));

	return buff.toString();
}

function recCloseRecoLanding(dataObj, logger){

	var buff = new StringBuffer();
	var data = formatJson(dataObj);

	var recoRelation = data.recoRelation;
	var recoBase = data.recoBase;
	var analystBase = data.analystBase;
	var stockBase = data.stockBase;
	var sectorBase = data.sectorBase;
	var analystRank = data.analystRank;
	var analystSectorRank = data.analystSectorRank;
	var stockRecoSummary = data.stockRecoSummary;
	var recoPerf = data.recoPerf;
	var type = data.type;
	buff.append('<div class="border3"><table class="se_re" >');
	for (k = 0; (recoRelation && k < recoRelation.length); k++ )
	{
			try{
				var x = (recoBase[recoRelation[k].id]['recoDt']);
				buff.append('<tr>');
				buff.append('<td rel="tooltip1" class="' + x.classname + '" title="' + x.tip + '" />');
				buff.append('<td class="companydetails tdline borderb td1"><p class="comp_name boldtext">'+renderHTML(link(stockBase[recoRelation[k].lstId]["exchgTkr"], 
						createLinkObj("st", {"cnt": data["cnt"] ,"recoData":recoBase[recoRelation[k].id],"stkData":stockBase[recoRelation[k].lstId]})))+ 
						'</p><p class="comp_namefull">'+stockBase[recoRelation[k].lstId]["stkName"]+
						'</p>'+getStockImgHtmlLanding(stockBase[recoRelation[k].lstId])+'</td><td class="persondetails tdline borderb td2">'+createAnHtmReco(analystBase, recoRelation[k], data)+'</td><td class ="tdline borderb td3">'+createClosedRecoWidget(recoRelation[k], data)+
						'</td>');
						
						if(recoPerf[recoRelation[k]["id"]])
							buff.append('<td class="tdline borderb td4">'+createClosedRecoCompare(recoPerf, recoBase, recoRelation[k]["id"])+'<td class="tdline borderb td6">'+createPerformanceWidget(recoPerf[recoRelation[k].id]));
						else
							buff.append('<td class="borderb td4">&nbsp;</td><td style="vertical-align: middle;" class="met borderb"><img alt="Insufficient price history for this stock" src="'+getImgUrl("alert.png")+'" style="margin-left: -165px;"></td><td class="tdline borderb" style="vertical-align: middle; font-size: 12px;"><div class="ranks" title="75%" style="margin-left: -92px; margin-bottom: 0px;"><p>Insufficient price history to score recommendation</p></div></td>');
						buff.append('<td class="td7 borderb"><div class="icon1 borderall">'
						+getLandingAddIcon(recoRelation[k].lstId, recoRelation[k].alysId, '', recoRelation[k].secId, data.userFav)+'</div></td></tr>');
			}catch(e){
				logDebug(logger, e);
				continue;
			}
	}

	buff.append('</table></div>');

	return buff.toString();
}

function createClosedRecoCompare(recoPerf, recoBase, recoId){
	var buff = new StringBuffer();
/*	if(recoPerf[recoId])
	 buff.append('<p class="boldtext">'+calculatePx(recoPerf[recoId]['closePx'])+
			 '</p><p>Actual</p><p class="bigtext blacktext">'+
			 calculateRoi(recoPerf[recoId]['closePx'], recoBase[recoId]['recoDtPx'], recoBase[recoId]['actn'])+
			 '</p></td>'+getTpMet(recoPerf[recoId]['tpMet']));
	
*/	
	if(recoPerf[recoId]){
		 buff.append('<p>Actual</p>');
		 buff.append('<p class="boldtext">'+calculatePx(recoPerf[recoId]['closePx'])+'</p>');
		 buff.append('<p class="bigtext blacktext">'+
				 calculateRoi(recoPerf[recoId]['closePx'], recoBase[recoId]['recoDtPx'], recoBase[recoId]['actn'])+
				 '</p>');
		 buff.append('<p class="font10">');
		 if(recoPerf[recoId]["closeDt"])
			 buff.append(formatDateString(new Date(recoPerf[recoId]["closeDt"].time)));
		 buff.append('</p>');
		 buff.append('</td>'+getTpMet(recoPerf[recoId]));
	}
	
	return buff.toString();
}
/*
 * been updated as per new layout.
function createClosedRecoWidget(recoRelation, dataObj, recoState){
	var data = formatJson(dataObj);
	//var recoRelation = data.recoRelation;
	var recoBase = data.recoBase;
	var analystBase = data.analystBase;
	var stockBase = data.stockBase;
	var sectorBase = data.sectorBase;
	var analystRank = data.analystRank;
	var analystSectorRank = data.analystSectorRank;
	var stockRecoSummary = data.stockRecoSummary;
	//var recoPerf = data.recoPerf;
	var type = data.type;
	
	var buff = new StringBuffer();
	buff.append('<div class="top_buyprecent1"><p class="buyleft bigtext greentext boldtext left">'+calculatePx(recoBase[recoRelation.id]['tgtPx'])+
			'</p><p class="buyprecent blacktext boldtext right">');
			if(recoState == "open"){
				buff.append(calculateRoi(recoBase[recoRelation.id]['tgtPx'], getCMP(recoRelation.lstId, data.cmp), recoBase[recoRelation.id]['actn']));
			}else{
				buff.append(calculateRoi(recoBase[recoRelation.id]['tgtPx'], recoBase[recoRelation.id]['recoDtPx'], recoBase[recoRelation.id]['actn']));
			}
			buff.append('</p><br class="clear"></div><div class="top_buyprecent2"><div class="buyleft mleft6 left">');
	if(recoBase[recoRelation.id]['actn'] == 'BUY'){
		buff.append('<p class="buycir">'+recoBase[recoRelation.id]["actn"]+'</p>');	
	}else if(recoBase[recoRelation.id]["actn"] == 'SELL'){
		buff.append('<p class="sellcir">'+recoBase[recoRelation.id]["actn"]+'</p>');	
	}else{
		buff.append('<p class="holdcir">'+recoBase[recoRelation.id]["actn"]+'</p>');	
	}		
	
	buff.append('</div><div class="buytarget right"><p>Target</p><p class="blacktext right">');
	if(recoState == "open"){
		buff.append(calculateHorizonFromNow(recoBase[recoRelation.id]['tgtDt']));
	}else{
		buff.append(calculateHorizon(recoBase[recoRelation.id]['recoDt'], recoBase[recoRelation.id]['tgtDt']));
	}
	
	buff.append('</p></div><div class="clear"></div></div><div class="buyprecent120"><div class="buytarget1 left">'+calculatePx(recoBase[recoRelation.id]['recoDtPx'])+'</div><div class="buytarget1 right">Reco dt</div></div>');
	
	return buff.toString();
}
*/
function createClosedRecoWidget(recoRelation, dataObj, recoState){
	var data = formatJson(dataObj);
	//var recoRelation = data.recoRelation;
	var recoBase = '';
	if(!data.recoBase){
		recoBase = data.recosBase;
	}else{
		recoBase = data.recoBase;
	}
	
	var analystBase = data.analystBase;
	var stockBase = data.stockBase;
	var sectorBase = data.sectorBase;
	var analystRank = data.analystRank;
	var analystSectorRank = data.analystSectorRank;
	var stockRecoSummary = data.stockRecoSummary;
	//var recoPerf = data.recoPerf;
	var type = data.type;
	
	var buff = new StringBuffer();
	
	var col;
	switch (recoBase[recoRelation.id]["actn"]) {
		case 'SELL': col="redtext"; break;
		case 'BUY': col="greentext"; break;
		case 'HOLD': col=""; break;
	};
	buff.append('<div>');
		
	if(recoBase[recoRelation.id]["recoState"] == "OPEN"){
		buff.append('<div class="bigtext bold '+col+'">'+recoBase[recoRelation.id]["actn"]+'</div>');	
		buff.append('<div class="boldtext '+col+'" >Target '+calculatePx(recoBase[recoRelation.id]['tgtPx'])+'</div>');
		buff.append('<div> <span class ="boldtext " >ROI '+calculateRoi(recoBase[recoRelation.id]['tgtPx'], recoBase[recoRelation.id]['recoDtPx'], recoBase[recoRelation.id]['actn'])+'</span>');
		buff.append('</div>');
		buff.append('<div class="clear"></div>');
		buff.append('<div>');
		buff.append('<p class ="left font10">Recommended at: ' +calculatePx(recoBase[recoRelation.id]['recoDtPx'])
			+' ('+formatDateString(new Date(recoBase[recoRelation.id]['recoDt'].time))+')</p>');
		
	}else{
		buff.append('<div class="bigtext bold '+col+'">'+recoBase[recoRelation.id]["actn"]+'</div>');	
		buff.append('<div class="boldtext '+col+'" >Target '+calculatePx(recoBase[recoRelation.id]['tgtPx'])+'</div>');
		buff.append('<div> <span class ="boldtext " >ROI '+calculateRoi(recoBase[recoRelation.id]['tgtPx'], recoBase[recoRelation.id]['recoDtPx'], recoBase[recoRelation.id]['actn'])+'</span>');
		buff.append('</div>');
		buff.append('<div class="clear"></div>');
		buff.append('<div>');
		buff.append('<p class ="left font10">Recommended at: ' +calculatePx(recoBase[recoRelation.id]['recoDtPx'])
			+' ('+formatDateString(new Date(recoBase[recoRelation.id]['recoDt'].time))+')</p>');
	}	
		
		buff.append('</div>');
	
	buff.append('</div>');

	return buff.toString();
}

function getRecoActionHtml(action){
	var buff = new StringBuffer();
	
	if(action == 'BUY'){
		buff.append('<p class="buycir">'+action+'</p>');	
	}else if(action == 'SELL'){
		buff.append('<p class="sellcir">'+action+'</p>');	
	}else{
		buff.append('<p class="holdcir">'+action+'</p>');	
	}	
	
	return buff.toString();
}

function createAnalRkMosWise(analystOARank, alysid){
	var buff = new StringBuffer();
	
	if(analystOARank[alysid] && analystOARank[alysid]['currRk'] && (analystOARank[alysid]['currRk'] > 0)){
		buff.append('<p class="person_rang">Overall Rank <span class="boldtext lftspace">'+analystOARank[alysid]["currRk"]+'</span></p>');
		buff.append('<p class="ranks"></p>')
	}
	else{
		buff.append('<p class="ranks">Not Ranked</p>');
	}
	
	if(analystOARank[alysid] && analystOARank[alysid]['thrMonRk'] && (analystOARank[alysid]['thrMonRk'] > 0))
	buff.append('<p class="psml">3 months ago<span class="blacktext lftspace">'+analystOARank[alysid]['thrMonRk']+'</span></p>');
	
	if(analystOARank[alysid] && analystOARank[alysid]['sixMonRk'] && (analystOARank[alysid]['sixMonRk'] > 0))
		buff.append('<p class="psml">6 months ago<span class="blacktext lftspace">'+analystOARank[alysid]['sixMonRk']+'</span></p>');
	
	if(analystOARank[alysid] && analystOARank[alysid]['yearRk'] && (analystOARank[alysid]['yearRk'] > 0))
		buff.append('</span></p><p class="psml">12 months ago<span class="blacktext lftspace">'+analystOARank[alysid]['yearRk']+'</span></p>');

		
	return buff.toString();
}

function createAnalystOARank_ar(dataObj, logger){
	logDebug(logger, '***********************************Inside createAnalystOARank');
	var buff = new StringBuffer();
	var data = formatJson(dataObj);
	var analystOARank = data.analystOARank;
	var analystBase = data.analystBase;
	var analystSectRank = data.analystSectRank;
	var context = data.context;
	var type = data.type;
	var analystSectors = data.analystSectors;
	var sectorBase = data.sectorBase;
	
	buff.append('<h3>Top Ranked Analysts</h3><div class="border3"><table class="tablepadding10">');
	
	for (var i = 0; i < analystSectors.length ; i++) {
		try{
			var alysId = analystSectors[i].id;
				buff.append('<tr>');
			    buff.append('<td class="tdline borderb td1">'+createAnHtm(analystBase, {"alysId":alysId}, null, null)+'</td><td class="tdline borderb td2">'+createAnalRkMosWise(analystOARank, alysId)+'</td>');
				buff.append('<td class="borderb td3"><div class="addicon">');
				
					var sects = analystSectors[i].sectors;
					
					for(var se = 0; se < sects.length; se++){
						var analystSectsRankTmp = analystSectRank[alysId+'-'+sects[se]];
						
						buff.append('<p class="ranks">'+sectorBase[sects[se]]["secName"]);
						
						if(analystSectsRankTmp)
							buff.append('<span class="blacktext lftspace">'+analystSectsRankTmp["rank"]+'</span>');
						else
							buff.append('<span class="blacktext lftspace">-</span>');
							
						buff.append('</p>');

				}
					
				buff.append('<div class="moreoption icon1 borderlb">'+getAddIcon("",alysId ,"", "")+'</div></div></td></tr>');
		}catch(e){
			logDebug(logger, e);
		}
	}
	
	buff.append('</table></div>'+createMoreLink(type, data.cnt));
	
	logDebug(logger, '***********************************Exiting  createAnalystOARank ');

	return buff.toString();
	
}

function createAnalystSecRank_ar(dataObj, logger){
	logDebug(logger, '***********************************Inside createAnalystSecRank');
	var buff = new StringBuffer();
	var data = formatJson(dataObj);
	var recoBase = data.recoBase;
	var recoRelation = data.recoRelation;
	var SectorTopAnalyst = data.SectorTopAnalyst;
	var analystBase = data.analystBase;
	var analystOARank = data.analystOARank;
	var sectorSummary = data.sectorSummary;
	var sectorBase = data.sectorBase;
	var context = data.context;
	var type = data.type;
	buff.append('<h3>Top Ranked Analysts for a Sector</h3><div class="border3"><table class="tablepadding10">');
	for (k = 0; k < SectorTopAnalyst.length; k++ )
	{
			try{
				buff.append('<tr>');
				//buff.append('<td class="' + calculateRecoAgeClassCode(recoBase[recoRelation[k].id]['recoDt']) + '"/>');
				buff.append('<td class="tdline borderb tdrght1"><p class="sect_name">'+renderHTML(link(sectorBase[SectorTopAnalyst[k].id]["secName"], createLinkObj('sec', {"cnt": data["cnt"] ,'data':sectorBase[SectorTopAnalyst[k].id]})))+
						'</p><p class="psml">'+sectorSummary[SectorTopAnalyst[k].id]['totalStk']+
						' Stocks</p><p class="psml">'+sectorSummary[SectorTopAnalyst[k].id]['totalAlys']+
						' Analysts </p><p class="psml">'+sectorSummary[SectorTopAnalyst[k].id]['totalReco']+
						' Recos</p></td><td class="borderb "><div class="addicon">');
				
							var alysList = SectorTopAnalyst[k].alysId;
							if(!alysList || alysList.length == 0){
								logDebug(logger, "No Analyst/s received with SectorTopAnalyst : sectId : "+ SectorTopAnalyst[k].id);
							}else{
								for(j = 0; j < alysList.length; j++ ){
									buff.append('<p class="">'+renderHTML(link(analystBase[alysList[j]]['alysName'], createLinkObj('an', {"cnt": data["cnt"] ,'analData':analystBase[alysList[j]]})))+
											'</p><p class="lftspace blacktext">Sector Rank '+(j+1)+'</p><p class="ranks"></p>');
								}
							}
						
						buff.append('<div class="moreoption icon1 borderlb">'+getAddIcon("", "", "", SectorTopAnalyst[k].id)+'</div></div></td></tr>');
				
			}catch(e){
				logDebug(logger, e);
				continue;
			}
	}
	buff.append('</table></div>'+createMoreLink(type, data.cnt));
	logDebug(logger, '***********************************Exiting  createAnalystOARank ');
	return buff.toString();	
}



function createAnalystStkRank_ar(dataObj, logger){
	logDebug(logger, '***********************************Inside createAnalystSecRank');
	var buff = new StringBuffer();
	var data = formatJson(dataObj);
	var stockTopAnalyst = data.stockTopAnalyst;
	var analystBase = data.analystBase;
	var recoBase = data.recoBase;
	var recoRelation = data.recoRelation;
	var stockBase = data.stockBase;
	var analystRank	= data.analystRank;
	var stockRecoSumm = data.stockRecoSumm;
	var context = data.context;
	var  type = data.type;
	buff.append('<h3>Top Ranked Analysts for a Stock</h3><div class="border3"><table>');
	for (var name in stockTopAnalyst) {
		try{
			if (stockTopAnalyst.hasOwnProperty(name)) {
				var analyst = stockTopAnalyst[name];
				oneReco = analyst[0].recoId;
				buff.append('<tr>');
				//buff.append('<td/>');
				buff.append('<td class="toprankedbystocks tdline borderb td1"><p class="comp_name boldtext">'+renderHTML(link(stockBase[name]['exchgTkr'], createLinkObj('st', {"cnt": data["cnt"] ,"recoData":recoBase[oneReco],'stkData':stockBase[name]})))+
						'</p><p class="comp_namefull marginb">'+stockBase[name]['stkName']+'</p><p class="cmpprice blacktext">'+getCMPHtml(name , data.cmp)+
						'</p></td><td class="toprankedbystocks tdline borderb td2">'+createMostRecoLandWidget_rd(stockRecoSumm[name])+'</td><td class="borderb tdline td3">');

						for(i = 0; i < analyst.length ; i++){
							oneAnl = analyst[i].alysId;
							buff.append('<p class="ranks">'+renderHTML(link(analystBase[oneAnl]['alysName'], createLinkObj('an', {'analData':analystBase[oneAnl]})))+
									'<span class="comp_capition ">,&nbsp;'+analystBase[oneAnl]["alysFirm"]+'</span></p>');
						}
						
						buff.append('</td><td class="tdline borderb td4">'+createRecoWidgetOpen(data, {"id":(oneReco != 0 ? recoBase[oneReco].id : 0), "lstId":name})+'</td><td class="td7 borderb  "><div class="icon1 borderall">'
								+getLandingAddIcon(name, "", "", "")+'</div></td></tr>');
			}
		}catch(e){
			logDebug(logger, e);
			continue;
		}
	}
	buff.append('</table></div>'+createMoreLink(type, data.cnt));
	
	logDebug(logger, '***********************************Exiting  createAnalystOARank ');

	return buff.toString();
	
}
function createAnalystStkRank_aLand(dataObj, logger){
	logDebug(logger, '***********************************Inside createAnalystSecRank');
	var buff = new StringBuffer();
	var data = formatJson(dataObj);
	var stockTopAnalyst = data.stockTopAnalyst;
	var analystBase = data.analystBase;
	var recoBase = data.recoBase;
	var recoRelation = data.recoRelation;
	var stockBase = data.stockBase;
	var analystRank	= data.analystRank;
	var stockRecoSumm = data.stockRecoSumm;
	var context = data.context;
	var  type = data.type;
	
	buff.append('<div class="toprankedbystocks"><div class="border3"><table>');
	for (var name in stockTopAnalyst) {
		try{
			if (stockTopAnalyst.hasOwnProperty(name)) {
				var analyst = stockTopAnalyst[name];
				oneReco = analyst[0].recoId;
				
				buff.append('<tr>');
				//buff.append('<td class="' + calculateRecoAgeClassCode(recoBase[recoRelation[k].id]['recoDt']) + '"/>');
						buff.append('<td class="toprankedbystocks tdline borderb td1"><p class="comp_name boldtext">'+renderHTML(link(stockBase[name]['exchgTkr'], createLinkObj('st', {"cnt": data["cnt"] ,"recoData":recoBase[oneReco],'stkData':stockBase[name]})))+
						'</p><p class="comp_namefull marginb">'+stockBase[name]['stkName']+'</p><p class="cmpprice blacktext">'+getCMPHtml(name, data.cmp)+
						'</p></td><td class="toprankedbystocks tdline borderb td2">'+createMostRecoLandWidget_rd(stockRecoSumm[name])+'</td><td class="borderb tdline td3">');
						
						for(var i = 0; i < analyst.length ; i++){
							oneAnl = analyst[i].alysId;
							buff.append('<p class="ranks">'+renderHTML(link(analystBase[oneAnl]['alysName'], createLinkObj('an', {"cnt": data["cnt"] ,'analData':analystBase[oneAnl]})))+
									'<span class="comp_capition ">,&nbsp;'+analystBase[oneAnl]['alysFirm']+'</span></p>');
						}

						buff.append('</td><td class="tdline borderb td4">'+createRecoWidgetOpen(data , {"id":(oneReco != 0 ? recoBase[oneReco].id : 0), "lstId":name})+'</td><td class="td7 borderb  "><div class="icon3 borderall wraper"><p class="borderr left">'
								+getStarIcon(name ,'', '', '', data.userFav, "STOCK")+'</p><p class="left">'+
								getLandingAddIcon(name ,'', '', '', data.userFav)+'</p></div></td></tr>');
			}
		}catch(e){
			logDebug(logger, e);
			continue;
		}
	}
	buff.append('</table></div></div>');
	
	logDebug(logger, '***********************************Exiting  createAnalystOARank ');

	return buff.toString();	
}

function createAnOpenRecoLanding(dataObj, logger){

	var buff = new StringBuffer();
	var data = formatJson(dataObj);

	var recoRelation = data.recoRelation;
	var recoBase = data.recoBase;
	var analystBase = data.analystBase;
	var stockBase = data.stockBase;
	var sectorBase = data.sectorBase;
	var analystRank = data.analystRank;
	var analystSectorRank = data.analystSectorRank;
	var stockRecoSummary = data.stockRecoSummary;
//	var recoPerf = data.recoPerf;
	var type = data.type;

	buff.append('<div class="border3">');
	if( recoRelation.length > 0){
		for (var k = 0; k < recoRelation.length; k++ )
		{
				try{
						var x = calculateRecoAgeClassCode(recoBase[recoRelation[k].id]['recoDt']);
						buff.append('<table class="se_re borderall"><tbody><tr>');
						buff.append('<td rel="tooltip1" class="' + x.classname + '" title="' + x.tip + '" />');
							buff.append('<td style ="width: 200px;" class="td1 tdline  borderb"><p class="comp_name boldtext">'+renderHTML(link(stockBase[recoRelation[k].lstId]['exchgTkr'], createLinkObj('st', {"cnt": data["cnt"] ,"recoData":recoBase[recoRelation[k].id],'stkData':stockBase[recoRelation[k].lstId]})))+
								'</p><p class="comp_namefull marginb">'+stockBase[recoRelation[k].lstId]['stkName']+
								'</p>'+getStockImgHtmlLanding(stockBase[recoRelation[k].lstId])+'</td><td class="tdline borderb td3">'+createRecoWidget(data, recoRelation[k], logger)+'</td><td class="rankdetails">'+createVoteLanding("RECO",recoRelation[k].id, data.voteSummary[recoRelation[k].id])+'</td><td class="icons"><div class="icon2 borderall wraper"><p class="borderr left">'
								+getStarIcon(recoRelation[k].lstId, "", "", "", data.userFav, "STOCK")+'</p><p class="left">'
								+getLandingAddIcon(recoRelation[k].lstId, "", recoRelation[k].id, "", data.userFav)+
								'</p></div></td><td class = "" style = "vertical-align:bottom;"><div title="Check peer Recos" class="inlineExp" id ="inlineChartAnalystTd_'+data.alysId+'_'+recoRelation[k].id+'_'+recoRelation[k].lstId+'"></div><td></tr></table>');
						buff.append('<div id ="inlineChartAnalystDiv_'+data.alysId+'_'+recoRelation[k].id+'_'+recoRelation[k].lstId+'" class="recommendationsinfo" style="display:none;"></div>');

				}catch(e){
					logDebug(logger, e);
					continue;
				}
		}
	}else{
		buff.append("No Records Found.")
	}

	buff.append('</div>');

	return buff.toString();
}


function createAnClosedRecoLanding(dataObj, logger){

	var buff = new StringBuffer();
	var data = formatJson(dataObj);
	var recoRelation = data.recoRelation;
	var recoBase = data.recoBase;
	var analystBase = data.analystBase;
	var stockBase = data.stockBase;
	var sectorBase = data.sectorBase;
	var analystRank = data.analystRank;
	var analystSectorRank = data.analystSectorRank;
	var stockRecoSummary = data.stockRecoSummary;
	var recoPerf = data.recoPerf;
	var type = data.type;
	buff.append('<div class="border3"><table class="tdprofilestable">');
	if(recoRelation.length > 0){
		for (k = 0; k < recoRelation.length; k++ )
		{
				try{
					var x = calculateRecoAgeClassCode(recoBase[recoRelation[k].id]['recoDt']);
					buff.append('<tr>');
					buff.append('<td rel="tooltip1" class="' + x.classname + '" title="' + x.tip + '" />');
					buff.append('<td class="companydetails tdline borderb td1" style="width: 127px;"><p class="comp_name boldtext">'+renderHTML(link(stockBase[recoRelation[k].lstId]["exchgTkr"], 
							createLinkObj("st", {"cnt": data["cnt"] ,"recoData":recoBase[recoRelation[k].id],"stkData":stockBase[recoRelation[k].lstId]})))+ 
							'</p><p class="comp_namefull">'+stockBase[recoRelation[k].lstId]["stkName"]+
							'</p>'+getStockImgHtmlLanding(stockBase[recoRelation[k].lstId])+'</td><td class=""></td><td class ="tdline borderb td3">'+createClosedRecoWidget(recoRelation[k], data)+'</td>');
							
							if(recoPerf[recoRelation[k]["id"]]){
								buff.append('<td class="tdline borderb td4">'+createClosedRecoCompare(recoPerf, recoBase, recoRelation[k]["id"])+'</td>'+
										'<td class="tdline borderb td6 ">'+createPerformanceWidget(recoPerf[recoRelation[k].id])+'</td>');
							}else{
								buff.append('<td class="borderb td4">&nbsp;</td><td style="vertical-align: middle;" class="met borderb"><img alt="Insufficient price history for this stock" src="'+getImgUrl("alert.png")+'" style="margin-left: -165px;"></td><td class="tdline borderb" style="vertical-align: middle; font-size: 12px;"><div class="ranks" title="75%" style="margin-left: -92px; margin-bottom: 0px;"><p>Insufficient price history to assess this recommendation</p></div></td>');
								
							}
							
							buff.append('<td class="td7 borderb vcenter"><div class="icon1 borderall">'+getLandingAddIcon(recoRelation[k].lstId, data.alysId, '', '', data.userFav)+'</div></td></tr>');
				}catch(e){
					logDebug(logger, e);
					continue;
				}
		}
	}else{
		buff.append("No Records Found.")
	}

	buff.append('</table></div>');

	return buff.toString();

}

function createNewRecoLanding(dataObj, logger){
	logDebug(logger, '***********************************Inside NewRecoLanding');
	var buff = new StringBuffer();
	var data = formatJson(dataObj);
	var recoRelation = data.recoRelation;
	var recoBase = data.recoBase;
	var analystBase = data.analystBase;
	var stockBase = data.stockBase;
	//var sectorBase = data.sectorBase;
	var analystRank = data.analystRank;
	var analystSectorRank = data.analystSectorRank;
	var stockRecoSummary = data.stockRecoSummary;
	var type = data.type;
	buff.append('<table class="se_re borderall">');
	
	//if(!recoRelation)
	//	return '';
	
	for (k = 0; (recoRelation && k < recoRelation.length); k++ )
	{
			try{
				var recoId = recoRelation[k].id;
				var alysId = recoRelation[k].alysId;
				var lstId = recoRelation[k].lstId;
				var secId = recoRelation[k].secId;
				var x = calculateRecoAgeClassCode(recoBase[recoRelation[k].id]['recoDt']);
				buff.append('<tr>');
				buff.append('<td rel="tooltip1" class="' + x.classname + '" title="' + x.tip + '" />');
				buff.append('<td class="companydetails"><p class="comp_name boldtext">'+renderHTML(link(stockBase[lstId]['exchgTkr'], createLinkObj('st', {"cnt": data["cnt"] ,"recoData":recoBase[recoRelation[k].id],'stkData':stockBase[lstId]})))+
						'</p><p class="comp_namefull marginb">'+stockBase[lstId]['stkName']+
						'</p>'+getStockImgHtmlLanding(stockBase[lstId])+'</td><td class="persondetails">'+createAnHtmReco(analystBase, recoRelation[k], data)+'</td><td class="buydetails">'+createRecoWidget(data, recoRelation[k])+'<td class="rankdetails">'
						+createVoteLanding("RECO",recoRelation[k].id, data.voteSummary[recoRelation[k].id])+'</td><td class="icons"><div class="icon2 borderall wraper"><p class="borderr left">'
						+getStarIcon('' ,'', recoRelation[k].id, '', data.userFav, "RECO")+'</p><p class="left">'+
						getLandingAddIcon(recoRelation[k].lstId ,recoRelation[k].alysId, recoRelation[k].id, recoRelation[k].secId, data.userFav)+'</p></div></td></tr>');
			}catch(e){
				logDebug(logger, e);
				continue;
			}
	}

	buff.append('</table>');
	return buff.toString();
}

function getAnalRank(analystRank, alysId){
	var buff = new StringBuffer();
	if(analystRank[alysId]){
		buff.append('<p class="person_rang">Overall Rank <span class="boldtext">'+analystRank[alysId]['currRk']+'</span></p>');
	}else{
		buff.append('<p class="person_rang">Not Ranked</span></p>');
	}
	
	return buff.toString();
}
function getAnalRankWithSecRank(analystRank, analystSectorRank,alysId){
	var buff = new StringBuffer();
	
	buff.append('<p>');
	if(analystRank[alysId]){
		buff.append('Overall Rank <span class="blacktext boldtext">'+analystRank[alysId]['currRk']+'</span>');
	}else{
		buff.append('Not Ranked');
	}
	buff.append('|');
	
	if(analystSectorRank[alysId]){
		buff.append('Sector Rank <span class="blacktext boldtext">'+analystSectorRank[alysId]['rank']+'</span>');
	}else{
		buff.append('Not Ranked');
	}
	
	//  Sector Rank  <span class="blacktext boldtext">not ranked</span></p>	
	//  [oneReco.alysId]["rank"]
	
	return buff.toString();
}

function createVoteLanding(entity, value, voteSummary){

	var buff = new StringBuffer();

	if(voteSummary){
		var posVote = voteSummary.posVote;
		var modVote = voteSummary.modVote;
		var negVote = voteSummary.negVote;
		var total = posVote + modVote + negVote;

	buff.append('<div class="ranks" title="'+makePercent(posVote/total,0)+
	'%"><p>Likely</p><div class="strength-bar"><div class="filled-green" style="width:'+makePercent(posVote/total,0)+'%"></div></div></div><div class="ranks" title="'+
	makePercent(modVote/total,0)+'%"><p>Cannot say</p><div class="strength-bar"><div class="filled-blue" style="width:'+
	makePercent(modVote/total,0)+'%"></div></div></div><div class="ranks" title="'+
	makePercent(negVote/total,0)+'%"><p>Unlikely</p><div class="strength-bar"><div class="filled-red" style="width:'+
	makePercent(negVote/total,0)+'%"></div></div></div>');
	}else{
		buff.append('<span class="comp_capition" align="center">Be the first to vote</span>');		
	}
	
	buff.append('<p class="vote" align="center" vertical-align="middle;" ><a  title="Rate this Reco" " class="recovote curspointer" id="reco_'+value+'">Vote</a></p>');
	
	return buff.toString();

}


function createExUpRecoLanding(dataObj, logger){
	var buff = new StringBuffer();
	var data = formatJson(dataObj);
	var recoRelation = data.recoRelation;
	var recoBase = data.recoBase;
	var analystBase = data.analystBase;
	var stockBase = data.stockBase;
	//var sectorBase = data.sectorBase;
	var analystRank = data.analystRank;
	var analystSectorRank = data.analystSectorRank;
	var stockRecoSummary = data.stockRecoSummary;
	var type = data.type;
	buff.append('<table class="se_re borderall">');
	for (k = 0; (recoRelation && k < recoRelation.length); k++ )
	{
			try{
				var recoId = recoRelation[k].id;
				var alysId = recoRelation[k].alysId;
				var lstId = recoRelation[k].lstId;
				var secId = recoRelation[k].secId;
				var x = calculateRecoAgeClassCode(recoBase[recoRelation[k].id]['recoDt']);
				buff.append('<tr>');
				buff.append('<td rel="tooltip1" class="' + x.classname + '" title="' + x.tip + '" />');
				buff.append('<td class="companydetails" style="vertical-align:middle "><p class="comp_name boldtext">'+renderHTML(link(stockBase[lstId]['exchgTkr'], createLinkObj('st', {"cnt": data["cnt"] ,"recoData":recoBase[recoRelation[k].id],'stkData':stockBase[lstId]})))+
						'</p><p class="comp_namefull marginb">'+stockBase[lstId]['stkName']+
						'</p>'
								+getStockImgHtmlLanding(stockBase[lstId])+
						'</td><td style="vertical-align:middle" class = "threepointAdd"><div class="up left">'
								+calculateRoi(recoBase[recoRelation[k].id]['tgtPx'], getCMP(lstId, data.cmp), recoBase[recoRelation[k].id]['actn'])+
								'</div><div class ="right" >'+createRecoWidget(data, recoRelation[k])+'</div>'+createAnHtmRecoHover(analystBase, recoRelation[k], data)+								
						'</td><td class="rankdetails" style="vertical-align:middle">'
								+createVoteLanding("RECO", recoRelation[k].id, data.voteSummary[recoRelation[k].id])+
						'</td><td class="icons" style="vertical-align:middle"><div class="icon2 borderall wraper"><p class="borderr left">'
								+getStarIcon('' ,'', recoRelation[k].id, '', data.userFav, "RECO")+
						'</p><p class="left" style="vertical-align:middle">'
								+getLandingAddIcon(recoRelation[k].lstId ,recoRelation[k].alysId, recoRelation[k].id, recoRelation[k].secId, data.userFav)+
						'</p></div></td></tr>');
			}catch(e){
				logDebug(logger, e);
				continue;
			}
	}

	buff.append('</table>');
	return buff.toString();
}

function getLandingAddIcon(lstId ,alysId, recoId, secId, userFav)
{
	var data = recoId+'_'+lstId+'_'+alysId+'_'+secId;
	return '<a title="More options for Favorites and Voting" href="#addoptionlightbox"  id=addIcon_'+data+' class="anchAdd" >Addicon</a> ';
}
function getAddIcon(lstId ,alysId, recoId, secId){
	var data = recoId+'_'+lstId+'_'+alysId+'_'+secId;
	return '<a class ="anchAdd" id="addIcon_'+data+'" href="#"><img title="More Options for My Favorites and Voting" height="16" width="16" src='+getImgUrl("add_icon.png")+'></a> ';
}

function ifExistsInFav(entityName, idElem, userFavs){
	var returnVal = false;
	for(var i = 0; i < userFavs.length; i++){
		var entityNameFav = userFavs[i]["entityName"];
		var id = userFavs[i]["id"];
		if(entityNameFav == entityName && entityName == "ANALYST"){
			if(id == idElem){
				returnVal  = true;
				break;
			}
		}else if(entityNameFav == entityName && entityName == "STOCK"){
			if(id == idElem){
				returnVal  = true;
				break;
			}

		}if(entityNameFav == entityName && entityName == "RECO"){
			if(id == idElem){
				returnVal  = true;
				break;
			}
		}if(entityNameFav == entityName && entityName == "SECTOR"){
			if(id == idElem){
				returnVal  = true;
				break;
			}
		} 
	}
	
	return returnVal;
}

function createVoteHtml(entityType, value){
	var buff = new StringBuffer();

	buff.append('<div class="voteoptions" id="addoptionlightbox"><div id=addFancyStatus ></div>');
	
	if(entityType == "RECO"){
		buff.append('<div class="votoptions  borderall mb8"><p class="vo_title">Recommendation Vote</p><div class=""><table><thead>');
		buff.append('<th class="borderb"></th>');	
		buff.append('</thead><tbody><tr><td class="borderr"><p><input name="recoVote" type="radio" value="Likely to succeed">Likely</p><p><input name="recoVote" type="radio" value="Very iffy">Cannot say</p><p><input name="recoVote" type="radio" value="Unlikely">Unlikely</p></td></tr></tbody></table></div></div><table class="optonbuttons"><tr><td width="82%" align="center"><a><img id = "okButtonReco" class ="voteIndvOk" src='+getImgUrl("okbutton.gif")+' width="73" height="30"></a><a><img id ="cancelButtonReco" class ="voteIndvCancel" src='+getImgUrl("cancle_button.gif")+' width="73" height="30"></a></td><td width="18%" class="godis"></td></tr></table></div><input type = "hidden" id ="recoInRow" value ='+value+'>');
	}else if(entityType == "STOCK"){
		buff.append('<div class="votoptions  borderall mb8"><p class="vo_title">Stock Vote</p><div class=""><table><thead>');
		buff.append('<th class="borderb"></th>');	
		buff.append('</thead><tbody><tr><td class="borderr"><p><input name="stockVote" type="radio" value="Positive">Bullish</p><p><input name="stockVote" type="radio" value="Neutral">Cannot say</p><p><input name="stockVote" type="radio" value="Negative">Bearish</p></td></tr></tbody></table></div></div><table class="optonbuttons"><tr><td width="82%" align="center"><a><img id = "okButtonStock" class ="" src='+getImgUrl("okbutton.gif")+' width="73" height="30"></a><a><img id ="cancelButtonStock" class ="" src='+getImgUrl("cancle_button.gif")+' width="73" height="30"></a></td><td width="18%" class="godis"></td></tr></table></div><input type = "hidden" id ="lstInRow" value ='+value+'>');
		
	}
	
	
	return buff.toString();
}

function createRegisWarnMessage(){
	
	var buff = new StringBuffer();

	buff.append('<div class="loginWarn loginWarnPop"><div class="waringbox"><table class=""><tbody><tr><td><div class=""><p>To take actions on stocks, analysts and the recommendations, sign-up for free or <a href="#" class="loginlink">Login</a>.</p></div><div class="singfree"> <a href="#" class="singupWarn" id="various">Sign-up For Free</a></div></td></tr></tbody></table></div></div>');	
	return buff.toString();
}
function createActivationMessage(){
	var buff = new StringBuffer();

	buff.append('<div class="voteoptions" id="addoptionlightbox"><div id=addFancyStatus ></div>');
	
	buff.append('<div class="votoptions  borderall mb8"><div class=""><table>');
	//buff.append('<tbody><tr><td class="borderr"><p>Your activation has been compleated successfully.</p></td></tr></table></div>');
	buff.append('<tbody><tr><td class="borderr">'+Messages["ACTIV_COMP"]+'</tr></tbody></table></div></div><table class="optonbuttons"><tr><td width="82%" align="center"><a href="#"><img id ="okButtonAct" class ="activateCancel" src='+getImgUrl("okbutton.gif")+' width="73" height="30"></a></td><td width="18%" class="godis"></td></tr></table></div>');
	
	return buff.toString();
}


/*
function showDialog(text, buttonName){
	
	var buff = new StringBuffer();

	buff.append('<div class="loginWarn loginWarnPop"><div class="waringbox"><table class=""><tbody><tr><td><div class=""><p>'+text+'</p></div><div class=""> <a href="#" class="" id="various">'+buttonName+'</a></div></td></tr></tbody></table></div></div>');	
	return buff.toString();
}
*/
function createLightBox(obj, usr_fav){
	
	var favs = new Object(usr_fav);
	var recoId = obj.recoId;
	var lstId = obj.lstId;
	var alysId = obj.alysId;
	var secId = obj.secId;

	var buff = new StringBuffer();
	
	buff.append('<div class="addoptions" id="addoptionlightbox"><div id=addFancyStatus ></div><div class="addfavourbox  borderall mb8"><p class="addfav_title">Add to My Favourites</p><table><tr>');
	
	if(ifExistsInFav('STOCK', lstId, favs) == true  && lstId != ''){
		buff.append('<td><input id = "lstAdd" name="" CHECKED type="checkbox" value="">Add Stock</td>');
	}else{
		if(lstId != '')
		buff.append('<td><input id = "lstAdd"  name="" type="checkbox" value="">Add Stock</td>');
	}
	
	if(ifExistsInFav('ANALYST', alysId, favs) == true && alysId!= ''){
		buff.append('<td><input id="alysAdd" CHECKED type="checkbox" value="">Add Analyst</td>');
	}else{
		if(alysId != '')
		buff.append('<td><input id="alysAdd" type="checkbox" value="">Add Analyst</td>');
	}
	
	if(ifExistsInFav('RECO', recoId, favs) == true && recoId!=''){
		buff.append('<td><input id ="recoAdd" name="" CHECKED type="checkbox" value="">Add Recommendation</td>');
	}else{
		if(recoId != '')
		buff.append('<td><input id ="recoAdd" name="" type="checkbox" value="">Add Recommendation</td>');
	}
	
	if(ifExistsInFav('SECTOR', secId, favs) == true && secId !=''){
		buff.append('<td><input id ="secAdd" name="" CHECKED type="checkbox" value="">Add Sector</td>');
	}else{
		if(secId != '')
		buff.append('<td><input id ="secAdd"  type="checkbox" value="">Add Sector</td>');
	}
	
	buff.append('</tr></table></div><div class="votoptions  borderall mb8"><p class="vo_titleactive">Voting Options</p><div class="optiontablelist"><table><thead>');
	
	if(lstId != '')
	buff.append('<th class="borderr borderb">Stock</th>');
	
	if(secId != '')
	buff.append('<th class="borderr borderb">Sector</th>');

	if(alysId != '')
	buff.append('<th class="borderr borderb">Analyst</th>');
	
	if(recoId != '')
	buff.append('<th class="borderb">Reco</th>');
	
	buff.append('</thead><tbody><tr>');
			
	if(lstId != '')
	buff.append('<td class="borderr"><p><input name="stockVote" type="radio" value="Positive">Bullish</p><p><input name="stockVote" type="radio" value="Neutral">Cannot say</p><p><input name="stockVote" type="radio" value="Negative">Bearish</p></td>');
			
	if(secId != '')
	buff.append('<td class="borderr"><p><input name="sectorVote" type="radio" value="Positive">Bullish</p><p><input name="sectorVote" type="radio" value="Neutral">Cannot say</p><p><input name="sectorVote" type="radio" value="Negative">Bearish</p></td>');
			
	if(alysId != '')
	buff.append('<td class="borderr"><p><input name="analystVote" type="radio" value="Provides superior advice">Provides superior advice</p><p><input name="analystVote" type="radio" value="Provides mediocre advice">Provides mediocre advice</p><p><input name="analystVote" type="radio" value="Provides inferior advice">Provides inferior advice</p></td>');
			
	if(recoId != '')
	buff.append('<td><p><input name="recoVote" type="radio" value="Likely to succeed">Likely</p><p><input name="recoVote" type="radio" value="Very iffy">Cannot say</p><p><input name="recoVote" type="radio" value="Unlikely">Unlikely</p></td>');
			
	buff.append('</tr></tbody></table></div></div><table class="optonbuttons"><tr><td width="82%" align="center"><a href="#"><img id = "okButtonAdd" src='+getImgUrl("okbutton.gif")+' width="73" height="30"></a><a href="#"><img id ="cancelButtonAdd" src='+getImgUrl("cancle_button.gif")+' width="73" height="30"></a></td><td width="18%" class="godis"></td></tr></table></div><input type = "hidden" id ="recoInRow" value ='+obj.recoId+'><input type = "hidden" id ="lstInRow" value ='+obj.lstId+' ><input type = "hidden" id ="alysInRow" value ='+obj.alysId+' ><input type = "hidden" id ="sectInRow" value ='+obj.secId+'>');
	
	return buff.toString();
}

function createExDnRecoLanding(dataObj, logger){
	var buff = new StringBuffer();
	var data = formatJson(dataObj);
	var recoRelation = data.recoRelation;
	var recoBase = data.recoBase;
	var analystBase = data.analystBase;
	var stockBase = data.stockBase;
	//var sectorBase = data.sectorBase;
	var analystRank = data.analystRank;
	var analystSectorRank = data.analystSectorRank;
	var stockRecoSummary = data.stockRecoSummary;
	var type = data.type;
	buff.append('<table class="se_re borderall">');
	if(recoRelation){
		for (k = 0; (recoRelation && k < recoRelation.length); k++ )
		{
				try{
					var recoId = recoRelation[k].id;
					var alysId = recoRelation[k].alysId;
					var lstId = recoRelation[k].lstId;
					var secId = recoRelation[k].secId;
					var x = calculateRecoAgeClassCode(recoBase[recoRelation[k].id]['recoDt']);
					buff.append('<tr>');
					buff.append('<td rel="tooltip1" class="' + x.classname + '" title="' + x.tip + '" />');
					buff.append('<td class="companydetails" style="vertical-align:middle "><p class="comp_name boldtext">'+renderHTML(link(stockBase[lstId]['exchgTkr'], createLinkObj('st', {"cnt": data["cnt"] ,"recoData":recoBase[recoRelation[k].id],'stkData':stockBase[lstId]})))+
							'</p><p class="comp_namefull marginb">'+stockBase[lstId]['stkName']+
							'</p>'
									+getStockImgHtmlLanding(stockBase[lstId])+
							'</td><td style="vertical-align:middle" class = "threepointAdd"><div class="down left">'
									+calculateRoi(recoBase[recoRelation[k].id]['tgtPx'], getCMP(lstId, data.cmp), recoBase[recoRelation[k].id]['actn'])+
									'</div><div class ="right" >'+createRecoWidget(data, recoRelation[k])+'</div>'+createAnHtmRecoHover(analystBase, recoRelation[k], data)+								
							'</td><td class="rankdetails" style="vertical-align:middle">'
									+createVoteLanding("RECO", recoRelation[k].id, data.voteSummary[recoRelation[k].id])+
							'</td><td class="icons" style="vertical-align:middle"><div class="icon2 borderall wraper"><p class="borderr left">'
									+getStarIcon('' ,'', recoRelation[k].id, '', data.userFav, "RECO")+
							'</p><p class="left" style="vertical-align:middle">'
									+getLandingAddIcon(recoRelation[k].lstId ,recoRelation[k].alysId, recoRelation[k].id, recoRelation[k].secId, data.userFav)+
							'</p></div></td></tr>');
				}catch(e){
					logDebug(logger, e);
					continue;
				}
		}
	}

	buff.append('</table>');
	return buff.toString();
}

function getPaginationMenus(dataObj){
	var data = formatJson(dataObj);
	var buff = new StringBuffer();
	var page_num = (data.page_num &&  data.page_num > 0) ? data.page_num : 1;
	var type = data.type;
	buff.append('<div class="pagemenu" id="pagemenus_'+type+'">');
	buff.append(createPageMenusByCounter(page_num , type,  data.isAjax, data.totalRows));
	buff.append('</div>');
	return buff.toString();
}

function createPageMenusByCounter(counter, type, isAjax, totalRows){

	var buff = new StringBuffer();
	buff.append('<ul>');
	var prevClass = "prev";
	var nextClass = "next";
	if(isAjax){
		prevClass +="Ajax";
		nextClass +="Ajax";
	}
	
	if(counter > 1){
			buff.append('<li><a id="prev_'+type+'_1"  class="prevHead '+prevClass+'">first </a></li>');
			buff.append('<li><a id="prev_'+type+'_0"  class="prevHead '+prevClass+'">previous </a></li>');
		}
		
		var spacer = false;
		var limit = 10;
		for(var i = 1; i <= counter; i++){
			
			if(counter >= limit && i < (counter-limit)){
				if(spacer == false){
					buff.append('<li>......</li>');
					spacer = true;
				}else{
						continue;
				}
			}else{
				
				if(counter > 1){
					buff.append('<li><a '+getActivePage(counter, (i))+' id="prev_'+type+'_'+i+'">'+i+'</a></li>');
				}
			}
		}
		
		if((counter)*10 < totalRows || isAjax )
			buff.append('<li><a id="next_'+type+'_'+i+'"  class="'+nextClass+'">next</a></li>');

	
	buff.append('</ul>');
	
	return buff.toString();

}

function getActivePage(counter, current){
	if(counter == current)
		return 'class="prev currentpage"';
	else
		return 'class="prev"';
}


function createSecsList(dataObj){
	var buff = new StringBuffer();
	var data = formatJson(dataObj);
	
	var allSectors = data.allSectors ? data.allSectors.allSectors : [];
	
	buff.append('<div class="margint"><div class="left bysec">By Sector:</div><div class="left"><select id="analBySecLand">');
	 
	buff.append('<option value="all">All Sectors</option>');

	for (var i = 0; i < allSectors.length; i++) {
				var secBase = allSectors[i];
				if(secBase["id"] == data.selSec){
					buff.append('<option value ='+secBase["id"]+'  selected>'+secBase["secName"]+'</option>');
				}else{
					buff.append('<option value ='+secBase["id"]+'>'+secBase["secName"]+'</option>');
				}
	}
	buff.append('</select></div></div>');
	return buff.toString();

}
function createAnalystBySecsLand(dataObj, logger){
	logDebug(logger, '***********************************Inside createAnalystBySecsLand');
	var buff = new StringBuffer();
	var data = formatJson(dataObj);
	
	var SectorTopAnalyst = data.SectorTopAnalyst;
	var analystBase = data.analystBase;
	var analystOARank = data.analystOARank;
	var sectorSummary = data.sectorSummary;
	var sectorBase = data.sectorBase;
	var context = data.context;
	var type = data.type;
	var analystPerf = data.analystPerf;

	buff.append('<div class="margint"><table class="stockby tablepadding10 borderall"><tbody>');
	for (var k = 0; k < SectorTopAnalyst.length; k++ )
	{
			try{

				var alysList = SectorTopAnalyst[k].alysId;
				for(var j = 0; j < alysList.length; j++ ){
					buff.append('<tr>');
					
					if(j == 0){
						buff.append('<td class="sttd1 " ><p class="sortbyname">'+renderHTML(link(sectorBase[SectorTopAnalyst[k].id]["secName"], createLinkObj('sec', {"cnt": data["cnt"] ,'data':sectorBase[SectorTopAnalyst[k].id]})))+
								'</p><p>&nbsp;</p><p><span class="blacktext">'+sectorSummary[SectorTopAnalyst[k].id]['totalAlys']+'</span>Analysts</p><p><span class="blacktext">'+sectorSummary[SectorTopAnalyst[k].id]['totalStk']+
								'</span> Stocks</p><p><span class="blacktext">'+sectorSummary[SectorTopAnalyst[k].id]['totalReco']+'</span> Recos</p></td>');
					}else{
						buff.append('<td class="sttd1 borderb"></td>');
					}
					buff.append('<td class="sttd2 tdline borderb"><p class="person_name">'+renderHTML(link(analystBase[alysList[j]]['alysName'], createLinkObj('an', {"cnt": data["cnt"] ,'analData':analystBase[alysList[j]]})))+
							'</p><p class="person_rang">Sector Rank <span class="boldtext">'+(j+1)+'</span></p><p class="comp_capition">'+analystBase[alysList[j]]['alysFirm']+'</p></td>');

					buff.append('<td class="sttd3 tdline borderb">'+createPerformanceWidget(analystPerf[alysList[j]])+'</td>');
					
					buff.append('<td class="sttd4 tdline borderb"><p>Overall Rank <span class="boldtext blacktext">'+analystOARank[alysList[j]]["currRk"]+'</span></p></td>');
					// stocks:
					var analystStkRanks = data.analystStkRank[alysList[j]];
					
					buff.append('<td class="sttd5 tdline borderb">');
					
					if(analystStkRanks){
						for(var s = 0 ; s < analystStkRanks.length; s++){
							if(analystStkRanks[s].sectId == SectorTopAnalyst[k]["id"]){
								// matching sector
								var stkRankAlys = analystStkRanks[s].stkRankAlys;
								for(var l = 0; l < stkRankAlys.length; l++ ){
									if (l == 0) {
										buff.append('<span class="tmar">'+stkRankAlys[l]["stkName"]+' ('+stkRankAlys[l]["rank"]+')</span>');
									} else {
										buff.append('<span class="tmar">, '+stkRankAlys[l]["stkName"]+' ('+stkRankAlys[l]["rank"]+')</span>');
									}
								}
							}
						
						}
					}

					buff.append('</td>');
					buff.append('<td class="icons sttd6 borderb"><div class="icon3 margint borderall wraper"><p class="borderr left">'+getStarIcon("",analystBase[alysList[j]]["id"], "" , "", data.userFav, "ANALYST")+'</p><p class="left">'+getLandingAddIcon('', analystBase[alysList[j]]["id"], '', SectorTopAnalyst[k]["id"], data.userFav)+'</p></div></td>');
					buff.append('</tr>');
				}
			}catch(e){
				logDebug(logger, e);
				continue;
			}
			
	}
	buff.append('</tbody></table></div>');
	logDebug(logger, '***********************************Exiting  createAnalystBySecsLand ');
	return buff.toString();		
}



function createAnalystBySecLand(dataObj, logger){
	logDebug(logger, '***********************************Inside createAnalystBySecsLand');
	var buff = new StringBuffer();
	var data = formatJson(dataObj);
	
	var SectorTopAnalyst = data.SectorTopAnalyst;
	var analystBase = data.analystBase;
	var analystOARank = data.analystOARank;
	var sectorSummary = data.sectorSummary;
	var sectorBase = data.sectorBase;
	var context = data.context;
	var type = data.type;
	var analystPerf = data.analystPerf;
	var sectorRank = data.sectorRank;
	buff.append('<div class="margint"><table class="stockby tablepadding10 borderall"><tbody>');
	
	var alysList = (SectorTopAnalyst) ? SectorTopAnalyst.alysId : [] ;
	
	for (var j = 0; j < alysList.length; j++) {
			buff.append('<tr>');
			buff.append('<td class="sttd2 tdline borderb"><p class="boldtext">'+renderHTML(link(analystBase[alysList[j]]['alysName'], createLinkObj('an', {"cnt": data["cnt"] ,'analData':analystBase[alysList[j]]})))+
					'</p>');
			
			if(sectorRank[alysList[j]+'-'+SectorTopAnalyst["id"]])		
				buff.append('<p class="person_rang">Sector Rank <span class="boldtext">'+sectorRank[alysList[j]+'-'+SectorTopAnalyst["id"]]['rank']+'</span></p>');
					
			buff.append('<p class="comp_capition">'+analystBase[alysList[j]]['alysFirm']+'</p></td>');

			buff.append('<td class="sttd3 tdline borderb">'+createPerformanceWidget(analystPerf[alysList[j]])+'</td>');
			if(analystOARank && analystOARank[alysList[j]]) {
				buff.append('<td class="sttd4 tdline borderb"><p>Overall Rank <span class="boldtext blacktext">'+analystOARank[alysList[j]]["currRk"]+'</span></p></td>');
			}
			buff.append('<td class="sttd5 tdline borderb">');
			// stocks:
			var analystStkRanks = data.analystStkRank[alysList[j]];
			
			if(analystStkRanks){
				for(var s = 0 ; s < analystStkRanks.length; s++){
					if(analystStkRanks[s].sectId == SectorTopAnalyst["id"]){
						// matching sector
						var stkRankAlys = analystStkRanks[s].stkRankAlys;
						for(var l = 0; l < stkRankAlys.length; l++ ){					
							if (l == 0) {
								buff.append('<span class="tmar">'+stkRankAlys[l]["stkName"]+' ('+stkRankAlys[l]["rank"]+')</span>');
							} else {
								buff.append('<span class="tmar">, '+stkRankAlys[l]["stkName"]+' ('+stkRankAlys[l]["rank"]+')</span>');
							}
						}
					}
				}
			}
			buff.append('</td>');
			buff.append('<td class="icons sttd6 borderb"><div class="icon3 margint borderall wraper"><p class="borderr left">'+getStarIcon("",analystBase[alysList[j]]["id"], "" , "", data.userFav, "ANALYST")+'</p><p class="left">'+getLandingAddIcon('', analystBase[alysList[j]]["id"], '', '', data.userFav)+'</p></div></td>');
			buff.append('</tr>');
	}
	buff.append('</tbody></table></div>');
	logDebug(logger, '***********************************Exiting  createAnalystBySecLand ');
	return buff.toString();		
}

function findRank(itemId, analystOARank){
	return analystOARank[itemId] ? analystOARank[itemId]["currRk"] : "Not Ranked";
}

function createRankHtm(){
	
}

/*
function findPerf(itemId, perf, type){
	var returnVal = '';
	switch(type)
	{
		case 'accuracy':
			returnVal = perf[itemId] ? roundToPercent(perf[itemId]["accuracy"], 0) : "";
			break;
		case 'sharpe':
			returnVal = perf[itemId] ? roundToPercent(perf[itemId]["sharpe"], 0) : "";
			break;
		case 'raror':
			returnVal = perf[itemId] ? roundToPercent(perf[itemId]["raror"], 0) : "";
			break;
		case 'roi':
			returnVal = perf[itemId] ? roundToPercent(perf[itemId]["roi"], 0) : "";
			break;
	}	
	
	return returnVal;
}
*/

function roundToPercent(val, places){
	var returnVal = '';
	if(!places)
		places = 0;
	try{
		returnVal = val.toFixed(2);
	}catch(e){
		returnVal = '';
	}
	
	if(isNaN(returnVal))
		returnVal = '';
	
	return returnVal;	
}

function createAnalstLandNavs(dataObj){
	var data = formatJson(dataObj);
	var buff = new StringBuffer();
	buff.append('<div class="tablist"><ul><li><a href="/" '+ getAtiveNav(data.select, 'oa') +'>By Overall Performance</a></li><li><a href="/" '+ getAtiveNav(data.select, 'secs') +'>By Sector</a></li><li><a href="/" '+ getAtiveNav(data.select, 'stks') +'>By Stocks</a></li><li><a href="/" '+ getAtiveNav(data.select, 'awc') +'>Analyst Coverage By Sector</a></li></ul></div>');
	return buff.toString();
}


function getAtiveNav(data, sel){
	var retStre = '';
	if(sel == data){
		retStre = 'class="active"';
	}
	
	return retStre;
}

function createAnalystOARankLanding(dataObj, logger){
	logDebug(logger, '***********************************Inside createAnalystOARank');
	var buff = new StringBuffer();
	var data = formatJson(dataObj);
	var analystOARank = data.analystOARank;
	var analystBase = data.analystBase;
	var analystSectRank = data.analystSectRank;
	var analystStkRank = data.analystStkRank;
	var sectorBase = data.sectorBase;
	var analystPerf = data.analystPerf;
	var analystSectors = data.analystSectors;
	var type = data.type;
	buff.append('<div><table class="boptable tablepadding10 borderall">');
	if(analystSectors){
		for (i =0 ; i<analystSectors.length; i++) {
			try{
					
				buff.append('<tr><td class="bop1 tdline borderb">'+createAnHtm(analystBase, {"alysId":analystSectors[i].id}, analystOARank, null)+'</td><td class=" tdline borderb">'+createPerformanceWidget(analystPerf[analystSectors[i].id])+'</td><td class="bop3 tdline borderb">');

				var sects = analystSectors[i].sectors;
				var nrSectBuff = new StringBuffer();
				for(var se = 0; se < sects.length; se++){
					var analystSectsRankTmp = analystSectRank[analystSectors[i].id+'-'+sects[se]];	
					if(analystSectsRankTmp) {
						buff.append('<p class="ctext">');
						buff.append(sectorBase[sects[se]]["secName"]);
						buff.append('&nbsp;<span class="blacktext lftspace">');
						buff.append(analystSectsRankTmp["rank"]);
						buff.append('</span></p>');
					}
					else {
						nrSectBuff.append('<p class="ctext">');
						nrSectBuff.append(sectorBase[sects[se]]["secName"]);
						nrSectBuff.append('</p>');
					}
				}
				buff.append(nrSectBuff.toString());
				buff.append('</td><td class="bop4 tdline borderb">');
				//stk rank
				var stkSecRnksArr = analystStkRank[analystSectors[i].id];
				if(stkSecRnksArr){
					for(var s = 0; s<stkSecRnksArr.length; s++){
						var stkRnkArr = stkSecRnksArr[s]['stkRankAlys'];
						for(var s2 = 0 ; s2 < stkRnkArr.length; s2++){
							buff.append('<span class="tmar">'+stkRnkArr[s2]['stkName']+' ('+stkRnkArr[s2]['rank']+')</span>');
							if(s != stkSecRnksArr.length-1 || s2 != stkRnkArr.length-1 )
								buff.append(', ');
						}
					}
				}
				buff.append('</td><td class="icons bop5 borderb"><div class="icon3 margint borderall wraper"><p class="borderr left">'+getStarIcon("", analystSectors[i].id, "" , "", data.userFav, "ANALYST")+ 
						'</p><p class="left">'+getLandingAddIcon("", analystSectors[i].id, "", "", data.userFav)+'</p></div></td></tr>');
			}catch(e){
				logDebug(logger, e);
			}
		}		
	}

	buff.append('</table></div>');
	logDebug(logger, '***********************************Exiting  createAnalystOARank');
	return buff.toString();
}

/*analyst landing pages*/
function createAnalystBio(dataObj, logger){
	logDebug(logger, '***********************************Inside createAnalystBio');
	var buff = new StringBuffer();
	var data = formatJson(dataObj);
	var analystPerf = data.analystPerf;
	var analystBase = data.analystBase;
	var analystBio = data.analystBio;
	var analystWorkHistory = data.analystWorkHistory;
	var analystOARank = data.analystOARank;
	var analystSectRank = data.analystSectRank;
	var analystStkRank = data.analystStkRank;
	var analystRecoSumm = data.analystRecoSumm;
	var context = data.context;
	
	buff.append('<div>');
	
	//buff.append('<div class="left">'+analystBase["alysName"]+' | '+analystBase["alysFirm"]+'</div>');
	
	buff.append('<div class="margint"><div class="indraco_title left">'+analystBase["alysName"]+'<span>'+analystBase["alysFirm"]+'</span></div><div class="icon3 borderall left"><p class="borderr left">'
			+getStarIcon( '',analystBase["id"], '', '', data.userFav, "ANALYST")+'</p><p class="left">'+getLandingAddIcon('', analystBase["id"], '', '', data.userFav)+'</p></div><div class="rec_history right"></div><div class="clear"></div></div><div class="right"></div><div class="clear"></div>');	
	
	buff.append('<h3 class ="margint">Analyst Rank Summary</h3>');
	buff.append('</div><div class="borderall analystprofilesection"><div class="analystdetails"><div class="analystcontent left"><div class="marginb">');
			if( analystOARank && analystOARank["currRk"]){
				buff.append('<div class=" borderall anabox1"><div class="anainfobox">'+analystOARank["currRk"]+'</div><p class="ybox bordert">OVERALL RANK</p></div>');
			}else{
				buff.append('<div class=" borderall anabox1"><div class="anainfobox ybox bordert">Not Ranked</div><p class="ybox bordert">OVERALL RANK</p></div>');
			}

			buff.append('<div class=" borderall anabox2"><div class="anainfobox">');
	
	for (var i =0 ; i<analystSectRank.length; i++) {
		try{
			buff.append('<p>'+analystSectRank[i]["sectName"]+'('+analystSectRank[i]["rank"]+')</p>');
			if(i == 0){
				break;
			}
		}catch(e){
			logDebug(logger, e);
		}
	}
	buff.append('</div><p class="ybox bordert">SECTOR RANK</p></div><div class=" borderall anabox3"><div class="anainfobox">');
	
	var rendered = 0;
	for (var i = 0 ; i<analystStkRank.length; i++) {
		if(rendered == 2)
			break;
		try{
			var stkRankAlys = analystStkRank[i]["stkRankAlys"];
			for(var j= 0; j < stkRankAlys.length; j ++){
				var oneRec = stkRankAlys[j];
				
				buff.append('<p>'+oneRec["stkName"]+'('+oneRec["rank"]+')</p>');
				rendered ++;
				if(rendered == 2)
					break;
			}
		}catch(e){
			logDebug(logger, e);
		}
	}
	buff.append('</div><p class="ybox bordert">STOCK RANK</p></div>');
	buff.append('<div class="analystphoto right"><img src='+getImgUrl("analyst.jpg")+' width="" height=""></div>');
	buff.append('<div class="clear">');
		
	buff.append('</div></div><p></p></div><div class="clear"></div></div></div><div class="social_icons"></div>');
	
	logDebug(logger, '***********************************Exiting  createAnalystBio');
	return buff.toString();	
}

function createAnalystPastPerformance(perf, factor){
	var buff = new StringBuffer();
	
	buff.append('<div class="dar4 borderr">');
	
	if(perf){
		
		var fillClass = "";
		if(factor == "roi"){
			fillClass = "filled-green";
		}else if(factor == "accuracy"){
			fillClass = "filled-blue";
			
		}else{
			fillClass = "filled-red";
			
		}
		for(var i = 0; i < perf.length; i++){
			
			if(i == 0 && perf[0]){
				//overall
				buff.append('<div class="ranks ranksAnal" title="'+makePercent(perf[i][factor],0)+'%"><div class ="left" ><p>Overall</p></div><div class="strength-bar right"><div class="'+fillClass+'" style="width:'+makePercent(perf[i][factor],0)+
						'%"></div></div></div>');
			}else if (i ==1 && perf[1]){
				buff.append('<div class = "clear"></div>');
				buff.append('<div class="ranks ranksAnal" title="'+makePercent(perf[i][factor],0)+'%"><div class ="left"><p>3 months ago</p></div><div class="strength-bar right"><div class="'+fillClass+'" style="width:'+makePercent(perf[i][factor],0)+
				'%"></div></div></div>');
				
				// three months
			}else if(i ==2 && perf[2]){
				buff.append('<div class = "clear"></div>');
				buff.append('<div class="ranks ranksAnal" title="'+makePercent(perf[i][factor],0)+'%"><div class ="left"><p>6 months ago</p></div><div class="strength-bar right"><div class="'+fillClass+'" style="width:'+makePercent(perf[i][factor],0)+
				'%"></div></div></div>');
			}else if(i == 3 && perf[3]){
				// 12 months
				buff.append('<div class = "clear"></div>');
				buff.append('<div class="ranks ranksAnal" title="'+makePercent(perf[i][factor],0)+'%"><div class ="left"><p>12 months ago</p></div><div class="strength-bar right"><div class="'+fillClass+'" style="width:'+makePercent(perf[i][factor],0)+
				'%"></div></div></div>');
			}
		}
	}
	buff.append('</div>');
	
	return buff.toString();
}

/*analyst landing pages*/
function createAnRecoPerf(dataObj, logger){
	logDebug(logger, '***********************************Inside createAnRecoPerf');
	var buff = new StringBuffer();
	var data = formatJson(dataObj);
	var analystPerf = data.analystPerf;
	var analystBase = data.analystBase;
	var analystBio = data.analystBio;
	var analystWorkHistory = data.analystWorkHistory;
	var analystOARank = data.analystOARank;
	var analystSectRank = data.analystSectRank;
	var analystStkRank = data.analystStkRank;
	var analystRecoSumm = data.analystRecoSumm;
	
	if(analystRecoSumm){
		buff.append('<h3 class="margint">Analyst Performance</h3><div class="borderall rec_sumbg"><div class="dar">');
	}
			
	if(analystPerf && analystPerf.length > 0){
		buff.append('<div class="dar1 borderb"><span class="boldtext">ROI</span>  DELIVERED</div><div class="dar2 borderb"><span class="boldtext">OVERALL</span> ACCURACY</div><div class="dar3 borderb"><span class="boldtext">SHARPE</span> RATIO</div><div class="clear"></div>');
		
		buff.append(createAnalystPastPerformance(analystPerf, "roi"));
		buff.append(createAnalystPastPerformance(analystPerf, "accuracy"));
		buff.append(createAnalystPastPerformance(analystPerf, "sharpe"));
		
		buff.append('<div class="clear"></div>');
	}
	
	buff.append('</div></div>');
	logDebug(logger, '***********************************Exiting  createAnRecoPerf');
	return buff.toString();
}

/*analyst landing pages*/
function createAnBioNav(dataObj, logger){
	logDebug(logger, '***********************************Inside createAnBioNav');
	var buff = new StringBuffer();
	var data = formatJson(dataObj);
	var analystPerf = data.analystPerf;
	var analystBase = data.analystBase;
	var analystBio = data.analystBio;
	var analystWorkHistory = data.analystWorkHistory;
	var analystOARank = data.analystOARank;
	var analystSectRank = data.analystSectRank;
	var analystStkRank = data.analystStkRank;
	var analystRecoSumm = data.analystRecoSumm;
	buff.append('<div class="tablist" id=anBioNav_'+analystBase["id"]+' ><ul><li><a href="/" class="active"> All Calls</a></li><li><a href="/">Success Calls</a></li><li><a href="/">Falied Calls</a></li><li><a href="/">Unmet Calls</a></li></ul></div>');
	logDebug(logger, '***********************************Exiting  createAnBioNav');
	return buff.toString();
}

function makePercent(val, places){

	var returnVal = '';
	if(!places)
		places = 0;
	try{
		returnVal = (val*100).toFixed(places);
	}catch(e){
		returnVal = '';
	}
	
	if(isNaN(returnVal))
		returnVal = '';
	
	return returnVal;
}

function calculateRoi(targetPx, recoPx, actn){
	var roi = '';
	var retHtm = '';
	if(!targetPx || !recoPx)
		return '<span class =""> &nbsp;</span>';
		
	if(actn == 'BUY' || actn == 'HOLD'){
		roi = ((((targetPx - recoPx)/recoPx)*100));
	}else if(actn == 'SELL'){
		roi = ((((recoPx - targetPx)/targetPx)*100));
	}
	
	if((""+roi).indexOf('.') > 0){
		retHtm = '<span class ="" >'+roi.toFixed(0)+'%</span>';
		
	}else{
		retHtm = '<span class ="" >'+roi+'%</span>';
	}

	return retHtm;
}

function calculateAnnualizedRoi(targetPx, recoPx, actn, tg_dt){
    var roi = '';
    var retHtm = '';
    if(!targetPx || !recoPx)
            return '<span class =""> &nbsp;</span>';

    if(actn == 'BUY' || actn == 'HOLD'){
            roi = ((((targetPx - recoPx)/recoPx)));
    }else if(actn == 'SELL'){
            roi = ((((recoPx - targetPx)/targetPx)));
    }
    var currdate = (new Date());
    var tgdt = (new Date(tg_dt.time));
    currdate.setHours(0);
    tgdt.setHours(0);
    var days = (tgdt.getTime() - currdate.getTime())/(3600*24000);
    roi = (Math.pow((1+roi),(365/days)) - 1) *100;
    if((""+roi).indexOf('.') > 0){
            retHtm = '<span class ="" >'+roi.toFixed(0)+'%</span>';
    }else{
            retHtm = '<span class ="" >'+roi+'%</span>';
    }

    return retHtm;
}

/* function calculateHorizon(rc_dt, tg_dt){
	return monthDiff(new Date(rc_dt.time), new Date(tg_dt.time));
}

function calculateHorizonTillNow(rc_dt){
	return monthDiff(new Date(rc_dt.time), new Date())+ " ago";
}

function calculateHorizonFromNow(tg_dt){
	return monthDiff(new Date(), new Date(tg_dt.time));
}

function monthDiff(d1, d2) {
   var d1Y = d1.getFullYear();
   var d2Y = d2.getFullYear();
   var d1M = d1.getMonth();
   var d2M = d2.getMonth();
   var diff = ((d2M+12*d2Y)-(d1M+12*d1Y));	
 
   if(diff == 0){
	   //caculate diff in months
	   diff = dateDiff(d1, d2);
	   return diff + " days";
   }else if(diff == 1){
	   //caluculate days if less then 30 , format it in days
	    var daysDiff = Math.ceil((d2.getTime()-d1.getTime())/(3600*24000));
	    if(daysDiff < 30){
	 	   return daysDiff + " days";
	    }else{
	 	   return diff + " m";
	    }
   }else{
	   return diff + " m";
   }
}

function dateDiff(startDate, endDate) {
	endDate.setHours(0);
    startDate.setHours(0);
    //assuming days cannt be 0.
    
    return endDate.getDate() - startDate.getDate();

}

*/

function formatJson(dataObj){
	try{
		data = eval('('+dataObj+')');
	}
	catch(e){
		data = 	eval(dataObj);
	}
	return data;
}

function logDebug(log, msg){
	if(log && log.debug){
		log.debug(msg);
	}else{
		// on browser side.
		//alert(msg);
	}
}

function secList(data, sap){
	var buff = new StringBuffer();
	for(var k = 0; k < data.length ; k++){
		if(k == 0){
			buff.append('<li><a href ="/" class = active  id='+sap+'_'+data[k].id+'>'+data[k].secName+'</a></li>');
		}else{
			buff.append('<li><a href ="/" id='+sap+'_'+data[k].id+'>'+data[k].secName+'</a></li>');
		}
	}
	return buff.toString();
}

function sec_stk_head(name, summ, totalSummaryMap){
	return '<p class="left">'+name+' : <span class="blacktext">'+summ.totalStk+'</span> Stocks,  <span class="blacktext">'+summ.totalReco+'</span> Recommendations</p><p class="right"><span class="blacktext">'+totalSummaryMap.totalStk+'</span> Stocks,  <span class="blacktext">'+totalSummaryMap.totalReco+
	'</span> Recommendations, <span class="blacktext">'+totalSummaryMap.totalAlys+'</span> Analysts</p><br class="clear">';
}

function sec_stk_headAjax(name, summ){
	return name+' : <span class="blacktext">'+summ.totalStk+'</span> Stocks,  <span class="blacktext">'+summ.totalReco+'</span> Recommendations';
}

function getStockImgHtml(stk_data){
	var buff = new StringBuffer();
	buff.append('<div class ="lazy loadingSmall"><!--<img width="100" height="40" src='+getStkImg(stk_data)+'>--></div>');
	return buff;
}
function getStockImgHtmlLanding(stk_data){
	var buff = new StringBuffer();
	buff.append('<p class="comp_chart"><div class ="lazyWin loadingSmall"><!--<img  width="100" height="40" src='+getStkImg(stk_data)+'>--></div></p>');
	return buff;
}

function secStk_data(dataObj, logger){
	var data = formatJson(dataObj);

	var buff = new StringBuffer();
	buff.append('<table id="stoccovertables"><tbody>');
	var stockBase = data.stkBase;
	var stkRecoSummary = data.stkRecoSummary;
	var lstIds = data.lstIds;
	for ( var k = 0; k < lstIds.length; k++) {
		try{
			if (stockBase.hasOwnProperty(lstIds[k])) {
				buff.append('<tr><td><span>'+renderHTML(link(stockBase[lstIds[k]]["exchgTkr"],createLinkObj("st", {"cnt": data["cnt"] ,"recoData":null,"stkData":stockBase[lstIds[k]]})))+
						'</span>, '+stockBase[lstIds[k]]['stkName']+'</td><td class="swc_map">'+getStockImgHtml(stockBase[lstIds[k]])+'</td>');

				if(stkRecoSummary[lstIds[k]]){
					buff.append('<td class="swc_buy">'+stkRecoSummary[lstIds[k]]["totalBuy"]+'</td><td class="swc_sell">'+stkRecoSummary[lstIds[k]]["totalSell"]+'</td><td class="swc_hold">'+stkRecoSummary[lstIds[k]]["totalHold"]+'</td></tr>');
				}else{
					buff.append('<td class="swc_buy">0</td><td class="swc_sell">0</td><td class="swc_hold">0</td></tr>');
				}
				
			}
		}catch(e){
			logDebug(logger, e);
			continue;
		}
	}

    buff.append('</tbody></table>');
    
	return buff.toString();
}

function secAnl_data(data, logger){
	var buff = new StringBuffer();
	buff.append('<table class="analystwecovertable"><tbody>');
	var alysRecoSummary = data.alysRecoSummary;
	var analystBase = data.analystBase;
	
	var alysIds = data.alysIds;
	
	for ( var k = 0; k < alysIds.length; k++) {
		try{
				buff.append('<tr><td><span>'+renderHTML(link(analystBase[alysIds[k]]["alysName"], 
						createLinkObj("an", {"cnt": data["cnt"] ,"analData":analystBase[alysIds[k]]})))+',&nbsp;&nbsp;</span>'+analystBase[alysIds[k]]["alysFirm"]+'</td>');
				buff.append('<td class="td2">'+( alysRecoSummary[alysIds[k]]["totalBuy"] + alysRecoSummary[alysIds[k]]["totalSell"] + alysRecoSummary[alysIds[k]]["totalHold"] + alysRecoSummary[alysIds[k]]['totalClose'])+'</td></tr>');
				
		}catch(e){
			logDebug(logger, e);
			continue;
		}
	}
	
    buff.append('</tbody></table>');
	return buff.toString();
}

function createAnSecs(secBase, anSecs){
	var buff = new StringBuffer();
	for (var k = 0; k < anSecs.length; k++){
		buff.append(secBase[anSecs[k]].secName);
		
		if (k == 0){
			break;
		}
	}

	return buff.join(",");
}
function getCMP(lstid, cmp){
	return  (cmp && cmp[lstid]) ? cmp[lstid]["cmp"].toFixed(2) : "";
}

function getCMPWithDate(lstid, cmp){
	var obj = {};
	obj.cmp = (cmp && cmp[lstid]) ? cmp[lstid]["cmp"] : "";
	obj.tradeTime = (cmp && cmp[lstid]) ? cmp[lstid]["tradeTime"] : "";
	obj.tradeDate = (cmp && cmp[lstid]) ? cmp[lstid]["tradeDate"] : "";
	return obj;
}

function getCMPCurr(cnt){
	if(cnt == 'IND'){
		return "RS";
	}else{
		return "USD";
	}
	
}

/*
function calcPercent(count, total){
	return parseInt((count/total)*100) + '%';
}
*/

function getExIcon(type){
	if(type == 'exup')
	return '<div class="addicon"><span class="up">';
	else
		return '<div class="addicon"><span class="down">';
}

function getTpMet(recoPerf){
	var buff = new StringBuffer();
	try{
	var flag = recoPerf['tpMet'];
	buff.append('<td class=" borderb" style ="vertical-align: middle;"');
	if(flag == true){
		buff.append('<p class ="met" >MET</p>');
		if(recoPerf["tpMetDt"])
			buff.append('<p class="font10 alignC">'+formatDateString(new Date(recoPerf["tpMetDt"].time))+'</p>');
	}else{
		buff.append('<p class ="missed">MISSED</p>');
	}
	
	buff.append('</td>');
	}catch(e){
		
	}
	return buff.toString();
}

function getNavsHtml(dataObj){
	var data = formatJson(dataObj);
	var buff = new StringBuffer();
	//var selTab = data.selTab;
	switch(data.context)
	{
		case 'newRecoLand':case 'exUpRecoLand': case 'exDnRecoLand': case 'topRatedRecoLand' : case 'closedRecoLand': case 'mostRecoStksLand': case 'favRecoLand':  case 'recoIndv': case 'stkWeCoverLand':
			buff.append('<div class="tablist"><ul><li title="Trading Ideas Dashboard" ><a href="'+createNavLink("tiDash")+'" >Dashboard</a></li><li title="Stock Recommendations by Top Analysts"><a '+getAtiveNav(data.selectNav, "topRecos")+' href="'+createNavLink("topRatedRecoLand")+
					'" >Top Rated</a></li><li title="New Stock Recommendations"><a '+getAtiveNav(data.selectNav, "newReco")+'  href="'+createNavLink("newRecoLand")+
					'" >New Reco</a></li><li title="Recently Closed Recommendations"><a  '+getAtiveNav(data.selectNav, "closedReco")+'  href="'+createNavLink("closedRecoLand")+'">Recently Closed</a></li>'+getFavNav(data)+'<li title="Extreme Upside Stocks"><a  '+getAtiveNav(data.selectNav, "exUp")+' href="'
					+createNavLink("exUpRecoLand")+'">Extreme Upside</a></li><li title="Extreme Downside Stocks"><a '+getAtiveNav(data.selectNav, "exDn")+'  href="'+createNavLink("exDnRecoLand")+'">Extreme Downside</a></li><li title="Stocks with Most Recommendations" ><a  '+getAtiveNav(data.selectNav, "mostRecoStks")+'    href="'+createNavLink("mostRecoStksLand")+'">Most Recommendations</a></li><li title ="Stock Coverage By Sector"><a href='+createNavLink("stk_we_cover")+' '+ getAtiveNav(data.selectNav, 'stkWeCover') +'>Stock Coverage By Sector</a></li></ul></div>');
			break;
		case 'tpRnkAnOaL': case 'tpRnkAnStkL' :  case 'tpRnkAnSeL' : case 'tpRnkAnSeSL' : case 'analBio' : case 'anlWeCoverLand':
			buff.append('<div class="tablist"><ul><li title ="Analyst Rating Dashboard" ><a href="'+createNavLink("aiDash")+'" >Dashboard</a></li><li title ="Top Ranked Analysts By Overall Performance"><a  '+ getAtiveNav(data.selectNav, 'anlOA') +'  href="'+createNavLink("an_oa")+'" >By Overall Performance</a></li><li title ="Top Ranked Analysts By Sector"><a href='+createNavLink("an_sec", data)+' '+ getAtiveNav(data.selectNav, 'anlSe') +'>By Sector</a></li><li title ="Top Ranked Analysts By Stocks"><a href='+createNavLink("an_stk")+' '+ getAtiveNav(data.selectNav, 'anlStk') 
					+'>By Stocks</a><li title ="Analyst Coverage By Sector"><a href='+createNavLink("an_we_cover")+' '+ getAtiveNav(data.selectNav, 'anlWeCover') +'>Analyst Coverage By Sector</a></li></ul></div>');
			break;
		case 'myAccount':
			buff.append('<div class="tablist"><ul><li title ="PERSONAL DETAILS" ><a '+ getAtiveNav(data.selectNav, 'MYACCOUNT_PERSONAL') +' href="'+createNavLink("myaccount_per")+'" >PERSONAL DETAILS</a></li></div>');
			break;
		case 'se':
			break;
	}
	return buff.toString();	
}
function getFavNav(data){
	if(data.currentUser){
		return '<li><a '+getAtiveNav(data.selectNav, "favReco")+' href="'+createNavLink("favReco")+'">MY Favourites</a></li>';
	}else 
		return ''; 
}

function createFirstSlide(dataObj, logger){
	logDebug(logger, '***********************************Inside tpRtdStks_home');
	var buff = new StringBuffer();
	var data = formatJson(dataObj);
	var recoRelation = data.recoRelation;
	var recoBase = data.recoBase;
	var analystBase = data.analystBase;
	var stockBase = data.stockBase;
	var sectorBase = data.sectorBase;
	var context = data.context;
	var type = data.type;
	
	var min_count = recoRelation.length > data.bannerRows ? data.bannerRows : 1;
	for (var k = 0; k < min_count; k++)
	{		
		try{
		   /* buff.append('<div class="slides_container"><div class="slide"><div class="silde1"><div class="left"><p><img src='+getImgUrl("Stock-of-the-Day.png")+' width="200" height="61"></p></div>');
			buff.append('<div class="right"><div class="s1b1"><div class="s1b131"><div class="s1b132"><p class="s1gtitle3"> &nbsp;</p><p class="s1gtitle4">&nbsp;</p></div>'
				+createAnHtmBanner(analystBase, recoRelation[k], null, null, null)+'</div><div class="clear"></div></div><div class="s1b2"><div class="s1b11">'
				+getBannerAction(recoBase[recoRelation[k]["id"]]["actn"])+'</div><div class="s1b12"><p class="s1gtitle1">'
				+renderHTML(link(stockBase[recoRelation[k].lstId]["exchgTkr"], createLinkObj("st", {"className":"bannerLinks", "cnt": data["cnt"] ,"recoData":recoBase[recoRelation[k]["id"]],"stkData":stockBase[recoRelation[k].lstId]})))
				+'</p><p class="s1gtitle2">'+stockBase[recoRelation[k].lstId]["stkName"]+'</p></div><div class="clear"></div></div><div class="s1b3"><div class="s1b131"><p class="s1gtitle2">Target&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'
				+'<span class ="s2gtitle1" >'+getCurrSym()+recoBase[recoRelation[k]["id"]]['tgtPx']+'</span>, '
				+calculateHorizonFromNow(recoBase[recoRelation[k]["id"]]['tgtDt']).replace("m", "months")+'</p><p class="s1gtitle2">Current&nbsp;&nbsp;&nbsp;&nbsp;'+getCMPHtml(recoRelation[k]["lstId"], data.cmp, logger, 'banner', true)+
				'</p></div><div class="s1b132"><p class="s1gtitle5">&nbsp;</p></div><div class="clear"></div></div><div class="s1b3"><div class="s1b131"><p class="s1gtitle2">Implied ROI &nbsp;&nbsp;&nbsp;'
				+calculateRoi(recoBase[recoRelation[k]["id"]]['tgtPx'], getCMP(recoRelation[k].lstId, data.cmp), recoBase[recoRelation[k]["id"]]["actn"])+
				'</p></div><div class="clear"></div><div class ="Disclaimers">'+renderHTML(link("Disclaimer", createLinkObj("disc", {"className":"bannerDisc"})))+'</div></div></div></div></div></div>');
		    */
			buff.append('<div class="slides_container"><div class="slide"><div class="silde1"><div class="left"></div>');
			buff.append('</div></div></div>');
		}catch(e){
			logDebug(logger, e);
		}
	}
	
	logDebug(logger, '***********************************Exit tpRtdStks_home');

	return buff.toString();
}

function getBannerAction(actn){
	
		if(actn == 'BUY')
			return '<div class=" buyBanner">BUY</div>';
		else	if(actn == 'SELL')
			return '<div class=" sellBanner">SELL</div>';
		else if	(actn == 'HOLD')
			return 	'<div class=" holdBanner">HOLD</div>';

}

function createRecoAction(actn){
	if(actn == 'BUY')
		return 'Buy';
	else	if(actn == 'SELL')
		return 'Sell';
	else if	(actn == 'HOLD')
		return 'Hold';
}

function createNavLink(type, data){
	var cnt = getCountry();
	var link = 'did not found the correct Nav link';
	switch(type)
	{
		case 'favReco':
			link = getLinks('favs');
			break;
		case 'an_oa'://analystOverAll
			link = getLinks('tprnkoa');
			break;
		case 'an_sec'://analyst by sec
			var secId = data.navConfig["sec_id"];
			if(!secId){
				secId = 2809;
			}
			
			link = '/'+getCountry()+'/top-rated-analysts-by-sector-performance';
			break;
		case 'an_stk'://analyst by secs
			link = getLinks('tprnkstk');
			break;
		case 'newRecoLand'://analyst by secs
			link = getLinks("newRecos");
			break;
		case 'exUpRecoLand'://analyst by secs
			link = getLinks('exup');
			break;
		case 'exDnRecoLand'://analyst by secs
			link = getLinks('exdn');
			break;
		case 'topRatedRecoLand'://analyst by secs
			link = getLinks("trs");
			break;			
		case 'closedRecoLand'://analyst by secs
			link = getLinks('rcls');
			break;			
		case 'mostRecoStksLand'://analyst by secs
			link = getLinks("mrs");
			break;
		case 'tiDash'://ti dash board
			link = getLinks("tiDash");
			break;
		case 'aiDash'://ti dash board
			link = getLinks("aiDash");
			break;
		case 'myaccount_per':
			link = getLinks("myaccount_per");
			break;
		case 'an_we_cover':
			link = getLinks("an_we_cover");
			break;
		case 'stk_we_cover':
			link = getLinks("stk_we_cover");
			break;
						
		
	}
	return link;
}

function getLinks(type, cnt){

	var link = 'did not found the correct link';
	var cnt = getCountry();
	switch(type)
	{
		case 'newRecos'://new recos
			link = '/'+cnt+'/new-stock-recommendations';
			
			break;
		case 'trs'://top rated stks home page
			link = '/'+cnt+'/top-rated-stock-recommendations';
			
			break;
		case 'favs': // faverite stocks 
			link = '/'+cnt+'/my-favorites';
			break;
		case 'mrs'://Stocks with Most Recommendations
			link = '/'+cnt+'/most-recommended-stocks';
			break;
		case 'exup'://extream upside
			link = '/'+cnt+'/stock-recommendations-with-extreme-upside';
			break;
		case 'exdn':// extream downside
			link = '/'+cnt+'/stock-recommendations-with-extreme-downside';
			break;
		case 'rcls'://recently closed
			link = '/'+cnt+'/recently-closed-stock-recommendations';
			break;			
		case 'tprnkoa'://Analyst top rank by overall
			link = '/'+cnt+'/top-rated-analysts-by-overall-performance';
			break;
		case 'tprnksec'://Analyst top rank by sector
			link = '/'+cnt+'/top-rated-analysts-by-sector-performance';
			break;
		case 'tprnkstk'://Analyst top rank by stocks
			link = '/'+cnt+'/top-rated-analysts-by-stock-performance';
			break;
		case 'rcls'://recently closed
			link = '/MilkOrWater/'+cnt+'/recoDashboard/newRecos.htm?page=10&size=10';
			break;
		case 'rcls'://recently closed
			link = '/MilkOrWater/'+cnt+'/recoDashboard/newRecos.htm?page=10&size=10';
			break;
		case 'tiDash'://recently closed
			link = '/'+cnt+'/trading-ideas';
			break;
		case 'aiDash'://recently closed
			link = '/'+cnt+'/analyst-ratings';
			break;
		case 'myaccount_per'://recently closed
			link = '/'+cnt+'/my-account';
			break;
		case 'an_we_cover':
			link = '/'+cnt+'/analyst-coverage-by-sector';
			break;	
		case 'stk_we_cover':
			link = '/'+cnt+'/stock-coverage-by-sector';
			break;
	}
	
	return link;

}

function createMoreLink(type, cnt){
	var link = getLinks(type, cnt);
	return '<div class="more"><a id =dasds href='+link+'>More</a></div>';
}

function getFiltsHtml(dataObj){
	var data = formatJson(dataObj);
	var buff = new StringBuffer();
	switch(data.context)
	{
		case 'tdLand':
			buff.append('<div class="sub"><table class="newrectabslist"><tr><td class="td1">By Sector<br><select name=""><option>Banking & Finance</option></select></td><td class="td2">By Analyst Rank<br><select name=""><option>1-60</option></select></td><td class="td3">By Recommendation<br><select name=""><option>Buy, Sell or Hold</option></select></td><td class="td4">By User Sentiments<br><select name="" class="myselect1"><option>All</option></select></td><td></td></tr></tr></table></div>');
			break;
		case 'st':
			break;
		case 're':

			break;
		case 'se':
			break;
	}
	return buff.toString();
}

/**
 * function to create analyst bio tabs
 */
function createAnalystTabs(dataObj, logger){
	try{
	var data = formatJson(dataObj);
	var alysId = data.alysId;
	var analystRecoJson = data;
	var analystRecoSumm = data.analystBioJson.analystRecoSumm;
	var buff = new StringBuffer();
	
	buff.append('<h3 class="margint"><div>All Stock Recommendations</div>');
	buff.append('</h3>');
	
	if(analystRecoSumm){
		var tot_open = analystRecoSumm["totalBuy"] + analystRecoSumm["totalHold"] + analystRecoSumm["totalSell"];
		var tot_closed=analystRecoSumm["totalClose"];
		buff.append( '<div class = "stockrecommands bordert" >Total Recos ' + (tot_open+tot_closed) + ' (' + tot_open + ' Open; ' + tot_closed + ' Closed)</div>');
	}else{
		//buff.append( 'no reco summ');
		
	}
	
	buff.append('<div class ="clear"></div>');
	
	buff.append('<div id=analTabs'+alysId+'><ul>'+
			'<li><a href="#analBioOpenCalls_'+data.alysId+'">Open Recos</a></li>'+
			'<li><a href="#analBioClosedCalls_'	+data.alysId+'"> Closed Recos</a></li>'+
			'<li><a href="#analBioSuccessCalls_'+data.alysId+'">Success Calls</a></li>'+
			'<li><a href="#analBioFailedCalls_'+data.alysId+'">Failed Calls</a></li>'+
			'</ul>'+
			
			'<div id="analBioOpenCalls_'+data.alysId+'"><div id="analBioOpenCalls_'+data.alysId+'_data">'+createAnOpenRecoLanding(analystRecoJson)+
			'</div>'+getPaginationMenus(
					{"page_num":"1", "type" : "analBioOpenCalls_"+alysId, "isAjax" : true}
					)+'</div>'+
					
			'<div id="analBioSuccessCalls_'+alysId+'"><div id="analBioSuccessCalls_'+alysId+'_data">'+getloader()+'</div></div>'+
			'<div id="analBioFailedCalls_'+data.alysId+'">'+'<div id="analBioFailedCalls_'+data.alysId+'_data">'+getloader()+'</div></div>'+
			'<div id="analBioClosedCalls_'+alysId+'" ><div id="analBioClosedCalls_'+alysId+'_data">'+getloader()+'</div></div></div>');
	
	}catch(e){
		logDebug(logger, e);
	}
	
	return buff.toString();
}

function getloader(){
	return 'Loading...';
}

function getTargetMet(tgdt){
	var returnVal = false;
	
	var tgdate = new Date(tgdt.time)
	var now = new Date();
	
	if(now > tgdate){
		returnVal = true;
	}
	
	return returnVal;
}

function sortAssoc(logger,aInput)
{
	var aTemp = [];
	for (var sKey in aInput)
		aTemp.push([sKey, aInput[sKey]]);
	aTemp.sort(function (a,b) {return ((a[1] > b[1]) - (a[1] < b[1]))});
	var aOutput = [];
	
	for (var nIndex = 0; nIndex < aTemp.length; nIndex++){
		aOutput.push(aTemp[nIndex][0]);	
	}
	return aOutput;
}

/** 
 * creates Srock section for reco indv rendering.
 * @param dataObj
 * @param chartData
 * @param renderHeader
 * @returns
 */



function createStockSection(dataObj, recoData,logger){
	var data = formatJson(dataObj);
	var recoId = data.recoId;//data.recoId;
	var listId = data.lstId;//data.listId;
	var isloggedin = data.loggedin;
	var buff = new StringBuffer();
	var topRecoId = null;
	
	if(recoData.topReco){
		recoId = recoData.topReco.id;
		topRecoId = recoData.topReco.id; 
	}
	var stkDetails = recoData.stockDetails;
	var quote = recoData.cmp[listId];
	if(quote) {
		cmpdate = getCMPDate(quote.tradeDate,quote.tradeTime);
		var change = (quote["change"])?quote["change"]:"0";
		var quoteClass = (change.indexOf('-')<0)?"distock_up":"distock_down";
	}
	var stockBase = recoData.stockBase[listId];
	var analystBaseMap = recoData.analystBase;
	var sectBase = recoData.sectorBase;
	var stockOpenRecoSummary = recoData.stockOpenRecoSummary[listId];
	var stockPeersIds = recoData.stockPeersIds;
	var stockPxRange = recoData.stockPxRange;
	var stockrange = {min:'-',max:'-'};
	var buyRange;//=stockrange;
	var sellRange;//=stockrange;
	var holdRange;//=stockrange;

	if(stockPxRange) {
		for(var i = 0; i < stockPxRange.length; i++){
			if(stockPxRange[i].action === 'BUY') buyRange = stockPxRange[i] ;
			else if(stockPxRange[i].action === 'SELL') sellRange = stockPxRange[i] ;
			else if(stockPxRange[i].action === 'HOLD') holdRange = stockPxRange[i] ;
		}
	}
	if(!stockBase){
		return '';
	}
	// getRecoRelation:
	var topReco = null;
	for(var i = 0; i < recoData.recoRelation.length; i++){
		if(topRecoId === recoData.recoRelation[i].id){
			topReco = recoData.recoRelation[i];
			break;
		}
	}	
	var assocArray = [];
	for (var key in analystBaseMap){	
		assocArray[key]=analystBaseMap[key].alysName;
	}
	var keys = sortAssoc(logger,assocArray);
	buff.append('<div class="dis_stock"><table><tr><td><table><tr>');
	buff.append('<td class="td1"><p class="distock_title1">'+stockBase["exchgTkr"]+'</p><p class="distock_title2">'+stockBase["stkName"]+'</p><p>'+sectBase["secName"]+'</p></td>');
	if(quote){
		buff.append('<td class="td2"><p>MKT Price</p><p class="'+quoteClass+'"><span>'+calculatePx(quote["cmp"], false, 2)+'</span> '+calculatePx(change, true, 2)+'</p><p class="distock_pxdate"><span>'+cmpdate.day+'</span>&nbsp;<span class="blacktext">'+cmpdate.time+'</span></p></td>');
	}
	buff.append('<td class="td3"><p>MKT Beta</p><p class="stock_price">'+calculatePx(stkDetails["mktBeta"], true, 2)+'</p></td>');
	buff.append('<td class="td4"><p>RSI(14)</p><p class="stock_price">'+calculatePx(stkDetails["rsi"], true, 0)+'</p> </td>');
	buff.append('<td class="td5"><p class="low_large">'+stkDetails["volatility"]+'</p><p>Volatility</p></td>');
	buff.append('<td class="td6"><p class="low_large">'+stkDetails["mktCap"]+'</p><p>MKT Cap</p> </td>');
	buff.append('</tr></table></td>');
	buff.append('<td class="dis_icons"><div class="icon3 borderall left"><p class="borderr left">'+getStarIcon( listId,'', '', '', recoData.userFav, "STOCK")+'</p>');
	buff.append('<p class="left">'+getLandingAddIcon(listId, '', '', '',  recoData.userFav)+'</p></div></td></tr> </table>');
	buff.append('<div class="viewstockpress"><a href="#peers">View Industry Peers</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#analysts" id="inlineAnalystsLink_'+listId+'" class="inlineAnalystExp inlineAnalystExpActive" title="Analysts covering this stock"> '+keys.length+' analysts covering this stock view/hide>></a>');
	buff.append('</div></div>');
	buff.append('<div class="peer_alys" id="inlineAnalystsDiv_'+listId+'"><p>');
	buff.append('<table>');
	var count=0;
	
	for (var i=0;i<keys.length;i=i+2){	
		var key =  keys[i];
		var key2 =  ((i+1)<keys.length)?keys[i+1]:undefined;
		buff.append('<tr><td width="270px"><span class="person_name">'+renderHTML(link(analystBaseMap[key].alysName, createLinkObj("an", {"cnt": recoData["cnt"] , "analData":analystBaseMap[key]})))+'</span>');
		buff.append('&nbsp;(<span>'+analystBaseMap[key].alysFirm+'</span>)</td><td>');
		if(key2){
			buff.append('<span class="person_name">'+renderHTML(link(analystBaseMap[key2].alysName, createLinkObj("an", {"cnt": recoData["cnt"] , "analData":analystBaseMap[key2]})))+'</span>');
			buff.append('&nbsp;(<span>'+analystBaseMap[key2].alysFirm+'</span>)');
		}
		buff.append('</td></tr>');
	}
	buff.append('</table>');
	buff.append('</p></br></div>');
	//buff.append('</br>'); 
	try{
		// evaluate message for top rated area.
		 //buff.append('<div class="borderall margint"><div class="borderb sectorrank ">');
		// if(!isloggedin){
		//	buff.append('<div class="singup_message"> To view recommendations from top ranked analysts.<a href="#inline1" class="singup">Signup</a> for free or <a href="#" class="loginlink">Login</a></div>');
		//}
		 buff.append('<div class="top_allrecommand">');
		 buff.append('<div class="user_toprecommendation"><h4>Top Recommendation</h4><div class="borderall"><table class="tablepadding10"><tr>');
		 if(topReco){				
				
				topReco.lstId = listId;
				buff.append('<td class="td2 tdline">'+createAnHtmReco(analystBaseMap, topReco, recoData));

				buff.append('</td> <td class="td3 buydetails">');
				//var targetMet = getTargetMet(chartData.recosBase[oneReco.id]['tgtDt']);
				
				if(recoData.recosBase.recoState  == "CLOSED"){
					data.recoBase = recoData.recosBase;
					buff.append(createClosedRecoWidget(topReco, data));	
				}else{
					if(topReco.lstId == null || topReco.lstId == 0){
						topReco.lstId = listId;
					}
					buff.append(createRecoWidget(recoData, topReco));
				}
		 						
		 }else{

			buff.append('<td class="td2 tdline"><div class="singup_message">Currently there is no recommendation from top ranked analysts for this stock.</div></td>');
		 }
		 buff.append('</tr></table></div></div>');
		 
		 if(stockOpenRecoSummary) { 
			 buff.append('<div class="all_recommendation"><h4>All Open Recommendations ('+(stockOpenRecoSummary.totalHold + stockOpenRecoSummary.totalBuy + stockOpenRecoSummary.totalSell)+')</h4>');
			 buff.append('<div class="allrecomm_box1"><table> <tr class = "row_hover">');
			 buff.append('<td class="td1 borderb"><div class="summ_buynum"><p class ="width15px" ><b>'+stockOpenRecoSummary.totalBuy+' </b></p><p class="in_buy">BUY</p></div></td>')
			 buff.append('<td class="td2 borderb">');
			 if (buyRange) {
			 	buff.append('<span class="rupee_left">Price Range '+getCurrSym()+'</span><span class="amount">'+calculatePx(buyRange.min, true, 0)+'</span><span class="to">to</span><span class="amount">'+calculatePx(buyRange.max, true, 0)+'</span>');
			 }
			 buff.append('</td>');
			 buff.append(' </tr> <tr class = "row_hover"><td class="td1 borderb"><div class="summ_buynum"><p class ="width15px"><b>'+stockOpenRecoSummary.totalSell+'</b></p><p class="in_sall">SELL</p></div></td>');
		     buff.append('<td class="td2 borderb">');
			 if (sellRange) {
			 	buff.append('<span class="rupee_left">'+getCurrSym()+'</span><span class="amount">'+calculatePx(sellRange.min, true, 0)+'</span><span class="to">to</span><span class="amount">'+calculatePx(sellRange.max, true, 0)+'</span>');
			 }
			 buff.append('</td>');
			 buff.append('</tr> <tr ><td class="td1 borderb"><div class="summ_buynum"><p class ="width15px"><b>'+stockOpenRecoSummary.totalHold+'</b> </p><p class="in_hold">HOLD</p></div></td>');
			 buff.append('<td class="td2 borderb">');
			 if (holdRange) {
			 	buff.append('<span class="rupee_left"> '+getCurrSym()+'</span><span class="amount">'+calculatePx(holdRange.min, true, 0)+'</span><span class="to">to</span><span class="amount">'+calculatePx(holdRange.max, true, 0)+'</span>');
			 }
			 buff.append('</td>');
			 buff.append('</tr></table></div></div>');
		 }		 
		 buff.append('<div class="chat_recommlist" id ="Chart_'+listId+'"></div>');
		 buff.append('</div>');
		 buff.append('</br><div class="Peers_ttitlenav">');
         buff.append('<div class="peerstitle margint"><h4><a name="peers" style="color:black">Stock Industry Peers ('+stockPeersIds.length+')</a></h4></div>');
        //buff.append('<div class="peersnav"><ul>');
         var active="";
         var  activedef = Math.ceil(stockPeersIds.length/6)+1;
        // for(var i = 1; i <= Math.ceil(stockPeersIds.length/3); i++){
        // 	if(i === activedef) active = ""; else active="";
        // 	buff.append('<li><a href="#inline1" id="peergrp'+i+'" class="'+active+'">'+i+'</a></li>');
        // }
        // buff.append('</ul></div>');
         buff.append('<div class="clear"></div> </div>');
         buff.append('<div class="peers borderall marginb"> <table class="tablepadding10"><tr><td class="peerpn"  id="prevpeer" style="padding:0px;"><a href="#inline1" class="fprev"/></td>'); 
         var rs = {totalBuy:0,totalSell:0,totalHold:0};
         var vs = {modVote:0,negVote:0,posVote:0};
         var pivot=10;
         var display="none";
         var style="";
         var start=9;
         var pivot=10;
         var end=11
         for(var i = 0; i < stockPeersIds.length; i++){
        	 if(stockPeersIds[i] == listId ) {
 			 	pivot = i;
 			 	start = i-1;
 			 	end = i+1;
 			 	if(pivot==0){
 			 		start=0;
 			 		end = pivot+2;
 			 	}else if(pivot==stockPeersIds.length-1){
 			 		start=pivot-2;
 			 		end = pivot;
 			 	}
 			 }        	 
         }
         for(var i = 0; i < stockPeersIds.length; i++){
         	 style="";
			 var peer_d = recoData.stockBase[stockPeersIds[i]];
			 var peer_rs = recoData.stockOpenRecoSummary[stockPeersIds[i]];
			 if(!peer_rs)  peer_rs = rs;
			 var peer_vs = recoData.voteSummary[stockPeersIds[i]];
			 if(!peer_vs)  peer_vs = vs;
			 var total = peer_vs.posVote + peer_vs.modVote + peer_vs.negVote;
			 if(total==0) total=1;
			 if(i == pivot ) {
			 	style="border:1px;border-style:solid;border-color:black;";
			 }
			 if(i%2==0) style=style+"background-color:#F1F0F0";
			 if(i >= start && i <= end) display=""; else display="none";
			 buff.append('<td class="td1 tdline" id="peer'+i+'" style="display:'+display+';'+style+'"><div class="peersdiv">');
	         buff.append('<p class="comp_name boldtext">');
	         buff.append(renderHTML(link(peer_d["exchgTkr"], createLinkObj("st", {"cnt": getCountry() , "stkData":peer_d}))));
	         
	         buff.append('<div class ="right negmargin15" >'+getStarIcon(stockPeersIds[i] ,'', '', '', recoData.userFav, "STOCK")+'</div>');
	         
	         buff.append('</p><p class="comp_namefull marginb">'+peer_d["stkName"]+'</p>');
	         buff.append('<div class="boxbuysalehold"><div class="bsh">');
	         buff.append('<div class="left"><p class="in_buy">BUY</p><p><b>'+peer_rs.totalBuy+'</b></p></div>');
	         buff.append('<div class="left"><p class="in_sall">SELL</p><p><b>'+peer_rs.totalSell+'</b></p></div>');
	         buff.append('<div class="left"><p class="in_hold">HOLD</p><p><b>'+peer_rs.totalHold+'</b></p></div>');
	         buff.append('<div class="clear"></div></div></div></div><div class="preers_rank">');
			 buff.append('<div title="'+makePercent(peer_vs.posVote/total,0)+'%" class="ranks"><p>Bullish</p><div class="strength-bar"><div style="width:'+makePercent(peer_vs.posVote/total,0)+'%" class="filled-green"></div></div></div>');                           
	         buff.append('<div title="'+makePercent(peer_vs.modVote/total,0)+'%" class="ranks"><p>Cannot say</p><div class="strength-bar "><div style="width:'+makePercent(peer_vs.modVote/total,0)+'%" class="filled-blue"></div></div></div>');                           
	         buff.append('<div title="'+makePercent(peer_vs.negVote/total,0)+'%" class="ranks"><p>Bearish</p><div class="strength-bar "><div style="width:'+makePercent(peer_vs.negVote/total,0)+'%" class="filled-red"></div></div></div></div></div>'); 
	         buff.append('<p class="vote"><a id="stock_'+stockPeersIds[i]+'" class="stockvote curspointer">Vote</a></p></td>');

		 }

         buff.append('<td class="peerpn" id="nextpeer" style="padding:0px;"><a href="#inline1" class="fnext"/></td></tr> </table> ');
         buff.append('<input id=peerCount_'+listId+ ' name="peerCount" type=hidden value="'+stockPeersIds.length+'"/>')
         buff.append('<input id=start_'+listId+ ' name="startCount" type=hidden value="'+start+'"/></div>');       
		  
	
	}catch(e){
		// alert(e);
	}

	 logDebug(logger, '***********************************Inside createAnalystOARank'+buff.toString());
	 return buff.toString();
}



/** 
 * creates Chart section for reco indv rendering.
 * @param dataObj
 * @param chartData
 * @param renderHeader
 * @returns
 */


function createChartSection(dataObj, recoData){
	 var data = formatJson(dataObj);
	 var recoId = data.recoId;//data.recoId;
	 var listId = data.lstId;//data.listId;
	 var buff = new StringBuffer();
	 buff.append('<div class="chartsection_'+listId+'">');
	 buff.append('<div class="recommand_char borderr">');			 
	 buff.append('<span  id="resetBtn_'+listId+'" class="actionBtn right">Refresh Chart</span>');
	 buff.append('<div id="" class="chartbox left">');
	 buff.append('<div id="prcContainer_'+listId+'" style="width: 337px; height: 330px; cursor: default;"></div>');
	 buff.append('<div id="volContainer_'+listId+'" style="width: 337px; height: 100px; cursor: default;"></div>');
	 buff.append('<div id="flagContainer_'+listId+'"></div>');
	 buff.append('</div>');
	 buff.append('</div>');
	 buff.append('<div class="recommand_info">');
	 
	 buff.append('<div class="recommand_infobox">');
	 if(recoData.recoRelation.length > 0){	 	
	 	buff.append('<div class="selectoption borderb"><p> <span><input name="sel_'+listId+'" type="radio" value="OPEN" checked/> Open <input name="sel_'+listId+'" type="radio" value="CLOSED"/> Closed <input name="sel_'+listId+'" type="radio" value="ALL" /> ALL </span>');
	 	buff.append('<span class="actionBtn"><span  id="deselAll_'+listId+'" class="actionBtn" style=>Unselect All</span></span></p></div>');
	 }
	 
	 buff.append('<div class="chattable" id ="chartTableDiv" >');
	 buff.append('<div class="chattable scrolldiv" style ="height:400px;overflow:hidden;" id ="chartTableWrap_'+listId+'">');
	 buff.append('<table id =chartTable_'+listId+' class="tablepadding10 charttable"><tbody></tbody></table>');
	 buff.append('</div></div>');
	 buff.append('<div class="clear"></div>');
	 buff.append('</div>');
	 buff.append('</div>');//wrapper.
	 buff.append('<input id=chartRecoId_'+listId+ ' type=hidden />');
	 buff.append('<input id=chartLstId_'+listId+' type=hidden  />');
	 buff.append('<div id=dhtmltooltip_'+listId+' class ="tooltipchart" style ="display:none;" ></div>');
	
	 buff.append('</div>');

	 return buff.toString();
}

function getCastVoteHtm(){
	return '<div>Sorry currently we are not tracking the recommendations for this stock. However, we are enhancing our coverage every month and will soon add this stock on priority.</div>';
}

/**
 * renders start icon on the bases of row context and user favs.
 * @param lstId
 * @param alysId
 * @param recoId
 * @param secId
 * @param userFavs
 * @param rowContext
 * @returns
 */
function getStarIcon(lstId ,alysId, recoId, secId, userFavs, rowContext){
	var data  = '';
	
	var starIconWhite = getImgUrl("star_icon-white.png");
	var starIcon = getImgUrl("star_icon.png");
	
	if(rowContext == 'RECO'){
		data  = recoId; 
	}else if(rowContext == 'SECTOR'){
		data  = secId; 
	}else if(rowContext == 'ANALYST'){
		data  = alysId; 
	}		
	else if(rowContext == 'STOCK'){
		data  = lstId; 
	}
	
	var isInFav = false;
	if(userFavs){
		for(var i = 0; i < userFavs.length; i++){
			var entityName = userFavs[i]["entityName"];
			var id = userFavs[i]["id"];
			if(entityName == rowContext ){
				if(id == data){
					isInFav = true;
					break;
			}
		}
	 }
	}
		
	
	var buff = new StringBuffer();
	//star
	if(isInFav == true){
		buff.append('<img title ="Remove from My Favourites" class="starIcon" id ="star_'+rowContext+'_'+data+'" width="16" height="16" src='+starIcon+'>');
		buff.append('<img title ="Add to My Favourites" style ="display:none;" class="nostarIcon" id ="nostar_'+rowContext+'_'+data+'" width="16" height="16" src='+starIconWhite+'>');
	}else{
		buff.append('<img title ="Remove from My Favourites" class="starIcon" id ="star_'+rowContext+'_'+data+'"  style ="display:none;" width="16" height="16" src='+starIcon+'>');
		buff.append('<img  title ="Add to My Favourites" class="nostarIcon" id ="nostar_'+rowContext+'_'+data+'" width="16" height="16" src='+starIconWhite+'>');
	}
	return buff.toString();
} 
/*
function getDataForAdd(userFavs){
	var obj = {};
	obj.hi = "there";
	return obj;
}
*/

function loadStockData (dataObject, logger){
	var buff = new StringBuffer();
	var data = formatJson(dataObject);

	var recoId = data.recoId;
	var lstId = data.lstId;
	if(!recoId){
		recoId = "";
	}
	var dataConfig = {};
	dataConfig.recoId=recoId;
	dataConfig.lstId=lstId;
	dataConfig.loggedin=data.loggedin;

	return createStockSection(dataConfig, data,logger);	
}

function loadChart (dataConfig, regionElem){
	var recoId = dataConfig.recoId;
	if(!recoId){
		recoId = "";
	}
	var lstId = dataConfig.lstId;
	var cnt = dataConfig.cnt;
	cnt = getCntry();
	//getDataAsJson
		//calling via jquery:
	
	siteAjax.getViaAjax({
			  spinner : '#mySpinnerId',
			  url : '/ajax-TI/recoIndv.htm?cn='+cnt+'&recoId='+recoId+'&lstId='+lstId+'&fromDate=2009-12-01&toDate=2011-10-01',
			  dataType: 'json',
			  success : function(recoData){
				  renderChart (dataConfig,formatJson(recoData.stkPageMap),regionElem);					
			  }
		});					
};

/**
 * loads chart on client side.
 */
function renderChart (dataConfig, recoData,regionElem){
	var recoId = dataConfig.recoId;
	if(!recoId){
		recoId = "";
	}
	var date = new Date();
	var d  = date.getDate();
	var day = (d < 10) ? '0' + d : d;
	var m = date.getMonth() + 1;
	var month = (m < 10) ? '0' + m : m;
	var yy = date.getYear();
	var year = (yy < 1000) ? yy + 1900 : yy;
	var lstId = dataConfig.lstId;
	var cnt = dataConfig.cnt;
	cnt = getCntry();
	//getDataAsJson
		//calling via jquery:
	
	siteAjax.getViaAjax({
			  spinner : '#mySpinnerId',
			  url : '/ajax-TI/chart.htm?cn='+cnt+'&recoId='+recoId+'&lstId='+lstId+'&fromDate='+(year-2)+'-'+month+'-'+day+'&toDate='+year+'-'+month+'-'+day,
			  dataType: 'json',
			  success : function(res){		
				  chartData = res.recosForLst;
				  	//check if recos are there for this stock!
				    var priceSeries = [];
					var volDataSeries = [];
					for (i=0; i<chartData.priceHistory.length ; i++) {
						var tempPrcArr = [];
						var tempVolArr = [];
						
						tempPrcArr.push(chartData.priceHistory[i].tradeDate.time);	
						tempPrcArr.push(chartData.priceHistory[i]['cl']);
						priceSeries.push(tempPrcArr);
						
						tempVolArr.push(chartData.priceHistory[i].tradeDate.time);
						var volInth = chartData.priceHistory[i]['volume'];
						tempVolArr.push(volInth);
						volDataSeries.push(tempVolArr);
						}

						var priceSeriesConfig = {};
						priceSeriesConfig.series = [];
						priceSeriesConfig.series['0'] = {"data":priceSeries, "opts": null};
						priceSeriesConfig['globalOpts'] = null;
						var i = 0;
						var eventData = [];
						for (var name in recoData.recosBase) {
							if (recoData.recosBase.hasOwnProperty(name)) {
							var tempObj = recoData.recosBase[name];

							var events = [];
							events.push(tempObj.recoDt.time);
							events.push(""+(tempObj.recoDtPx));
							events.push(tempObj.tgtDt.time);
							events.push(""+(tempObj.tgtPx));
							events.push(tempObj.id);
							events.push(tempObj.actn);
							i++;
							}
							eventData.push(events)
						}

						var eventSeriesConfig = {};
						eventSeriesConfig.series = [];
						eventSeriesConfig.series['0'] = {'data':eventData};

						var volSeriesConfig = {};
						volSeriesConfig.series = [];
						volSeriesConfig.series['0'] = {'data':volDataSeries};

						//main object for chart rendering
						var chartConfig = {'priceSeriesConfig':priceSeriesConfig, 'eventSeriesConfig':eventSeriesConfig, 'volSeriesConfig': volSeriesConfig};
						var config = {
								"chartConfig" : chartConfig,
								"volRegion" : 'volContainer_'+lstId,
								"chartRegion" : 'prcContainer_'+lstId,
								"flagRegion"  : 'flagContainer_'+lstId,
								"tableRegion" : 'chartTable_'+lstId,
								"tooltipRegion" : 'dhtmltooltip_'+lstId,
								"uid" : lstId,
								"chartData" : recoData,
								"lstId":lstId
						};
						
						regionElem.eq(0).ready(function(){
							$(function() {						
								try{	
										regionElem.html(createChartSection(dataConfig, recoData));
										var mowChart = new MowChart(config);
										mowChart.execute();
										initUiLinks();
								}catch(e){
									alert(e);
								}	
							});
			  			});

			    }
		});					
};

function createmyAccounts(dataObj){
	var data = formatJson(dataObj);

	var buff = new StringBuffer();
	
	return buff.toString();
}
/************************************************** Filters ************************************/



function getfilterForm(config){

	switch(config["filterClass"]){
	case 'TextFilter':
		return createTextFilter(config);
		break;
	case 'SelectFilter':
		return createSelectFilter(config);
		break;
	case 'RangeFilter':
		return createRangeFilter(config);
		break;
	}
}

/**
 * handler for diffrent type of filters.
 * @param config
 * @returns
 */

var createTextFilter  = function (config){
		return '<input style="width: 90%;" class ="TextFilter" id ="'+config.attribName+'_input"  value="'+config.defalutText+'" />';
};

function createOptions(opts, selected){
	var buff = new StringBuffer();
	for (var name in opts) {
		if (opts.hasOwnProperty(name)) {
			if(selected == name)
				buff.append('<option value="'+name+'" selected>'+opts[name]+'</option>')
			else
				buff.append('<option value="'+name+'">'+opts[name]+'</option>')
		}
	}
	return buff.toString();
}

function createSortOptions(optList, selected){
	var buff = new StringBuffer();
	
	for ( var i = 0; i < optList.length; i++) {
		var sorttext = sortSpec["options"][optList[i]];
		if(selected == optList[i])
			buff.append('<option value="'+optList[i]+'" selected>'+sorttext+'</option>')
		else
			buff.append('<option value="'+optList[i]+'" >'+sorttext+'</option>')
	}

	return buff.toString();
}


var createSelectFilter  = function (config){
		var buff = new StringBuffer();
		buff.append('<select style="width: 90%;" id="'+config.attribName+'_select" class="filterinput SelectFilter">'+createOptions(config.options)+'</select>');
		return buff.toString();
};

var createRangeFilter  = function (config){
	var buff = new StringBuffer();
	buff.append('<div class ="RangeFilter" id="'+config.attribName+'_rangeWrap">');
	buff.append('<select class ="SelectRange filterinput" id ="'+config.attribName+'_rangeSelect" style="width: 90%;">');
	buff.append(createOptions(config.options))
	buff.append('</select>');
	buff.append('<div class ="customRange filterinput" style="padding-top: 5px;width: 470px">');
	buff.append('<strong>From&nbsp;</strong>');
	buff.append('<input class ="rangeInputs from" id="'+config.attribName+'_from" />');
	buff.append('<strong>&nbsp;To&nbsp;</strong>');
	buff.append('<input class ="rangeInputs to" id="'+config.attribName+'_to" />');
	buff.append('<span class ="rangeInputs labelerror" id="'+config.attribName+'_toError" />');
	buff.append('</div>');
	buff.append('</div>');
	
	return buff.toString();

};

function getLandingFilters(dataObj){
	var buff = new StringBuffer();
	
	var data = formatJson(dataObj);
	
	var reqParams = data.reqParams;
	var filters = data.filterAttribs;	
	
	var appliedFilters = new StringBuffer();
	var resultStr = new StringBuffer();
	var rangeParams = getRangeParams(reqParams);
	var count = 0;
	for (var name in reqParams) {
		if (reqParams.hasOwnProperty(name) && searchSpecs[name] && reqParams[name]) {
			
			if(count > 0)
				resultStr.append('|&nbsp;');
			appliedFilters.append(createFilterRow(name, reqParams[name].join(';')));
			resultStr.append('<strong class="gray">'+searchSpecs[name]["label"] + (searchSpecs[name]["units"] ? ('&nbsp;in&nbsp;'+searchSpecs[name]["units"]) : '')+'</strong>');
			resultStr.append(':');
			resultStr.append(reqParams[name].join(';'));
			count ++;
		}
	}
	
	//count = 0;
	for (var name in rangeParams) {
		if (rangeParams.hasOwnProperty(name) && searchSpecs[name]) {
			
			if(count > 0)
				resultStr.append('|&nbsp;');
			appliedFilters.append(createFilterRow(name, rangeParams[name]));
			resultStr.append('<strong class="gray">'+searchSpecs[name]["label"]+ ' ' +searchSpecs[name]["units"]+'</strong>');
			resultStr.append(':');
			resultStr.append(rangeParams[name]["from"]);
			resultStr.append('-');
			resultStr.append(rangeParams[name]["to"]);
			count ++;
		}
	}

	buff.append('<div class ="searchWraper" >');
	buff.append('<table cellspacing="0" cellpadding="0" border="0"  class="borderall filterHeader" ><tbody>');				
	buff.append('<tr>');				
	buff.append('<td style ="width: 48%;" align="left" valign="middle" class="normalcontentpadding" scope="row"><div style ="color:#5B6062; font-size:18px;font-weight:bold;" >'+data.totalRows+'&nbsp;Results<span class="comp_capition" style ="font-size: 10px;font-weight: normal;" >&nbsp;'+getActualCountStr(data)+'</span></div></td>');				
	buff.append('<td align="right" valign="middle" height="45px" class="normalcontentpadding"  scope="row">');				
	buff.append('<div class ="left gray" style ="margin-top: 10px;" >Sorted by&nbsp;</div><select id ="sortBy" style="width: 275px;" class="left" name="criteria">'+createSortOptions(data.sortAttribs, reqParams["sort"])+'</select>');				
	
	//buff.append('<div style ="margin-top: 4px;" class ="right" >');
	if(reqParams["sortDir"] == 'asc'){
		buff.append('<a id ="sortDesc" class ="sortDir  curspointer right" title= "sort results in descending order"></a>');				
	}
	else{
		buff.append('<a id ="sortAsc" class ="sortDir  curspointer right" title= "sort results in ascending order" ></a>');				
	}
	//buff.append('</div>');		
			
	buff.append('</td>');				
	buff.append('</tr>');				
	if(resultStr.toString().length > 0 ){
		buff.append('<tr>');				
		buff.append('<td class="normalcontentpadding" scope="row" colspan="2">');				
		buff.append(resultStr.toString());				
		buff.append('</td>');				
		buff.append('</tr>');		
	}
				
	buff.append('</tbody></table>');
	buff.append('<table cellspacing="0" cellpadding="0" border="0" class="borderall" style="width: 740px;">');
	buff.append('<tbody>');
	buff.append('<tr>');
		buff.append('<td width="350px" valign="middle" height="32px" colspan="2" class="filter_top curspointer">Filter Your Results&nbsp;<span style="font-size:10px;">click here to enter criteria</span>');
		buff.append('&nbsp;<span class="newicon">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>');
		buff.append('<div style="float: right; padding-right: 15px;" id="filterHide" class="filtersHide curspointer" title=""></div>');
		buff.append('</td>');
	buff.append('</tr>');
	buff.append('<tr id ="filterRegion" style="display:none">');
		buff.append('<td width="120px" class="borderr2"> <div class="anWeCoverSecList left">');
				buff.append('<span class="comp_namefull marginb15">Select a criterion</span>');
				buff.append('<ul class="analystWeCoverLand">');
				for(i = 0; i < filters.length; i++){
					buff.append('<li><a id="'+searchSpecs[filters[i]]["attribName"]+'_radios" name="filterRadio" class="filterRadiosDiv curspointer" >'+searchSpecs[filters[i]]["label"]+'</a></li>');
				}
				buff.append('</ul></div>');
		buff.append('</td>');
		buff.append('<td class="normalcontentpadding">');
			buff.append('<table cellspacing="0" cellpadding="0" border="0" align="left" class="filter_inner_table borderb"><tbody>');
				buff.append('<tr><td colspan="2"><h3 id ="filterHeader"></h3></td></tr>');
				
				for(i = 0; i < filters.length; i++){
					buff.append('<tr class ="datatr" id ="datatr_'+searchSpecs[filters[i]]["attribName"]+'" >');
					buff.append('<td>');
					buff.append(getfilterForm(searchSpecs[filters[i]]));
					buff.append('</td>');
					buff.append('<td class="rightFilterTd"> <input type="button" id ='+searchSpecs[filters[i]]["attribName"]+'_addButton" value="Add Criterion" class="addCriteria actionBtn"></td>');
					buff.append('</tr>');
				}
				buff.append('<tr><td></td><td></td></tr>');
				buff.append('</tbody></table>');
				
				buff.append('<table cellspacing="0" cellpadding="10" border="1" align="left" class="filter_inner_table filterDetails"><tbody>');
				buff.append('<tr>');
					buff.append('<td colspan="2"><h5>Added Criteria</h5></td>');
					buff.append('<td class="rightFilterTd"><input type="button" value="Clear All" class="actionBtn filterClear" title ="Clear all selected criterias" ></td>');
				buff.append('</tr>');

			buff.append(appliedFilters.toString());	
			buff.append('<tr ><td colspan="3"><div class="searchButton" id="searchGo" ><b>Click here to View Results</b></div></td></tr>');
			buff.append('</tbody></table>');			
	buff.append(' </td></tr></tbody></table>');				
	buff.append('</div>');				
	return buff.toString();
}


function getActualCountStr(data){
	var totalRows = data.totalRows;
	var actualRows = data.actualRows;
	var offSet = data.offSet;
	var pageNum = data.pageNum;
	
	var buff = new StringBuffer();
	
	if(totalRows == 0)
		return '';
	
	buff.append("&nbsp;Displaying ");
	
	if(pageNum == 1){
		buff.append((totalRows > 0 ? '1' : '0')+' - ');
		
		if(actualRows == offSet)
			buff.append(offSet*(pageNum))
		else
		buff.append(totalRows)
	}
	else{
		
		buff.append((offSet*(pageNum-1)+1)  + ' - ')
		
		if(actualRows == offSet)
			buff.append(offSet*(pageNum))
		else
			buff.append(totalRows)
	}

	//buff.append(" Results ")
	
	// from

	return buff.toString();
	
}

function getRangeParams(reqParams){
	var seenRFilters = {};
	for (var name in reqParams) {
		if(name.endsWith('To')){
			var p = name.substring(0, name.indexOf('To'));
			if(!seenRFilters[p])
				seenRFilters[p] = {};
			
			seenRFilters[p]['to'] =  reqParams[name].join(',');
			
		}else if(name.endsWith('From')){
			var p = name.substring(0, name.indexOf('From'));
			if(!seenRFilters[p])
				seenRFilters[p] = {};
			seenRFilters[p]['from'] =  reqParams[name].join(',');
		}
	}

	return seenRFilters;
}

function createActionItems(attrib){
	var buff = new StringBuffer();
	//buff.append('<div class ="curspointer" ><span class ="actionAdd" id ='+attrib+'_addIcon >add</span>&nbsp;&nbsp&nbsp<span class ="actionMinus" id ='+attrib+'_minusIcon>remove</span></div>');
	buff.append('<div style="float: left; padding-left: 17px;"><a class="plusLink curspointer" id ="'+attrib+'_addIcon" title ="Add to '+searchSpecs[attrib]["label"]+' criteria" >Add</a></div>');				
	buff.append('<div style="float: left;"><a id ='+attrib+'_minusIcon class="minusLink curspointer" title ="Clear '+searchSpecs[attrib]["label"]+' criterion">Remove</a></div>');				
	
	
	return buff.toString();
}

function createFilterRow(atribute, val){
	var buff = new StringBuffer();
	switch (searchSpecs[atribute]["filterClass"]) {
	case 'TextFilter': case 'SelectFilter': case 'RangeFilter':
		buff.append('<tr id ="'+ atribute+'" class ="'+searchSpecs[atribute]["filterClass"]+'_data filters">');	
		buff.append('<td valign="top" class="boldtext">'+searchSpecs[atribute]["label"]+ (searchSpecs[atribute]["units"] ? ('&nbsp;in&nbsp;'+searchSpecs[atribute]["units"]) : '')+'</td>');				
		buff.append('<td valign="top" class ="datatd"><div class ="filterTextDiv">'+val+'</div><textarea class ="filterTextArea">'+val+'</textarea>');				
		buff.append('<td valign="top" class="rightFilterTd"><div align="center">');
		buff.append(createActionItems(atribute));
		buff.append('</div></td>');
		buff.append('</tr>');		
		break;
/*	case 'RangeFilter':
		buff.append('<tr id ="'+ atribute +'"  class ="'+searchSpecs[atribute]["filterClass"]+'_data filters" >');
		buff.append('<td class ="td2 boldtext">'+searchSpecs[atribute]["label"]+' in ' +searchSpecs[atribute]["units"] +'</td>');
		buff.append('<td class ="datatd"><div class ="filterTextDiv">'+getRangeHtml(atribute, val)+'</div><textarea class ="filterTextArea">'+val+'</textarea>');
		buff.append('<td class ="actionItems" >'+createActionItems(atribute)+'</td>');
		buff.append('</tr>');
		break;
*/	default:
		break;
	}
	
	return buff.toString();
}

function getRangeHtml(attr, val){
/*	var buff = new StringBuffer();
	buff.append(searchSpecs[attr]["label"]);
	if(val.from.length > 0)
	buff.append(' from '+val.from);
			
	if(val.to.length > 0)
		buff.append(' to '+val.to);
	
	return buff.toString();
*/	
	return val;
}

var searchSpecs = {
		"stkName" 			:	{
					'attribName' 		: 'stkName',
					'label' 			: 'Stock',
					'defalutText'		: 'Enter Stock or Company Name',
					'filterClass'		: 'TextFilter',
					'urlParam'			: 'stkName',
					'searchUrl'			: '/ajax-Search/h.htm?searchType=stock',
					'autoCompleteFormat'			: 'withOutDesc'
		},
		"alysName" 			:	{
			'attribName' 		: 'alysName',
			'label' 			: 'Analyst',
			'defalutText'		: 'Enter Analyst or Broker/Research Firm',
			'filterClass'		: 'TextFilter',	
			'urlParam'			: 'alysName',
			'searchUrl'			: '/ajax-Search/h.htm?searchType=analyst',
			'autoCompleteFormat'			: 'withDesc'
		},
		"sectName" 			:	{
			'attribName' 		: 'sectName',
			'label' 			: 'Sector',
			'defalutText'		: 'Enter Sector',
			'filterClass'		: 'TextFilter',	
			'urlParam'			: 'sectName',
			'searchUrl'			: '/ajax-Search/h.htm?searchType=sector'
		},
		"indusName" 			:	{
			'attribName' 		: 'indusName',
			'label' 			: 'Industry',
			'defalutText'		: 'Enter Industry',
			'filterClass'		: 'TextFilter',	
			'urlParam'			: 'indusName',
			'searchUrl'			: '/ajax-Search/h.htm?searchType=industry'
		},
		"firmName" 			:	{
			'attribName' 		: 'firmName',
			'label' 			: 'Broker/Research Firm',
			'defalutText'		: 'Enter Broker/Research Firm',
			'filterClass'		: 'TextFilter',	
			'urlParam'			: 'firmName',
			'searchUrl'			: '/ajax-Search/h.htm?searchType=firm'
		},
		"recoAction" 			:	{
			'attribName' 		: 'recoAction',
			'label' 			: 'Reco Type',
			'filterClass'		: 'SelectFilter',	
			'urlParam'			: 'recoAction',
			'options'			: {
				''		: 'Select Reco Type',
									'Buy'  : 'Buy',
									'Sell' : 'Sell',
									'Hold' : 'Hold'
								}
		},
		"recoState" 			:	{
			'attribName' 		: 'recoState',
			'label' 			: 'Reco State',
			'defalutText'		: 'Select Reco State',
			'filterClass'		: 'SelectFilter',
			'urlParam'			: 'recoState',
			'options'			: {
									'OPEN' : 'Open',
									'CLOSED' : 'Closed'
								}
		},
		"stkSize" 			:	{
			'attribName' 		: 'stkSize',
			'label' 			: 'Market Capitalization',
			'filterClass'		: 'SelectFilter',
			'urlParam'			: 'stkSize',
			'options'			: {
				''		: 'Select Market Capitalization',
				'Mega' : 'Mega Cap',
				'Large' : 'Large Cap',
				'Mid' : 'Mid Cap',
				'Small' : 'Small Cap',
				'Micro' : 'Micro Cap'
			}
		},
		'stkCMP'			:{
			'attribName' 		: 'stkCMP',
			'label' 			: 'Stock Price Range',
			'toLabel'			: 'Stock Price Range to',
			'fromLabel'			: 'Stock Price Range from',
			'defalutMinRange'	: 1,
			'defalutMaxRange'	: 10000,
			'filterClass'		: 'RangeFilter',
			'units'				: 'Rs',
			'urlParam'			: 'stkCMP',
			'isNumeric'			: true,
			'options'			: {
				''		: 'Select Stock Price Range',
				'0-100' : 'Rs 0 - 100',
				'100-500' : 'Rs 100 - 500',
				'500-1000' : 'Rs 500 - 1000',
				'1000-' : 'Rs 1000 and above',
				'custom' : 'Custom Range'
			}
			
		},
		'roi'			:{
			'attribName' 		: 'roi',
			'label' 			: 'Expected ROI',
			'filterClass'		: 'RangeFilter',
			'units'				: '%',	
			'defalutMinRange'	: 1,
			'defalutMaxRange'	: 100,
			'urlParam'			: 'roi',
			'options'			: {
				''		: 'Select Expected ROI Range',
				'0-10' : '0% - 10%',
				'10-25' : '10% - 25%',
				'25-' : '25% and above',
				'custom' : 'Custom Range'
			},
			'isNumeric'			: true
		},
		'recoHorizon'			:{
			'attribName' 		: 'recoHorizon',
			'label' 			: 'Investment Period',
			'defalutMinRange'	: 1,
			'defalutMaxRange'	: 524,
			'filterClass'		: 'RangeFilter',
			'units'				: 'months',	
			'urlParam'			: 'recoHorizon',
			'isNumeric'			: true,
			'options'			: {
				''		: 'Select Investment Period',
				'0-3' : '0-3 months',
				'3-6' : '3-6 months',
				'6-12' : '6-12 months',
				'12-' : '12 months and above',
				'custom' : 'Custom Range'
			}
		},
		'alysOARank'			:{
			'attribName' 		: 'alysOARank',
			'label' 			: 'Analyst Overall Rank',
			'defalutMinRange'	: 1,
			'defalutMaxRange'	: 524,
			'filterClass'		: 'RangeFilter',
			'units'				: '',	
			'urlParam'			: 'alysOARank',
			'isNumeric'			: true
		}
		
}

var sortSpec  = {
	'attribName' 						: 'sort',
	'options' : {
		'recoAge' 						: 'Reco Age',
		'recoTD' 						: 'Reco Investment Period',
		'recoROI' 						: 'Reco Expected ROI',
		'recoAccu' 						: 'Reco Price Accuracy',
		'recoROIAct' 					: 'Reco Actual ROI',
		'recoROIGap'					: 'Reco ROI Gap (Expected-Actual)',
		'stkName' 						: 'Stock Name',
		'stkBuyCnt' 					: 'Number of BUYs',
		'stkSellCnt' 					: 'Number of SELLs',
		'stkRatioBuySell' 				: 'BUYs as % of Total Recos',
		'stkTotalRecoCnt' 				: 'Number of Recos',
		'alysName' 						: 'Analyst Name',
		'alysOARank' 					: 'Analyst Overall Rank',
		'alysROI' 						: 'Analyst ROI Score',
		'alysAccu' 						: 'Analyst Price Accuracy Score',
		'alysSr' 						: 'Analyst Sharpe Ratio Score'
	},
	'defaultSortDir' : {
	'recoAge' 						: 'asc',
	'recoTD' 						: 'asc',
	'recoROI' 						: 'desc',
	'recoAccu' 						: 'desc',
	'recoROIAct' 					: 'desc',
	'recoROIGap'					: 'asc',
	'stkName' 						: 'asc',
	'stkBuyCnt' 					: 'desc',
	'stkSellCnt' 					: 'desc',
	'stkRatioBuySell' 				: 'desc',
	'stkTotalRecoCnt' 				: 'desc',
	'alysName' 						: 'asc',
	'alysOARank' 					: 'asc',
	'alysROI' 						: 'desc',
	'alysAccu' 						: 'desc',
	'alysSr' 						: 'desc'
	}

}

function createBlankDataTable(){
	return '<div class ="noMoreData">End of List.</div>';
}

function calculateHorizon( rc_dt,tg_dt ) {
    var m = (calcDateDiff( new Date(rc_dt.time), new Date(tg_dt.time) ) / 30);
    return printRecoDaycount(m);
}

function calculateHorizonTillNow( rc_dt ) {
    var m = (calcDateDiff( new Date(rc_dt.time), new Date() ) / 30);
    return printRecoDaycount(m) + " ago";
}

function calculateHorizonFromNow( tg_dt ) {
    var m = (calcDateDiff( new Date(), new Date(tg_dt.time) )/ 30);
    return printRecoDaycount(m);
}

function calcDateDiff( date_from, date_to ) {
	// fractional day is counted as one
	var MILLISEC_IN_A_DAY = 3600*24*1000;
	var days = Math.round((date_to.getTime()-date_from.getTime())/MILLISEC_IN_A_DAY);
	return days;// returns number of days
}


function printRecoDaycount( m ) {
	if ( m < 1 ) { 
		return Math.round(m*30) + " days"; }
	else{
	        return Math.ceil(m) +  " m"; 
	}
}
	
function calculateRecoAgeClassCode( rc_dt ) {
	 var d = calcDateDiff( new Date(rc_dt.time), new Date());
	 if ( d >= 0 && d < 4 ) 
	 {
	     return {classname:'recoage recoage_new borderb',tip:Messages.RECO_AGE_NEW};
	  }
	  else if ( d >= 4 && d < 8) 
	  {
	     return {classname:'recoage recoage_recent borderb',tip:Messages.RECO_AGE_RECENT};
	  }
	  else
	  {
	      return {classname:'recoage borderb',tip:''};
	  }	        
}
