/*
	DCH = new DataSearch( { Form: 'Contact',		//name of form
							Input: 'Company',	    // field on which to search
							Launch: 'SearchBtn',	// id of item to click 
							Url: 'CsvToJson.php',	// url to get data
							Fields: [ "Company", "Addr1", "Addr2", "City", "State", "Zip" ]   // fields to populate from data
							Max: 15   			    // Max lines to display
						  } );

*/
function FormCache( optObj ){
	var self = this;
	this.options = {  Max: 25, 
					  DlogWH: [ 200, 100 ],
					  Match: function( a, b ){  if( a[ self.options.Input ].toUpperCase() == b[ self.options.Input ].toUpperCase() ){ return( true ); } return( false ); },
					  DialogTitle: 'Data',
					  DialogTitleStyle: false
					  };
					
	for (var p in optObj) { this.options[p] = optObj[p]; }
	if( ! self.options.LoadUrl ){ this.options.LoadUrl = '?req=gfc&frm=' + self.options.Form; }
	if( ! self.options.SaveUrl ){ this.options.SaveUrl = '?req=sfc&frm=' + self.options.Form; }
	if( ! self.options.AppendUrl ){ this.options.AppendUrl = '?req=afc&frm=' + self.options.Form; }
	self.Form = $F( self.options.Form );
	
	this.LoadCache = function(){
		
		if( self.options.Data ){
			self.Data = self.options.Data;
			var rowObj = self.Data[0];
			self.colHeads = new Array();
			for (var p in rowObj) { self.colHeads.push( p ); }
			self.Grid.createHeader( self.colHeads ); 
			return;
			}
			
		var options = { 
			type: OAT.AJAX.TYPE_TEXT,
			onerror:function( request ){ alert( "request returned " + request.getStatus() ); }
		};
		
		function afterLoad( request ){ 
				self.Data = OAT.JSON.parse( request );
				if( ! self.Data.length ){ self.Data = new Array(); }
				var rowObj = self.Data[0];
				self.colHeads = new Array();
				for (var p in rowObj) { self.colHeads.push( p ); }
				self.Grid.createHeader( self.colHeads ); 
				}
					
		OAT.AJAX.GET( self.options.LoadUrl, '', afterLoad, options ); 
	};
	
	this.SaveCache = function(){
		var options = { 
			type: OAT.AJAX.TYPE_TEXT,
			onerror:function( request ){ alert( "request returned " + request.getStatus() ); }
		};
		
		OAT.AJAX.POST( self.options.SaveUrl, OAT.JSON.stringify( self.Data, -1 ), function(request){}, options ); 
	};
	
	this.AppendCache = function( obj ){

		var options = { 
			type: OAT.AJAX.TYPE_TEXT,
			onerror:function( request ){ alert( "request returned " + request.getStatus() ); }
		};
		
		OAT.AJAX.POST( self.options.AppendUrl, OAT.JSON.stringify( obj, -1 ), function(request){}, options ); 
		
	};
	

	this.ShowSearch = function(){
		var s = self.Form.elements[ self.options.Input ].value;
		s.replace(/^\s+|\s+$/g,"");
		re = new RegExp( '^'+ s + '.*', 'i');
		//re[1] = new RegExp( s,"ig");
		self.Grid.clearData();
		
		self.ShortList = [];
		var rowData = new Array();
			for( var i = 0; i < self.Data.length; ++i ){
				if( self.Data[i][ self.options.Input ].match( re ) ){
					var c = self.Data[i];
					self.ShortList.push( c );
					var d = 0;
					for( var h=0; h < self.colHeads.length; ++h ){ rowData[ h ] = c[ self.colHeads[h] ]; }
					var gr = self.Grid.createRow( rowData );
					OAT.Event.attach( gr, 'click', function(){ setTimeout( self.Select, 100 ); } );
					}
				if( self.ShortList.length >= self.options.Max ){ break; }
			} 
			
		self.Dlog.show();
	};
	
	this.Div = OAT.Dom.create( 'div' );
	OAT.Dom.hide( this.div );
	OAT.Dom.append( [ document.body, this.Div ] );
	this.Grid = new OAT.Grid( this.Div, { allowColumnHiding : false, imagePath: '/_sd/images/oat/grid/' } ); 
	this.LoadCache();
	
	OAT.Event.attach( self.options.Launch, 'click', self.ShowSearch );
	
	this.Dlog = new OAT.Dialog( self.options.DialogTitle, this.Div, 
										{ modal:0, 
										  buttons:0,
										  imagePath: '/_sd/images/oat/',
										  width: self.options.DlogWH[0],
										  height: self.options.DlogWH[1]
										  } );
										  
	if( self.options.DialogTitleStyle ){ OAT.Style.apply( this.Dlog.win.div.childNodes[0], self.options.DialogTitleStyle ); }	
						  
	this.Select = function( event ){
		var r = self.Grid.rows;
		for( var i = 0; i < r.length; ++i ){
			if( r[i].selected == true ){
				self.FillForm( self.ShortList[i] );
				}
			}
			
		self.Dlog.hide();	
	};
	
	this.FillForm = function( obj ){
	
		var  frmels = this.Form.elements;
		
		if( self.options.Fields ){
			var fa = self.options.Fields;
			for( var i=0;i< fa.length; ++ i ){
				if( frmels[ fa[i] ] && obj[ fa[i] ] ){
					frmels[ fa[i] ].value = obj[ fa[i] ];
					}
				else{
					if( frmels[ fa[i] ] ){ frmels[ fa[i] ].value = ''; }
					}
				}
			return;
			}
			
		for( var c=0; c < frmels.length; ++c ){
			if( obj[ frmels[c].name ] ){
				frmels[c].value = obj[ frmels[c].name ];
				}
			}
			
	};
	
	this.UpdateCache = function(){
		// updates the array in memory and the file on the server.
		if( self.Form.elements[ self.options.Input ].value == '' ){ return; }
		
		var obj = {};
		var frmels = self.Form.elements;
		
		if( self.options.Fields ){
			var fa = self.options.Fields;
			for( var i=0;i< fa.length; ++ i ){
				obj[ fa[i] ] = frmels[ fa[i] ].value.replace(/^\s+|\s+$/g,"");
			}
		}else{
			for( var a=0; a < frmels.length; ++a ){
				var el = frmels[a];
				if( el.type == 'text' || el.type == 'hidden' || el.type == 'password' || el.type == 'textarea' ){
					obj[ frmels[a].name ] = frmels[a].value.replace(/^\s+|\s+$/g,"");
				}
			}
		}
	
		for( var c=0; c < self.Data.length; ++ c){
			if( self.options.Match( obj, self.Data[c] ) ){
				return;
				}
			//if( obj[ self.options.Input ].toUpperCase() == self.Data[i][ self.options.Input ].toUpperCase() ){
			//	self.Data[i] = obj;
			//	return;
			//	}
			}
		
		self.Data.push( obj );
		self.AppendCache( obj );
	
	};
	
}
