	VIEW_TEXT = 1;
	VIEW_SIMPLELIST = 2;
	VIEW_MULTIPLELIST = 3;
	VIEW_CHOICE = 4;
	
	NEXT_CRITERIA = 0;
	PREV_CRITERIA = 1;
	
	// Data Types
	TCHAR = 1;
	TNUM = 2;
	TCURRENCY = 3;
	TDATE = 4;
	
	// Sort Directions
	ASC = 1;
	DESC = 2;
	
	// Sub-total functions
	SUM = 1;
	PERCENT = 2;
	MIN = 3;
	MAX = 4;
	AVG = 5;
	VAR = 6;
	ECART = 7;
	COUNT = 8;
	NONE = 9;
	
	// rupture constant
	RUPTURE_END_ROW = 0;
	RUPTURE_START_ROW = 6;
	RUPTURE_NBROW = 1;
	RUPTURE_FUNC = 2
	RUPTURE_FUNC_RESULT = 3;
	RUPTURE_GRP_VAL = 4;
	RUPTURE_SUM = 5;
	
	RUPTURE_SUB_COL = 0;
	RUPTURE_SUB_FUNC = 1;
	RUPTURE_DISP_TOT = 2;	
	

	function fnMsg(id)
	{
		switch (id)
		{	
			case 10:str="Please, load the information before !";break;
			case 20:str="hide filters !";break;
			case 21:str="show filters !";break;
			case 22:str="hide all columns !";break;
			case 23:str="show all columns!";break;
			case 24:str="hide all lines !";break;
			case 25:str="show all lines !";break;
			case 26:str="hide data filters!";break;
			case 27:str="show data filters !";break;

			case 30:str="Filters";break;
			case 31:str="Page Filters";break;
			default:str='';break;
		}
		return str;
	}	
	
	
	/*--------------------------------*/
	/* VIEW MANAGER COLLECTION OBJECT */
	/*--------------------------------*/
	function SQLVManagerDef()
	{
		var _list = new Collection();
		
		this.AddViewMailing = AddVM;
		this.AddViewTBC = AddTBC;
		this.AddViewList = AddViewList;
		
		
		this.Find = Find;
		this.Remove = Remove;
		this.FindById = FindById;
		
		
		function AddVM(id,pageCount)
		{
			var VMIndex;
			var NewVM;
			
			
			VMIndex = Find(id);
			
			if (VMIndex >= 0)
				return _list.Item(VMIndex);
			
			NewVM = new ViewMailingDef(id,pageCount);
			
			_list.Add(NewVM);
			this.Count = _list.Count();
			
			return NewVM;
		}		
		
		function AddTBC(id)
		{
			var TBCIndex;
			var NewTBC;
			
			
			TBCIndex = Find(id);
			
			if (TBCIndex >= 0)
				return _list.Item(TBCIndex);
			
			NewTBC = new ViewTBCDef(id);
			
			_list.Add(NewTBC);
			this.Count = _list.Count();
			
			return NewTBC;		
			
		}
		
		function AddViewList(docID, WPQ, DOQ, oHTMLGrid, cDT, cF, ruptureCol, ruptureDef,IdDatabase,IdDomain )
		{
			var Index;
			var New;
			
			
			Index = Find(docID);
			
			if (Index >= 0)
				return _list.Item(Index);
			
			New = new ViewListDef(docID, WPQ, DOQ, oHTMLGrid, cDT, cF,IdDatabase,IdDomain);
			if( ruptureCol != null || ruptureDef != null )
			{
				New.Rupture(ruptureCol,ruptureDef);
				New.hideAllRupture();
			}
			
			_list.Add(New);
			this.Count = _list.Count();
			
			return New;				
			
		}
		
		
	
		function FindById(Id)
		{
			var i;
			for( i=0; i<_list.Count(); i++ )
			{
				if( _list.Item(i).id == Id )
					return _list.Item(i);
			}
			return null;
		}		

		function Find(Index)
		{
			if (isNaN(Index))
			{
				var i;
				for( i=0; i<_list.Count(); i++ )
				{
					if( _list.Item(i).id == Index )	
						return i;
				}
				return -1;
			}
			else
			{
				if( Index < 0 || Index >= _list.Count() )
					return -1;
				else
					return Index;
			}
		}

		function Remove(Index)
		{
			_list.Remove(Find(Index));
			this.Count = _list.Count();
		}
		
		function Clear()
		{
			var i;
			for(i=0;i<this.Count;i++)
				Remove(i);
			
		}	
	
	}	
	
	/*---------------------*/
	/* VIEW MAILING OBJECT */
	/*---------------------*/	
	function ViewTBCDef(appletID)
	{
		this.id = appletID;
		this.appletObj = getElByID(appletID);
		this.appletDiv = getElByID('tablediv'+appletID);
		this.filterDiv = getElByID('filterdiv'+appletID);
		this.pagefilterDiv = getElByID('pagefilterdiv'+appletID);
		this.txtdata= getElByID('txtdata'+ appletID);
		this.txtprops= getElByID('txtprops'+ appletID);
	
		this.resetApplet=resetApplet;
		this.appletLoad=appletLoad;
		this.isAppletLoaded=isAppletLoaded;
		this.seeTable=seeTable;
	
		this.columnLabels=new Array();
		this.nColumnLabels=0;
		this.typeColumnLabel='C';
		this.lineLabels=new Array();
		this.nLineLabels=0;
		this.typeLineLabel='L';
		this.pageLabels=new Array();
		this.npageLabels=0;
		this.typePageLabel='P';
		this.loadFilterLabels=loadFilterLabels;
		this.filterManage=filterManage;
		this.updateMsg = updateMsg;
	
	
		//Outils
		this.getType=getType;
		this.getLabel=getLabel;
	
		//formats
		this.openFormat=openFormat;
		this.pattern="#0.0#";
	
		//Styles
		this.styleLabel = new oStyle(null,null,null,null,null,null,null);
		this.styleSubTotal = new oStyle(null,null,null,null,null,null,null);
		this.styleCell = new oStyle(null,null,null,null,null,null,null);
		this.loadAllStyle=loadAllStyle;
		this.fillStyle=fillStyle;
		this.saveStyle=saveStyle;
		this.openStyle=openStyle;
	
		//Rotations
		this.openRotation=openRotation;
		this.dataRotate=null;
	
		//modify fields
		this.dataView=dataView;
		this.viewProp=viewProp;
	
		//View columns/lines
		this.toggleLine=toggleLine;
		this.toggleColumn=toggleColumn;
		this.toggleAllLine=toggleAllLine;
		this.toggleAllColumn=toggleAllColumn;
		this.hideFields=hideFields;
		this.pageFilters=pageFilters;
	
		//Infos
		this.axml=getElByID('axml'+appletID);
		this.paramButtons=getElByID('paramButtons'+appletID);
		this.fieldButtons = getElByID('fieldButtons'+appletID);
		this.hiddentxt=getElByID('hiddenvalues'+appletID);
		this.txtAllLine=getElByID('allLine'+appletID);
		this.txtAllColumn=getElByID('allColumn' + appletID);
	
	
		/*-----------------------------------------------------------------------------------*/
		//--------------------------------- GESTION APPLET
		/*-----------------------------------------------------------------------------------*/
	
		/*------------------------------------------------------------*/
		function resetApplet()
		{
			this.fieldButtons.style.display='none';
			this.paramButtons.style.display='none';
			this.appletObj.reset();
			this.appletObj.initData(this.txtdata.value,this.txtprops.value,this.id,repTBCImg);
		}
	
		/*------------------------------------------------------------*/
		function appletLoad(fullLoadFlag)
		{
			//try 
			//{
				
				if (fullLoadFlag) {	this.resetApplet();}
				
				this.updateMsg();
				
				this.appletObj.asyncCompute();
				
				
				while(!this.appletObj.getComputeStatus()); //alert(this.appletObj.getComputeStatusMessage());
				this.initDoneFlag=true;
				this.loadAllStyle();
				this.loadFilterLabels();
				this.saveStyle();
				if(!this.appletObj.mustInit()) 
				{
					this.allColumnsFlag=false;
					this.appletObj.toggleAllColumnLabels(this.allColumnsFlag);
					this.allLinesFlag=false;
					this.appletObj.toggleAllLineLabels(this.allLinesFlag);
					this.seeTable(false);
					this.fieldButtons.style.display='';
					this.paramButtons.style.display='';
				}
				else
					this.viewProp(false);
				
			//}
			//catch (ex) 
			//{
			//	alert("erreur " + ex.message);
			//}
		}
	
		/*------------------------------------------------------------*/
		function seeTable(bcompute)
		{
			try
			{
				if (bcompute)
				{
					this.appletObj.asyncCompute();
					while(!this.appletObj.getComputeStatus()) alert(this.appletObj.getComputeStatusMessage());
					this.allColumnsFlag=false;
					this.appletObj.toggleAllColumnLabels(this.allColumnsFlag);
					this.allLinesFlag=false;
					this.appletObj.toggleAllLineLabels(this.allLinesFlag);
				}
				this.appletDiv.innerHTML = this.appletObj.getHTMLTable();
			}
			catch(ex)
			{
				alert(ex.message);
				initDoneFlag=false;
			}
		}
	
		/*------------------------------------------------------------*/
		function dataView()
		{
			this.dataHiddenFlag=!this.dataHiddenFlag;
			this.txtdata.style.display=(this.dataHiddenFlag) ? 'none':'';
			this.txtprops.style.display=(this.dataHiddenFlag) ? 'none':'';
			(this.dataHiddenFlag) ? this.axml.innerHTML='voir xml':this.axml.innerHTML='cacher xml';
		}
	
		/*------------------------------------------------------------*/
		function viewProp(init)
		{
			if (!this.isAppletLoaded()) return;
			(init)? url='tbcfields.asp?applet='+this.id+'&init=true':url='tbcfields.asp?applet='+this.id+'&init=false';
			fnWindowOpen(url,'Fields',700,400,true,false)
		}
	
		/*------------------------------------------------------------*/
		function isAppletLoaded()
		{
			if (this.initDoneFlag)
				return true
			else
				alert(fnMsg(10));
			return false;
		}
	
		/*------------------------------------------------------------*/
		function getType(id)
		{
			return this.appletObj.getTypeLabel(id);
		}
	
		function getLabel(id)
		{
			return this.appletObj.getLabelById(id);
		}
	
	
		/*-----------------------------------------------------------------------------------*/
		//--------------------------------- GESTION LIGNE/ COLONNE
		/*-----------------------------------------------------------------------------------*/
	
		/*------------------------------------------------------------*/
		function toggleLine(id,open) {
			this.appletObj.toggleLineLabels(id,open);
			this.seeTable();
		}
	
		/*------------------------------------------------------------*/
		function toggleAllLine()
		{
			if (!this.isAppletLoaded()) return;
			this.allLinesFlag=!this.allLinesFlag;
			this.appletObj.toggleAllLineLabels(this.allLinesFlag);
			(this.allLinesFlag) ? this.txtAllLine.src=repTBCImg+'hidelines.gif':this.txtAllLine.src=repTBCImg+'seelines.gif';
			(this.allLinesFlag) ? this.txtAllLine.alt='hide all lines !':this.txtAllLine.alt='see all lines !';
			this.seeTable();
		}
	
		/*------------------------------------------------------------*/
		function toggleColumn(id,open) 
		{
			this.appletObj.toggleColumnLabels(id,open);
			this.seeTable();
		}
	
		/*------------------------------------------------------------*/
		function toggleAllColumn()
		{
			if (!this.isAppletLoaded()) return;
			this.allColumnsFlag=!this.allColumnsFlag;
			this.appletObj.toggleAllColumnLabels(this.allColumnsFlag);
			(this.allColumnsFlag) ? this.txtAllColumn.src=repTBCImg+'hidecolumns.gif':this.txtAllColumn.src=repTBCImg+'seecolumns.gif';
			(this.allColumnsFlag) ? this.txtAllColumn.alt='hide all columns !':this.txtAllColumn.alt='see all columns';
			this.seeTable();
		}
	
		/*------------------------------------------------------------*/
		function hideFields()
		//Cacher certains fields dynamiquement..
		{
			if (!this.isAppletLoaded()) return;
			this.filterFlag=!this.filterFlag;
			this.filterDiv.style.display=(this.filterFlag) ? '':'none';
			(this.filterFlag) ? this.hiddentxt.src=repTBCImg+'hidefilter.gif':this.hiddentxt.src=repTBCImg+'seefilter.gif';
			(this.filterFlag) ? this.hiddentxt.alt=fnMsg(21):this.hiddentxt.alt=fnMsg(20);
		}
	
		/*------------------------------------------------------------*/
		function updateMsg()
		{
			this.dataHiddenFlag=true;
			this.filterFlag=false;
			this.initDoneFlag=false;
			this.allColumnsFlag=false;
			this.allLinesFlag=false;
	
			(this.filterFlag) ? this.hiddentxt.src=repTBCImg+'hidefilter.gif':this.hiddentxt.src=repTBCImg+'seefilter.gif';
			(this.filterFlag) ? this.hiddentxt.alt=fnMsg(21):this.hiddentxt.alt=fnMsg(20);
			(this.allColumnsFlag) ? this.txtAllColumn.src=repTBCImg+'hidecolumns.gif':this.txtAllColumn.src=repTBCImg+'seecolumns.gif';
			(this.allColumnsFlag) ? this.txtAllColumn.alt='hide all columns !':this.txtAllColumn.alt='see all columns';
			(this.allLinesFlag) ? this.txtAllLine.src=repTBCImg+'hidelines.gif':this.txtAllLine.src=repTBCImg+'seelines.gif';
			(this.allLinesFlag) ? this.txtAllLine.alt='hide all lines !':this.txtAllLine.alt='see all lines !';
		}
		/*------------------------------------------------------------*/
		function pageFilters()
		//ne pas prendre en compte certaines valeurs d'un champ donne
		{
			if (!this.isAppletLoaded()) return;
			this.pagefilterFlag=!this.pagefilterFlag;
			this.pagefilterDiv.style.display=(this.pagefilterFlag) ? '':'none';
			(this.pagefilterFlag) ? this.hiddentxt.src=repTBCImg+'hidefilter.gif':this.hiddentxt.src=repTBCImg+'seefilter.gif';
			(this.pagefilterFlag) ? this.hiddentxt.alt=fnMsg(27):this.hiddentxt.alt=fnMsg(26);
		}
	
		/*-----------------------------------------------------------------------------------*/
		//--------------------------------- GESTION DATA FORMAT
		/*-----------------------------------------------------------------------------------*/
		function openFormat()
		{
			if (!this.isAppletLoaded()) return;
			fnWindowOpen('tbcformat.asp?applet='+this.id,'Datafield',350,280,false,false);
		}
	
		/*-----------------------------------------------------------------------------------*/
		//--------------------------------- GESTION FILTER VALUES
		/*-----------------------------------------------------------------------------------*/
	
		/*------------------------------------------------------------ OBJET FILTER */
		function oColumnFilterTBC(id,applettmp)
		{
			this.id=id;
			this.label=applettmp.getLabel(id);
			this.value=new Array();
			this.visible=new Array();
			var values=applettmp.appletObj.getLabelValues(id);
			for (i=0;i<values.size();i++)
			{
				this.value[i]=values.elementAt(i);
				this.visible[i]=true;
			}
		}
		
		function oLineFilterTBC(id,applettmp)
		{
			this.id=id;
			this.label=applettmp.getLabel(id);
			this.value=new Array();
			this.visible=new Array();
			var values=applettmp.appletObj.getLabelValues(id);
			for (i=0;i<values.size();i++)
			{
				this.value[i]=values.elementAt(i);
				this.visible[i]=true;
			}
		}
		function oPageFilterTBC(id,applettmp)
		{
			this.id=id;
			this.label=applettmp.getLabel(id);
			this.value=new Array();
			this.visible=new Array();
			var values=applettmp.appletObj.getLabelValues(id);
			for (i=0;i<values.size();i++)
			{
				this.value[i]=values.elementAt(i);
				this.visible[i]=true;
			}
		}
	
		/*------------------------------------------------------------*/
		function loadFilterLabels()
		{
			var strfilter='';
	
			
			if (!this.isAppletLoaded()) return;
			this.nColumnLabels=0;
			this.nLineLabels=0;
	
			//chargement des columns
			var columnList = this.appletObj.getColumnLabels();
			this.nColumnLabels=columnList.size();
			for (var i=0;i<this.nColumnLabels;i++) this.columnLabels[i]=new oColumnFilterTBC(columnList.elementAt(i).id,this);
	
			//chargement des lines
			var lineList = this.appletObj.getLineLabels();
			this.nLineLabels=lineList.size();
			for (var i=0;i<this.nLineLabels;i++) this.lineLabels[i]=new oLineFilterTBC(lineList.elementAt(i).id,this);
	
			//chargement des pages
			var pageList = this.appletObj.getPageFilters();
			this.nPageFilters=pageList.size();
			for (var i=0;i<this.nPageFilters;i++) this.pageLabels[i]=new oPageFilterTBC(pageList.elementAt(i),this);
	
	
			//le tableau des line/column/page filters
	
			strfilter+="<table cellpadding=0 cellspacing=1 border=0 style='background-color:gray'>"
			strfilter+="<tr class=WPbody valign=middle ><td colspan='"+this.nLineLabels+"'><b>" + fnMsg(31) + "</b></td>"
			strfilter+="<td class=WPbody >"
			//page filters
			var i=0;
			for (i=0;i<this.nPageFilters;i++ )
			{
				strfilter+="<a href=\"javascript:fnWindowOpen('tbcdatafilter.asp?applet="+this.id+"&id=" +i+ "&type="+this.typePageLabel+"','hidden_fields',500,450,true,true);\">";
				strfilter+=this.pageLabels[i].label+"</a><br>";
			}
	
			strfilter+="</td></tr><tr class=WPbody valign=middle>"
			
			strfilter+="<tr class=WPbody valign=middle ><td colspan='"+this.nLineLabels+"'><b>" + fnMsg(30) + "</b></td>"
			strfilter+="<td class=WPbody >"
			//les columns...
			var i=0;
			for (i=0;i<this.nColumnLabels ;i++ )
			{
				strfilter+="<a href=\"javascript:fnWindowOpen('tbcdatafilter.asp?applet="+this.id+"&id=" +i+ "&type="+this.typeColumnLabel+"','hidden_fields',500,450,true,true);\">";
				strfilter+=this.columnLabels[i].label+"</a><br>";
			}
	
			strfilter+="</tr><tr class=WPbody valign=middle>"
	
			//lines
			for (i=0;i<this.nLineLabels;i++)
			{
				strfilter+="<td class=WPbody >"+"<a href=\"javascript:fnWindowOpen('tbcdatafilter.asp?applet="+this.id+"&id=" +i+ "&type="+this.typeLineLabel+"','hidden_fields',500,450,true,true);\">";
				strfilter+=this.lineLabels[i].label+"</a></td>";
			}
			strfilter+="<td class=WPbody >&nbsp;</td>";
			
			strfilter+="</tr></table><br>";
			this.filterDiv.innerHTML=strfilter;
		}
	
		/*------------------------------------------------------------*/
		function filterManage(id,idvalue,removeFlag,typeLabel)
		{
			switch (typeLabel)
			{
			case this.typeColumnLabel:
				(removeFlag) ? this.appletObj.removeColumnFilter(this.columnLabels[id].id,this.columnLabels[id].value[idvalue]):this.appletObj.addColumnFilter(this.columnLabels[id].id,this.columnLabels[id].value[idvalue]);
				break;
			case this.typeLineLabel:
				(removeFlag) ? this.appletObj.removeLineFilter(this.lineLabels[id].id,this.lineLabels[id].value[idvalue]):this.appletObj.addLineFilter(this.lineLabels[id].id,this.lineLabels[id].value[idvalue]);
				break;
			case this.typePageLabel:
				(removeFlag) ? this.appletObj.removePageFilter(this.pageLabels[id].id,this.pageLabels[id].value[idvalue]):this.appletObj.addPageFilter(this.pageLabels[id].id,this.pageLabels[id].value[idvalue]);
				break;
			default:
				break;
			}
		}
		/*-----------------------------------------------------------------------------------*/
		//--------------------------------- GESTION STYLE
		/*-----------------------------------------------------------------------------------*/
	
		/*------------------------------------------------------------ OBJET STYLE */
		function oStyle(fontbgcolor,fontfamily,fontsize,fontweight,fontvariant,fontstyle,fontcolor)
		{
			this.background_color=fontbgcolor;
			this.font_family=fontfamily;
			this.font_size=fontsize;
			this.font_weight=fontweight;
			this.font_variant=fontvariant;
			this.font_style=fontstyle;
			this.color=fontcolor;
		}
	
		/*------------------------------------------------------------*/
		function loadAllStyle()
		{
			if (!this.isAppletLoaded()) return;
			this.fillStyle('Label',this.appletObj.getConfigValue('style_Label'));
			this.fillStyle('SubTotal',this.appletObj.getConfigValue('style_SubTotal'));
			this.fillStyle('Cell',this.appletObj.getConfigValue('style_Cell'));
		}
	
		/*------------------------------------------------------------*/
		function saveStyle()
		{
			if (!this.isAppletLoaded()) return;
			this.appletObj.setConfigValue('style_Label',writeXmlStyle(this.styleLabel));
			this.appletObj.setConfigValue('style_SubTotal',writeXmlStyle(this.styleSubTotal));
			this.appletObj.setConfigValue('style_Cell',writeXmlStyle(this.styleCell));
		}
	
		/*------------------------------------------------------------*/
		function openStyle(type)
		{
			if (!this.isAppletLoaded()) return;
			this.loadAllStyle();
			if (type=='default')
			{
				this.styleLabel = new oStyle(null,null,null,null,null,null,'black');
				this.styleSubTotal = new oStyle(null,null,null,null,null,null,'red');
				this.styleCell = new oStyle(null,null,null,null,null,null,'blue');
				this.saveStyle();
				this.seeTable();
				return;
			}
			url='tbcstyles.asp?type=' + type + '&applet=' + this.id;
			fnWindowOpen(url,'Style',620,230,false,false);
		}
	
		/*------------------------------------------------------------*/
		function fillStyle(label,str)
		{
			if (!str) return;
			var currentStyle=eval("GetSQLVObject('" + this.id +"').style" + label);
			var infosStyle=str.split(';');
			for (var i=0;i<infosStyle.length;i++ )
			{
				var ssinfos=infosStyle[i].split(':');
				if (ssinfos.length==2) eval("GetSQLVObject('" + this.id +"').style" + label + "." + ssinfos[0].replace('-','_') + "=ssinfos[1]");
			}
		}
	
		/*------------------------------------------------------------*/
		function writeXmlStyle(otmpStyle)
		{
			var str='';
			if (otmpStyle.background_color)	str+='background-color:'+otmpStyle.background_color+';';
			if (otmpStyle.font_family)	str+='font-family:'+otmpStyle.font_family+';';
			if (otmpStyle.font_size)	str+='font-size:'+otmpStyle.font_size+';';
			if (otmpStyle.font_weight)	str+='font-weight:'+otmpStyle.font_weight+';';
			if (otmpStyle.font_variant)	str+='font-variant:'+otmpStyle.font_variant+';';
			if (otmpStyle.font_style)	str+='font-style:'+otmpStyle.font_style+';';
			if (otmpStyle.color)	str+='color:'+otmpStyle.color+';';
			return str;
		}
	
	
	
		function openRotation()
		{
			var url='';
			url='tbcrotation.asp?applet='+this.id;
			fnWindowOpen(url,'Rotations_Fields',700,500,true,true);
		}
	}	
	
	
function ViewListDef(docID, WPQ, DOQ, oHTMLGrid, cDT, cF,IdDatabase,IdDomain)
{
 	var _docID = docID;
 	var _WPQ = WPQ;
 	var _DOQ = DOQ;
 	var _oHTMLGrid = getElByID(oHTMLGrid);
 	var _IdDatabase = IdDatabase;
 	var _IdDomain = IdDomain;
	var _arrayData = null;
	var _objectID = null;
	var _lastCol;
	var _dataType = TCHAR;
	var _nbRow = 0;
	var _nbCol = 0;
	var _colDataType = cDT;
	var _colFormat = cF;
	var _lastColSortDir;
	var _ruptureData = null;
	var _ruptureCount = 0;
	var _ruptureRowIndex = null;
	var _ruptureHearderRows = null;
	var _rowColor = "";
	var _rowAlternateColor = "";
	var _cS = 'â‚¬';
	var _subtotalcol = null;
	var _grandtotal = null;
	
	// Style Sheets
	var _sheet = null;
	var _rules = null;
	
	// Dialog variables
	// Ruptures Dialog
	var _rupDlgWin = null;
	var _UIstate = null;
	var _userdefs = new Array();
	var _rCol = 0;
	var _nbSubCol = 0;
	var _possibleSubCols = new Array();
	var _areEnabled = false;
	var _beenThere = false;
	var _elDragged = null  // Track current item.
	var _ruptureDef = new Array();
	
	// Alert Dialog
	var _alertDlgWin = null;
	var _alertDefs = new Array();
	var _hideLines = 0;
	var _nbAlert = 0;
	var _modIndex = -1;
	var _fColWidth = false;
	
	// Format Dialog
	var _formatDefs = _colFormat;
	var _formatNumStrings = new Array('0', '0.00', '# ###', '# ##0.00', '0 â‚¬', '0.00 â‚¬', '# ### â‚¬', '# ##0.00 â‚¬');
	this.getFormatNumStrings = function(){ return _formatNumStrings; }
	var _formatDateStrings = new Array('dd/MM/yyyy', 'dd/mm/yy', 'dd-mm-yy', 'HH:mm:ss', 'H:mm:ss', 'HH.mm');
	this.getFormatDateStrings = function(){ return _formatDateStrings; }
	
	//tests
	var onlyOnce = true;
	
	this.id = _docID;
	
	
	this.Sort = Sort;
	this.getArrayData = getArrayData;
	this.loadGrid = loadGrid;
	// this.setcolDataType = setcolDataType;
	this.getcolDataType = getcolDataType;
	this.Rupture = Rupture;
	this.getruptureData = getruptureData;
	this.getruptureCount = getruptureCount;
	this.hideRupture = hideRupture;
	this.showRupture = showRupture;
	this.hideAllRupture = hideAllRupture;
	this.showAllRupture = showAllRupture;
	this.delRupture = delRupture;
	this.showAlert = showAlert;
	this.hideAlert = hideAlert;
	this.applyFormat = applyFormat;
	this.WGgroup = WGgroup;
	
	// Rupture dialog public functions/events
	this.initRuptureDlg = initRuptureDlg;
	this.setRupDlgWin = setRupDlgWin;
	this.getrCol = getrCol;
	this.getareEnabled = getareEnabled;
	this.showRuptureDialog = showRuptureDialog;
	this.okButton = okButton;
	this.cancelButton = cancelButton;
	this.eraseButton = eraseButton;
	this.selectedCol = selectedCol;
	this.selectedSubCol = selectedSubCol;
	this.selectedFunc = selectedFunc;
	this.restoreUIstate = restoreUIstate;

	// Alert dialog public functions/events
	this.showAlertDialog = showAlertDialog;
	
	// Format dialog
	this.showFormatDialog = showFormatDialog;
	
	// Print dialog
	this.showPrintDialog = showPrintDialog;

	// List View public event	
	this.doMouseMove = doMouseMove;
	this.doMouseDown = doMouseDown;
	this.doSelectStart = doSelectStart;
	this.doMouseUp = doMouseUp;
	this.setColWidth = setColWidth;
	this.onRowClick = onRowClick;
	
	
	setColWidth(null);
	//loadGrid();
	_initCSS();
	RegisterEvent('www.activportal.mc:ActivPortal','MaximizeWebPart', this.setColWidth);
		
	
	function onRowClick() {
		var i, re;
		var myRow = event.selected;
	
		if (myRow.cells[0].children.length > 0) {
			if (myRow.cells[0].children[0].tagName == "A")
				return;			
		}	
	
		for (i=1; i<myRow.cells.length; i++) {
			var myCell = myRow.cells[i];
			var myParams = new CriteriaDataEvent();
			
			myParams.IdDatabase = _IdDatabase;
			myParams.IdDomain = _IdDomain;
			myParams.IdObject = myCell.objectID;
			myParams.LabelObject = myCell.Label;
			myParams.Value = String(myCell.innerText);
			myParams.Operator = '=';
			
			switch (_colDataType[i]) {
				case TNUM:
				case TCURRENCY:
					re = /,/g;
					myParams.Value = myParams.Value.replace(re, ".");
					re = /[^0-9\.-]/g;
					myParams.Value = myParams.Value.replace(re, "");
					break;
				
			}

			if( myCell.IsGlobalCriteria == '1')
			{
				SendGlobalCriteria(_docID.replace(PREFIX_ELEMENT,""),myParams);
			}
			
			if( myCell.IsEventCriteria == '1' )
			{
				RaiseApplicationEvent('www.activportal.mc:SQLVCriteria', 'OnCriteriaChange', myParams);
			}			
			// alert(myParams[0]+ ", " + myParams[1]);
		}
	}

	function setColWidth(wpID) {
		var i;
		var colWidths = new Array();
		
/*		if( !_fColWidth )
		{*/
			if( (wpID != null) && (_docID.substr(0,wpID.length) == wpID)) return;
/*			{
				if( _docID.substr(0,wpID.length) == wpID ) return;
			}*/
			
		
			try
			{
				for (i=1; i<_oHTMLGrid.rows[0].cells.length; i++) {
					var hW = getElByID('listViewHeader'+_docID).rows[0].cells[i].offsetWidth;
					var dW = _oHTMLGrid.rows[0].cells[i].offsetWidth;
					
					if (hW > dW) {
						colWidths[i] = hW;
					} else {
						colWidths[i] = dW;
					}
					
					//alert(colWidths[i]);
					getElByID('listViewHeader'+_docID).rows[0].cells[i].width = colWidths[i];
					_oHTMLGrid.rows[0].cells[i].width = colWidths[i];
					getElByID('gtotal'+_docID).rows[0].cells[i].width = colWidths[i];					
				}
				
				var iHeight = _oHTMLGrid.offsetHeight + getElByID('gtotal'+_docID).offsetHeight;
				if( iHeight > 300 ) getElByID('listViewContainer'+_docID).style.height = '300px';
				
				// getElByID('listViewHeader'+_docID).style.tableLayout = 'fixed';
				// _oHTMLGrid.style.tableLayout = 'fixed';
				// getElByID('gtotal'+_docID).style.tableLayout = 'fixed';
				
				UnRegisterEvent('www.activportal.mc:ActivPortal','MaximizeWebPart', this.setColWidth);
			}
			catch(e)
			{}
		//}
	}
	
	function ArrayData()
	{
		if( _arrayData == null ) loadGrid();
		return _arrayData;
	}
	
	function NbCol()
	{
		if (_nbCol == 0) loadGrid();
		return _nbCol;
	}

	function NbRow()
	{
		if (_nbRow == 0) loadGrid();
		return _nbRow;
	}
	
	function showAlert(alerts, hide) {
		var i,j,k;
		var val1, op, val2;
		
		for(i=0; i<alerts.length; i++) {
			
			if ( alerts[i] == undefined )
				continue;
				
			switch(_colDataType[alerts[i][0]]) {
				case TCHAR:
					val2 = alerts[i][2].toUpperCase();
					op = alerts[i][1];
					for(j=0; j<NbRow(); j++) {
						val1 = ArrayData()[j][alerts[i][0]].toUpperCase();
						if ( doCompare(val1, op, val2) ) {
							if ( alerts[i][3] == 1 ) {
								ArrayData()[j][NbCol()].cells(alerts[i][0]).style.color = alerts[i][5];
							} else {
								for (k=1; k < NbCol(); k++)
									ArrayData()[j][NbCol()].cells(k).style.color = alerts[i][5];
							}	
							if ( hide )
								ArrayData()[j][NbCol()].style.display = "none";
							else
								ArrayData()[j][NbCol()].style.display = "block";
						}
					}
					break;
				case TNUM:
				case TCURRENCY:
					val2 = Number(alerts[i][2]);
					op = alerts[i][1];
					for(j=0; j<NbRow(); j++) {
						val1 = Number(ArrayData()[j][alerts[i][0]]);
						if ( doCompare(val1, op, val2) ) {
							if ( alerts[i][3] == 1 ) {
								ArrayData()[j][NbCol()].cells(alerts[i][0]).style.color = alerts[i][5];
							} else {
								for (k=1; k < NbCol(); k++)
									ArrayData()[j][NbCol()].cells(k).style.color = alerts[i][5];
							}	
							if ( hide )
								ArrayData()[j][NbCol()].style.display = "none";
							else
								ArrayData()[j][NbCol()].style.display = "block";
						}
					}					
					break;
				case TDATE:
					
					break;
			}
			
		}
		
	}
	
	function hideAlert() {
		var i,j;
		
		for (i=0; i < NbRow(); i++) 
		{
   			for (j=1; j < NbCol(); j++) {
				ArrayData()[i][NbCol()].cells(j).style.color = "black";
			}
			ArrayData()[i][NbCol()].style.display = "block";
		}
	}
	
	function doCompare(val1, op, val2, dtype) {
	
		switch (op) {
			case 1: // <
				if (val1 < val2)
					return true;
				break;	
			case 2: // <=
				if (val1 <= val2)
					return true;
				break;	
			case 3: // !=
				if (val1 != val2)
					return true;
				break;	
			case 4: // ==
				if (val1 == val2)
					return true;
				break;	
			case 5: // >
				if (val1 > val2)
					return true;
				break;	
			case 6: // >=
				if (val1 >= val2)
					return true;
				break;	
		}
		
		return false;
	}
	
	function Rupture(col, subtotalcol) {
		//alert(subtotalcol.length + " -> " + subtotalcol);
		var i,j;
		
		if ( _ruptureData != null )
			return;
		// we assume ArrayData() contains more than one row !!!!!
		// sorting will group data automagicaly
		if ( col != _lastCol ) {
			_dataType = _colDataType[col];
			_lastCol = col;
			_lastColSortDir = ASC;
			ArrayData().sort(ArraySort);
			RefreshGrid();
		}
		
		if ( col == _lastCol && _lastColSortDir == DESC) {
			ArrayData().reverse();
			RefreshGrid();
		}
						
		// the first row also define the first rupture
		_ruptureData = new Array();
		_ruptureData[_ruptureCount] = new Array();
		_ruptureData[_ruptureCount][RUPTURE_GRP_VAL] = ArrayData()[0][col];
		_ruptureData[_ruptureCount][RUPTURE_NBROW] = 1;
		// this is the case where only one field have been selected for subtotal.
		// as the user can select more that one, we need to make an array for those 2
		// like this : _ruptureData[_ruptureCount][RUPTURE_FUNC_RESULTS] = new Array();
		//             _ruptureData[_ruptureCount][RUPTURE_SUMS] = new Array();
		_ruptureData[_ruptureCount][RUPTURE_FUNC] = new Array();
		_ruptureData[_ruptureCount][RUPTURE_FUNC_RESULT] = new Array();
		_ruptureData[_ruptureCount][RUPTURE_SUM] = new Array();

		_ruptureRowIndex = new Array();
		_ruptureRowIndex[_ruptureCount] = new Array();
		_ruptureRowIndex[_ruptureCount][0] = 0;

		for ( i=0; i < subtotalcol.length; i++) {
			_ruptureData[_ruptureCount][RUPTURE_FUNC][i] = subtotalcol[i][RUPTURE_SUB_FUNC];
			
			if ( _ruptureData[_ruptureCount][RUPTURE_FUNC][i] == MIN || _ruptureData[_ruptureCount][RUPTURE_FUNC][i] == MAX )
				_ruptureData[_ruptureCount][RUPTURE_FUNC_RESULT][i] = Number( ArrayData()[0][subtotalcol[i][RUPTURE_SUB_COL]] );
			else
				_ruptureData[_ruptureCount][RUPTURE_FUNC_RESULT][i] = 0;
			
			_ruptureData[_ruptureCount][RUPTURE_SUM][i] = Number( ArrayData()[0][subtotalcol[i][RUPTURE_SUB_COL]] );
		}
		
		for (i=1; i < NbRow(); i++) {
			
			if ( ArrayData()[i][col] == _ruptureData[_ruptureCount][RUPTURE_GRP_VAL] ) { // still in the same rupture
				_ruptureData[_ruptureCount][RUPTURE_NBROW] += 1;
				for ( j=0; j < subtotalcol.length; j++) {
					_ruptureData[_ruptureCount][RUPTURE_SUM][j] += Number(ArrayData()[i][subtotalcol[j][RUPTURE_SUB_COL]]);
					// we should do some other maths here
					switch (_ruptureData[0][RUPTURE_FUNC][j]) {
					 		case MIN:
								if ( Number(ArrayData()[i][subtotalcol[j][RUPTURE_SUB_COL]]) < _ruptureData[_ruptureCount][RUPTURE_FUNC_RESULT][j] )
					 				_ruptureData[_ruptureCount][RUPTURE_FUNC_RESULT][j] = Number(ArrayData()[i][subtotalcol[j][RUPTURE_SUB_COL]]);
					 			break;
					 		case MAX:
					 			if ( Number(ArrayData()[i][subtotalcol[j][RUPTURE_SUB_COL]]) > _ruptureData[_ruptureCount][RUPTURE_FUNC_RESULT][j] )
					 				_ruptureData[_ruptureCount][RUPTURE_FUNC_RESULT][j] = Number(ArrayData()[i][subtotalcol[j][RUPTURE_SUB_COL]]);
					 			break;
					 }			
				}
			
			} else { // new rupture
				_ruptureData[_ruptureCount][RUPTURE_END_ROW] = i;
				_ruptureRowIndex[_ruptureCount][1] = i-1;
				
				// here we finalize to compute the end result for the rupture
				for ( j=0; j < subtotalcol.length; j++) {
					switch (_ruptureData[0][RUPTURE_FUNC][j]) {
				 		case COUNT:
				 			_ruptureData[_ruptureCount][RUPTURE_FUNC_RESULT][j] = _ruptureData[_ruptureCount][RUPTURE_NBROW];
				 			break;
			 			case SUM:
			 				num = Number(_ruptureData[_ruptureCount][RUPTURE_SUM][j]);
			 				_ruptureData[_ruptureCount][RUPTURE_FUNC_RESULT][j] = num.toFixed(2);
							break;
						case AVG:
							num =  Number( Number(_ruptureData[_ruptureCount][RUPTURE_SUM][j]) / Number(_ruptureData[_ruptureCount][RUPTURE_NBROW]) );
							_ruptureData[_ruptureCount][RUPTURE_FUNC_RESULT][j] = num.toFixed(2);
							break;
					}
				}

				// a new rupture is created
				_ruptureCount++;
				_ruptureData[_ruptureCount] = new Array();
				_ruptureData[_ruptureCount][RUPTURE_GRP_VAL] = ArrayData()[i][col];
				_ruptureData[_ruptureCount][RUPTURE_NBROW] = 1;
				
				_ruptureData[_ruptureCount][RUPTURE_FUNC_RESULT] = new Array();
				_ruptureData[_ruptureCount][RUPTURE_SUM] = new Array();
				
				_ruptureRowIndex[_ruptureCount] = new Array();
				_ruptureRowIndex[_ruptureCount][0] = i;
				
				for ( j=0; j < subtotalcol.length; j++) {
					if ( _ruptureData[0][RUPTURE_FUNC][j] == MIN || _ruptureData[0][RUPTURE_FUNC][j] == MAX )
						_ruptureData[_ruptureCount][RUPTURE_FUNC_RESULT][j] = Number(ArrayData()[i][subtotalcol[j][RUPTURE_SUB_COL]]);
					else
						_ruptureData[_ruptureCount][RUPTURE_FUNC_RESULT][j] = 0;
					_ruptureData[_ruptureCount][RUPTURE_SUM][j] = Number(ArrayData()[i][subtotalcol[j][RUPTURE_SUB_COL]]);
				}
			}
		}
		_ruptureData[_ruptureCount][RUPTURE_END_ROW] = i;
		_ruptureRowIndex[_ruptureCount][1] = i-1;
		
		for ( j=0; j < subtotalcol.length; j++) {
			var num = new Number();
			switch (_ruptureData[0][RUPTURE_FUNC][j]) {
			 		case COUNT:
			 			_ruptureData[_ruptureCount][RUPTURE_FUNC_RESULT][j] = _ruptureData[_ruptureCount][RUPTURE_NBROW];
			 			break;
			 		case SUM:
			 			num = Number(_ruptureData[_ruptureCount][RUPTURE_SUM][j]);
			 			_ruptureData[_ruptureCount][RUPTURE_FUNC_RESULT][j] = num.toFixed(2);
						break;
					case AVG:
						num =  Number( Number(_ruptureData[_ruptureCount][RUPTURE_SUM][j]) / Number(_ruptureData[_ruptureCount][RUPTURE_NBROW]) );
						_ruptureData[_ruptureCount][RUPTURE_FUNC_RESULT][j] = num.toFixed(2);
						break;
			}
		}
		_ruptureCount++; // we add one so that the total count is 1 based.
		_subtotalcol = subtotalcol;
		displayRuptures(col, subtotalcol);
	}
	
	
	
	function displayRuptures(col, subtotalcol) {
		var pDoc, newRow, newCol, newText, newImg, newLink, srow;
		var i,j,k,def, sFunc, r;
		var headerFirstRow;
		
		if ( _ruptureCount <= 0 )
			return;
		// .ownerDocument is a new property of the table object in the DOM
		// For netscape we could use the parentElement property and crawl up to
		// the document object.
		pDoc = _oHTMLGrid.ownerDocument;
		// _ruptureRowIndex = new Array();
		_ruptureHearderRows = new Array();
		
		for ( i=0; i < _ruptureCount; i++ ) {
			newRow = pDoc.createElement("<TR bgcolor='#eeeeee' class='headerRow'>");
			newCol = pDoc.createElement("<TD align='center' valign='center' width='"+ _oHTMLGrid.rows(0).cells(0).width +"'>");
			newLink = pDoc.createElement("<A>");
			
			newLink.id = "a" + _docID + i ;
			newLink.href = "javascript:funcEval('" + _docID + "','hideRupture(" + i + ")')"
			/**********************\
			if( i== 1 ) 
			{
				alert(this.id);
				alert(newLink.outerHTML);
			}
			\***********************/
			newImg = pDoc.createElement("<IMG id='img"+ _docID + i + "' src='" + repViewListImg + "minus.gif' border='0'>")
			newLink.insertBefore(newImg, null);
			newCol.insertBefore(newLink, null);
			newRow.insertBefore(newCol, null);
			for ( j=1; j < NbCol(); j++) {
				headerFirstRow = getElByID('listViewHeader'+_docID).rows(0).cells(j);
				
				// newCol = pDoc.createElement("<TD width='"+ _oHTMLGrid.rows(0).cells(j).width +"' align='right'>");
				newCol = pDoc.createElement("<TD style='font-weight:bold;' width='"+ headerFirstRow.width +"' align='"+ headerFirstRow.align +"'>");
				def = false;
				
				if ( j == col ) {
					newText = pDoc.createTextNode(_ruptureData[i][RUPTURE_GRP_VAL]);
					newCol.insertBefore(newText, null);
					newRow.insertBefore(newCol, null);
					continue;
				}
			
				for (k=0; k < subtotalcol.length; k++) {
					if ( j == subtotalcol[k][RUPTURE_SUB_COL] ) {
						// alert(j + "/" + _colFormat[j]);
						var lResult = _ruptureData[i][RUPTURE_FUNC_RESULT][k];
						var lType = _formatDefs[j].indexOf(_cS)!=-1?TCURRENCY:_colDataType[j];
						var lFormat = _formatDefs[j];
			
						var tmp = applyFormat(lType,Number(lResult),lFormat)
						
						newText = pDoc.createTextNode(tmp);
						def = true;
					}
				}
				
				if ( !def )
					newText = pDoc.createTextNode(" ");
					
				newCol.insertBefore(newText, null);
				newRow.insertBefore(newCol, null);
			}
			

			if ( _ruptureData[i][RUPTURE_END_ROW] != null )
				if ( i==0 ) {
					srow = _oHTMLGrid.rows(0);
				} else {
					// srow = _oHTMLGrid.rows(_ruptureData[i-1][RUPTURE_END_ROW]+i);
					// alert(_ruptureData[i-1][RUPTURE_END_ROW]);
					srow = ArrayData()[_ruptureData[i-1][RUPTURE_END_ROW]][NbCol()];
				}
			else
				srow = null;
				
			r = _oHTMLGrid.children[0].insertBefore(newRow, srow);
			r.state = 'open';
			_ruptureHearderRows[i] = r;
			
		}
		
		var grandtotal = new Array();
		for ( k=0; k < subtotalcol.length; k++ ) { // for each defined rupture
			
			if ( subtotalcol[k][RUPTURE_DISP_TOT] == 1 ) {	// we need to compute the grand total for rupture 'k'
				grandtotal[k] = 0;
				
				for ( i=0; i < _ruptureCount; i++)
						grandtotal[k] += Number(_ruptureData[i][RUPTURE_FUNC_RESULT][k]);
				
				j = getElByID('gtotal'+_docID);
				var colNum = subtotalcol[k][RUPTURE_SUB_COL];
				j.rows(0).children[colNum].innerHTML = applyFormat(_formatDefs[colNum].indexOf(_cS)!=-1?TCURRENCY:_colDataType[colNum],Number(Number(grandtotal[k]).toFixed(2)), _formatDefs[colNum]); 

				j.style.display = "block";
				j.children[0].style.display = "block";
			}
			
			
		}
		_grandtotal = grandtotal;
		
		var lnk = getElByID('listViewHeader'+_docID).rows(0).cells(0).children[0];
		lnk.href = "javascript:funcEval('"+ _docID + "','hideAllRupture()')";
		
		var img=lnk.children[0];
		img.src = repViewListImg + "minus.gif";
	}

	function WGgroup(S) {
		if (S.length<4) {
			return S;
		} else {
			return ( WGgroup(S.substring(0,S.length-3)) + " " + S.substring(S.length-3,S.length) );	
		}
	}
	
	function applyFormat(_type, _number, _format) {
			var strResult = "";
			
			switch ( _type ) {
				case TNUM:
					switch ( _format ) {
						case '0':
							strResult = _number.toFixed(0);
							break;
						case '0.00':
							strResult = _number.toFixed(2);
							break;
						case '# ###':
							strResult = _number.toFixed(0);
							strResult = WGgroup(strResult);
							break;
						case '# ##0.00':
						  	var N = Math.abs(Math.round(_number*100));
						  	var strAmount = ((N<10)?'00':((N<100)?'0':''))+N;
						  	
							var fNumber = WGgroup(strAmount.substring(0,(strAmount.length-2))) + '.' + strAmount.substring((strAmount.length-2),strAmount.length)  	

							if (fNumber == ('0.00'))
								_number = 0;

							if (_number >= 0) {
						  		strResult = fNumber;
							} else {
								strResult = "- " + fNumber;
							}
	
							break;
					}
					break;

				case TCURRENCY:
					switch ( _format ) {
						case '0 '+_cS:
							strResult = String(_number.toFixed(0)) + ' ' + _cS;
							break;
						case '0.00 '+_cS:
							strResult = String(_number.toFixed(2)) + ' ' + _cS;
							break;
						case '# ### '+_cS:
							strResult = _number.toFixed(0);
							strResult = WGgroup(strResult) + ' ' + _cS;
							break;
						case '# ##0.00 '+_cS:
						  	var N = Math.abs(Math.round(_number*100));
						  	var strAmount = ((N<10)?'00':((N<100)?'0':''))+N;
						  	
							var fNumber = WGgroup(strAmount.substring(0,(strAmount.length-2))) + '.' + strAmount.substring((strAmount.length-2),strAmount.length)  	

							if (fNumber == ('0.00'))
								_number = 0;

							if (_number >= 0) {
						  		strResult = fNumber + ' ' + _cS;
							} else {
								strResult = "- " + fNumber + ' ' + _cS;
							}
							break;
					}
					break;
			}
			
			return strResult;
	}
	
	function hideAllRupture() {
		var i;
		
		if (_ruptureCount <= 0)
			return;
			
		for (i=0; i<_ruptureCount; i++) {
				if ( _ruptureHearderRows[i].state == 'open' ) {
					hideRupture(i);
				}
		}

		var lnk = getElByID('listViewHeader'+_docID).rows(0).cells(0).children[0];
		lnk.href = "javascript:funcEval('"+ _docID + "','showAllRupture()')";
		
		var img=lnk.children[0];
		img.src = repViewListImg + "plus.gif";

	}

	function showAllRupture() {
		var i;

		if (_ruptureCount <= 0)
			return;
		
		for (i=0; i<_ruptureCount; i++) {
				if ( _ruptureHearderRows[i].state == 'close' ) {
					showRupture(i);
				}
		}		

		var lnk = getElByID('listViewHeader'+_docID).rows(0).cells(0).children[0];
		lnk.href = "javascript:funcEval('"+ _docID + "','hideAllRupture()')";
		
		var img=lnk.children[0];
		img.src = repViewListImg + "minus.gif";
	}
	
	function hideRupture(r) {
		var i,j, srow, erow, lnk, img;
		
		
		// srow = _ruptureData[r][RUPTURE_END_ROW]+r;	
		// erow = srow - (_ruptureData[r][RUPTURE_NBROW]-1);
		srow = _ruptureHearderRows[r].rowIndex + 1;
		erow = srow + _ruptureData[r][RUPTURE_NBROW] - 1;
		
		
		// alert(srow + ", " + erow);
		// return;
			
		// lnk = _oHTMLGrid.rows(erow-1).cells(0).children[0];
		lnk = _ruptureHearderRows[r].cells(0).children[0];
		// alert(lnk.href);
		lnk.href = "javascript:funcEval('" + _docID + "','showRupture(" + r + ")');";
		
		img = lnk.children[0];
		img.src = repViewListImg + "plus.gif";
		
		// we save the start and end index, the state
		// _oHTMLGrid.rows(_ruptureData[r][RUPTURE_END_ROW]+r).sRow = srow;
		// _oHTMLGrid.rows(_ruptureData[r][RUPTURE_END_ROW]+r).eRow = erow;
		// _oHTMLGrid.rows(_ruptureData[r][RUPTURE_END_ROW]+r).state = 'close';
		if ( _ruptureHearderRows[r].sRow == undefined ) {
			_ruptureHearderRows[r].sRow = srow;
			_ruptureHearderRows[r].eRow = erow;
		}
		_ruptureHearderRows[r].state = 'close';
		
		// alert (srow + ", "+ erow);
		// for (i=srow; i >= erow ; i--)
		for (i=srow; i <= erow ; i++)
			_oHTMLGrid.rows(i).style.display = "none";
		
	}
	
	function showRupture(r) {
		var i, j, srow, erow, lnk, img;

		srow = _ruptureHearderRows[r].sRow;
		erow = _ruptureHearderRows[r].eRow;

		lnk = _ruptureHearderRows[r].cells(0).children[0];
		lnk.href = "javascript:funcEval('"+ _docID + "','hideRupture("+ r +")')";
		
		img = lnk.children[0];
		img.src = repViewListImg + "minus.gif";
	
		for (i=srow; i <= erow ; i++)
			_oHTMLGrid.rows(i).style.display = "block";
		
		_ruptureHearderRows[r].state = 'open';
	}
	
	function delRupture() {
		var p,r,i,j, pDoc;
		
		pDoc = _oHTMLGrid.ownerDocument;
		
		for ( i=0; i < _ruptureCount;  i++ )
			_oHTMLGrid.deleteRow(_ruptureHearderRows[i].rowIndex);
				
		for (i=0; i < NbRow(); i++)
			_oHTMLGrid.rows(i).style.display = "block";
		
		j = getElByID('gtotal'+_docID);
		j.style.display = "none";
		j.children[0].style.display = "none";
		for (i=1; i < j.rows(0).cells.length; i++)
			j.rows(0).cells(i).innerHTML = "";
			
		delete _ruptureData;
		_ruptureData = null;
		delete _ruptureRowIndex;
		_ruptureRowIndex = null;
		delete _ruptureHearderRows;
		_ruptureHearderRows = null;
		delete _subtotalcol;
		_subtotalcol = null;
		delete _grandtotal;
		_grandtotal = null;
		_ruptureCount = 0;
	}
	

	function getruptureData () {
		return _ruptureData;
	}

	function getruptureCount () {
		return _ruptureCount;
	}


	function getcolDataType () {
		return _colDataType;
	}
	
	
	
//	function setcolDataType (cDT) {
//		_colDataType = cDT;
//		return;
//	}
	
	function getArrayData () {
		return ArrayData();
	}
	
	function loadGrid()
	{
		var i;
		var j;
		var re;
		var arr, ss, tmp;
				

		if( _oHTMLGrid == null ) return false;
		
		_nbRow = _oHTMLGrid.rows.length;
		_nbCol = (_nbRow>0)?_oHTMLGrid.rows(0).cells.length:0;
		

    	_objectID = new Array();
    	_objectID[0] = '';
		for (j=1; j < _nbCol; j++)
			_objectID[j] = _oHTMLGrid.rows(0).cells(j).getAttribute("objectID");

		// Stupid !!! change this !!!
		if( _oHTMLGrid.rows(0) != null ) _rowColor = _oHTMLGrid.rows(0).currentStyle.backgroundColor;
		if( _oHTMLGrid.rows(1) != null ) _rowAlternateColor = _oHTMLGrid.rows(1).currentStyle.backgroundColor;
		
		_arrayData = new Array();
		
		for (i=0; i < _nbRow; i++) 
		{
			_arrayData[i] = new Array();
			for (j=1; j < _nbCol; j++) {
				_oHTMLGrid.rows(i).cells(j).className = _DOQ + "O" + _objectID[j]
				tmp = _oHTMLGrid.rows(i).cells(j).innerHTML;
				switch (_colDataType[j]) {
					case TNUM:
					case TCURRENCY:
						re = /,/g;
						tmp = tmp.replace(re, ".");
						re = /[^0-9\.-]/g;
						tmp = tmp.replace(re, "");
						break;
				}
				_arrayData[i][j] = tmp;
			}
	
			_arrayData[i][_nbCol] = _oHTMLGrid.rows(i);
    	}
    	
		// alert(_objectID[4]);
		return true;
  	}
	
	function GetDataByType(value) 
	{
		switch(_dataType)
		{
			case TCHAR:
				return value.toUpperCase();
				break;
			case TNUM:
			case TCURRENCY:
				var oNum = new Number(value);
				if( isNaN(oNum) ) return 0;
				return oNum;
				break;
			case TDATE:
				//alert(Date.parse(value));
				var oDate = parseShortDateTimeFR(value);
				//alert(oDate);
				if( isNaN(oDate) ) return 0;
				return oDate;
				break;
		}
	}
	
	function Sort(Col)
	{
		if ( _ruptureCount <= 0 ) {
			_dataType = _colDataType[Col];
			//setTimeout("ExecSort(" + Col1 + ")", 10);
			ExecSort(Col);
		} else {
			var tempArr;
			var i,k,j=0;
			var tmplastCol = _lastCol;
			var tmpdataType = _dataType;
			
			_lastCol = Col;
			_dataType = _colDataType[Col];
			
			for (k=0; k < _ruptureCount; k++) {
				tempArr = new Array();
				// Copy
				j=0;
				for (i=_ruptureRowIndex[k][0]; i <= _ruptureRowIndex[k][1]; i++) {
					tempArr[j] = new Array();
					tempArr[j] = ArrayData()[i];
					j++;
				}
				// Sort
				tempArr.sort(ArraySort);
				/*
				var strSorted = "";
				for (i=0; i < tempArr.length; i++)
					strSorted += tempArr[i][Col] + ",";
									
				alert(strSorted);
				*/
				// Copy back
				j=0;
				for (i=_ruptureRowIndex[k][0]; i <= _ruptureRowIndex[k][1]; i++) {
					ArrayData()[i] = tempArr[j];
					j++;
				}
				
				
			}
			
			RefreshGrid();
			
			_lastCol = tmplastCol;
			_dataType = tmpdataType;
		}
		
	}
	

	function ExecSort(Col)
	{
		if( ArrayData() == null ) loadGrid();
		if((Col == _lastCol) ) {
			if ( _lastColSortDir == ASC )
				_lastColSortDir = DESC;
			else
				_lastColSortDir = ASC;
			ArrayData().reverse();
		} else 	{
    			_lastCol = Col;
    			_lastColSortDir = ASC;	// first sort will sort ascendently
    			
    			// !!!!! need a sort function for each different data type (faster) !!!!!!
    			ArrayData().sort(ArraySort);
  		}
  		RefreshGrid();
  	}
  	
  	
  	function RefreshGrid()
  	{
  		var i,j,k;
		
  		if ( _ruptureCount <= 0 ) {
  			for (i=0; i < NbRow(); i++) {
  				_oHTMLGrid.moveRow(ArrayData()[i][NbCol()].rowIndex,i);
  				if ( i%2 == 0 )
  					_oHTMLGrid.rows(i).style.backgroundColor = _rowColor;
  				else
  					_oHTMLGrid.rows(i).style.backgroundColor = _rowAlternateColor;
  			}
  		} else {
			for (k=0; k < _ruptureCount; k++) {
				for (i=_ruptureRowIndex[k][0]; i <= _ruptureRowIndex[k][1]; i++) {
	  				_oHTMLGrid.moveRow(ArrayData()[i][NbCol()].rowIndex,i+k+1);
				}
			}

  			for (i=0; i < NbRow(); i++) {
  				if ( ArrayData()[i][NbCol()].state == undefined ) {
	  				if ( i%2 == 0 )
	  					ArrayData()[i][NbCol()].style.backgroundColor = _rowColor;
	  				else
	  					ArrayData()[i][NbCol()].style.backgroundColor = _rowAlternateColor;
	  			}
  			}
							
  		}
     		
  	}
  	

	function ArraySort(n1,n2)
	{
		var val1 = GetDataByType(n1[_lastCol]);
		var val2 = GetDataByType(n2[_lastCol]);
		var retVal;
		
		switch(_dataType)
		{
			case TCHAR:
				if (val1<val2) retVal = -1;
  				else if (val1>val2) retVal = 1;
  				else retVal = 0;
  				break;
			case TNUM:
			case TCURRENCY:
  			case TDATE:
  				retVal = ( val1 - val2 );
				break;
		}			
	
		return retVal;
	}
	
	function clear()
	{
		if( _oHTMLGrid == null ) return;
		while(_oHTMLGrid.rows.length>0)
			_oHTMLGrid.rows[0].removeNode(true);
	}

function parseShortDateTimeFR(stDate)
{
	if( stDate == '' || stDate == null ) return '';
	var index1 = stDate.indexOf("/");
	var stDay = stDate.substr(0, index1);
	var index2 = stDate.lastIndexOf("/");
	var stMonth = stDate.substring(index1+1, index2);
	var stYear = stDate.substring(index2+1,stDate.length);
	
	var d = new Date();
	d.setDate(stDay);
	d.setMonth(stMonth-1);
	d.setYear(stYear);
	
	return d;
	
}



this.showColorDialog = function(wpq) {
	var params = new Array();
	_WPQ = wpq;
	
	params[0] = window;
	params[1] = wpq;
	params[2] = this;
	params[3] = _formatDefs;
	
	// _rules[_findCSSRule("." + _DOQ + "O" + _objectID[2])].style.backgroundColor = "#FFFFFF";
	
	var retValue = window.showModalDialog('viewList/bgColorDlg.html', params,'dialogWidth:100,dialogHeight:100,scroll:no,status:no,toolbar:no,menubar:no,location:no,resizable:no');
		
	if ( retValue != null ) {

	}
	
	
	return;	
}

/*****************/
/* CSS Functions */
/*****************/
function _initCSS() {
	// Looking for our stuff
	for (var i=0; i<document.styleSheets.length; i++) {
		if (document.styleSheets[i].href.indexOf('sqlvision')>-1)
			break;
	}
	_sheet = document.styleSheets[i];
	_rules = _sheet.rules;	
	
	for (var i=1;i<NbCol();i++) {
		_sheet.addRule("." + _oHTMLGrid.rows(0).cells(i).className, "border-width: 0px", -1);
	}
}

function _findCSSRule(selector) {
	for(var i=0;i<_rules.length;i++)
		if(_rules[i].selectorText.toUpperCase()==selector.toUpperCase())
			return i;
	return -1;
}


/**********************************/
/* Rupture Dialog Box             */
/**********************************/

function initRuptureDlg() {
	var i, j;

  // Process mousemove.
  //document.onmousedown = doMouseDown;
  //document.onmousemove = doMouseMove;
  // Reset element on mouseup.
  //document.onmouseup = doMouseUp;
  //document.onselectstart = doSelectStart;	
	if ( !_beenThere ) {
		
		var ruptureCol = eval("ruptureCol"+_WPQ);
		var ruptureDef = eval("ruptureDef"+_WPQ);
		
		var j=0;
		for (i=1; i < _colDataType.length; i++) {
			if ( _colDataType[i] == TNUM || _colDataType[i] == TCURRENCY ) {
				_possibleSubCols[j] = i;
				// _possibleSubCols[j] = new Array();
				// _possibleSubCols[j][0] = i; //we store the column number
				// _possibleSubCols[j][1] = _rupDlgWin.document.getElementById('col'+i);
				// _possibleSubCols[j][2] = _rupDlgWin.document.getElementById('func'+i);
				// _possibleSubCols[j][3] = _rupDlgWin.document.getElementById('chk'+i);
				j++;
			}
		}
	
		// UI state array init
		// this UI contains 4 different parts : ruptures, champs, fonctions, total général
		// Part I : ruptures. We'll store the index of the selected radio button, ruptCol[?]
		// Part II : champs. We'll store the name of the selected controls, col?
		// Part III : fonctions. We'll store the index of the selected functions, func?
		// Part IV : total général. We'll store either 1 or 0 depending on the state of each checkboxes, chk?
		_UIstate = new Array(_possibleSubCols.length + 1);
		_UIstate[0] = 0;
		
		for (i=1; i < _possibleSubCols.length + 1; i++) {
			_UIstate[i] = new Array(3); // 3 -> part 2, 3 and 4 defined above
			_UIstate[i][0] = 0;
			_UIstate[i][1] = 0;
			_UIstate[i][2] = 0;  
		}
	
		if( ruptureCol != null || ruptureDef != null ) {
			_nbSubCol = ruptureDef.length;
			_rCol = ruptureCol;
			
			_UIstate[0] = _rCol - 1;
			
			for (j=0; j < _nbSubCol; j++) {
				_userdefs[j] = ruptureDef[j][0];
				
				for (i=0; i<_possibleSubCols.length; i++) {
					if ( _possibleSubCols[i]== ruptureDef[j][0] ) {
						_UIstate[i+1][0] = 1;
						_UIstate[i+1][1] = ruptureDef[j][1];
						_UIstate[i+1][2] = ruptureDef[j][2];
					}
				}					
			}
	
		} else {
	
			_nbSubCol = 0;
			_rCol = 0;
			_areEnabled = false;
		
			for (i=0; i < _rupDlgWin.document.getElementsByName('ruptCol').length; i++)
				_rupDlgWin.document.getElementsByName('ruptCol')[i].checked = false;			
		}
		
		_beenThere = true;
		return true;
	}
	
	return false;
}

function selectedCol(selectedCol) {
	var i;

	// _rupDlgWin.alert(_rCol);
	//return;
	
	if ( !_areEnabled ) {
		for (i=0; i<_possibleSubCols.length; i++) {
			_rupDlgWin.document.getElementById('col'+_possibleSubCols[i]).disabled=false;
			_rupDlgWin.document.getElementById('label'+_possibleSubCols[i]).style.color='black';
			
			//eval ("func"+possibleSubCols[i]+".disabled=false");
			//eval ("chk"+possibleSubCols[i]+".disabled=false");
		}
		_areEnabled = true;	//will almost never go back to false ! Once a radio is selected from a group, user can't set the selection back to nothing !!!
	}
	//alert(ruptureCol);
	
}

function selectedSubCol(isChecked, selectedsubCol) {
	var i, action, subCol;
	
	// action = window.event.srcElement.checked;
	// subCol = window.event.srcElement.value;
	action = isChecked;
	subCol = selectedsubCol;
	
	// alert("selectedSubCol: isChecked=" + isChecked + ", selectedSubCol=" + selectedsubCol);
	if ( action ) {  // if checkbox checked
		_rupDlgWin.document.getElementById('func'+subCol).disabled=false;
		_rupDlgWin.document.getElementById('func'+subCol).options(1).selected=true; // SUM by default
		_rupDlgWin.document.getElementById('chk'+subCol).disabled=false;
		_rupDlgWin.document.getElementById('chk'+subCol).checked=true; // by default grand total is selected

		_userdefs[_nbSubCol] = subCol;
		_nbSubCol++;

	} else { // checkbox was unchecked
		_rupDlgWin.document.getElementById('func'+subCol).disabled=true;
		_rupDlgWin.document.getElementById('func'+subCol).options(0).selected=true; // empty item selected
		_rupDlgWin.document.getElementById('chk'+subCol).checked=false;
		_rupDlgWin.document.getElementById('chk'+subCol).disabled=true;

		_nbSubCol--;
	}
}

function selectedFunc(srcEl) {
	var i, e, subFunc;
	
	
	// e = window.event.srcElement;
	e = srcEl;
	subFunc = e.value;
	
	if ( subFunc == 0 ) {	// user can't select the empty item
		e.options(1).selected=true; // SUM by default
	}
}

function okButton() {
	var i, funcCtrl, gTotalCtrl;
	
	for (i=0; i < _rupDlgWin.document.getElementsByName('ruptCol').length; i++)
		if (_rupDlgWin.document.getElementsByName('ruptCol')[i].checked == true)
			_rCol = _rupDlgWin.document.getElementsByName('ruptCol')[i].value;
			
	// let's do some checking and then collect data for the rupture function
	if ( _rCol == 0 ) { // nothing have been touched
		//alert("rCol = 0");
		_rupDlgWin.close();
		return;
	}

	if ( _nbSubCol == 0 ) { // user selected a column but did not define any sub-totals column... crazy user...
		//alert("nbSubCol = 0");
		saveUIstate();
		_rupDlgWin.close();
		return;
	}
	
	if ( UIstateHasChanged() ) {
		delete ruptureDef;
		ruptureDef = new Array();
	
		for (i=0; i < _nbSubCol; i++) {
			ruptureDef[i] = new Array(); 
		
			funcCtrl = _rupDlgWin.document.getElementById('func'+_userdefs[i]);
			gTotalCtrl = _rupDlgWin.document.getElementById('chk'+_userdefs[i]);
	
			ruptureDef[i][0] = parseInt(_userdefs[i], 10);
			ruptureDef[i][1] = parseInt(funcCtrl.options[funcCtrl.selectedIndex].value, 10);
			ruptureDef[i][2] = parseInt(gTotalCtrl.checked ? 1 : 0, 10);
			
			// alert(_rCol + "," + ruptureDef[i][0]+ ","+ ruptureDef[i][1]+ ","+ ruptureDef[i][2]);
		}
	
	    //alert(ruptureDef.length + " -> " + ruptureDef);
	
		saveUIstate();
		delRupture();
		Rupture(_rCol, ruptureDef);
	}
	
	// getElByID('rupDlgWin'+_docID).style.display = "none";
	_rupDlgWin.close();
	return;
}

function cancelButton() {

	if ( _rCol != 0 ) {
		// ruptureCol = _rCol;
		// restoreUIstate();
	}
	
	// getElByID('rupDlgWin'+_docID).style.display = "none";
	_rupDlgWin.close();
	return;
}

function eraseButton() {
	var i;
	
	_nbSubCol = 0;
	_rCol = 0;

	for (i=0; i<_possibleSubCols.length; i++) {
		_rupDlgWin.document.getElementById('label'+_possibleSubCols[i]).style.color='lightgrey';
		_rupDlgWin.document.getElementById('col'+_possibleSubCols[i]).disabled=true;
		_rupDlgWin.document.getElementById('func'+_possibleSubCols[i]).disabled=true;
		_rupDlgWin.document.getElementById('chk'+_possibleSubCols[i]).disabled=true;
		
		_rupDlgWin.document.getElementById('col'+_possibleSubCols[i]).checked=false;
		_rupDlgWin.document.getElementById('func'+_possibleSubCols[i]).options(0).selected=true;
		_rupDlgWin.document.getElementById('chk'+_possibleSubCols[i]).checked=false;
	}
	
	for (i=0; i < _rupDlgWin.document.getElementById('ruptCol').length; i++)
		_rupDlgWin.document.getElementById('ruptCol')[i].checked = false;	
	
	_areEnabled = false;
	
	saveUIstate();
	delRupture();
	
	// getElByID('rupDlgWin'+_docID).style.display = "none";
	_rupDlgWin.close();
	return;
}



function saveUIstate() {
	var i;
	
	// alert("saveUIstate");

	_UIstate[0] = _rCol-1;
	for (i=1; i < _possibleSubCols.length + 1; i++) {
		_UIstate[i][0] = _rupDlgWin.document.getElementById('col'+_possibleSubCols[i-1]).checked ? 1 : 0;
		_UIstate[i][1] = _rupDlgWin.document.getElementById('func'+_possibleSubCols[i-1]).selectedIndex;
		_UIstate[i][2] = _rupDlgWin.document.getElementById('chk'+_possibleSubCols[i-1]).checked ? 1 : 0;
	}
}

function restoreUIstate() {
	var i, radios;
	
	// alert("restoreUIstate");

	radios = _rupDlgWin.document.getElementsByName('ruptCol');
	radios[_UIstate[0]].click();
	
	for (i=1; i < _possibleSubCols.length + 1; i++) {
		if ( _UIstate[i][0] == 1 ) {
			_rupDlgWin.document.getElementById('col'+_possibleSubCols[i-1]).click();
			_rupDlgWin.document.getElementById('func'+_possibleSubCols[i-1]).options(_UIstate[i][1]).selected = true;
			_rupDlgWin.document.getElementById('chk'+_possibleSubCols[i-1]).checked = _UIstate[i][2];
		}		
	}

}

function UIstateHasChanged() {	// return true if UI state have changed, false otherwise
	
	if ( _UIstate[0] != (_rCol-1) )
		return true;
	
	for (i=1; i < _possibleSubCols.length + 1; i++) {
		if ( _UIstate[i][0] != _rupDlgWin.document.getElementById('col'+_possibleSubCols[i-1]).checked )
			return true;
		
		if ( _UIstate[i][1] != _rupDlgWin.document.getElementById('func'+_possibleSubCols[i-1]).selectedIndex )
			return true
		
		if ( _UIstate[i][2] != _rupDlgWin.document.getElementById('chk'+_possibleSubCols[i-1]).checked )
			return true;
	}
	
	return false;
}

function showRuptureDialog(wpq) {
	var params = new Array();
	_WPQ = wpq;
	
	params[0] = window;
	params[1] = wpq;
	params[2] = this;
	
	var retValue = window.showModalDialog('viewList/ruptureDlg.html', params,'dialogWidth:100,dialogHeight:100,scroll:no,status:no,toolbar:no,menubar:no,location:no,resizable:yes');
		
	return;
}

function setRupDlgWin(rupDlgWin) {
	_rupDlgWin = rupDlgWin;
}

function getareEnabled() {
	return _areEnabled;
}

function getrCol() {
	return _rCol;	
}

/**********************************/
/* Alert Dialog Box               */
/**********************************/
function showAlertDialog(wpq) {
	var params = new Array();
	_WPQ = wpq;
	
	params[0] = window;
	params[1] = wpq;
	params[2] = this;
	params[3] = _alertDefs;
	params[4] = _hideLines;
	
	var retValue = window.showModalDialog('viewList/alertDlg.html', params,'dialogWidth:100,dialogHeight:100,scroll:no,status:no,toolbar:no,menubar:no,location:no,resizable:no');
	
	if ( retValue != null ) {
		_alertDefs = retValue[0];
		_hideLines = retValue[1];
	}
	
	return;
}


/**********************************/
/* Format Dialog Box              */
/**********************************/
function showFormatDialog(wpq) {
	var params = new Array();
	_WPQ = wpq;
	
	params[0] = window;
	params[1] = wpq;
	params[2] = this;
	params[3] = _formatDefs;
	
	// alert("Format dialog for " + wpq);
	
	var retValue = window.showModalDialog('viewList/formatDlg.html', params,'dialogWidth:100,dialogHeight:100,scroll:no,status:no,toolbar:no,menubar:no,location:no,resizable:no');
	
	if ( retValue != null ) {
		_formatDefs = retValue;
		applyColumnFormat();
	}

	return;
}

/**********************************/
/* Print Dialog Box              */
/**********************************/
function showPrintDialog(wpq) {
	var params = new Array();
	_WPQ = wpq;
	
	params[0] = "lv";
	params[1] = getElByID(_docID + "_ForPrinting").innerHTML;
	// params[2] = this;
	// params[3] = ;
	
	// alert("Print dialog for " + wpq);
	
	var retValue = window.showModalDialog('DocPrint.htm', params,'dialogWidth:100,scroll:no,status:no,toolbar:no,menubar:no,location:no');
	
	return;
}

function applyColumnFormat() {
	var i,j,k;
	var isSubTotal, isGrandTotal;
	var myValue;
	var myFormat;
	
	for (i=1; i < NbCol(); i++) {
		
		if (_formatDefs[i]=='') {
			continue;
		}
		var j;

		myFormat = _formatDefs[i].indexOf(_cS)!=-1?TCURRENCY:_colDataType[i];
		
		for (j=0; j<NbRow(); j++) {
			myRow = ArrayData()[j][NbCol()];
			myRow.cells(i).innerHTML = applyFormat(myFormat, Number(ArrayData()[j][i]), _formatDefs[i]);
		}
		
		isSubTotal = false;
		isGrandTotal = false;
		
		if ( _subtotalcol != null ) {
			for (k=0; k < _subtotalcol.length; k++) {
				if ( i == _subtotalcol[k][RUPTURE_SUB_COL] ) {
					isSubTotal = true;
					if ( _subtotalcol[k][RUPTURE_DISP_TOT] == 1 )
						isGrandTotal = true;
					break;
				}
			}
			
			if (isSubTotal == true) {
				for (j=0; j < _ruptureCount; j++) {
					myRow = _ruptureHearderRows[j];
					myValue = _ruptureData[j][RUPTURE_FUNC_RESULT][k];
					myRow.cells(i).innerHTML = applyFormat(myFormat, Number(myValue), _formatDefs[i]);
				}
				if (isGrandTotal) {
					gtTable = getElByID('gtotal'+_docID);
					myValue = _grandtotal[k];
					gtTable.rows(0).cells(i).innerHTML = applyFormat(myFormat, Number(myValue), _formatDefs[i]);
				}
			}
			
		}

		
		// if () {
			
		// }	
	}
}


/************************************/
/*   Drag'n'Drop                    */
/************************************/
  function doMouseMove() {
    // Check if mouse button is down and if an element is being dragged
    if ((event.button == 1) && (_elDragged != null)) {
      // Move the element
      // Where the mouse is in the document
      var intTop = event.clientY+document.body.scrollTop; 
      var intLeft = event.clientX + document.body.scrollLeft;
      // Calculate what element the mouse is really in
      var intLessTop  = 0; var intLessLeft = 0;
      var elCurrent = _elDragged.offsetParent;
      while (elCurrent.offsetParent!=null) {
        intLessTop+=elCurrent.offsetTop;
        intLessLeft+=elCurrent.offsetLeft;
        elCurrent = elCurrent.offsetParent;
      }
      // Set new position
      _elDragged.style.pixelTop = intTop  - intLessTop - _elDragged.y;
      _elDragged.style.pixelLeft = intLeft - intLessLeft  - _elDragged.x;
      event.returnValue = false;
    }
  }

  function checkDrag(elCheck) {
    // Check if the clicked inside an element that supports dragging
    while (elCheck!=null) {
      if (elCheck.getAttribute("dragEnabled")!=null) 
        return elCheck.parentElement;
      elCheck = elCheck.parentElement;
    }      

/*	if (elCheck.getAttribute("id") == "rupDlgTitleBar" || elCheck.getAttribute("id") == "alertDlgTitleBar" || elCheck.getAttribute("id") == "defAlertDlgTitleBar") {
		elCheck = elCheck.parentElement;
		return elCheck;
	}*/
    return null;
  }

  function doMouseDown() {
    // Store element on mousedown.  Called from click handler in code below .
    // All elements that have a "dragEnabled" attribute and are positioned
    // can be dragged.
    var elCurrent = checkDrag(event.srcElement)
    if (elCurrent!=null) {
        _elDragged = elCurrent;
        // Determine where the mouse is in the element
        _elDragged.x = event.offsetX;
        _elDragged.y = event.offsetY;
        var op = event.srcElement;
        // Find real location in respect to element being dragged.
        if ((_elDragged!=op.offsetParent) && (_elDragged!=event.srcElement)) {
          while (op!=_elDragged) {
            _elDragged.x+=op.offsetLeft;
            _elDragged.y+=op.offsetTop;
            op=op.offsetParent;
          }
        }
    }
  }

  function doSelectStart() {
    // Don't start text selections in dragged elements.
	//alert(event.srcElement.tagName);
    if ( event.srcElement.tagName == "INPUT" ) {
    	//alert("Selection started");
    	return true;
    }
    
    return (checkDrag(event.srcElement)==null && (_elDragged!=null))
  }
  
  function doMouseUp() {
  	_elDragged = null;
  }

	

}


		
	
	
	/*---------------------*/
	/* VIEW MAILING OBJECT */
	/*---------------------*/
	function ViewMailingDef(id,pageCount)
	{
		var _currentPage	= 1;

		this.id = id;
		this.pageCount = pageCount;
		this.getCurrentPage = getCurrentPage;
		
		this.MoveFirst = MoveFirst;
		this.MoveLast = MoveLast;
		this.MoveNext = MoveNext;
		this.MovePrev = MovePrev;
		this.Print = Print;
		
		function getCurrentPage()
		{
			return _currentPage;
		}
		
		function Print(all,from,to,custom)
		{
			if (all)
			{
				pPrint(1, pageCount);
			} else {
				if (custom=='')
				{
					if ( (from < 1) || (from>to) || (to>pageCount) )
						return false;
					else
						pPrint(from,to);
				} else {
					// Custom page selection
					// eg: 1-4;9;12-19
				}
			}
			return true;
		}
		
		function pPrint(from,to)
		{
			var i;
			var j=0;
			var params = new Array();
			params[0] = "vm";
			params[1] = new Array();
			
			for( i=from; i<=to; i++ )
			{
				params[1][j++] = getElByID(id + i).innerHTML;
			}
			
			var retValue = window.showModalDialog('DocPrint.htm', params,'dialogWidth:100,dialogHeight:100,scroll:yes,status:no,toolbar:no,menubar:no,location:no,resizable:no');
			
		}
		
		function pUpdatePageNav()
		{
			getElByID("pageInfo"+id).innerText = _currentPage + "/" + pageCount;
		}
		
		function MoveFirst()
		{
			if( pageCount > 0 )
			{
				try { // When calling MoveFirst right after an init, 'getElByID' is undefined thus generating an jScript Error !
					getElByID(this.id + _currentPage).style.display = 'none';
				} catch (e) { 
					// alert(e.number & 0xFFFF); // -> 424, Object Required
				}
				_currentPage = 1;
				document.getElementById(this.id + _currentPage).style.display = 'block';
				pUpdatePageNav();
			}
		}
		
		function MovePrev()
		{
			if( _currentPage >  1 )
			{
				getElByID(this.id + _currentPage).style.display = 'none';
				_currentPage--;
				getElByID(this.id + _currentPage).style.display = 'block';
				pUpdatePageNav();
			}
			return ( _currentPage >  1 );
		}

		function MoveNext()
		{
			if( _currentPage <  pageCount )
			{
				getElByID(this.id + _currentPage).style.display = 'none';
				_currentPage++;
				getElByID(this.id + _currentPage).style.display = 'block';
				pUpdatePageNav();
			}
			return ( _currentPage <  pageCount );
		}

		function MoveLast()
		{
			if( pageCount > 0 )
			{
				getElByID(this.id + _currentPage).style.display = 'none';
				_currentPage = pageCount;
				getElByID(this.id + _currentPage).style.display = 'block';
				pUpdatePageNav();
			}
		}		
		
	}	
	
	
	
	
	/*-----------------------------------------*/
	/* CRITERIA MANAGER COLLECTION OBJECT 	   */
	/*-----------------------------------------*/	
	function CMCollectionDef()
	{
		var _listCM = new Collection();
		
		this.FindCM = FindCM;
		this.AddCM = AddCM;
		this.RemoveCM = RemoveCM;
		this.FindCMById = FindCMById;
	
		function FindCMById(Id)
		{
			var i;
			for( i=0; i<_listCM.Count(); i++ )
			{
				if( _listCM.Item(i).id == Id )
					return _listCM.Item(i);
			}
			return null;
		}		

		function FindCM(Index)
		{
			if (isNaN(Index))
			{
				var i;
				for( i=0; i<_listCM.Count(); i++ )
				{
					if( _listCM.Item(i).id == Index )
						return i;
				}
				return -1;
			}
			else
			{
				if( Index < 0 || Index >= _listCM.Count() )
					return -1;
				else
					return Index;
			}
		}

		function CM(Index)
		{
			var CMIndex;
			CMIndex = FindCM(Index);
			if (CMIndex >= 0)
				return _listCM.Item(CMIndex);
			else
				return null;
		}

		function AddCM(WPQualifier,DocumentID,url,fCreateIFrame)
		{
			var CMIndex;
			var NewCM;
			
			
			CMIndex = FindCM(DocumentID);
			
			if (CMIndex >= 0)
				return null;
			
			NewCM = new CriteriaManagerDef(WPQualifier,DocumentID,url,fCreateIFrame);
			
			_listCM.Add(NewCM);
			this.Count = _listCM.Count();
			
			return NewCM;
		}

		function RemoveCM(Index)
		{
			_listCM.Remove(FindCM(Index));
			this.Count = _listCM.Count();
		}
		
		function ClearCM()
		{
			var i;
			for(i=0;i<this.Count;i++)
				RemoveCM(i);
			
		}			
		
	}
	
	
	/*-----------------------------*/
	/* CRITERIA DATA EVENT	 	   */
	/*-----------------------------*/		
	function CriteriaDataEvent(IdDatabase,IdDomain,IdObject,LabelObject,TypeObject,Operator,Value)
	{
		this.IdDatabase = IdDatabase;
		this.IdDomain = IdDomain;
		this.IdObject = IdObject;
		this.LabelObject = LabelObject;
		this.TypeObject = TypeObject;
		this.Operator = Operator;
		this.Value = Value;
	}
	
	
	
	/*-----------------------------*/
	/* CRITERIA MANAGER OBJECT 	   */
	/*-----------------------------*/	
	function CriteriaManagerDef(WPQualifier,DocumentID,url,fCreateIFrame)
	{
		var _listCriteria = new Collection();
		var _listObject = new Collection();
		var _DocumentID = DocumentID;
		var _WPQualifier	= WPQualifier;
		var _urlStore = url;
		var _Frame = null;
		var _fCreateIFrame = fCreateIFrame
		
		
		this.id = _DocumentID;
		this.Save = Save;
		this.init = init;
		this.AddCriteria = AddCriteria;
		this.ClearCriteria = ClearCriteria;
		this.FindCriteriaById = FindCriteriaById;
		this.FindCriteriaByObjectId = FindCriteriaByObjectId;
		this.ChangeCriteria = ChangeCriteria
		this.SendCriteria = SendCriteria;
		this.SetGlobalCriteria = SetGlobalCriteria;
		
		
		
		function init()
		{
			if( _fCreateIFrame )
			{
				var nameFrame = "__ICriteriaSave" + _DocumentID;
				document.write("<IFRAME ID='" + nameFrame + "' style='display:none;' src='blank.html'></IFRAME>"); //
				_Frame = document.frames(nameFrame)
			}
		}
		
		function FindCriteriaById(Id)
		{
			var i;
			for( i=0; i<_listCriteria.Count(); i++ )
			{
				if( _listCriteria.Item(i).id == Id )
					return _listCriteria.Item(i);
			}
			return null;
		}		
		
		function FindCriteriaByObjectId(Id)
		{
			var i;
			for( i=0; i<_listCriteria.Count(); i++ )
			{
				if( _listCriteria.Item(i).IDObject == Id )
					return _listCriteria.Item(i);
			}
			return null;
		}			

		function FindCriteria(Index)
		{
			if (isNaN(Index))
			{
				var i;
				for( i=0; i<_listCriteria.Count(); i++ )
				{
					if( _listCriteria.Item(i).id == Index )
						return i;
				}
				return -1;
			}
			else
			{
				if( Index < 0 || Index >= _listCriteria.Count() )
					return -1;
				else
					return Index;
			}
		}

		function Criteria(Index)
		{
			var CriteriaIndex;
			CriteriaIndex = FindCriteria(Index);
			if (CriteriaIndex >= 0)
				return _listCriteria.Item(CriteriaIndex);
			else
				return null;
		}

		function AddCriteria(IDCriteria,HTMLElem,ViewType,DataType)
		{
			var oCriteria = null;
			var NewCriteria;
			
			
			oCriteria = FindCriteriaById(IDCriteria);
			
			if (oCriteria != null)
				return oCriteria;
			
			NewCriteria = new CriteriaDef(IDCriteria,HTMLElem,ViewType,DataType);
			
			_listCriteria.Add(NewCriteria);
			this.Count = _listCriteria.Count();
			
			return NewCriteria;
		}

		function RemoveCriteria(Index)
		{
			_listCriteria.Remove(FindCriteria(Index));
			this.Count = _listCriteria.Count();
		}
		
		function ClearCriteria()
		{
			var i;
			for(i=0;i<this.Count;i++)
				RemoveCriteria(i);
			
		}
		
		function Save(Cmd)
		{
			var strXML = "<CriterionList>";
			var i;
			
			for(i=0;i<_listCriteria.Count();i++)
			{
				strXML = strXML + _listCriteria.Item(i).Save();
			}
			strXML = strXML + "</CriterionList>";
			SendCriteria(Cmd,strXML);
		
		}
		
		function SendCriteria(Cmd,xmlProps)
		{
			
			var frmCriteria;
			
			if( _fCreateIFrame )
			{
				if( typeof(_Frame.document.all.__FRM_CriteriaSave) == "undefined"  )
				{
					var strFrm = "<FORM id='__FRM_CriteriaSave' Method='POST' action='" + _urlStore + "' ><INPUT TYPE='TEXT' NAME='Cmd' VALUE='' ><INPUT TYPE='TEXT' NAME='WPQualifier' VALUE='' ><INPUT TYPE='TEXT' NAME='DocumentID' VALUE='' ><INPUT TYPE='TEXT' NAME='xmlProps' VALUE=''></FORM>";
					_Frame.document.write(strFrm);
				}
				frmCriteria = _Frame.document.all.__FRM_CriteriaSave;
			}
			else
			{
				frmCriteria = getElByID("__FRM_CriteriaSave" + _WPQualifier);	
				frmCriteria.action = _urlStore;
			}
			
			frmCriteria.Cmd.value = Cmd;
			frmCriteria.WPQualifier.value = _WPQualifier;
			frmCriteria.DocumentID.value = _DocumentID;
			frmCriteria.xmlProps.value = xmlProps;
			frmCriteria.submit();			
			
		}
		
		function SetGlobalCriteria(paramEvent)
		{
			var strXML = "<GlobalCriteria IdObject='" + paramEvent.IdObject + "' Operator='=' >";
			strXML +=  "<Value>" + paramEvent.Value + "</Value>";
			strXML += "</GlobalCriteria>";
			SendCriteria('SetGlobalCriteria',strXML);
			
			//try{
				if( HasWindowOpener() )
					window.opener.SetDisplayGlobalFilter(paramEvent.IdDomain,paramEvent.LabelObject,paramEvent.Operator,paramEvent.Value);
				else
					SetDisplayGlobalFilter(paramEvent.IdDomain,paramEvent.LabelObject,paramEvent.Operator,paramEvent.Value);
			//}
			//catch(e){}
			
		}
		
		
		
		function ChangeCriteria(paramEvent)
		{
			
			var oIDObject = paramEvent.IdObject;
			var oValue = paramEvent.Value;
			var oCriteria = FindCriteriaByObjectId(oIDObject);
			if( oCriteria != null )
			{
				var strXML = "<CriterionList>";
				strXML +=  oCriteria.Xml("<Value>" + oValue + "</Value>");
				strXML += "</CriterionList>";
				SendCriteria('0',strXML);
				//var oWP = eval('varPart' + _WPQualifier);
				
				//oWP.setVisible(true);
			}
		}

	}

	/*-----------------------------*/
	/* CRITERIA OBJECT 	   		   */
	/*-----------------------------*/
	function CriteriaDef(IDCriteria,IDObject,HTMLElem,ViewType,DataType)
	{
		
		this.id = IDCriteria;
		this.IDObject = IDObject;
		this.HTMLElem = HTMLElem;
		this.ViewType = ViewType;
		this.DataType = DataType;
		this.IsSave = 0;
		this.Ignore = 0;
		this.InheriteContact = 0;
		this.IsActivate = false;
		this.Save = Save;
		this.Xml = GetXml;
		
		
		function Save()
		{
			var strXML = "";
			var oHTMLElem = null;
			
			oHTMLElem = document.getElementById(HTMLElem);
			if( this.IsActivate && oHTMLElem != null )
			{
				strXML = "<Criterion IDCriterion=\"" + this.id + "\" Save=\"" + this.IsSave + "\" Ignore=\"" + this.Ignore + "\" InheriteContact=\"" + this.InheriteContact + "\" >";
				strXML += "<Values>";
				if( this.InheriteContact == 1 )
				{
					strXML += "<Value>_IDCONTACT_</Value>";
				}
				else
				{
					switch(ViewType)
					{
						case VIEW_TEXT:
						case VIEW_SIMPLELIST:
						case VIEW_CHOICE:				
							strXML += "<Value>" + oHTMLElem.value + "</Value>";
							break;
						case VIEW_MULTIPLELIST:
							var options = oHTMLElem.options;
							var i;
							for(i=0;i<options.length;i++)
							{
								if( options.item(i).selected )	strXML += "<Value>" + options.item(i).value + "</Value>";
							}
							break;
					}
				}
				strXML += "</Values></Criterion>";
			}
			this.IsActivate = false;
			
			return strXML;
				
		}
		
		function GetXml(value)
		{
			var strXML = "";
			
			strXML = "<Criterion IDCriterion=\"" + this.id + "\" Save=\"" + this.IsSave + "\">";
			strXML += "<Values>";
			if( value != null && value != "" )
			{
				strXML += value;
			}
			strXML += "</Values></Criterion>";
			return strXML;
		}
		
		
		function ClearValue()
		{
			switch(ViewType)
			{
				case VIEW_TEXT:
				case VIEW_SIMPLELIST:
				case VIEW_CHOICE:				
					HTMLElem.value = ''
					break;
				case VIEW_MULTIPLELIST:
					var options = HTMLElem.options;
					var i;
					for(i=0;i<options.length;i++)
						options.item(i).selected = false;
					break;
			}
		}
	}
	
	
/************************************************************************************/
/* Entry Point : 																	*/
/************************************************************************************/

PREFIX_ELEMENT	= "_sqlv_";
var repTBCImg='Pictures/TBC/';
var repViewListImg='Pictures/ViewList/';

var _CMCollection = new CMCollectionDef();
var _SQLVManagerObject = new SQLVManagerDef();

function RegisterCriteriaManager(WPQualifier,DocumentID,url,fCreateIFrame)
{
	var oManager = _CMCollection.AddCM(WPQualifier,DocumentID,url,fCreateIFrame);
	if( oManager != null )
	{
		oManager.init();
		if( typeof(RegisterEvent) != "undefined" )
			RegisterEvent("www.activportal.mc:SQLVCriteria","OnCriteriaChange",oManager.ChangeCriteria);
	}
	return oManager;
}

function GetCriteriaManager(DocumentID)
{
	return  _CMCollection.FindCMById(DocumentID);
}

function RegisterCriteria(DocumentID,IDCriteria,IDObject,HTMLElem,ViewType,DataType,IsActivate)
{
	var oManager = _CMCollection.FindCMById(DocumentID);
	if( oManager != null ) 
	{
		var oCriteria = oManager.AddCriteria(IDCriteria,IDObject,HTMLElem,ViewType,DataType);
		oCriteria.IsActivate = IsActivate;
		
		var oFunc = null;
		oFunc = RequestAvailableInfos("www.activportal.mc:SQLVCriteria","Criteria_O" + String(IDObject));
		if( oFunc != null && oFunc() != null)
		{
			var paramArray = new Array();
			paramArray[0] = IDObject;
			paramArray[1] = oFunc();
			
			oManager.ChangeCriteria(paramArray);
		}
		
		return oCriteria
	}
	return null;
}


function CheckSaveCriteria(DocumentID,IDCriteria,CheckElem)
{
	var oManager = _CMCollection.FindCMById(DocumentID);
	if( oManager != null )
	{
		var oCriteria = oManager.FindCriteriaById(IDCriteria);
		if( oCriteria != null )
			oCriteria.IsSave = CheckElem.value;
	}
}


function CheckIgnoreCriteria(DocumentID,IDCriteria,CheckElem)
{
	var oManager = _CMCollection.FindCMById(DocumentID);
	if( oManager != null )
	{
		var oCriteria = oManager.FindCriteriaById(IDCriteria);
		if( oCriteria != null )
			oCriteria.Ignore = CheckElem.value;
	}
}

function CheckInheriteContact(DocumentID,IDCriteria,CheckElem)
{
	var oManager = _CMCollection.FindCMById(DocumentID);
	if( oManager != null )
	{
		var oCriteria = oManager.FindCriteriaById(IDCriteria);
		if( oCriteria != null )
			oCriteria.InheriteContact = CheckElem.value;
	}
}

function NextCriteria(DocumentID)
{
	
	var oManager = _CMCollection.FindCMById(DocumentID);
	oManager.Save(NEXT_CRITERIA);
}

function PrevCriteria(DocumentID)
{
	var oManager = _CMCollection.FindCMById(DocumentID);
	oManager.Save(PREV_CRITERIA);
}

function ResetCriteria(DocumentID)
{
	var oManager = _CMCollection.FindCMById(DocumentID);
	oManager.SendCriteria("ResetCriteria","");
}

function SendGlobalCriteria(DocumentID,paramCriteria)
{
	var oManager = _CMCollection.FindCMById(DocumentID);
	oManager.SetGlobalCriteria(paramCriteria);
}

function initializeVM(ID,PageCount)
{
	_SQLVManagerObject.Remove(PREFIX_ELEMENT + ID);
	var oVM = _SQLVManagerObject.AddViewMailing(PREFIX_ELEMENT + ID,PageCount);
	oVM.MoveFirst();
}

function PrintPage(_ID)
{
	var _all = false;
	var _from = 0;
	var _to = 0;
	var _custom = "";
	
	var oVM = null;
	oVM = _SQLVManagerObject.FindById(PREFIX_ELEMENT + _ID);
	if( oVM != null )
	{
		var params = new Array();
		params[0] = "vm";
		
		var retValue = window.showModalDialog('printDialog.htm', params,'dialogWidth:100,scroll:no,status:yes,toolbar:yes,menubar:no,location:no');
		
		if (retValue != null) {
			if ( retValue[0] == "all" )
			{
				_all = true;
			} else if ( retValue[0] == "current" )
			{
				//alert("oVM.getCurrentPage: "+oVM.getCurrentPage());
				_from = oVM.getCurrentPage();
				_to = _from;
			} else if ( retValue[0] == "range" )
			{
				_from = retValue[1];
				_to = retValue[2];			
			}
	
			// alert(_all+";"+_from+";"+_to+";'"+_custom+"'");
			
			return oVM.Print(_all,_from,_to,_custom);
		}
	}
	return false;
}

function PageFirst(ID)
{
	var oVM = null;
	oVM = _SQLVManagerObject.FindById(PREFIX_ELEMENT + ID);
	if( oVM != null ) return oVM.MoveFirst();
	return false;
}

function PageNext(ID)
{
	var oVM = null;
	oVM = _SQLVManagerObject.FindById(PREFIX_ELEMENT + ID);
	if( oVM != null ) return oVM.MoveNext();
	return false;
}

function PagePrev(ID)
{
	var oVM = null;
	oVM = _SQLVManagerObject.FindById(PREFIX_ELEMENT + ID);
	if( oVM != null ) return oVM.MovePrev();
	return false;
}

function PageLast(ID)
{
	var oVM = null;
	oVM = _SQLVManagerObject.FindById(PREFIX_ELEMENT + ID);
	if( oVM != null ) return oVM.MoveLast();
	return false;
}


function initializeTBC(ID)
{
	_SQLVManagerObject.Remove(ID);
	var oTBC = _SQLVManagerObject.AddViewTBC(ID);
	oTBC.appletLoad(true)
}

function fnImgSwap(obj)
{
	var img=obj.src;
	if (img.indexOf('over.gif')>-1)
		obj.src=img.replace('over.gif','.gif');
	else
		obj.src=img.replace('.gif','over.gif');
}


function funcEval(objID,action)
{
	eval("_SQLVManagerObject.FindById('" + objID + "')." + action);
}

function btnEval(objID,action)
{
	eval("_SQLVManagerObject.FindById('" + objID + "')." + action);
}


function GetSQLVObject(id)
{
	return _SQLVManagerObject.FindById(id);
}


function initializeVL(docID, WPQ, DOQ, oHTMLGrid, cDT, cF, ruptureCol,ruptureDef,IdDatabase,IdDomain )
{
	_SQLVManagerObject.Remove(docID);
	var oVL = _SQLVManagerObject.AddViewList(docID, WPQ, DOQ, oHTMLGrid, cDT, cF, ruptureCol,ruptureDef,IdDatabase,IdDomain);
}

