AUI.add('sdsh-accessibility', function(A) {
    A.namespace('SdshAccessibility');
 
    A.SdshAccessibility.selectableFontSizes = -1;
    A.SdshAccessibility.portletNamespace = '';
    A.SdshAccessibility.ajaxUrl = '';
    A.SdshAccessibility.backToNormalUrl = '';
    A.SdshAccessibility.init = function(A, portletNamespace, selectableFontSizes, ajaxUrl, backToNormalUrl) {
    	A.SdshAccessibility.portletNamespace = portletNamespace;
    	A.SdshAccessibility.selectableFontSizes = selectableFontSizes;
    	A.SdshAccessibility.ajaxUrl = ajaxUrl;
    	A.SdshAccessibility.backToNormalUrl = backToNormalUrl;
		var fontSizeSelector = A.one('#' + portletNamespace
				+ 'fontSizeSelectors');
		var fontSizeSelectors = fontSizeSelector
				.all('.accessibility-option-font-size .aui-button-input');

		var fontSizeField = A.one('#' + portletNamespace + 'fontSize');

		fontSizeSelectors.on('click', function(event) {
			var clickedNode = event.currentTarget;
			var size = clickedNode.attr('data-size');
			var sizeIndex = A.Array.indexOf(A.SdshAccessibility.selectableFontSizes, fontSizeField.val());
			if (sizeIndex == -1)
				sizeIndex = 0;
			var oldFontSize = A.SdshAccessibility.selectableFontSizes[sizeIndex];
			if (size == 'sizeDec' && sizeIndex > 0) {
				sizeIndex--;
			} else if (size == 'sizeInc' && sizeIndex < (A.SdshAccessibility.selectableFontSizes.length - 1)) {
				sizeIndex++;
			}
			var newFontSize = A.SdshAccessibility.selectableFontSizes[sizeIndex];
			if (A.SdshAccessibility.setFontSize(newFontSize))
				A.SdshAccessibility.submitForm();
			event.preventDefault();
		});
		
		A.one('#' + A.SdshAccessibility.portletNamespace + 'ajax-response').plug(A.Plugin.IO, {
			uri: ajaxUrl,
			autoLoad: false,
			dataType: 'html',
			showLoading: false,
			failureMessage: '',
			form: {
				id: portletNamespace + 'fm'
			}
		});
		A.all('#' + portletNamespace + 'fm input[name="' + portletNamespace + 'contrast"]').on('checkedChange', A.SdshAccessibility.onChangeContrast);
		A.all('#' + portletNamespace + 'fm input[name="' + portletNamespace + 'largeCursorCheckbox"]').on('checkedChange', A.SdshAccessibility.onChangeLargeCursor);
    };
    
    A.SdshAccessibility.backToNormal = function() {
    	A.SdshAccessibility.setFontSize(A.SdshAccessibility.selectableFontSizes[0]);
    	
    	A.SdshAccessibility.setContrast('normal');
    	var contrastField = A.one('input[name="' + A.SdshAccessibility.portletNamespace + 'contrast"]:checked');
    	if (contrastField) {
    		contrastField.set('checked', false);
    		A.use('aui-radio');
    		A.AuiRadio.updateUI(contrastField);
    	}
    	
    	A.SdshAccessibility.setLargeCursor(false);
    	var largeCursorCheckbox = A.one('input[name="' + A.SdshAccessibility.portletNamespace + 'largeCursorCheckbox"]');
    	largeCursorCheckbox.set('checked', false);
    	Liferay.Util.updateCheckboxValue(largeCursorCheckbox.getDOM());
    	A.use('aui-checkbox');
    	A.AuiCheckbox.updateUI(largeCursorCheckbox);
    	
    	var io = A.one('#' + A.SdshAccessibility.portletNamespace + 'ajax-response').io;
    	io.stop();
    	io.set('uri', A.SdshAccessibility.backToNormalUrl);
    	io.start();
    };
    
    A.SdshAccessibility.onChangeContrast = function(event) {
    	if (event.target.get('name') != A.SdshAccessibility.portletNamespace + 'contrast')
    		return;
    	var contrast = A.one('input[name="' + A.SdshAccessibility.portletNamespace + 'contrast"]:checked').get('value');
    	A.SdshAccessibility.setContrast(contrast);
    	A.SdshAccessibility.submitForm();
    };
    
    A.SdshAccessibility.onChangeLargeCursor = function(event) {
    	if (event.target.get('name') != A.SdshAccessibility.portletNamespace + 'largeCursorCheckbox')
    		return;
    	var largeCursor = A.DataType.String.evaluate(A.one('input[name="' + A.SdshAccessibility.portletNamespace + 'largeCursor"]').get('value'));
    	A.SdshAccessibility.setLargeCursor(largeCursor);
    	A.SdshAccessibility.submitForm();
    };
    
    A.SdshAccessibility.setFontSize = function(fontSize) {
		var fontSizeField = A.one('#' + A.SdshAccessibility.portletNamespace + 'fontSize');
		var oldFontSize = fontSizeField.val();
		if (oldFontSize == fontSize)
			return false;
		A.one('body').replaceClass('sdsh-acc-font-size-' + oldFontSize, 'sdsh-acc-font-size-' + fontSize);
		fontSizeField.val(fontSize);
		return true;
    };
    
    A.SdshAccessibility.setContrast = function(contrast) {
    	var body = A.one('body');
    	body.removeClass('sdsh-acc-contrast-normal');
    	body.removeClass('sdsh-acc-contrast-yg');
    	body.removeClass('sdsh-acc-contrast-bw');
    	body.addClass('sdsh-acc-contrast-' + contrast);
    };
    
    A.SdshAccessibility.setLargeCursor = function(largeCursor) {
    	var body = A.one('body');
    	body.replaceClass('sdsh-acc-large-cursor-' + !largeCursor, 'sdsh-acc-large-cursor-' + largeCursor);
    };
    
    A.SdshAccessibility.submitForm = function () {
    	var io = A.one('#' + A.SdshAccessibility.portletNamespace + 'ajax-response').io;
    	io.set('uri', A.SdshAccessibility.ajaxUrl);
    	io.stop();
    	io.start();
    };
 
}, '0.1.1' /* module version */, {
    requires: ['base', 'cookie', 'node', 'array', 'aui-io-plugin', 'selector-css3', 'aui-datatype', 'aui-radio', 'aui-checkbox']
});
