function PageTrackingObj(exp, titleName, cm, frame){
   this.VarTrivPageTracking = new Variable( 'VarTrivPageTracking', null, 0, cm, frame, exp, titleName, true );
   this.numPages = 0;
   this.publishTimeStamp = 0;
   this.title = null;
}

PageTrackingObj.prototype.InitPageTracking = function ( )
{
	var THIS = this;
	var pageTrackData = this.VarTrivPageTracking.getValue();
	var bDoInit = true;
	try {
	    if (pageTrackData && pageTrackData.length > 0 && pageTrackData != '~~~null~~~')
	    {
	        var topLevelSplit = pageTrackData.split('#');
	        if (topLevelSplit && topLevelSplit.length > 1)
            {
		        var arrIds = topLevelSplit[0].split(',');
		        var arrStatus = topLevelSplit[1].split('');
		        var bits = 4;
		        for( var i=0; i<arrIds.length; i++ )
		        {
			        var id = parseInt( '0x' + arrIds[i] );
			        var mask = 1<<(i%bits);
			        var status = ( parseInt('0x'+arrStatus[Math.floor(i/bits)] ) & mask ) == 0 ? 1 : 2;
			        var node = this.FindNode( this.title, id );
			        if( node )
				        node.v = status;
		        }
    		}
        }
    } catch (e) { }
}

PageTrackingObj.prototype.FindNode = function( node, id )
{
	if( node.id == id )
		return node;
	
	var match = null;
	if( typeof( node.c ) != 'undefined' ){
		for( var i=0; i<node.c.length; i++ ){
			match = this.FindNode( node.c[i], id );
			if( match != null )
				break;
		}
	}
	
	return match;
}

PageTrackingObj.prototype.InternalGetRangeStatus = function( node )
{
	if( node == null )
		return -1;
		
	if( typeof(node.c) == 'undefined' )
	{
		return node.v;
	}
	else
	{
		// we need to calculate
		if( node.v == 0 )
		{
			var bAllComplete = true;
			var bInprogress = false;
			for( var i=0; i<node.c.length; i++ )
			{
				var cnode = node.c[i];
				var status = this.InternalGetRangeStatus( cnode );
				if( status == 1 || status == 2 )
					bInprogress = true;
				if( status == 0 || status == 1)
					bAllComplete = false;
			}
			
			if( !node.t && bAllComplete )
				return 2;
			else if( bInprogress )
				return 1;
			else
				return 0;
		}
		else
			return node.v
			
	}
}

//returns a incomplete or inprogress or complete
PageTrackingObj.prototype.GetRangeStatus = function( id, bInit )
{
	var status = -1;
	if ( bInit ) 
		this.InitPageTracking();
	
	status = this.InternalGetRangeStatus( this.FindNode( this.title, id ) );
		
	if( status == 0)
		return 'notstarted';	
	else if( status == 1 )
		return 'inprogress';
		
	return 'complete';
}


PageTrackingObj.prototype.InternalSetRangeStatus=function( node, status )
{
	if( node == null )
		return;
	node.v = status;
	if( status == 0 && typeof(node.c)!='undefined')
	{
		for( var i=0; i<node.c.length; i++ )
			this.InternalSetRangeStatus( node.c[i], status ); 
	}
}

PageTrackingObj.prototype.SetRangeStatus = function( id, status /*0 or 1 or 2*/)
{
	this.InternalSetRangeStatus( this.FindNode(this.title, id), status );
	
	this.SavePageTracking();
}

PageTrackingObj.prototype.IterateTree = function( func )
{
	var stack = [];
	stack.push( this.title );
	var i = 0;
	while( stack.length > 0 )
	{
		var node = stack.shift();
		
		if( typeof(node.c) != 'undefined' )
			stack = node.c.concat(stack);
			
		//do the thing
		func( node, i, stack );
		i++;
	}	
}

PageTrackingObj.prototype.SavePageTracking = function()
{
	var hexVal = 0;
	var hexString = '';
	
	var arrayIds = [];
	var arrayStatus= [];
	
	this.IterateTree( function(node, i, stack){
		if( node.v != 0 )
		{
			arrayIds.push(node.id);
			arrayStatus.push(node.v);
		}
	});
	
	for( var i=0; i<arrayIds.length; i++ )
	{
		if( i!=0 ) hexString += ',';
		hexString += arrayIds[i].toString(16);
	}
	
	hexString += '#';
	
	var bits = 4;
	var num = 0;
	for( var i=0; i<arrayStatus.length; i++ )
	{
		var bit = arrayStatus[i] == 2 ? 1 : 0
		num |= bit << (i%bits);
		if( ((i+1)%bits==0) || ((i+1)==arrayStatus.length) )
		{
			hexString += num.toString(16);
			num = 0;
		}
	}
	
	this.VarTrivPageTracking.set(hexString);
}

PageTrackingObj.prototype.GetNumCompPages = function(childArray, countCompleted)
{
	//Pass in title.c to get all completed pages
	for(var idx = 0; idx < childArray.length; idx++ )
	{
		if(childArray[idx].c)
			countCompleted = this.GetNumCompPages(childArray[idx].c, countCompleted);
		else if( typeof(childArray[idx].c) == 'undefined')
		{
			var strStatus ='';
			strStatus = this.GetRangeStatus(childArray[idx].id);
			if (strStatus === 'complete')
				countCompleted++;
		}
	}
	return countCompleted;
}

var trivPageTracking = new PageTrackingObj(365,'inside_investment_management_citi', 0, 'scorm');
trivPageTracking.numPages = 58;

trivPageTracking.publishTimeStamp = 20263114161;

trivPageTracking.title={id:1,v:0,c:[{id:1801,v:0,c:[{id:12635,v:0},{id:68463,v:0,c:[{id:13707,v:0},{id:1155511,v:0}]},{id:73331,v:0,c:[{id:73335,v:0}]},{id:73176,v:0,c:[{id:1049475,v:0},{id:936930,v:0},{id:1157225,v:0},{id:1156899,v:0}]},{id:72750,v:0,c:[{id:1157034,v:0},{id:1157118,v:0},{id:1157274,v:0},{id:1157362,v:0},{id:1157457,v:0},{id:1157528,v:0},{id:1157665,v:0},{id:1157927,v:0},{id:1158301,v:0},{id:1158386,v:0},{id:1075111,v:0},{id:1159588,v:0}]},{id:72637,v:0,c:[{id:1159756,v:0},{id:937964,v:0,c:[{id:1054860,v:0},{id:1187604,v:0},{id:1192701,v:0},{id:1196111,v:0},{id:1199668,v:0},{id:1202752,v:0}]},{id:937926,v:0},{id:1207438,v:0}]},{id:71750,v:0,c:[{id:1051084,v:0},{id:1160107,v:0},{id:1160462,v:0},{id:939452,v:0},{id:1054514,v:0},{id:1160622,v:0},{id:1160706,v:0},{id:317988,v:0},{id:1160786,v:0}]},{id:70151,v:0,t:1,c:[{id:70155,v:0},{id:1254412,v:0,c:[{id:70375,v:0},{id:1055402,v:0},{id:1255072,v:0},{id:1255214,v:0}]},{id:1254429,v:0,c:[{id:1055273,v:0},{id:1255430,v:0}]},{id:1254438,v:0,c:[{id:1025228,v:0},{id:70263,v:0},{id:1255808,v:0},{id:1255941,v:0},{id:1256107,v:0},{id:1256250,v:0},{id:1259680,v:0},{id:1256522,v:0}]},{id:1254448,v:0,c:[{id:1025114,v:0},{id:70353,v:0},{id:1256971,v:0}]},{id:1254452,v:0,c:[{id:194191,v:0},{id:788021,v:0},{id:923548,v:0}]}]},{id:70065,v:0,c:[{id:70066,v:0},{id:70123,v:0}]},{id:69991,v:0,c:[{id:69992,v:0},{id:590215,v:0},{id:70033,v:0}]},{id:69970,v:0,c:[{id:69971,v:0}]},{id:69931,v:0,c:[{id:769470,v:0},{id:69958,v:0},{id:69968,v:0}]}]}]};
