/*
 * Add-Edit-Delete - Javascript
 * Builds a clean form to configure a database table
 * Revision 1.6.6
 */

var allowLink = true;
var xrefs = new Array();
var sBox = new Array();
var upKeys = new Array();
var saveCallback = null;
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';
}

// Credit-card field changed
function ccChange(el) {
	frmChange();
	if (el.handled) return;
	var orig = document.getElementById(el.name + '-cc');
	if (el.value != orig.value) {
		if (orig.value.indexOf(el.value.trim()) != -1) el.value = '';
		el.handled = true;
	}
} 

// Filter changed
function filterChange(el) {
	var id = el.id;
	var gData = '?f'+id+'='+el.value;
	if (getData) gData += "&"+getData;
	window.location = uri+gData;
}

// Load date filter
function loadDateFilter() {
	openAthenaWindow('win-df');
	centerWindow('win-df');
}

// Set the date filter to on, set dates
function setDateFilter() {
	frmSave();
	var gData = '?fd=1&ffd='+document.getElementById('edit-ffd').value.urlSafe();
	gData += '&ftd='+document.getElementById('edit-ftd').value.urlSafe();
	if (getData) gData += "&"+getData;
	window.location = uri+gData;
}

// Disable date filter
function clearDateFilter() {
	frmSave();
	var gData = '?fd=0';
	if (getData) gData += "&"+getData;
	window.location = uri+gData;
}

// Close date filter window
function cancelDateFilter() {
	frmSave();
	closeAthenaWindow('win-df');
}

// 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();
		if (saveCallback) eval(saveCallback+'(true);');
	} else if (txt.substr(0, 7) == 'REDIR: ') {
		frmSave();
		if (saveCallback) eval(saveCallback+'(true);');
		window.location = txt.substr(7);
	} else {
		setStatus(txt, 10000);
		if (saveCallback) eval(saveCallback+'(false);');
	}
}

// (edit) Cancel button pressed
function btnCancel() {
	window.location = uri + (getData ? ("?"+getData) : "");
}

// Standard Menu Button Controls
function enableBtn(btn) {
	var 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) {
	var 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) {
	var btnA = document.getElementById(btn);
	if (!btnA) return; 
	var newClass = '';
	var classes = btnA.className.split(' ');
	for (var i = 0; i < classes.length; i++) {
		if (classes[i] != 'hidden') {
			if (newClass.length) newClass += ' ';
			newClass += classes[i];
		}
	}
	btnA.className = newClass;
}

function hideBtn(btn) {
	var btnA = document.getElementById(btn);
	if (!btnA) return;
	var hidden = false;
	var classes = btnA.className.split(' ');
	for (var i = 0; i < classes.length; i++) {
		if (classes[i] == 'hidden') {
			hidden = true;
			break;
		}
	}
	if (!hidden) btnA.className += ' hidden';
}

function btnEnabled(btn) {
	var 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);	// IEEE floating-point error
	cents = Math.round(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) {
				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);
}

// Switch a toggle
function setToggle(index, toggle) {
	var el = document.getElementById('toggle-'+toggle+'-'+index);
	if (!el) return;
	
	if (el.src.substr(el.src.length - 11, 11) == '_active.png') {
		el.src = el.src.substring(0, el.src.length - 11) + '_action.png';
	} else if (el.src.substr(el.src.length - 13, 13) == '_inactive.png') {
		el.src = el.src.substring(0, el.src.length - 13) + '_action.png';
	} else {
		alert('Please wait for status to update');
	}
	
	var q = uri+'?action=9&toggle='+toggle+'&index='+index.urlSafe();
	if (getData) q += "&"+getData;

	// 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 {
			// el still available
			if (ajaxObj.responseText == '0') {
				el.src = el.src.substring(0, el.src.length - 11) + '_inactive.png';	
			} else if (ajaxObj.responseText == '1') {
				el.src = el.src.substring(0, el.src.length - 11) + '_active.png';	
			} else {
				setStatus('Unknown response from server. Your update may not have been applied.', 10000);
			}
		}
    }
	
	ajaxObj.open("GET", q, true);
	ajaxObj.send(null);
}






