spcore = {};


spcore.returnAddressURL = window.location;

spcore.listeners = [];

spcore.registerListener = function(event, callback) {
	spcore.listeners.push({event:event, callback:callback});
};

spcore.unregisterListener = function(event, callback) {
	var i = 0;
	for (var listener in spcore.listeners) {
		if (listener.event == event && listener.callback == callback) {
			spcore.listeners.splice(i, 1);
			break;
		}
		i++;
	}
};

spcore.broadcast = function(event, data) {
	for (var listener in spcore.listeners) {
		if (listener.event == event) {
			listener.callback.apply(listener.callback, data);
		}
	}
};

spcore.getEditboxContentContainer = function() {
	var container = jQuery('#spcore_editboxContent');
	if (container.size() == 0) {
		jQuery('body').append('<div id="spcore_editboxContent" style="display:none;"></div>');
		return jQuery('#spcore_editboxContent');
	}
	return container;
};

spcore.editboxOpen = false;
spcore.lastEditboxResponse = null;
spcore.editboxCloseHandlerRegistered = false;
spcore.handleEditboxResponse = function(result) {
	var contentContainer = spcore.getEditboxContentContainer();

//console.dir(result);

	if (result.spcore_actionSuccess) {
		contentContainer.html(result.html);
	}
	else {
		if (result.spcore_actionError || result.spcore_validationErrors) {
			var errorLists = '<ul class="spcore_actionErrors">';
			if (result.spcore_actionError) {
				// (theoretically, only one action error (?))
				errorLists += '<li>' + result.spcore_actionError.message + '</li>';
			}
			if (result.spcore_validationErrors) {
				for (var i = 0; i < result.spcore_validationErrors.length; i++) {
					errorLists += '<li>' + result.spcore_validationErrors[i].message + '</li>';
				}
			}
			errorLists += '</ul>';
			contentContainer.html(errorLists);
		}
		else {
			contentContainer.html(result.toString());
		}
	}
	
	spcore.lastEditboxResponse = result;

	if (result.closeEditbox) {
		tb_remove();
	}
	else {
		// erg. icky code is icky.
		jQuery('#TB_ajaxContent').children().remove();
		tb_show('', '#TB_inline?inlineId=spcore_editboxContent');
		
		if (!spcore.editboxCloseHandlerRegistered) {
			spcore.editboxCloseHandlerRegistered = true;
			jQuery("#TB_window").unload(function() {
				spcore.handleThickboxClosed();
			});
		}

		spcore.handleEditboxPageLoaded();
	}
	if (result.refreshPage) {
		window.location = window.location;
	}	
};

spcore.loadInEditbox = function(obj) {
	if (obj.nodeType && obj.nodeName.toLowerCase() == 'a') {
		var a = jQuery(obj);
		jQuery.get(
			a.attr('href'),
			(!spcore.editboxOpen ? { editbox_clearStack: 1 } : {}),
			function(data, statusText) { spcore.handleEditboxResponse(data); },
			'json'
		);
	}
	else if (obj.nodeType && obj.nodeName.toLowerCase() == 'form') {
		jQuery(obj).ajaxSubmit({
			dataType: 'json',
			beforeSubmit: function(values) {
				if (!spcore.editboxOpen) {
					values.push({ name: 'editbox_clearStack', value: 1 });
				}
			},
			success: function(result) { spcore.handleEditboxResponse(result); }
		});
	}
};

spcore.handleThickboxClosed = function() {
	spcore.editboxOpen = false;
	spcore.editboxCloseHandlerRegistered = false;
	if (spcore.lastEditboxResponse.refreshOnClose) {
		window.location = window.location;
	}
};

spcore.handleEditboxPageLoaded = function() {
	jQuery('#TB_ajaxContent form.target-editbox').submit(function() {
		spcore.loadInEditbox(this);
		return false;
	});
	jQuery('#TB_ajaxContent a.target-editbox').click(function() {
		spcore.loadInEditbox(this);
		return false;
	});
	jQuery('#TB_ajaxContent h4.collapser').click(function() { 
		jQuery(this).next('fieldset, form, ul, table').slideToggle('fast');
	});
	spcore.editboxOpen = true;
};


spcore.generateAndSubmitForm = function(dictionary, method) {
	method = (typeof method == 'undefined' ? 'POST' : method);
	jQuery('body').append('<form style="display:none;" action="' + spcore.actionEndpointURL + '" method="' + method + '" id="spcore_adhoc_form"></form>');
	var form = jQuery('#spcore_adhoc_form');
	for (var p in dictionary) {
		form.append('<input type="hidden" name="' + p + '" value="' + dictionary[p] + '" />');
	}
	form.append('<input type="hidden" name="spcore_returnAddress" value="' + spcore.returnAddressURL + '" />');
	//console.log(form.html());
	form.submit();
};

spcore.clearFormExceptForFieldset = function(jqForm, fieldsetSelector) {
	jqForm.find('input, select, textarea')
		// subtract our own inputs
		.not(jQuery(fieldsetSelector + ' input, ' + fieldsetSelector + ' select, ' + fieldsetSelector + ' textarea'))
		// add back any inputs in any sub-fieldsets
		.add(jQuery(fieldsetSelector + ' fieldset input, ' + fieldsetSelector + ' fieldset select, ' + fieldsetSelector + ' fieldset textarea'))
		.remove();
};

spcore.toggleTableRow = function(selector) {
	var row = jQuery(selector);
	if (row.get(0).style.display == 'none') {
		row.css('display', (jQuery.browser.msie ? 'block' : 'table-row'));
	}
	else {
		row.css('display', 'none');
	}
	return false;
};

spcore.bindStateSelectorInputs = function(selectSelector, inputSelector) {	
	jQuery(document).ready(function() {
		var jqSelect = jQuery(selectSelector);
		var jqInput = jQuery(inputSelector);
		
		jqSelect.change(function() {
			if (jQuery(this).val() == 'other') {
				jqInput.fadeIn('fast');
			}
			else {
				jqInput.fadeOut('fast');
			}
		});
		
		var originalColor = jqInput.css('color');
		jqInput.focus(function() {
			if (jQuery(this).val() == 'Enter a State Name') {
				jQuery(this).val('').css('color', originalColor);
			}
		});
		jqInput.blur(function() {
			if (jQuery.trim(jQuery(this).val()) == '') {
				jQuery(this).val('Enter a State Name').css('color', '#888');
			}
		});
		jqInput.parents('form').submit(function() {
			if (jqInput.val() == 'Enter a State Name') {
				jqInput.val('');
			}
		});

		
		if (jqSelect.val() == 'other') {
			jqSelect.change();
		}		
		if (jqInput.val() == '') {
			jqInput.val('Enter a State Name').css('color', '#888');
		}
		else {
			jqInput.fadeIn('fast');
		}
	});
};

spcore.formatAsCurrency = function(amount) {
	amount = Math.round(amount * 100) / 100;
	if (amount == Math.floor(amount)) {
		return amount + '.00';
	}
	else if ((amount * 10) == Math.floor(amount * 10)) {
		return amount + '0';
	}
	return amount;
};

spcore.enableQuantityField = function(fieldSelector) {
	var f = jQuery(fieldSelector);
	var q = f.val();
	f.focus(function() { q = jQuery(this).val(); });
	f.blur(function() {
		if (jQuery(this).val() != q) {
			jQuery(this).parent('form').submit();
		}
	});
};

jQuery(function() {
	jQuery('form.target-editbox').submit(function() {
		spcore.loadInEditbox(this);
		return false;
	});
	jQuery('a.target-editbox').click(function() {
		spcore.loadInEditbox(this);
		return false;
	});
	jQuery('h4.collapser').click(function() { 
		jQuery(this).next('fieldset, form, ul, table').slideToggle('fast');
	});	
});