// ************************************************************************

var BFWDATA_JSONXML_obj;
var BFWDATA_JSON_obj;

function BFWDATA_unparseJSONHTML ( val ) {
	return val.replace(/(&gt;)/g,'>' ).replace(/(&lt;)/g,'<' ).replace(/(&amp;)/g,'&' );
}

// Google analytics Code
//****************************************************************************************************

var _gaq = _gaq || [];
var hostdomain = window.location.hostname.toLowerCase()
if (hostdomain == 'bcs.whfreeman.com') {
    _gaq.push(['_setAccount', 'UA-6563127-14']);
}
else if (hostdomain == 'bcs.worthpublishers.com') {
    _gaq.push(['_setAccount', 'UA-6563127-15']);
}
else if (hostdomain == 'bcs.bedfordstmartins.com') {
    _gaq.push(['_setAccount', 'UA-6563127-6']);
}
else {
    _gaq.push(['_setAccount', 'UA-6563127-6']);
}
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();
//****************************************************************************************************

// ************************************************************************
var BFWDATA = new BFWDATAObj();

function BFWDATAObj () {
	this.expand_types = new Object();
	this.dataDiv = null;
	this.debugDiv = null;
	this.rootItem = null;
	this.debugMsg = '';
	this.debugMode = false;
	this.BSIItems = new Object();
}

BFWDATAObj.prototype.logDebug = function (msg) {
	if (!this.debugMode) return;
	this.debugMsg += msg;
}

BFWDATAObj.prototype.dumpDebug = function () {
	if (!this.debugMode) return;
	$('#BFWDATA_debugmsg').append( this.debugMsg );
	this.debugMsg = '';
}

BFWDATAObj.prototype.resetDebug = function () {
	if (!this.debugMode) return;
	var msg = '';
	$('#BFWDATA_debugmsg').html( msg );
}

BFWDATAObj.prototype.setExpanded = function ( expand_arr ) {
	this.expand_types = new Object();
	for (var i=0; i<expand_arr.length; i++) {
		this.expand_types[expand_arr[i]] = true;
	}
}

BFWDATAObj.prototype.loadData_error = function (XMLHttpRequest, textStatus, errorThrown) {
	alert('loadData_error: '+textStatus+' - '+errorThrown +'\n'+ XMLHttpRequest.responseText );
}

BFWDATAObj.prototype.loadedData_go = function () {}

BFWDATAObj.prototype.loadData = function (wsTarget) {
	var strEnvelope = ''
	$.ajax({
		type: 'GET',
		url: wsTarget,
		dataType: 'html',
		data: strEnvelope,
		processData: false,
		cache: false,
		beforeSend: function(req) {
		},
		success: function(data,textStatus) {
			BFWDATA_JSONXML_obj = data;
			$(BFWDATA.dataDiv).append( BFWDATA_JSONXML_obj );
			var str = $('div.BFWDATASITE',BFWDATA.dataDiv).html();
			BFWDATA_JSON_obj = str.parseJSON();
			BFWDATA.rootItem = BFWDATA.loadItem( BFWDATA_JSON_obj.SC.root.root_id, true );
			BFWDATA.loadedData_go();
		},
		error: this.loadData_error
	});
}

BFWDATAObj.prototype.loadItem = function ( ID, expand, expandChildren ) {
var msg = '';
msg += 'loadItem ( '+ ID +', '+ expand +', '+ expandChildren +' ) <br/>';
	if ($('#i_item_'+ID, BFWDATA.dataDiv).length==0) {
msg += 'no data! (loadItem) ::: '+ '#i_item_'+ID +'<br/>';
		return;
	}
	var dataDiv = $('#i_item_'+ID, BFWDATA.dataDiv).html();
if (chad) alert(1);
	var BFWDATA_JSON_obj = dataDiv.parseJSON();
if (chad) alert(2);
//alert(BFWDATA_JSON_obj.i_psiid +'  --  '+ BFWDATA_JSON_obj.i_id +'  --  '+ BFWDATA.BSIItems[BFWDATA_JSON_obj.i_psiid]);
	var BSItem = new BSIObj (
					BFWDATA_JSON_obj.i_id,
					BFWDATA_JSON_obj.i_uid,
					BFWDATA_JSON_obj.i_psiid,
					BFWDATA_JSON_obj.i_pid,
					BFWDATA_JSON_obj.i_psq,
					BFWDATA_JSON_obj.i_sitocl,
					BFWDATA_JSON_obj.i_type,
					BFWDATA_JSON_obj.i_subtype,
					BFWDATA_JSON_obj.i_title,
					BFWDATA_JSON_obj.i_lurl,
					BFWDATA_JSON_obj.i_alevel,
					'',
					'',
					expand,
					expandChildren,
					BFWDATA_JSON_obj.i_d_got,
					BFWDATA_JSON_obj.i_data_ct,
					BFWDATA_JSON_obj.i_data,
					BFWDATA_JSON_obj.i_qpc_got,
					BFWDATA_JSON_obj.qpc_props_ct,
					BFWDATA_JSON_obj.qpc_props,
					BFWDATA_JSON_obj.i_item_ct,
					BFWDATA_JSON_obj.i_item_ids
				)
	BSItem.dataDiv = dataDiv;

	var typeStr = BSItem.type.replace(/ /g,'_') +'_'+ BSItem.subtype.replace(/ /g,'_');
//msg += '<br/>'+ typeStr +' == '+ this.expand_types[typeStr];

	if (expandChildren) {
	}
if (chad) alert(5);

BFWDATA.logDebug( msg );
BFWDATA.dumpDebug();
	return BSItem;
}

BFWDATAObj.prototype.loadItemBottomUp = function ( ID, expand, expandChildren ) {
	var gotItem;
var msg = '';
msg += 'loadItemBottomUp ( '+ ID +', '+ expand +', '+ expandChildren +' ) <br/>';
	if ($('#i_item_'+ID, BFWDATA.dataDiv).length==0) {
msg += 'no data!<br/>';
		return;
	}
	var dataDiv = $('#i_item_'+ID, BFWDATA.dataDiv).html();
msg += 'dataDiv ( '+ dataDiv +' )<br/>';
	var BFWDATA_JSON_obj = dataDiv.parseJSON();
msg += 'BFWDATA_JSON_obj ( '+ BFWDATA_JSON_obj +' )<br/>';
	if (!BFWDATA.BSIItems[BFWDATA_JSON_obj.i_psiid]) {
msg += '1 ( '+ BFWDATA_JSON_obj.i_psiid +' )<br/>';
msg += '<ul>'+ BFWDATA.loadItemBottomUp_2( BFWDATA_JSON_obj.i_psiid, expand, expandChildren ) +'</ul>';
msg += 'loading item now...<br/>';
		gotItem = BFWDATA.loadItem( ID, expand, expandChildren );
	} else if (!BFWDATA.BSIItems[ID]) {
msg += '2<br/>';
		BFWDATA.loadItem( BFWDATA_JSON_obj.i_psiid, expand, expandChildren );
msg += 'loading item now...<br/>';
		gotItem = BFWDATA.loadItem( ID, expand, expandChildren );
	} else {
		gotItem = BFWDATA.BSIItems[ID];
	}
try {
msg += gotItem.ID +' : '+ gotItem +'<br/>';
}catch(e){
msg += 'loadItemBottomUp ERROR ('+ ID +', '+ expand +', '+ expandChildren +'): gotItem='+ gotItem +' - '+ e.lineNumber +' - '+ e.message;
}
BFWDATA.logDebug( msg );
BFWDATA.dumpDebug();
//alert(msg);
	return gotItem;
}

BFWDATAObj.prototype.loadItemBottomUp_2 = function ( ID, expand, expandChildren ) {
var msg = '';
msg += 'loadItemBottomUp_2 ( '+ ID +', '+ expand +', '+ expandChildren +' ) <br/>';
	if ($('#i_item_'+ID, BFWDATA.dataDiv).length==0) {
msg += 'no data!<br/>';
		return;
	}
	var dataDiv = $('#i_item_'+ID, BFWDATA.dataDiv).html();
	var BFWDATA_JSON_obj = dataDiv.parseJSON();
	if (!BFWDATA.BSIItems[BFWDATA_JSON_obj.i_psiid]) {
msg += '1<br/>';
msg += '<ul>'+ BFWDATA.loadItemBottomUp( BFWDATA_JSON_obj.i_psiid, expand, expandChildren ) +'</ul>';
msg += 'loading item now...<br/>';
		BFWDATA.loadItem( BFWDATA_JSON_obj.i_psiid, expand, expandChildren );
	} else if (!BFWDATA.BSIItems[ID]) {
msg += '2<br/>';
		BFWDATA.loadItem( BFWDATA_JSON_obj.i_psiid, expand, expandChildren );
/*
	} else if (!BFWDATA.BSIItems[ID].items_loaded || !BFWDATA.BSIItems[ID].expanded) {
msg += '3<br/>';
		if (!BFWDATA.BSIItems[ID].items_loaded) {
msg += '4<br/>';
			BFWDATA.BSIItems[BFWDATA_JSON_obj.i_psiid].loadChildren( true );
		}
		if (!BFWDATA.BSIItems[ID].expanded) {
msg += '5<br/>';
			BFWDATA.BSIItems[BFWDATA_JSON_obj.i_psiid].expanded = true;
		}
*/
	}
msg += BFWDATA.BSIItems[ID] +'<br/>';
	return msg;
}

BFWDATAObj.prototype.findItemsByType = function (t,st) {
	var outItems = new Array();
	for (var i in this.BSIItems) {if (this.BSIItems.hasOwnProperty(i)) {
		var addIt = false;
		if (t == this.BSIItems[i].type) {
			if (st) {
			if (st == this.BSIItems[i].subtype) {
				addIt = true;
			}
			} else {
				addIt = true;
			}
		}
		if (addIt) outItems[outItems.length] = this.BSIItems[i];
	}}
	return outItems;
}

// ************************************************************************************

function BSIObj (
		ID,
		UID,
		PID,
		PUID,
		sequence,
		TOClevel,
		type,
		subtype,
		title,
		link_url,
		access_level,
		CID,
		SID,
		expanded,
		expandChildren,
		data_got,
		data_ct,
		data,
		qpc_got,
		qpc_ct,
		qpc,
		item_ct,
		item_id_arr
	) {

BFWDATA.logDebug( '<br/>new BSIObj ::: '+ ID +', '+ title +', '+ expanded +', '+ expandChildren  );
BFWDATA.logDebug( '<br/>PID status 1 ::: '+ PID +', '+ BFWDATA.BSIItems[PID] +', '+ expandChildren );
if ( BFWDATA.BSIItems[PID] ) {
BFWDATA.logDebug( '<br/>PID status 2 ::: '+ BFWDATA.BSIItems[PID].expanded +' --- '+ BFWDATA.BSIItems[PID].items_loaded );
}
//alert(PID +'  --  '+ ID +'  --  '+ BFWDATA.BSIItems[PID]);
	if (!BFWDATA.BSIItems[PID] && (!TOClevel || !isNaN(TOClevel) || TOClevel<1) ) {
		this.TOClevel=1;
	} else {
//		this.TOClevel = TOClevel;
		this.TOClevel = BFWDATA.BSIItems[PID].TOClevel+1;
	}

	this.items = new Array();
	this.items_loaded = false;
	this.item_id_arr = item_id_arr;

	this.treeIDs = new Object();
	this.ID = ID;
	this.UID = UID;
	this.PID = PID;
	this.PUID = PUID;
	this.SID = SID;
	this.sequence = sequence;
	this.type = type;
	this.subtype = subtype;
	this.title = BFWDATA_unparseJSONHTML(title);
	this.link_url = link_url;
	this.access_level = !isNaN(access_level) ? new Number(access_level) : 0;
	this.CID = CID;
	this.data_got = data_got==true ? true : false;
	this.data_ct = !isNaN(data_ct) ? new Number(data_ct) : 0;
	this.data = data!=null && data.constructor == Array ? data : new Array();
	this.qpc_got = qpc_got==true ? true : false;
	this.qpc_ct = !isNaN(qpc_ct) ? new Number(qpc_ct) : 0;
	this.qpc = qpc!=null && qpc.constructor == Array ? qpc : new Array();
	this.expanded = expanded==true ? true : false;
if (chad) alert(3);
	for (var i=0; i<this.data.length; i++) {
try {
		this.data[i].i_d_v = BFWDATA_unparseJSONHTML(this.data[i].i_d_v);
		if (this.data[i].i_d_n=='expand_by_default' && this.data[i].i_d_v==1) {
			this.expanded = true;
		}
} catch(e) {
alert('new BSIObj ERROR ::: '+ e.lineNumber +' ::: '+ e.message);
}
	}
if (chad) alert(4);
	var typeStr = this.type.replace(/ /g,'_') +'_'+ this.subtype.replace(/ /g,'_');
//BFWDATA.logDebug( '<br/>'+ typeStr +' == '+ BFWDATA.expand_types[typeStr] );
	if (BFWDATA.expand_types[typeStr]) {
		this.expanded = true;
	}


BFWDATA.logDebug( '<br/><span style="font-size:10px;">'+ this.expanded +', '+ TOClevel +':'+ this.TOClevel +', '+ this.type.replace(/ /g,'_') +'_'+ this.subtype.replace(/ /g,'_') +'</span> - <span style="font-size:10px;color:#d88">'+ this.PID +' :: '+ this.PUID +'</span>' );
BFWDATA.logDebug( '<ul>' );

	BFWDATA.BSIItems[this.ID] = this;
//alert(type +'_'+ BFWDATA.BSIItems[this.ID].subtype +' --- '+ BFWDATA.BSIItems[this.ID].type +'_'+ subtype );

	if (this.expanded) {
		this.loadChildren( expandChildren );
	}

BFWDATA.logDebug( '</ul>' );
}

BSIObj.prototype.loadChildren = function ( expandThem ) {
BFWDATA.logDebug( '<br/>loadChildren ::: '+ this.ID +', '+ this.title +', '+ expandThem +'<ul>' );

	if (!this.items_loaded) {
		for (var i=0; i<this.item_id_arr.length; i++) {
			try {
				var x = BFWDATA.loadItem( this.item_id_arr[i], expandThem );
				this.items[ this.items.length ] = x;
			} catch(e) {
BFWDATA.logDebug( '<br/>loadChildren ERROR ('+ this.item_id_arr[i] +') ::: '+ e.lineNumber  +' ::: '+ e.message +'<br/>' );
			}
		}
		this.items_loaded = true;
	} else {
BFWDATA.logDebug( '<br/> ::: already loaded' );
	}

//BFWDATA.logDebug( '</ul>' );
}

// ************************************************************************************
// ************************************************************************************
// ************************************************************************************

BFWDATAObj.prototype.loadChildrenAsync = function ( treeID, parentID, itemID, expandThem, goFn ) {
BFWDATA.logDebug( '<br/>loadChildrenAsync ::: '+ treeID +', '+ parentID +', '+ itemID +', '+ expandThem +'<br/>' );
	var parentItem = BFWDATA.BSIItems[parentID];
	if (!parentItem) {
BFWDATA.logDebug( '<br/>loadChildren ERROR parent isn\'t loaded ('+ parentID +')' );
	} else {
		try {
			var item = BFWDATA.BSIItems[itemID];
			if (!item) {
	BFWDATA.logDebug( '<br/> ::: item not found' );
			} else {
				if (item.items_loaded) {
	BFWDATA.logDebug( '<br/> ::: item children already loaded' );
				} else {
					if (item.item_id_arr.length>0) {
//BFWDATA.loadChildAsync( treeID, item.ID, item.item_id_arr[0], expandThem, goFn );
setTimeout('BFWDATA.loadChildAsync('+ treeID +','+ item.ID +','+ item.item_id_arr[0] +','+ expandThem +','+ goFn +');',1);
					}
				}
			}
		} catch(e) {
BFWDATA.logDebug( '<br/>loadChildrenAsync ERROR ('+ itemID +') ::: '+ e.lineNumber  +' ::: '+ e.message +'<br/>' );
		}
	}
}

BFWDATAObj.prototype.loadChildAsync = function ( treeID, parentID, itemID, expandThem, goFn ) {
BFWDATA.logDebug( '<br/>loadChildAsync ::: '+ treeID +', '+ parentID +', '+ itemID +', '+ expandThem +'<br/>' );
	try {
		var parentItem = BFWDATA.BSIItems[parentID];
		var x = BFWDATA.loadItem( itemID, expandThem );
		parentItem.items[ parentItem.items.length ] = x;

		var nextItemID = '';
		var isFirst = false;
		for (var i=0; i<parentItem.item_id_arr.length; i++) {
var msg = '';
msg += '<br/> ::: test = ';
msg += ''+ itemID +'';
msg += ' ?= ';
msg += ''+ parentItem.item_id_arr[i] +'';
msg += ', '+ i +'';
msg += ' ?< ';
msg += ''+ parentItem.item_id_arr.length-1;
//BFWDATA.logDebug( msg );
			if (itemID == parentItem.item_id_arr[i] && i<parentItem.item_id_arr.length-1) {
				if (i==0) isFirst = true;
				nextItemID = parentItem.item_id_arr[i+1];
			}
		}
//BFWDATA.logDebug( '<br/> ::: nextItemID = '+ nextItemID );
		if (nextItemID == '') {

BFWDATA.logDebug( '<br/> ::: last child loaded' );
			parentItem.items_loaded = true;

		} else {

//BFWDATA.logDebug( '<br/> ::: doing next child :: BFWDATA.loadChildAsync(\''+ treeID +'\',\''+ parentID +'\',\''+ nextItemID +'\','+ expandThem +');' );

setTimeout('BFWDATA.loadChildAsync('+ treeID +','+ parentID +','+ nextItemID +','+ expandThem +','+ goFn +');',1);

		}

//BFWDATA.logDebug( '<br/> ::: goFn ...' );
goFn(parentID, itemID);
//BFWDATA.logDebug( '<br/> ::: goFn POST...' );

	} catch(e) {
BFWDATA.logDebug( '<br/>loadChildrenAsync ERROR ('+ itemID +') ::: '+ e.lineNumber  +' ::: '+ e.message +'<br/>' );
	}
}


