var PERIOD_HISTORICAL=1;
var PERIOD_INTRADAY=2;
var PERIOD_INTRADAY_10D=3;

var PERIODICITY_INTRA_TICK =0;
var PERIODICITY_INTRA_1MIN =1;
var PERIODICITY_INTRA_5MIN =2;
var PERIODICITY_INTRA_15MIN =3;
var PERIODICITY_INTRA_30MIN =4;
var PERIODICITY_INTRA_1HRS =5;

var SEGMENT_CM = "CM";
var SEGMENT_CD = "CD";
var SEGMENT_FO = "FO";
var SEGMENT_INDEX = "OI";
var SEGMENT_IRF = "IRF";

var DT_LINE=1;
var DT_BAR=2;
var DT_OHLC=3;
var DT_CANDLE=4;

var GT_PRICE = 1;
var GT_VOLUME = 2;
var GT_SMA = 3;
var GT_EMA = 4;
var GT_BBANDS = 5;
var GT_MFI = 6;
var GT_MACD = 7;
var GT_RSI = 8;
var GT_ROC = 9;
var GT_WILLIAM = 10;
var GT_STOCHASTIC = 11;
var GT_OI = 12;
var GT_PSAR = 13;
var GT_RBI = 14;
var GT_COMPARE = 15;
var GT_ABSCOMPARE = 16;
var GT_TRENDLINE = 17;
var GT_AD = 18;
var GT_ADX = 19;
var GT_ATR = 20;
var GT_CHMF = 21;
var GT_CHV = 22;
var GT_CCI = 23;
var GT_DPO = 24;
var GT_EMV = 25;
var GT_OBV = 26;
var GT_POS = 27;
var GT_STDEV = 28;
var GT_VWMA = 29;

var GT_DISPLAYORDER=[GT_PRICE,GT_VOLUME,GT_OI,GT_SMA,GT_EMA,GT_BBANDS,GT_MFI,GT_RSI,GT_ROC,GT_MACD,GT_WILLIAM,GT_STOCHASTIC,GT_PSAR,GT_AD,GT_ADX,GT_ATR,GT_CHMF,GT_CHV,GT_CCI,GT_DPO,GT_EMV,GT_OBV,GT_POS,GT_STDEV,GT_VWMA];

var GR_ID_PRICE="g1";
var GR_ID_VOLUME="g2";
var GROUP_PRICE=1;
var GROUP_VOLUME=2;
var GROUP_PERCENTAGE=3;
var GROUP_MACD=4;
var GROUP_PERCENTAGE_NEGATIVE=5;
var GROUP_OI=6;
var GROUP_COMPARE=7;
var GROUP_AD=8;
var GROUP_ADX=9;
var GROUP_CHMF=10;
var GROUP_CCI=11;
var GROUP_PRICERANGE=12;
var GROUP_EMV=13;
var GROUP_OBV=14;

var AN_PIVOT=1;
var AN_FIB_RET=2;
var AN_MARKER=3;
var AN_TRENDLINE=4;
var AN_FIB_EXT=5;

var DISPLAY_TYPES=["","line","column","ohlc","candlestick"];
var ANNOTATIONS=["","Pivot Points","Fibonacci Retracements","Marker","Trendline","Fibonacci Extensions"];
var ANNOTATIONS_HELP=["","pivot.html","fibonacciretracements.html","","trendline.html","fibonacciextensions.html"];
var ANNOTATIONS_DESC=["","Click on the chart to select the pivot point date.",
"Click on the chart twice to identify the trend start and end dates.",
"Click on the chart to select the marker date.",
"Click on the chart twice to identify the trend start point and end point.",
"Click on the chart thrice to identify the trend start, trend end and retraced dates."];

var GRAPH_TYPES=[null,new GraphMetaData(GT_PRICE,"Price","Price Graph",[1,3,4],[[["Color","0000ff"]],[["Up Color","0000ff"],["Down Color","ff0000"]],[["Up Color","0000ff"],["Down Color","ff0000"]]],[],false,GROUP_PRICE,"price.html",false),
new GraphMetaData(GT_VOLUME,"Vol","Volume Graph",[2],[[["Color","0000ff"]]],[],false,GROUP_VOLUME,"volume.html",false),
new GraphMetaData(GT_SMA,"SMA","Simple Moving Average",[1],[[["Color","288003"]]],[["Period",2,true,null,1,null,"5"]],true,GROUP_PRICE,"sma.html",true),
new GraphMetaData(GT_EMA,"EMA","Exponential Moving Average",[1],[[["Color","804545"]]],[["Period",2,true,null,1,null,"5"]],true,GROUP_PRICE,"ema.html",true),
new GraphMetaData(GT_BBANDS,"BBands","Bollinger Bands",[1],[[["Upper","804545"],["Lower","804545"]]],[["Period",2,true,null,1,null,"5"],["Deviation",2,true,null,1,null,"2"]],true,GROUP_PRICE,"bbands.html",true),
new GraphMetaData(GT_MFI,"MFI","Money Flow Index",[1],[[["Color","288003"]]],[["Period",2,true,null,1,null,"14"]],true,GROUP_PERCENTAGE,"mfi.html",true),
new GraphMetaData(GT_MACD,"MACD","Moving Average Convergence Divergence",[1],[[["MACD Color","288003"],["Signal Color","288003"],["Divergence Color","288003"]]],[["Slow Period",2,true,null,1,null,"26"],["Fast Period",2,true,null,1,null,"12"],["Signal Period",2,true,null,1,null,"9"]],true,GROUP_MACD,"macd.html",true),
new GraphMetaData(GT_RSI,"RSI","Relative Strength Index",[1],[[["Color","288003"]]],[["Period",2,true,null,1,null,"14"]],true,GROUP_PERCENTAGE,"rsi.html",true),
new GraphMetaData(GT_ROC,"ROC","Rate of Change",[1],[[["Color","288003"]]],[["Period",2,true,null,1,null,"12"]],true,GROUP_PERCENTAGE,"roc.html",true),
new GraphMetaData(GT_WILLIAM,"William%R","William%R",[1],[[["Color","288003"]]],[["Period",2,true,null,1,null,"14"]],true,GROUP_PERCENTAGE_NEGATIVE,"william.html",true),
new GraphMetaData(GT_STOCHASTIC,"FullStochastic","Full Stochastic Oscillator",[1],[[["%K Color","288003"],["%D Color","288003"]]],[["%K(Fast) Period",2,true,null,1,null,"14"],["%K(Full) Period",2,true,null,1,null,"3"],["%D(Full) Period",2,true,null,1,null,"3"]],true,GROUP_PERCENTAGE,"stochastic.html",true),
new GraphMetaData(GT_OI,"OI","Open Interest",[2],[[["Color","0000ff"]]],[],true,GROUP_OI,"oi.html",false),
new GraphMetaData(GT_PSAR,"PSAR","Parabolic Stop and Reversal",[1],[[["Color","288003"]]],[["Initial Acc. Factor",3,true,null,1,null,"0.02"],["Incremental Acc. Factor",3,true,null,1,null,"0.02"],["Maximum Acc. Factor",3,true,null,1,null,"0.20"]],true,GROUP_PRICE,"psar.html",true),
new GraphMetaData(GT_RBI,"RBI","RBI Reference Rates",[1],[[["Color","288003"]]],[],true,GROUP_PRICE,"rbi.html",false),
new GraphMetaData(GT_COMPARE,"COMPARE","compare",[1],[[["Color","288003"]]],[],true,GROUP_COMPARE,"compare.html",false),
new GraphMetaData(GT_ABSCOMPARE,"ABSCOMPARE","abscompare",[1],[[["Color","288003"]]],[],true,GT_ABSCOMPARE,"abscompare.html",false),
new GraphMetaData(GT_TRENDLINE,"TRENDLINE","trendline",[1],[[["Color","288003"]]],[],true,GT_TRENDLINE,"trendline.html",true),
new GraphMetaData(GT_AD,"AD","Accumulation Distribution",[1],[[["Color","288003"]]],[],true,GROUP_AD,"ad.html",true),
new GraphMetaData(GT_ADX,"ADX","Average Directional Index",[1],[[["Color","288003"]]],[["Period",2,true,null,1,null,"14"]],true,GROUP_ADX,"adx.html",true),
new GraphMetaData(GT_ATR,"ATR","Average True Range",[1],[[["Color","288003"]]],[["Period",2,true,null,1,null,"14"]],true,GROUP_PRICERANGE,"atr.html",true),
new GraphMetaData(GT_CHMF,"ChMF","Chaikin Money Flow",[1],[[["Color","288003"]]],[["Period",2,true,null,1,null,"10"]],true,GROUP_CHMF,"chmf.html",true),
new GraphMetaData(GT_CHV,"ChV","Chaikin Volatility",[1],[[["Color","288003"]]],[["Period",2,true,null,1,null,"10"]],true,GROUP_PERCENTAGE,"chv.html",true),
new GraphMetaData(GT_CCI,"CCI","Commodity Channel Index",[1],[[["Color","288003"]]],[["Period",2,true,null,1,null,"14"]],true,GROUP_CCI,"cci.html",true),
new GraphMetaData(GT_DPO,"DPO","Detrended Price Oscillator",[1],[[["Color","288003"]]],[["Period",2,true,null,1,null,"20"]],true,GROUP_PRICERANGE,"dpo.html",true),
new GraphMetaData(GT_EMV,"EMV","Ease of Movement",[1],[[["Color","288003"]]],[["Period",2,true,null,1,null,"14"]],true,GROUP_EMV,"emv.html",true),
new GraphMetaData(GT_OBV,"OBV","On Balance Volume",[1],[[["Color","288003"]]],[],true,GROUP_OBV,"obv.html",true),
new GraphMetaData(GT_POS,"POS","Price Oscillator",[1],[[["Color","288003"]]],[["Fast Period",2,true,null,1,null,"10"],["Slow Period",2,true,null,1,null,"30"]],true,GROUP_PERCENTAGE,"pos.html",true),
new GraphMetaData(GT_STDEV,"STDev","Std Deviation",[1],[[["Color","288003"]]],[["Period",2,true,null,1,null,"5"]],true,GROUP_PRICERANGE,"stdev.html",true),
new GraphMetaData(GT_VWMA,"VWMA","Volume Weighted Moving Average",[1],[[["Color","288003"]]],[["Period",2,true,null,1,null,"10"]],true,GROUP_PRICE,"vwma.html",true)
];

var PT_DOJI=1;
var PT_GRAVEDOJI=2;
var PT_DRAGONDOJI=3;
var PT_HAMMER=4;
var PT_HANGINGMAN=5;
var PT_DARKCLOUDCOVER=6;
var PT_PIERCINGLINE=7;
var PT_BULLISHENGULFING=8;
var PT_BEARISHENGULFING=9;
var PT_INVERTEDHAMMER=10;
var PT_MORNINGDOJISTAR=11;
var PT_EVENINGDOJISTAR=12;
var PT_MORNINGSTAR=13;
var PT_EVENINGSTAR=14;
var PT_BEARISHHARAMICROSS=15;
var PT_BEARISHHARAMI=16;
var PT_SHOOTINGSTAR=17;
var PT_BEARISHKICKING=18;
var PT_BULLISHKICKING=19;

var PT_DISPLAYORDER=[PT_DOJI,PT_GRAVEDOJI,PT_DRAGONDOJI,PT_HAMMER,PT_HANGINGMAN,PT_DARKCLOUDCOVER,PT_PIERCINGLINE,PT_BULLISHENGULFING,PT_BEARISHENGULFING,PT_INVERTEDHAMMER,PT_MORNINGDOJISTAR,PT_EVENINGDOJISTAR,PT_MORNINGSTAR,PT_EVENINGSTAR,PT_BEARISHHARAMICROSS,PT_BEARISHHARAMI,PT_SHOOTINGSTAR,PT_BEARISHKICKING,PT_BULLISHKICKING];


var PARAM_CLOSERANGE=0;
var PARAM_LONGRANGE=1;
var PARAM_LONG_BODY=2;
var PARAM_GAP=3;
var PARAM_SHORTBODY=4;
var PARAM_LONGCANDLESTICKRANGE=5;
var PARAM_PRIORDOWNTREND=6;
var PARAM_PRIORUPTREND=7;
var PARAM_DETAILS=[
["Tolerance","Difference in prices which are considered almost equal",[["",3,true,null,1,null,"0.05"]]],
["Long Range","Difference in prices which is considered sufficiently long",[["",3,true,null,1,null,"0.66"]]],
["Real Body With Short Wicks","Difference in prices which is considered sufficiently long. Used in Dark Cloud, Piercing Line",[["",3,true,null,1,null,"0.75"]]],
["Gap","Percentage difference in prices which is considered as a gap",[["",3,true,null,1,null,"0.02"]]],
["Short Candlestick Range","Percentage difference in prices which is considered as sufficiently short",[["",3,true,null,1,null,"0.5"]]],
["Long Candlestick Range","Percentage difference in prices which is considered as sufficiently long",[["",3,true,null,1,null,"0.66"]]],
["Prior Downtrend","Rate of change of x days EMA for y days is negative",[["EMA Period",2,true,null,1,null,"20"],["ROC Period",2,true,null,1,null,"10"]]],
["Prior Uptrend","Rate of change of x days EMA for y days is positive",[["EMA Period",2,true,null,1,null,"20"],["ROC Period",2,true,null,1,null,"10"]]]
];
var PATTERN_TYPES=[null,new PatternMetaData(PT_DOJI,"","Doji","1B96AD","doji.html")
,new PatternMetaData(PT_GRAVEDOJI,"","Gravestone Doji","0E1FBF","gravestonedoji.html")
,new PatternMetaData(PT_DRAGONDOJI,"","Dragonfly Doji","A920BC","dragondoji.html")
,new PatternMetaData(PT_HAMMER,"","Hammer","9A898F","hammer.html")
,new PatternMetaData(PT_HANGINGMAN,"","Hanging Man","C9A505","hanginman.html")
,new PatternMetaData(PT_DARKCLOUDCOVER,"","Dark Cloud Cover","304400","darkcloudcover.html")
,new PatternMetaData(PT_PIERCINGLINE,"","Piercing Line","34360E","piercingline.html")
,new PatternMetaData(PT_BULLISHENGULFING,"","Bullish Engulfing","7A79A3","bullishengulfing.html")
,new PatternMetaData(PT_BEARISHENGULFING,"","Bearish Engulfing","64EFD6","bearishengulfing.html")
,new PatternMetaData(PT_INVERTEDHAMMER,"","Inverted Hammer","E909E0","invertedhammer.html")
,new PatternMetaData(PT_MORNINGDOJISTAR,"","Morning Doji Star","4A6806","morningdojistar.html")
,new PatternMetaData(PT_EVENINGDOJISTAR,"","Evening Doji Star","671E1B","eveningdojistar.html")
,new PatternMetaData(PT_MORNINGSTAR,"","Morning Star","18FF8D","morningstar.html")
,new PatternMetaData(PT_EVENINGSTAR,"","Evening Star","771852","eveningstar.html")
,new PatternMetaData(PT_BEARISHHARAMICROSS,"","Bearish Harami Cross","47A462","bearishharamicross.html")
,new PatternMetaData(PT_BEARISHHARAMI,"","Bearish Harami","DA953E","bearishharami.html")
,new PatternMetaData(PT_SHOOTINGSTAR,"","Shooting Star","9943E9","shootingstar.html")
,new PatternMetaData(PT_BEARISHKICKING,"","Bearish Kicking","612294","bearishkicking.html")
,new PatternMetaData(PT_BULLISHKICKING,"","Bullish Kicking","FEBB1B","bullishkicking.html")
];

function GraphMetaData(pGraphType,pName,pDesc,pDisplayTypes,pColorParams,pGraphParams,pRemovable,pGraphGroup,pHelpFile,pLdb)
{
	var t=this;
	t.graphType=pGraphType;
	t.name=pName;
	t.desc=pDesc;
	t.displayTypes=pDisplayTypes;
	t.colorParams=pColorParams;
	t.graphParams=pGraphParams;
	t.removable=pRemovable;
	t.graphGroup=pGraphGroup;
	t.helpFile=pHelpFile;
	t.ldb=pLdb;
}
function PatternMetaData(pType,pCode,pName,pColor,pHelpFile)
{
	var t=this;
	t.type=pType;
	t.code=pCode;
	t.name=pName;
	t.color=pColor;
	t.helpFile=pHelpFile;
}
function ChartBean(pId,pHeight,pGroup)
{
var t=this;
t.id=pId;
t.height=pHeight;
t.group=pGroup;
}

function GraphBean(pId,pChartId,pGraphType,pDisplayType,pGraphColors,pGraphParams)
{
var t=this;

t.id=pId;
t.chartId=pChartId;
t.graphType=pGraphType;
t.displayType=pDisplayType;
t.graphColors=pGraphColors;
t.graphParams=pGraphParams;
t.key="";
t.serverParams=null;

t.getString=function getString(pDisp)
{
	lStr=t.id+"|"+t.graphType+"|"+pDisp;
	for (lGrPtr=0;(t.graphParams!=null)&&(lGrPtr<t.graphParams.length);lGrPtr++ )
	{
		lStr+="|"+t.graphParams[lGrPtr];
	}
	return lStr;
}
t.getTitleString=function getTitleString()
{
	lStr=GRAPH_TYPES[t.graphType].name+" "+t.key+"(";
	for (var lGrPtr=0;(t.graphParams!=null)&&(lGrPtr<t.graphParams.length);lGrPtr++ )
	{
		lStr+=t.graphParams[lGrPtr];
		if (lGrPtr<t.graphParams.length-1) lStr+=",";
	}
	lStr+=")";
	return lStr;
}
t.setKey=function setKey(pKey)
{
	t.key=pKey;
}

}

function AnnotationBean(pId,pType,pDate,pParams)
{
var t=this;
t.id=pId;
t.type=pType;
t.date=pDate;
t.params=pParams;

t.getTitleString=function getTitleString()
{
	return ANNOTATIONS[t.type]+"("+t.date+")";
}
}

function CorpAnnouncementBean(pId,pColor,pAlign,pLetter,pSize)
{
	var t=this;
	t.id=pId;
	t.color=pColor;
	t.align=pAlign;
	t.letter=pLetter;
	t.size=pSize;
}
function PatternBean(pType,pSize,pAlign,pColor)
{
	var t=this;
	t.type=pType;
	t.size=pSize;
	t.align=pAlign;
	t.color=pColor;
	t.enabled=false;
	t.count=0;
}
function WorkBench()
{
var t=this;
t.charts=new Array();
t.graphs=new Array();
t.annotations=new Array();
t.corpAnnouncements=new Array();
t.segment;
t.patterns=new Array();
t.patternParams=new Array();
t.addChartBean=function addChartBean(pChartBean)
{
	if (pChartBean.id==null)
	{
		pChartBean.id=-1;
		for(lPtr=0;lPtr<t.charts.length;lPtr++)
		{
			if(t.charts[lPtr].id>pChartBean.id) pChartBean.id=t.charts[lPtr].id;
		}
		pChartBean.id++;
	}
	t.charts.push(pChartBean);
}
t.removeChartBean=function removeChartBean(pChartId)
{
	for(lPtr=0;lPtr<t.charts.length;lPtr++)
	{
		if(t.charts[lPtr].id==pChartId)
		{
			t.charts.splice(lPtr,1);
			break;
		}
	}
	//remove graphs
	for(lPtr=t.graphs.length-1;lPtr>=0;lPtr--)
	{
		if (t.graphs[lPtr].chartId==pChartId)
		{
			t.graphs.splice(lPtr,1);
		}
	}
}
t.getChartBean=function getChartBean(pChartId)
{
	lChart=null;
	for(lPtr=0;lPtr<t.charts.length;lPtr++)
	{
		if(t.charts[lPtr].id==pChartId)
		{
			lChart=t.charts[lPtr];
			break;
		}
	}
	return lChart;
}
t.addGraphBean=function addGraphBean(pGraphBean)
{
	if (pGraphBean.id==null)
	{
		var lMaxId=-1;
		var lTempId;
		for(lPtr=0;lPtr<t.graphs.length;lPtr++)
		{
			lTempId=parseInt(t.graphs[lPtr].id.substr(1));
			if(lTempId>lMaxId) lMaxId=lTempId;
		}
		lMaxId++;
		pGraphBean.id="g"+lMaxId;
	}
	t.graphs.push(pGraphBean);
}
t.removeGraphBean=function removeGraphBean(pGraphId)
{
	lGraphBean=null;
	for(lPtr=0;lPtr<t.graphs.length;lPtr++)
	{
		if(t.graphs[lPtr].id==pGraphId)
		{
			lGraphBean=t.graphs[lPtr];
			t.graphs.splice(lPtr,1);
			break;
		}
	}
	// check if chart to be removed
	if (lGraphBean==null) return;
	lFound=false;
	for(lPtr=0;lPtr<t.graphs.length;lPtr++)
	{
		if(t.graphs[lPtr].chartId==lGraphBean.chartId)
		{
			lFound=true;
			break;
		}
	}
	if (!lFound)
	{
		t.removeChartBean(lGraphBean.chartId);
	}
}
t.getGraphBean=function getGraphBean(pGraphId)
{
	lGraph=null;
	for(lPtr=0;lPtr<t.graphs.length;lPtr++)
	{
		if(t.graphs[lPtr].id==pGraphId)
		{
			lGraph=t.graphs[lPtr];
			break;
		}
	}
	return lGraph;
}
t.getChartsForGroup=function getChartsForGroup(pGroupId)
{
	lList=new Array();
	for(lPtr=0;lPtr<t.charts.length;lPtr++)
	{
		if(t.charts[lPtr].group==pGroupId)
		{
			lList.push(lPtr+1);
		}
	}
	return lList;
}
t.removeEmptyCharts=function removeEmptyCharts()
{
	for(lPtr=t.charts.length-1;lPtr>=0;lPtr--)
	{
		lFound=false;
		for (lPtr1=0;lPtr1<t.graphs.length;lPtr1++)
		{
			if(t.charts[lPtr].id==t.graphs[lPtr1].chartId)
			{
				lFound=true;
				break;
			}
		}
		if (!lFound)
		{
			t.charts.splice(lPtr,1);
		}
	}
}
t.addAnnotationBean=function addAnnotationBean(pAnnotationBean)
{
	if (pAnnotationBean.id==null)
	{
		pAnnotationBean.id=-1;
		for(lPtr=0;lPtr<t.annotations.length;lPtr++)
		{
			if(t.annotations[lPtr].id>pAnnotationBean.id) pAnnotationBean.id=t.annotations[lPtr].id;
		}
		pAnnotationBean.id++;
	}
	t.annotations.push(pAnnotationBean);
}
t.removeAnnotationBean=function addAnnotationBean(pAnnotationId)
{
	for(lPtr=0;lPtr<t.annotations.length;lPtr++)
	{
		if(t.annotations[lPtr].id==pAnnotationId)
		{
			t.annotations.splice(lPtr,1);
			break;
		}
	}
}
t.getAnnotationBean=function getAnnotationBean(pAnnotationId)
{
	lAnnotation=null;
	for(lPtr=0;lPtr<t.annotations.length;lPtr++)
	{
		if(t.annotations[lPtr].id==pAnnotationId)
		{
			lAnnotation=t.annotations[lPtr];
			break;
		}
	}
	return lAnnotation;
}

t.setCorpAnnouncements=function setCorpAnnouncements(pCorpAnnouncements)
{
	t.corpAnnouncements = pCorpAnnouncements;

}
t.getCorpAnnouncements=function getCorpAnnouncements()
{
	return t.corpAnnouncements;
}

t.getCorpAnnouncementBean=function getCorpAnnouncementBean(pCatgoryId)
{
	var lCorpAnnouncement=null;
	for(var lPtr=0;lPtr<t.corpAnnouncements.length;lPtr++)
	{
		if(t.corpAnnouncements[lPtr].id==pCatgoryId)
		{
			lCorpAnnouncement=t.corpAnnouncements[lPtr];
			break;
		}
	}
	return lCorpAnnouncement;
}
// init patterns
for(var lPtr=0;lPtr<PATTERN_TYPES.length;lPtr++)
{
	var lMetaBean=PATTERN_TYPES[lPtr];
	if(lMetaBean!=null)
		t.patterns[lPtr]=new PatternBean(lMetaBean.type,16,"true",lMetaBean.color);
}
for(var lPtr=0;lPtr<PARAM_DETAILS.length;lPtr++)
{
	t.patternParams[lPtr]=new Array();
	for(var lPtr1=0;lPtr1<PARAM_DETAILS[lPtr][2].length;lPtr1++)
	{
		t.patternParams[lPtr][lPtr1]=PARAM_DETAILS[lPtr][2][lPtr1][6];
	}
}
}

