//The Saturno Dataset JS class addes dataset-like functions to webpages for use with ajax related tools. 
//Should be used with SaturnoJSONSerializer

//Author: Ronald Eddy
//Beta release: 10 Dec 2008
//Copyright 2008 Saturno Design LLC. All rights reserved.


var DataSet = new Class({
    initialize: function(data){
        this.filters=[];
        this.data=this.processData(data, 2);
		this.colNamesArray=this.data[0];
        this.SaturnoDataSet = this.data[1]; 
        this.SortCols='';
		this.ColNames=new Hash();
		this.data[0].each(function(item, index){
				this.ColNames.set(item, index);
			}, this);  
	      
    },
    addFilter: function(type, filter)
	{
		this.removeFilter(type);
		this.filters.extend([[type, filter]]);		
	}, 
	removeFilter: function(type)
	{
		this.filters=this.filters.filter(function(item){
			return item[0]!=type;
		});
	},

	getView: function()
	{
		var arInput=$A(this.SaturnoDataSet);

		this.filters.each(function(filter){
			arInput=arInput.filter(filter[1]);
		});
		arInput=this.buildSort(arInput, this.SortCols)
		return arInput;
	},

	clearFilters: function()
	{
		this.filters=[];
	},

	buildFirstletterFilter: function(col, value)
	{
		col=this.getColID(col);
		value=value.toLowerCase();	
		//alert('buildFirstletterFilter:' + col);
		return function(item, index){
					if (item[col].length>0)
					{
						return item[col].substring(1,0).toLowerCase() == value;
					}else
					{
						return false
					}
				};
	},

	buildIsEqualFilter: function(col, value)
	{
		col=this.getColID(col);
		//alert('buildIsEqualFilter:' + col);
		return function(item, index){
			return item[col] == value;
		}
	},

	buildAssocIsEqualFilter: function(col, value)
	{
		col=this.getColID(col);
		//alert('buildAssocIsEqualFilter:' + col);
		return function(item, index){
			var boolReturn=false;
			item[col][1].each(function(i){  				
				if (i==value)
				{
					boolReturn=true;
					
				}
			}, this);
			return boolReturn;
		}
	},
	buildAssocRelIsEqualFilter: function(col, relatCol, value)
	{
		col=this.getColID(col);
		//alert('buildAssocIsEqualFilter:' + col);
		return function(item, index){
			var boolReturn=false;
			var itemDS=new DataSet(item[col]);
			var itemV=itemDS.getView();	
			var itemcol=itemDS.getColID(relatCol);			
			itemV.each(function(i){  			
				if (i[itemcol]==value)
				{
					boolReturn=true;
					
				}
			}, this);
			return boolReturn;
		}
	},	
	getColID: function(col)
	{
		if (typeof(col)=='string')
		{
			return this.ColNames.get(col);
		}else
		{
			return col;
		}

	},
	buildSort: function(inArray, cols)
	{

		var temp=[];
		var out=[];
		var sortText;
		
		inArray.each(function(item, index){  
			sortText="";
			cols.split(',').each(function(col){		
				sortText=sortText +  item[this.getColID(col)] + " ";
			}, this);
	    
			temp.extend([[sortText, item]]);
		}, this);
		temp.sort();
	    
		temp.each(function(item){
			out.extend([item[1]]);
		});
		return out;
	},
	processData: function(inObj, direction)
	{
		if(typeof(inObj)=="string")
		{			
			var outp=eval(saturnoCleanData(inObj, direction));
			return outp;
		
		}else
		{
			return inObj;
		}	
	}
});


function saturnoCleanData(inobj, direction)
{
	if (inobj.charAt(0)=="~")
	{
		
		inobj=inobj.replace(/^\~*/, '');
		var inData=inobj.split('');
		var outdata=new Array();
		var pattern = new Array(3, 7, 11, 15, 2, 6, 10, 14, 1, 5, 9, 13, 0, 4, 8, 12);
		var endlength=inData.length-1;
		
		if (direction!=1 && direction!='1')
		{
			pattern=pattern.reverse();
		}
		
		for (i=0;i<endlength;i=i + 16) 
			{
				pattern.each(function(item, index){
					outdata.push(inData[i+item]);					
				});
			}
			
		return outdata.join('').replace(/\~*$/, '');
	}else
	{
		return inobj;
	}
}
