/**	HISTORY
 *	
 *	29-01-2003	Added property type in BufferItem. Type can have value:
 *					- objArr	=	values[3].instance.prop
 *					- objObj	=	values["instanceID"].instance.prop
 *					- string	=	"string"
 *	06-01-2003	If pCollection in Buffer.add is undefined pCollection = pObjClass
 *	23-12-2002	Changed static method getRefByCollection to compare collection property instead of object property.
 *	23-12-2002	Added property collection in BufferItem. Different collections can contain instances of the same class.
 *	
 */









function BufferItem(pType,pCollection,pObject)
{
	this.object		=	pObject;
	this.collection	=	pCollection;
	this.type		=	pType;				
	this.values		=	new Array();
}




/**	Buffer
 *	
 *	Buffer class is static, since only one buffer is necessary
 *	
 *	items	contains BufferItems
 *	temp
 */
function Buffer(){}
Buffer.items	=	new Array();
Buffer.temp		=	new Array();

/**	add
 *	
 *	Invoked by the Controller
 *	Adds data from a DataLoader
 *	
 *	1. Parse the data to objects
 *	2. Append or replace data whether it's a collection
 *	
 */
Buffer.add	= function(pType,pDataString,pCollection,pObjClass,pIsCollection)
{
	//alert(pType
	//	+"\n"+pCollection
	//	+"\n"+pDataString);
	switch(pType)
	{
		case "objArr":
			//alert(pObjClass);
			Buffer.addObjArr(pType,pDataString,pCollection,pObjClass,pIsCollection);
			break;
		case "objObj":
			Buffer.addObjObj(pType,pDataString,pCollection,pObjClass,pIsCollection);
			break;
		case "string":
			Buffer.addString(pType,pDataString,pCollection);
			break;
		default:
			error("Type: "+pType+" doesn't have a matching.\n"
				+"\npType:         "+pType
				+"\npCollection:   "+pCollection
				+"\npObjClass:     "+pObjClass
				+"\npIsCollection: "+pIsCollection
				+"\npDataString:   "+pDataString
				,"Buffer.add");
	}
}

Buffer.addObjArr	= function(pType,pDataString,pCollection,pObjClass,pIsCollection)
{
	var i;
	var found=false;
	var p;
	var type=pType;
	var isCollection=pIsCollection;
	var objClass=pObjClass;
	var obj;
	//if(new String(pCollection)=="undefined")
	//	pCollection=pObjClass;
	//alert("Buffer.add:\n"+p.values);
	for(i=0;i<Buffer.items.length;i++)
	{
		//if (em) {
		//	alert("pCollection: "+pCollection
		//		+"\nBuffer.items.length: "+Buffer.items.length
		//		+"\ni: "+i
		//		+"\nBuffer.items["+i+"]: "+Buffer.items[i]
		//		+"\ntypeof Buffer.items["+i+"]: "+typeof Buffer.items[i]
		//		);
		//}
		if(typeof Buffer.items[i]=="object"&&Buffer.items[i].collection==pCollection)
		{
			found=true;
			p = new Parser();//pDataString
			if(pObjClass=="Array"){
				obj=pDataString;
				for (var i=0;i<obj.length;i++) {
					obj[i] = p.changeChars(obj[i]);
				}
			}else {
				if (objClass != "Ingrediente2") {
					//alert("objClass: "+objClass+"\n"+pDataString+"\n"+_viewObj(pDataString));
				}
				if(pObjClass=="Object" && pDataString!="" &&!pDataString[0].length){
					obj=p.createInstances(pDataString, objClass, 0);
				}else {
					//alert("Buffer: "+objClass);
					obj=new Array();
					if (typeof objClass=="string") {
						if (typeof window[objClass]=="undefined") {
							/*	
							 *	IE50 Bugfix; when the page is cached an error 
							 *	will occur and prevent the page from loading without this alert.
							 */
							var loc=location.href;
							var params=location.search;
							if (params.indexOf("reload=1") > -1) {
								alert("Carregando script...Pronto!\n\nContinua...");
								//alert(params);
							}
							if (loc.indexOf("?") > -1) {
								loc += "&";
							} else {
								loc += "?";
							}
							location = loc+"reload=1";
							//location
							//location.reload();
							//setTimeout("location.reload();", 1000);
							return;
							//alert("Buffer: \n\nobjClass: "+objClass
							//	+"\npDataString: "+pDataString);
						}
					}
					//alert(_viewObj(pDataString));
					obj=p.createInstances(pDataString, objClass, 0,"Buffer");
				}
				//debug("obj: "+_viewObj(obj,"obj")
				//	+"\np.values: "+p.values
				//	+"\nobjClass: "+objClass
				//	+"\npDataString: "+pDataString[0].ds_Titulo,"Buffer.addObjArr");
			}
			//alert("Buffer.add:\n"+obj);
			if(isCollection)
			{
				//debug("pObjClass: "+pObjClass +"\n"
				//	+"obj: " + obj +"\n"
				//	+"Buffer.items["+i+"].object: " + Buffer.items[i].object +"\n"
				//	+"Buffer.items["+i+"].values: " + Buffer.items[i].values,"Buffer.addObjArr");
				//Buffer.replace(i, obj);	//		----------------------------------------------------------		 BUG!!!!!!!!!
			}else{
				//Buffer.remove(i, obj);
				//Buffer.append(i, obj);
			}
			if(isCollection!="append"){
				Buffer.remove(i, obj);
			}
			Buffer.append(i, obj);
		}
	}
	if (!found)
	{
		Buffer.addCollection(pType,pCollection,objClass);
		Buffer.addObjArr(pType,pDataString,pCollection,pObjClass,pIsCollection);
	}
}


/*Buffer.createInstance	= function(pType,pClass)
{
	var i;
	var found=false;
	var obj;
	for(i=0;i<Buffer.items.length;i++)
	{
		if(Buffer.items[i].object==pClass)
		{
			found=true;
			obj=new Buffer.items[i].object;
			Buffer.items[i].values.push(obj);
		}
	}
	if (!found)
	{
		Buffer.addCollection(pType,pCollection,pClass);
		obj=Buffer.createInstance(pType,pClass);
	}
	return obj;
}*/

/**
 *	
 *	pInstance is an object with only the keys initiated; a search object
 */
Buffer.getRefById	= function(pCollection, pInstance)
{
	var i,j,same=false;
	for(i=0;i<Buffer.items.length;i++)
		if(Buffer.items[i].collection==pCollection)
			for(j=0;j<Buffer.items[i].values.length;j++)
			{
				same = Buffer.sameKeys(Buffer.items[i].values[j],pInstance);
				//debug("\n same: "+same
				//		+"\n i: "+i
				//		+"\n j: "+j
				//		+"\n Buffer.items[i].values[j]: "+Buffer.items[i].values[j],"Buffer.getRefById");
				if(same)
				{
					//debug(Buffer.items[i].values[j]
					//		+"\n object: "+Buffer.items[i].object,"Buffer.getRefById");
					return Buffer.items[i].values[j];
				}
				same=false;
			}
	return -1;
}

Buffer.getRefByCollection	= function(pCollection)
{
	var i,j;
	//debug("pCollection: "+pCollection+"\n","Buffer.getRefByCollection");
	for(i=0;i<Buffer.items.length;i++)
	{
		//debug("pCollection: "+pCollection+"\nBuffer.items["+i+"].collection: "+Buffer.items[i].collection,"Buffer.getRefByCollection");
		if(typeof Buffer.items[i]=="object"&&Buffer.items[i].collection==pCollection)
			return Buffer.items[i].values;
	}
	return -1;
}
Buffer.getItemById	= function(pCollection){
	return Buffer.getRefByCollection(pCollection);
}
Buffer.getCollectionIndex= function(pCollection){
	for(i=0;i<Buffer.items.length;i++){
		if(Buffer.items[i].collection==pCollection)
			return i;
	}
	return -1;
}

Buffer.getCollectionLength= function(pCollection)// BUG ??
{
	for(i=0;i<Buffer.items.length;i++){
		if(Buffer.items[i].collection==pCollection)
			return Buffer.items[i].values.length;
	}
	return -1;
}

Buffer.getProperty	= function(pCollIndex,pInd,pProp)
{
	//alert("Buffer.items["+pCollIndex+"].values["+pInd+"]["+pProp+"];"
	//	+"\n");
	return Buffer.items[pCollIndex].values[pInd][pProp];
}

Buffer.setProperty	= function(pCollIndex,pInd,pProp,pValue)
{
	Buffer.items[pCollIndex].values[pInd][pProp]=pValue;
}

Buffer.removeCollection	= function(pCollection)
{
	for(var i=Buffer.items.length-1;i>=0;i--) {
		//if (em) {
		//	alert("Buffer.items.length: "+Buffer.items.length
		//		+"\ni: "+i
		//		+"\nBuffer.items["+i+"]: "+Buffer.items[i]
		//		+"\ntypeof Buffer.items["+i+"]: "+typeof Buffer.items[i]
		//		);
		//}
		if(typeof Buffer.items[i]=="object"&&Buffer.items[i].collection==pCollection) {
			Buffer.items.splice(i,1);
			return true;
		}
	}
	return false;
}

Buffer.removeClass	= function(pClass)
{
	var i;
	for(i=Buffer.items.length-1;i>=0;i--)
		if(Buffer.items[i].object==pClass)
		{
			Buffer.items.splice(i,1);
			return true;
		}
	return false;
}

Buffer.addCollection	= function(pType,pCollection,pClass)
{
	var len=Buffer.items.length;
	Buffer.items[len]=new BufferItem(pType,pCollection,pClass);
	//debug("pClass: "+pClass +"\n"
	//	+"Buffer.items["+len+"].object: " + Buffer.items[len].object +"\n"
	//	+"Buffer.items["+len+"].values: " + Buffer.items[len].values,"Buffer.addCollection");
	//alert(pClass+"\n"+Buffer.items[len].object);
}

Buffer.append	= function(pIndex, pObjects)
{
	var i;
	var startIndex=Buffer.items[pIndex].values.length;
	for(i=0;i<pObjects.length;i++)
	{
		Buffer.items[pIndex].values[startIndex]=pObjects[i];
		startIndex++;
	}
}

Buffer.replace	= function(pIndex, pObjects)
{
	var i,j;
	//debug("\n pIndex: "+pIndex
	//		+"\n pObjects: "+pObjects
	//		+"\n pObjects.length: "+pObjects.length,"Buffer.replace");
	for(i=0;i<Buffer.items[pIndex].values.length;i++)
		for(j=pObjects.length-1;j>=0;j--)
			if(Buffer.sameKeys(Buffer.items[pIndex].values[i],pObjects[j]))
				Buffer.items[pIndex].values[i]=pObjects.splice(j,1);
	Buffer.append(pIndex, pObjects);
}

Buffer.updateAll	= function(pIndex, pObjects)
{
	var i,j;
	for(i=0;i<Buffer.items[pIndex].values.length;i++)
		for(j=pObjects.length;j>=0;j--)
			for(prop in Buffer.items[pIndex].values[i])
				Buffer.items[pIndex].values[i][prop]=pObjects[j][prop];
}

Buffer.sameKeys	= function(pObj1,pObj2)
{
	var i=0,j;
	var prop;
	//debug(pObj1+"=="+pObj2+": "+(pObj1==pObj2)
	//		+"\n pObj1: "+pObj1
	//		+"\n pObj2: "+pObj2,"Buffer.sameKeys");
	for(prop in pObj1)
	{
		if(prop.slice(0,2)=="id")
		{
			if(pObj1[prop]!=pObj2[prop])
				return false;
			j++;
		}
		i++;
	}
	//debug(pObj1+"=="+pObj2+": "+(pObj1==pObj2)
	//		+"\n prop: "+prop
	//		+"\n i: "+i,"Buffer.sameKeys");
	if((i==0)||(j==0))
		return false;
	return true;
}

/**	
 *	Clear the values array
 */
Buffer.remove	= function(pIndex, pObjects)
{
	Buffer.items[pIndex].values=[];
}

/**	
 *	Return the size of the whole buffer as a string
 */
Buffer.getSize	= function()
{
	var i;
	var str="";
	var p=new Parser();
	for(i=0;i<Buffer.items.length;i++)
		for(j=0;i<Buffer.items[i].values.length;j++)
			for(prop in Buffer.items[i].values[j])
				if(typeof Buffer.items[i].values[j][prop]=="object")
				{
					str+=p.getString(Buffer.items[i].values[j][prop]);
				}else{
					str+=Buffer.items[i].values[j][prop];
				}
	return str.length;
}


