// DOM helper function
var addListener = (function () {if (window.addEventListener) {return function (el, type, fn) {el.addEventListener(type, fn, false);};} else if (window.attachEvent) {return function (el, type, fn) {var f = function () {fn.call(el, window.event);};el.attachEvent("on" + type, f);};} else {return function (el, type, fn) {el["on" + type] = fn;};}})();


// simple error/info logging
var scLog, debugMode = false;
function createScLog() {
	var logFunction = debugMode ?
		function (a) { alert(a); } :
		function () {};
	scLog = window.console ? window.console : {
		log: logFunction,
		dir: function(a) {
			var ret = [];
			for (i in a) ret.push([i + ': ' + a[i]]);
			scLog.info('Data:\n' + ret.join('\n'));
		},
		info: logFunction,
		warn: logFunction
	};
}
createScLog();


function getElementsByClassName(options) {
	// { className, startNode, tagName, onlyFindFirst }
	var options = options.className ? options : {className: options};
	var startNode = options.startNode || document;
	var els = startNode.getElementsByTagName(options.tagName || '*');
	options.className = typeof options.className === 'string' ? options.className : options.className.join('(\s|$)|(\s|^)');
	var re = new RegExp('(\s|^)(' + options.className + ')(\s|$)');
	if (options.onlyFindFirst === true) {
		for (var i = 0, j = els.length; i < j; i++)
			if (re.test(els[i].className))
				return els[i];
		return false;
	} else {
		var found = [];
		for (var i = 0, j = els.length; i < j; i++)
			if (re.test(els[i].className))
				found.push(els[i]);
		return found;
	}
}


// needed if you want to call Persist.remove() in IE
if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) {
	i || (i = 0);
	var length = this.length;
	if (i < 0) i = length + i;
	for (; i < length; i++)
		if (this[i] === item) return i;
	return -1;
};


// Actual stuff set up here...
var optionsLoader = function(container) {
	this.container = typeof container === 'string' ? document.getElementById(container) : container;
	this.dbName = 'monkeys';
	this.formIdCleanser = /[^a-z0-9\-]/ig;
	this.pageId = window.pageId || window.location.pathname.replace(instance.formIdCleanser, '');

	this.loadData = function(callback) {
		scLog.log('Attempting to load options from database...');
		optionsLoaderInstance.data = {}
		this.store.get(this.dbName, function(ok, val) {
			if (ok) {
				try {
					optionsLoaderInstance.data = eval('(' + val + ')') || {};
					optionsLoaderInstance.loadOptions();
				} catch(e) {
					scLog.warn('Database information corrupted... resetting database');
				}
			} else {
				scLog.warn('Unable to load data from database... creating empty database');
				optionsLoaderInstance.store.set(optionsLoaderInstance.dbName, '{}');
			}
		});
	};

	this.storeOptions = function () {
		scLog.log('Attempting to store options');
		var instance = optionsLoaderInstance;
		if (!instance.container) {
			scLog.info('Options container does not exist');
			return;
		}
		var page = {};
		var forms = instance.container.getElementsByTagName('form');
		for (var i = 0, form; form = forms[i]; i++) {
			var formId, c = 0;
			do {
				formId = form.getAttribute('action').replace(instance.formIdCleanser, '') + (c++ > 0 ? c : '');
			} while (page[formId]);
			page[formId] = {};

			for (var j = 0, el; el = form.elements[j]; j++) {
				if (el.name && typeof page[formId][el.name] === 'undefined') {
					var type = el.type.toLowerCase();
					if (type === 'radio') {
						page[formId][el.name] = instance.findRadioElement(el).value;
					} else if (type === 'checkbox') {
						page[formId][el.name] = el.checked;
					} else {
						if (typeof el.value !== 'undefined') page[formId][el.name] = el.value;
					}
				}
			}
		}
		instance.data[instance.pageId] = page;
		var str = JSON.stringify(instance.data);
		if (str.length > Persist.size) {
			scLog.warn('Exceeding storage space, resetting');
			instance.data = {};
			instance.data[instance.pageId] = page;
			str = JSON.stringify(instance.data);
		}
		instance.store.set(instance.dbName, str);
	};

	this.loadOptions = function() {
		scLog.log('Attempting to load options');
		var instance = optionsLoaderInstance;
		var page = instance.data[instance.pageId];
		if (page) {
			var forms = instance.container.getElementsByTagName('form');
			for (var i = 0, form; form = forms[i]; i++) {
				var formId = form.getAttribute('action').replace(instance.formIdCleanser, ''), c = 0;
				for (var j = 0; j < i; j++)
					if (form.getAttribute('action').replace(instance.formIdCleanser, '') ===
					  forms[j].getAttribute('action').replace(instance.formIdCleanser, ''))
						formId = form.getAttribute('action').replace(instance.formIdCleanser, '') + ++c;

				if (page[formId]) {
					for (var j = 0, el; el = form.elements[j]; j++) {
						if (el.name && typeof page[formId][el.name] !== 'undefined') {
							var type = el.type.toLowerCase();
							if (type === 'radio') {
								if (instance.findRadioElement(el, page[formId][el.name]) === el) {
									el.checked = true;
									if (el.click) el.click();
								}
							} else if (type === 'checkbox') {
								el.checked = page[formId][el.name];
							} else {
								if (typeof el.value !== 'undefined') el.value = page[formId][el.name];
							}
						}
					}
				}
			}
		}
		var customPrint = document.getElementById('customprint'),
		    customPrintSelect = document.getElementById('customprintselect'),
		    customPrintContainer = document.getElementById('customPrint');
		if (customPrint && customPrintSelect && customPrintSelect.value !== "") {
			customPrint.onclick();
			customPrintSelect.onchange();
			returnAddyAdjust(customPrintSelect.value);
			try {
				if (customPrintContainer && /Firefox/i.test(navigator.userAgent)) {
					var potentiallyBrokenInputs = getElementsByClassName({startNode: customPrintContainer,
							className: 'textF', tagName: 'input'});
					for (var i = 0, input; input = potentiallyBrokenInputs[i]; i++) {
						var newInput = document.createElement('input'),
						    attrs = ['id', 'class', 'type', 'maxlength', 'name'];
						for (var j = 0, attr; attr = attrs[j]; j++)
							newInput.setAttribute(attr, input.getAttribute(attr));
						newInput.setAttribute('value', input.value);
						input.parentNode.replaceChild(newInput, input);
					}
				}
			} catch (e) {}
		}
	};

	this.info = function() {
		return ['Backend: ',
			Persist.type || 'none',
			', ',
			'Approximate Size Limit: ',
			(Persist.size < 0) ? 'unknown' : Persist.size 
			].join('');
	};

	this.findRadioElement = function(radioElement, value) {
		var form = radioElement.form;
		for (var k = 0, radio, toFind = radioElement.name; radio = form.elements[k]; k++)
			if (radio.name === toFind &&
			  ((typeof value === 'undefined' && radio.checked === true) || radio.value === value))
				return radio;
		return {value: null};
	};

	this.init = function () {
		if (typeof this.store === 'undefined')
			this.store = new Persist.Store('test', { swf_path: window.pathToPersistSWF || 'persist.swf' });
		if (this.store) this.loadData();

		addListener(window, 'beforeunload', optionsLoaderInstance.storeOptions);
	};
};

addListener(window, 'load', function() {
	var customPrint = document.getElementById('customprint');
	if (customPrint && customPrint.checked === true)
		togglePrintingOpts(customPrint);
});

