function spcDatabase()
{
	this.queryResult	= null;
	this.queryDone 		= true;
}

spcDatabase.prototype.getQueryResult = function()
{
	return this.queryResult;
}	

spcDatabase.prototype.fetchQuery = function(pQuery,callbackOnQueryDone)
{
		console.log('Called spcDatabase.prototype.fetchQuery');
		
		requestdoc({ url:				product.url.api
					, method:            'GET'
					, params:			{ "class":	'database'
										, method:	'fetchQuery'
										, query:	pQuery
										}
					, callback:          function()
						{
							if (this.req.responseText == '')
							{
								console.log('fetchQuery no reponseText?');
								return;
							}

							var queryResult = parseResponse(this.req.responseText);
							
							if (!queryResult) {
								alert('Failed: spcDatabase.prototype.fetchQuery parseResponse(this.req.responseText);');
							}
							this.queryResult = queryResult;
							
							//alert(this.req.responseText);
							this.queryDone 		= true;
					
							if (callbackOnQueryDone) {
								callbackOnQueryDone(queryResult);
							}
						}
				   , callbackError:     function()
						{
							console.error('fetchQuery: Failed to get data');
						}
				   });
	this.queryDone 		= false;			   
	console.log('Done spcDatabase.prototype.fetchQuery');
}

spcDatabase.prototype.formValidate = function(objName)
{
		console.log('Called spcDatabase.prototype.formValidate(' + objName + ')');
		var valid = true;
		var field = document.getElementById(objName);
		// for all fields in this form check if value in database matches values in fields
		if (field) {
			console.log('field.form.elements.length: ' + field.form.elements.length + ' ');
			for (i = 0; i < field.form.elements.length; i++)
			{
				try {
					var id = '';
					var value = '';
					if (field.form.elements[i].id) id = field.form.elements[i].id;
					if (field.form.elements[i].value) value = field.form.elements[i].value;
					
					if (field.form.elements[i].focus) field.form.elements[i].focus();
					
					//console.log('formValidate('+ i + '): ' + id + '=' + value);
					
					// field should at least be one character long
					
					if (value.length == 0) {
						if (hasClass(field.form.elements[i],'required')) {
							valid = false;
							break;
						}
					}
					
				}

				catch (e) {
					console.log('formValidate(): failed.');
					
				}
			}
		}
		
		// if NOT valid then return cursor to the faulty input field
		
		return valid;
}

spcDatabase.prototype.pairKey = function(obj) {
        for (var objectItem in obj) {
            if (typeof(obj)!='object') {
                return objectItem;
            }
            else {
                 return (objectItem);
            }
        }
    }
    
spcDatabase.prototype.pairValue = function(obj) {
        for (var objectItem in obj) {
            if (typeof(obj)!='object') {
                return obj[objectItem];
            }
            else {
                 return (obj[objectItem]);
            }
        }
    }		

spcDatabase.prototype.toInnerHTML = function(queryResult,options) {
    
        var key;
        var value;
        var first = true;
        
        var innerHTML = '';
    
        console.log('spcDatabase.toInnerHTML()');
        
        if (queryResult.success) {
			if (options) {
				innerHTML += '<TABLE ' + options + ' >';
			} else {
				innerHTML += '<TABLE border="1" >';
			}
            var data = queryResult.data;
            for (var objectItem in data) {
                var columns = data[objectItem];
                if (first) {
                    innerHTML += '<TR>';
                    for (var objectColumn in columns) {
                    
                        key = objectColumn;
                        value = columns[objectColumn];
                        
                        innerHTML += '<TD>';
                        innerHTML += this.pairKey(value);
                        innerHTML += '</TD>';
                    }
                    innerHTML += '</TR>';
                }
            
                innerHTML += '<TR>';
                
                for (var objectColumn in columns) {
                
                    key = objectColumn;
                    value = columns[objectColumn];

                    innerHTML += '<TD>';
                    innerHTML += this.pairValue(value);
                    innerHTML += '</TD>';
                }
            
                innerHTML += '</TR>';
                first = false;
            }
            innerHTML += '</TABLE>';
        }
        
		return innerHTML;
    }

/* Typical application: */

function spcDataSink()
{
	this.debug = false;
	this.initialized = false;
	this.editmode = false;
	
	this.id = '';

	this.database = new spcDatabase;
	this.query = '';
	this.queryResult = null;
	this.callbackOnDone = null;
	this.filter = null;
	
}

spcDataSink.prototype.fetchQuery = function(id,size,query,callbackOnDone,filter)
{
	var self = this;
	this.id = id;
	this.size = size;
	this.query = query;
	this.callbackOnDone = callbackOnDone;
	this.filter = filter;

	if (!query) {
	
	}
	else {
		
		console.log('Called spcDataSink.prototype.create with query: ' + query);
		
		this.database.fetchQuery(query,function(queryResult) {self.onQueryDone(queryResult);});
		return true;
	}
	
	console.log('Done spcDataSink.prototype.create');
		
	return false;
}

spcDataSink.prototype.onQueryDone = function(queryResult)
{
	var self = this;
	this.queryResult  = queryResult;
							
	console.log(JSON.stringify(this.queryResult));
	
	consol.log('Called spcDataSink.onQueryDone() ');
	
	if (console.group) {
		console.group();
		console.log(this.queryResult);
		console.groupEnd();
	}
	
	var proc = new spcObject();
	proc.foreachObject({ data:		this.queryResult
						,callback:	function(key,value) { self.queryResultToForm(key ,value); }
						});
						
	if (this.callbackOnDone) {
		this.callbackOnDone(this.queryResult);
	}
}

spcDataSink.prototype.queryResultToForm = function(key,value)
{
	var obj = document.getElementById(key);
	if (obj) {
		obj.value = value;
	}
}

// default settins
var A_TCALDEF = {
	'months' : ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
	'weekdays' : ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
	'yearscroll': true, // show year scroller
	'weekstart': 1, // first day of week: 0-Su or 1-Mo
	'centyear'  : 70, // 2 digit years less than 'centyear' are in 20xx, othewise in 19xx.
	'imgpath' : 'img/' // directory with calendar images
};

spcDataSink.prototype.parseDate = function(s_date) {

var a_tpl;

	if (!a_tpl)
		a_tpl = A_TCALDEF;

	var re_date = /^\s*(\d{2,4})\-(\d{1,2})\-(\d{1,2})\s*$/;
	if (!re_date.exec(s_date))
		return alert ("Invalid date: '" + s_date + "'.\nAccepted format is yyyy-mm-dd.")
	var n_day = Number(RegExp.$3),
		n_month = Number(RegExp.$2),
		n_year = Number(RegExp.$1);

	if (n_year < 100)
		n_year += (n_year < a_tpl.centyear ? 2000 : 1900);
	if (n_month < 1 || n_month > 12)
		return alert ("Invalid month value: '" + n_month + "'.\nAllowed range is 01-12.");
	var d_numdays = new Date(n_year, n_month, 0);
	if (n_day > d_numdays.getDate())
		return alert("Invalid day of month value: '" + n_day + "'.\nAllowed range for selected month is 01 - " + d_numdays.getDate() + ".");

	return new Date (n_year, n_month - 1, n_day);
}




