var RequestForm = {
	UPDATE_TOPICS: {url:"/requestFormAction/listUpdateTopics.do",key:"id",value:"name"},
	CONTACT_TOPICS: {url:"/requestFormAction/listContactTopics.do",key:"id",value:"name"},
	BROCHURES: {url:"/requestFormAction/listBrochures.do",key:"id",value:"name"},
	REGIONS: {url:"/requestFormAction/listRegions.do",key:"abbr",value:"name"},
	init: function(validators, submitOptions) {
		ConsumerUtil.populate("form.requestForm");
		var modalNotifier = new ModalNotifier("#alertOverlay", "#alertContent");
		var validator = new Validator("form.requestForm", modalNotifier, submitOptions);
		validator.register(new RequiredValidation("validate_required"));
		validator.register(new LengthValidation("validate_length"));
		validator.register(new ZipCodeValidation("validate_zip"));
		validator.register(new EmailValidation("validate_email"));
		validator.register(new PhoneValidation("validate_phone"));
		if(validators) {
			$(validators).each(function(index, value) {
				validator.register(value);
			});
		}
		this.validator = validator;
		PrivacyPolicy.init();
	},
	submit: function(link, options) {
		//options = ClassUtils.extend(options, this.validator.jform.defaultAjaxForm);
		var jqLink = $(link);
		var form;
		if(jqLink.length > 0 && jqLink[0].tagName == "FORM") form = jqLink[0];
		else form = $(link).parents("form");
		
		form.addClass("submitting");
		
		// Check if there are any async validators
		if(this.validator.validateAsync(form, function(valid) { if(valid) form.submit(); })) {
			form.submit();
			if(oFloodLight)
			{
				if(form[0].id == "updateSignUpForm")
				{
					oFloodLight.fireFloodlight("up", "");
					if(($('#requestForm_acceptsEmails').fieldValue().length > 0)){
						oFloodLight.createFloodLight("eopt", "", true);
					}
				}
			}
		} else {
			form.removeClass("submitting");
		}
	},
	populateCheckBoxGroup: function(req, fieldName, selector) {
		var _this = this;
		$.get(APP_CONTEXT + req.url, function(data) {
			if(!data) return;
			var topics = eval("("+data+")");
			$(document).ready(function() {
				_this.buildGroup(topics, selector, fieldName);
			});
		});
	},
	buildGroup: function(data, selector, fieldName, func) {
		if(arguments.length < 4) func = this.createTopicCheckBox;
		var groups = $(selector);
		var maxRows = Math.floor(data.length / groups.length);
		var extra = data.length % groups.length;
		var pos = 0;
		for(var col=0; col<groups.length; col++) {
			var ttl = (extra-- > 0) ? maxRows+1 : maxRows;
			for(var row=0; row<ttl; row++) {
				var item = func.apply(this, [data[pos++], fieldName]);
				if(item) groups[col].appendChild(item);
			}
		}
	},
	createTopicCheckBox: function(topic, fieldName) {
		if(!topic) return null;
		var item = document.createElement("li");
		var field = document.createElement("input");
		field.name = fieldName;
		field.type = "checkbox";
		field.value = topic.id;
		field.className = "checkbox";
		item.appendChild(field);

		var label = document.createElement("label");
		label.className = "checkbox";
		label.htmlFor = getElementId(field);
		label.innerHTML = topic.name;
		item.appendChild(label);
		
		var clear = document.createElement("div");
		clear.className = "clear";
		item.appendChild(clear);
		
		return item;
	}
};

var ConsumerUtil = {
	CONSUMER: {url:"/requestFormAction/retrieveConsumer.do"},
	consumer: null,
	_requested: false,
	_listeners: [],
	listen: function(listener) {
		this._listeners[this._listeners.length] = listener;
		if(this.consumer) {
			listener.apply(window, [this.consumer]);
		} else {
			this._get();
		}
	},
	populate: function(formSelector) {
		var fieldNames = [ "title", "firstName",
   			"lastName", "company", "email",
   			"address.street", "address.city",
   			"address.region.abbr",
   			"address.postalCode.value", "acceptsEmails" ];
   		var _this = this;
   		$(document).ready(function() {_this.listen(function(consumer) {
   			$(formSelector).each(function(index, form) {
   				var prefix = form.id + ".consumer";
   				if (!form[prefix+".email"]) prefix = "consumer";
   				for(var i=0; i<fieldNames.length; i++) {
   					FormUtils.setFormField(form, prefix, fieldNames[i], consumer);
   				}
   				var field = form[prefix+".phone"];
   				if(field) field.value=consumer.phone.formattedNumber;
   			});
   		})});
	},
	set: function(consumer) {
		this.consumer = consumer;
		var listeners = this._listeners;
		for(var i=0; i<listeners.length; i++) {
			listeners[i].apply(window, [consumer]);
		}
	},
	logout: function(link) {
		var data = {rnd:Math.round(Math.random() * 100000)};
		$.getJSON(APP_CONTEXT + "/consumerAction/logout.do", data, function(data) {
			if (data.success && data.redirect) location.href = data.redirect;
		});
	},
	_get: function() {
		if(!this.requested) {
			this.requested = true;
			var _this = this;
			var data = {rnd:Math.round(Math.random() * 100000)};
			$.get(APP_CONTEXT + this.CONSUMER.url, data, function(data) {
				if(!data || data == "null") return;
				_this.set(eval("(" + data + ")"));
			});
		}
	}
}

var PrivacyPolicy = {
	init: function() {
		$(document).ready(function() {
			$("body").append('<div id="privacyOverlay" class="jqmAlertOverlay"><h2>Privacy Policy</h2><div class="alertContent" id="privacyContent"></div><div class="buttonGroup"><a href="#" onclick="PrivacyPolicy.close(this);return false;">Close</a><a href="#" onclick="PrivacyPolicy.print(this);return false;" class="alertOverlayClose">Print</a></div></div>');
			$("#privacyOverlay").jqm({modal:true,overlayClass:"jqmAlertOverlayBkg"});
		});
	},
	show: function(link) {
		$("#privacyContent").load(link.href + " #generalContainer p", null, function() {
			$("#privacyOverlay").jqmShow();
		});
	},
	print: function() {
		$("body").addClass("print_privacy");
		window.print();
	},
	close: function() {
		$("body").removeClass("print_privacy");
		$("#privacyOverlay").jqmHide();
	}
}

