function DBAdmin(sTableId)
{
	this.sTableId = sTableId;
	
	this.save_form = function (sFormType, sRecordId, sActionAfter)
	{
		// get field values
		var aFields = new Array();
		
		iFieldCounter = 0;
		$('#dbadmin_form_' + this.sTableId + ' :input').each(function() 
		{
			sFieldType = this.type;
			sFieldName = this.name;
			
			if ( this.length > 0 )
			{
				sFieldType = this[0].type;
				sFieldName = this[0].name;
			}
			
			if ( this.tagName.toLowerCase() == 'select' )
				sFieldType = 'select';
			if ( this.tagName.toLowerCase() == 'textarea' )
				sFieldType = 'textarea';
					
			switch ( sFieldType )
			{
				case 'select':
					aFields[iFieldCounter] = new Object();
					aFields[iFieldCounter].name = this.name;
					aFields[iFieldCounter].value = this.options[this.selectedIndex].value;
					iFieldCounter++;
					break;
				case 'text':
				case 'hidden':
				case 'password':
				case 'textarea':
					aFields[iFieldCounter] = new Object();
					aFields[iFieldCounter].name = this.name;
					if ( (this.getAttribute('rel') != undefined) && (this.getAttribute('rel') == 'wysiwyg') )
					{
						aFields[iFieldCounter].value = FCKeditorAPI.GetInstance(this.name).GetHTML();
					}
					else
						aFields[iFieldCounter].value = this.value;

					iFieldCounter++;
					break;
				case 'checkbox':
					aFields[iFieldCounter] = new Object();
					aFields[iFieldCounter].name = this.name;
					
					if ( this.checked == true )
						aFields[iFieldCounter].value = true;
					else
						aFields[iFieldCounter].value = false;
					
					iFieldCounter++;
					break;
				case 'radio':
					if(this.checked)
					{
						aFields[iFieldCounter] = new Object();
						aFields[iFieldCounter].name = this.name;
						aFields[iFieldCounter].value = this.value;
						iFieldCounter++;
					}
					break;
			}							
		});
		
		// prepare JSON request
		JSONRequest = {
			module: "DBAdmin",
			table_id: this.sTableId,
			action: sFormType,
			action_after: sActionAfter,
			fields: aFields
		}
		
		if ( sFormType == 'edit' )
			JSONRequest.id = sRecordId;
		
		$.ajax({
			url: '/json-gateway/',
			cache: false,
			type: 'POST',
			data: {json_request: JSON.stringify(JSONRequest)},
			dataType: 'json',
			success: function(JSONResponse){
				if ( JSONResponse.response_code == -1 )
					alert(JSONResponse.response_text);
				else
				{
					oDBAdmin = new DBAdmin(JSONResponse.table_id);

					switch(JSONResponse.action_after)
					{
						case 'refresh_list':
							if ( sFormType == 'add' )
								oDBAdmin.clear_form();
								
							oDBAdmin.refresh_list();
							oDBAdmin.show_message(JSONResponse.response_code, JSONResponse.response_text, 'form');
							break;
						case 'goto_list':
							document.location.href=JSONResponse.list_url;
							break;
						case 'js_callback':
							eval(JSONResponse.js_callback);
							break;
						case 'save_and_new':
							if ( sFormType == 'add' )
							{
								oDBAdmin.clear_form();
								oDBAdmin.show_message(JSONResponse.response_code, JSONResponse.response_text, 'form');
							}
							else
								document.location.href=JSONResponse.add_url;
							break;
						case 'save_and_edit':
							if ( sFormType == 'add' )
								document.location.href=JSONResponse.edit_url;
							else
								oDBAdmin.show_message(JSONResponse.response_code, JSONResponse.response_text, 'form');
							break;
						default:
							if ( sFormType == 'add' )
								oDBAdmin.clear_form();

							oDBAdmin.show_message(JSONResponse.response_code, JSONResponse.response_text, 'form');
							break;
					}
				}
			},
			error: function(XMLHttpRequest, textStatus, errorThrown){
				alert(XMLHttpRequest.status + "\n\n" + XMLHttpRequest.responseText);
				//alert('Ooops! There was a problem with your request. (Error #5000)');
			}
		});
	}

	this.remove_record = function (sRecordId, sActionAfter)
	{
		if ( confirm('These items will be permanently deleted and cannot be recovered. Are you sure?') )
		{
			JSONRequest = {
				module: "DBAdmin",
				table_id: this.sTableId,
				action: "remove",
				id: sRecordId,
				action_after: sActionAfter
			}
	
			$.ajax({
				url: '/json-gateway/',
				cache: false,
				type: 'POST',
				data: {json_request: JSON.stringify(JSONRequest)},
				dataType: 'json',
				success: function(JSONResponse){
					if ( JSONResponse.response_code == -1 )
						alert(JSONResponse.response_text);
					else
					{
						switch (JSONResponse.action_after)
						{
							case 'js_callback':
								eval(JSONResponse.js_callback);
								break;
							default:
								$('#dbadmin_list_row_' + JSONResponse.table_id + '_' + JSONResponse.id).animate(
									{ backgroundColor: "#ff0000" }, "slow", function() { 
										$(this).animate({ opacity: "hide" }, "slow", function()																																			
										{
											oDBAdmin = new DBAdmin(JSONResponse.table_id);
											oDBAdmin.show_message(JSONResponse.response_code, JSONResponse.response_text, 'list');
									   	} )
									} );
								break;
						}
					}
				},
				error: function(JSONResponse){
				//alert(JSONResponse.status + "\n\n" + JSONResponse.responseText);
				alert('Ooops! There was a problem with your request. (Error #5000)');
				}
			});
		}
	}
	
	this.show_message = function (iResponseCode, sResponseText, sPrependTo)
	{
		if ( sPrependTo == 'form' )
		{
			sPrependToId = 'dbadmin_form_' + this.sTableId;
			sMessageClass = 'dbadmin_message_form';
		}
		else
		{
			sPrependToId = 'dbadmin_list_' + this.sTableId;
			sMessageClass = 'dbadmin_message_list';
		}
			
		if ( $('#dbadmin_message_' + this.sTableId).length > 0 )
		{
			$('#dbadmin_message_' + this.sTableId).text(sResponseText);
			$('#dbadmin_message_' + this.sTableId).show("slow");
		}
		else
		{
			var dbadmin_message_div = $("<div></div>").attr('id','dbadmin_message_' + this.sTableId).css({display:"none"}).text(sResponseText);
			$('#' + sPrependToId).prepend(dbadmin_message_div);
			
			$('#dbadmin_message_' + this.sTableId).slideDown("fast");
		}
		
		switch ( iResponseCode )
		{
			case 0:
				$('#dbadmin_message_' + this.sTableId).removeClass().addClass(sMessageClass + ' ui-corner-all ui-state-error');
				break;
			case 1:
				$('#dbadmin_message_' + this.sTableId).removeClass().addClass(sMessageClass + ' ui-corner-all ui-state-success');
				break;
		}
		
		$('#dbadmin_message_' + this.sTableId).animate({opacity: 1}, 5000, function () { 
			$(this).hide("slow", function() { 																									   				//$(this).remove();
   			} );
		});
	}

	this.populate = function (sRecordId)
	{
		// prepare JSON request
		JSONRequest = {
			module: "DBAdmin",
			table_id: this.sTableId,
			action: "populate",
			id: sRecordId
		}
		
		$.ajax({
			url: '/json-gateway/',
			cache: false,
			type: 'POST',
			data: {json_request: JSON.stringify(JSONRequest)},
			dataType: 'json',
			success: function(JSONResponse){
				if ( JSONResponse.response_code == -1 )
					alert(JSONResponse.response_text);
				else
				{
					oForm = document.forms['dbadmin_form_' + JSONResponse.table_id];
					if ( JSONResponse.fields != undefined )
					for(i=0; i<JSONResponse.fields.length; i++)
					{
						oField = oForm[JSONResponse.fields[i].name];
						if ( oField != undefined )
						{
							sFieldType = oField.type;
							sFieldName = oField.name;
							
							if ( oField.length > 0 )
							{
								sFieldType = oField[0].type;
								sFieldName = oField[0].name;
							}
							
							if ( oField.tagName != undefined )
							{
								if ( oField.tagName.toLowerCase() == 'select' )
									sFieldType = 'select';
								if ( oField.tagName.toLowerCase() == 'textarea' )
									sFieldType = 'textarea';
							}
	
							switch ( sFieldType )
							{
								case 'select':
									for(j = 0; j < oField.length; j++)
									{
										if(oField[j].value == JSONResponse.fields[i].value)
											oField.selectedIndex = j;
									}
									
									break;
								case 'text':
								case 'hidden':
								case 'password':
								case 'textarea':
									if ( (oField.getAttribute('rel') != undefined) && (oField.getAttribute('rel') == 'wysiwyg') && (FCKeditorAPI != undefined) && (FCKeditorAPI.GetInstance(oField.name) != undefined) )
									{
										FCKeditorAPI.GetInstance(oField.name).SetHTML(JSONResponse.fields[i].value);
									}
									else
									{
										oField.value = JSONResponse.fields[i].value;
									}
									
									break;
								case 'checkbox':
									if ( JSONResponse.fields[i].value )
										oField.checked = true;
									else
										oField.checked = false;
									break;
								case 'radio':
									var radioLength = oField.length;
									if(radioLength == undefined) 
									{
										oField.checked = (oField.value == JSONResponse.fields[i].value.toString());
									}
									else
									{
										for(var j = 0; j < radioLength; j++) 
										{
											oField[j].checked = false;
											if(oField[j].value == JSONResponse.fields[i].value.toString()) 
											{
												oField[j].checked = true;
											}
										}
									}
									break;
							}
						}				
					}
				}
				
				$.unblockUI(); 
			},
			error: function(JSONResponse){
				alert(JSONResponse.responseText);
				//alert('Ooops! There was a problem with your request. (Error #5000)');
			}
		});
	}

	this.clear_form = function ()
	{
		$('#dbadmin_form_' + this.sTableId + ' :input').each(function() {
			var type = this.type;
			var tag = this.tagName.toLowerCase();

			if ( type != 'hidden' )
			{
				if (type == 'text' || type == 'password' || tag == 'textarea')
				{
					if ( (this.getAttribute('rel') != undefined) && (this.getAttribute('rel') == 'wysiwyg') )
						FCKeditorAPI.GetInstance(this.name).SetHTML('');
					else
						this.value = '';
				}
					
				else if (type == 'checkbox' || type == 'radio')
					this.checked = false;
	
				else if (tag == 'select')
					this.selectedIndex = 0;
			}
		});
	}
	
	this.refresh_list = function ()
	{
		JSONRequest = {
			module: "DBAdmin",
			table_id: this.sTableId,
			action: "refresh_list"
		}

		$.ajax({
			url: '/json-gateway/',
			cache: false,
			type: 'POST',
			data: {json_request: JSON.stringify(JSONRequest)},
			dataType: 'json',
			success: function(JSONResponse){
				if ( JSONResponse.response_code == -1 )
					alert(JSONResponse.response_text);
				else
				{
					// removing all tbody elements
					oTable = document.getElementById('dbadmin_table_' + JSONResponse.table_id);

					while (oTable.tBodies[0].childNodes.length > 0) {
						oTable.tBodies[0].removeChild(oTable.tBodies[0].lastChild);
					}
					
					$('#dbadmin_tbody_' + JSONResponse.table_id).append(JSONResponse.rows_html); 
					$('#dbadmin_table_' + JSONResponse.table_id).trigger("update");
					
					if ( (JSONResponse.sortable != undefined) && (JSONResponse.sortable == true) )
						$('#dbadmin_table_' + JSONResponse.table_id).tableDnD({
							onDragClass: "dbadmin_row_hover",
							onDrop: function(table, row) {
								dbadmin_list_sortable_submit(JSONResponse.table_id, table, row);
							}
						});
				}
			},
			error: function(JSONResponse){
				alert('Ooops! There was a problem with your request. (Error #5000)');
			}
		});
	}
}

function format_decimal(sData)
{
	num = sData.toString().replace(/\$|\,/g,'');
	if(isNaN(num))
		num = "0";
	sign = (num == (num = Math.abs(num)));
	num = Math.floor(num*100+0.50000000001);
	cents = num%100;
	num = Math.floor(num/100).toString();
	if(cents<10)
		cents = "0" + cents;
	for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
		num = num.substring(0,num.length-(4*i+3))+','+
	num.substring(num.length-(4*i+3));
	return (((sign)?'':'-') + num + '.' + cents);
}

function format_money(sData)
{
	num = sData.toString().replace(/\$|\,/g,'');
	if(isNaN(num))
		num = "0";
	sign = (num == (num = Math.abs(num)));
	num = Math.floor(num*100+0.50000000001);
	cents = num%100;
	num = Math.floor(num/100).toString();
	if(cents<10)
		cents = "0" + cents;
	for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
		num = num.substring(0,num.length-(4*i+3))+','+
	num.substring(num.length-(4*i+3));
	return (((sign)?'':'-') + '$' + num + '.' + cents);
}
