/*
 * Add-Edit-Delete - Javascript
 * Builds a clean form to configure a database table
 * Revision 1.5.0
 */

var allowLink = true;
var xrefs = new Array();
var sBox = new Array();
var upKeys = new Array();
addEvent(window, 'beforeunload', checkSave);

// Add new button pressed
function btnAdd() {
	document.getElementById('addBox').style.display = 'block';
	document.getElementById('add-'+addData[0]).focus();
}

// Add-Cancel button pressed
function aedAddCancel() {
	document.getElementById('addBox').style.display = 'none';
}

// Add submit button pressed
function aedAdd() {
	// Build list of things to send back to page
	var gData = '?action=1';
	for (i = 0; i < addData.length; i++) {
		x = document.getElementById('add-'+addData[i]);
		gData += '&'+addData[i]+"="+escape(x.value).replace(/\+/g, '%2B');
		x.value = '';
	}
	if (getData) gData += "&"+getData;
	
	ajaxCall(uri+gData, 'aedAdd_callback');
	
	setStatus('Adding item..', false);
	document.getElementById('addBox').style.display = 'none';
}

// Add button callback
function aedAdd_callback(txt) {
	if (txt.substr(0, 7) == 'REDIR: ') {
		window.location = txt.substr(7);
	} else {
		setStatus('Item Added', true);
		document.getElementById('aedList').innerHTML = txt;
	}
}

// Delete item pressed
function aedDelete(index) {
	if (!confirm('Are you sure you want to delete this item?')) return;

	// Build list of things to send back to page
	if (typeof(index) == "string") index = index.urlSafe();
	var gData = '?action=2&index='+index;
	if (getData) gData += "&"+getData;
	
	ajaxCall(uri+gData, 'aedDelete_callback');
	setStatus('Deleting item..', false);
}

// Add button callback
function aedDelete_callback(txt) {
	setStatus('Item Deleted', true);
	document.getElementById('aedList').innerHTML = txt;
}

// (edit) Save button pressed
function btnSave(index) {
	var gData = '?action=4&index='+index;
	if (getData) gData += "&" + getData;
	
	var postData = '';
	for (i = 0; i < addData.length; i++) {
		postData += '&' + addData[i] + "=";
		x = document.aedForm.elements['edit-'+addData[i]];
		if (!x) continue;	// headings
		if (x.length) {
			// Check for a radio item
			for (cn = 0; cn < x.length; cn++) {
				if (x[cn].checked || x[cn].selected) {
					postData += escape(x[cn].value).replace(/\+/g, '%2B');
					break;
				}
			}
		} else if (x.type == "checkbox") {
			// Checkbox
			postData += x.checked ? '1' : '0';
		} else {
			// Anything else
			postData += escape(x.value).replace(/\+/g, '%2B');
		}
	}
	
	// Cross-reference tables
	postData += '&xref='+json_encode(xrefs).urlSafe();
	
	// Image tables
	for (var i = 0; i < document.forms.length; i++) {
		var f = document.forms[i];
		if (f.APC_UPLOAD_PROGRESS && f.field) {
			postData += '&' + f.field.value + '=' + document.getElementById(f.field.value+'-image').value.urlSafe();
		}
	}
	
	ajaxCall(uri+gData, 'aedSave_callback', postData);
	setStatus('Saving..', false);
}

// Save button callback
function aedSave_callback(txt) {
	if (txt == 'SUCCESS') {
		setStatus('Saved', true);
		for (var i in xrefs) {
			xrefs[i] = new Array();
			refreshTable(i);
		}
		frmSave();
	} else if (txt.substr(0, 7) == 'REDIR: ') {
		frmSave();
		window.location = txt.substr(7);
	} else {
		setStatus(txt, 10000);
	}
}

// (edit) Cancel button pressed
function btnCancel() {
	window.location = uri + (getData ? ("?"+getData) : "");
}

// Standard Menu Button Controls
function enableBtn(btn) {
	btnA = document.getElementById(btn);
	if (btnA) btnI = btnA.getElementsByTagName('img')[0];
	
	if (btnA && (btnA.className == 'stdBtnDisabled')) {
		btnA.className = 'stdBtn';
		if (btnI) btnI.src = btnI.src.substr(0, btnI.src.length-13)+".png";
	}	
}

function disableBtn(btn) {
	btnA = document.getElementById(btn);
	if (btnA) btnI = btnA.getElementsByTagName('img')[0];
	
	if (btnA && (btnA.className == 'stdBtn')) {
		btnA.className = 'stdBtnDisabled';
		if (btnI) btnI.src = btnI.src.substr(0, btnI.src.length-4)+"_disabled.png";
	}
}

function showBtn(btn) {
	btnA = document.getElementById(btn);
	if (btnA) btnA.className = btnA.className.substr(0, btnA.className.length-7);
}

function hideBtn(btn) {
	btnA = document.getElementById(btn);
	if (btnA) btnA.className += ' hidden';
}

function btnEnabled(btn) {
	btnA = document.getElementById(btn);
	return btnA && ((btnA.className == 'stdBtn') || (btnA.className == 'stdBtnActive'));
}

// -- Money Formatters -- //
function moneyChange(id) {
	md = document.getElementById(id+'_d');
	mc = document.getElementById(id);
	
	cents = Math.floor(md.value.replace(/\$|\,|\t/g,'') * 100);
	mc.value = cents;
}

function moneyBlur(id) {
	md = document.getElementById(id+'_d');
	mc = document.getElementById(id);
	
	cents = mc.value;
	md.value = formatCurrency(cents / 100);
}

function formatCurrency(num) {
	num = num.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);
}

/*
 * Cross-Referrence Controls 
 */

// Regular left column click
function toggleActive(xref, index, title) {
	if (typeof(xrefs[xref]) == "undefined") xrefs[xref] = new Array();
	if (typeof(xrefs[xref]['del']) == "undefined") xrefs[xref]['del'] = new Array();
	
	if (typeof(xrefs[xref]['del'][index]) == "undefined") {
		// Set
		xrefs[xref]['del'][index] = title;
	} else {
		// Unset
		delete xrefs[xref]['del'][index];
	}
	refreshTable(xref);
	frmChange();
}

// Search result (right column) click
function toggleSearch(xref, index, title) {
	if (typeof(xrefs[xref]) == "undefined") xrefs[xref] = new Array();
	if (typeof(xrefs[xref]['add']) == "undefined") xrefs[xref]['add'] = new Array();
	
	if (typeof(xrefs[xref]['add'][index]) == "undefined") {
		// Set
		xrefs[xref]['add'][index] = title;
	} else {
		// Unset
		delete xrefs[xref]['add'][index];
	}
	refreshTable(xref);
	frmChange();
}

// Refresh a cross-reference table
function refreshTable(xref, silent) {
	var search = document.getElementById(xref+'-search').value;
	if (typeof(silent) == "undefined") silent = false;
	if (typeof(xrefs[xref]) == "undefined") xrefs[xref] = new Array;
	if (typeof(xrefs[xref]['add']) == "undefined") xrefs[xref]['add'] = new Array();
	if (typeof(xrefs[xref]['del']) == "undefined") xrefs[xref]['del'] = new Array();
	var json = json_encode(xrefs[xref]);
	var postData = 'xref='+xref+'&tables='+json.urlSafe();
	
	// To avoid having to transport the table name back from the server query, we'll run a private AJAX query
	var ajaxObj = initAjax();
	if (ajaxObj == null) return false;

    ajaxObj.onreadystatechange = function() {
		if (!ajaxReady(ajaxObj)) return;
		if (ajaxObj.status >= 400) {
			setStatus('(AJAX Error) Server returned '+ajaxObj.status+' '+ajaxObj.statusText, 10000);
		} else {
			// xref variable still avaialble
			var el = document.getElementById('xref-'+xref);
			if (el) {
				// Search may have changed between transactions
				el.innerHTML = ajaxObj.responseText;
			} else {
				setStatus('AJAX Error) Unable to locate the xref element');
			}
		}
    }
	
	ajaxObj.open("POST", uri+'?action=5&index='+index+"&search="+search.urlSafe(), true);
	ajaxObj.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	ajaxObj.send(postData);

	var fl = document.getElementById(xref+'-floor');
	if (fl && !silent) fl.innerHTML = 'working..';
}

// Reset changes to a table
function resetTable(xref) {
	if (!confirm("Reset changes to this table?")) return;
	xrefs[xref] = new Array();
	refreshTable(xref);
}

// X-Ref Search
function xrefSearch(xref) {
	var search = document.getElementById(xref+'-search').value;
	if (search != sBox[xref]) {
		sBox[xref] = search;
		refreshTable(xref, true);
	}
}

// Select image
function selectImage(img) {
	document.getElementById(img + '-frm').className = 'imgFileBox';
}

// Remove image
function removeImage(img){
	// Clear the filename
	document.getElementById(img + '-image').value = '';
	
	// Refresh image box
	refreshImg(img);
}

// File box changed - start the upload
function fileChange(img){
	var key = document.getElementById(img+'-key').value;
	upKeys[img] = key;
	
	if (document.getElementById(img+'-upload').value.length == 0) return;

	document.forms[img+'Form'].submit();
	checkUpload(img);
	document.getElementById(img+'-top').style.display = 'none';
	document.getElementById(img+'-bottom').style.display = 'block';
	var pMeter = document.getElementById(img+'-progressMeter');
	pMeter.style.width = '1px';
}

function checkUpload(img) {
	var key = upKeys[img];
	ajaxCall(uri+'?action=6&key='+key+'&field='+img.urlSafe(), 'uploadProgress');
	document.getElementById(img+'-floor').innerHTML = 'uploading..';
}

function uploadProgress(json) {
	var stat = eval("("+json+")");
	var img = stat['img'];
	var progress = stat['current'] / stat['total'];
	var elapsed = stat['time'] - stat['start_time'];
	var speed = elapsed == 0 ? 0 : (stat['current'] / elapsed);
	// Just in case progress returns before first update on the server
	if (speed < 0) {
		speed = 0;
		progress = 0;
	}
	var remaining = progress > 0 ? Math.round((elapsed * (1 / progress)) - elapsed) : 0;
	var pMeter = document.getElementById(img+'-progressMeter');
	var pSpeed = document.getElementById(img+'-progressSpeed'); 
	var pTime = document.getElementById(img+'-progressTime'); 
	pMeter.style.width = Math.round(progress * 100)+'%';
	pMeter.innerHTML = Math.round(progress * 100)+'%&nbsp;';
	pSpeed.innerHTML = speed.toSize()+'/s';
	pTime.innerHTML = remaining > 0 ? (remaining.toTime()+' remaining') : '&nbsp;';
	if (stat['current'] < stat['total']) setTimeout("checkUpload('"+img+"')", 100);
}

function uploadDone(img, filename) {
	// Set new filename
	document.getElementById(img+'-image').value = filename;
	// Refresh image box
	refreshImg(img);
}

function uploadError(img) {
	// Set status should have been called, just refresh the image box
	refreshImg(img);
}

// Refresh an image box
function refreshImg(img) {
	// To avoid having to transport the table name back from the server query, we'll run a private AJAX query
	var ajaxObj = initAjax();
	if (ajaxObj == null) return false;

    ajaxObj.onreadystatechange = function() {
		if (!ajaxReady(ajaxObj)) return;
		if (ajaxObj.status >= 400) {
			setStatus('(AJAX Error) Server returned '+ajaxObj.status+' '+ajaxObj.statusText, 10000);
		} else {
			// img variable still avaialble
			var el = document.getElementById('img-'+img);
			if (el) {
				// Search may have changed between transactions
				el.innerHTML = ajaxObj.responseText;
			} else {
				setStatus('AJAX Error) Unable to locate the image element');
			}
		}
    }
	
	var postData = 'img='+img.urlSafe()+'&fn='+document.getElementById(img+'-image').value.urlSafe();
	ajaxObj.open("POST", uri+'?action=7&index='+index, true);
	ajaxObj.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	ajaxObj.send(postData);

	var fl = document.getElementById(img+'-floor');
	if (fl) fl.innerHTML = 'working..';
}

function renameXref(index, id) {
	var title = document.getElementById('img-'+id+'-title').innerHTML;
	var newTitle = prompt("Enter new name:", title);
	if (newTitle) {
		ajaxCall(uri + '?action=8&index=' + index + '&xref=' + id.urlSafe() + '&title=' + newTitle.urlSafe(), 'xref_callback');
		document.getElementById('img-'+id+'-title').innerHTML = newTitle;
		setStatus('Updating..');
	}
}

function xref_callback(txt) {
	setStatus(txt, true);
}






