var FormStyler = (function() {
	var options = {
        elements: ['select', 'checkbox', 'radio', 'text', 'button', 'file'],
        validClass: false,
        invalidClass: false,
		selectClass:   'fs-select',
		radioClass: 'fs-radio',
		checkboxClass: 'fs-checkbox',
		fileClass: 'fs-file',
		inputClass: 'fs-text',
        buttonClass: 'fs-button',
		fileText: 'Nincs fájl kiválasztva',
		fileButton: 'Tallózás',
		checkedClass: 'fs-checked',
		focusClass: 'fs-focus',
		disabledClass: 'fs-disabled'
    };
    
    var inputCount = 0;
    
    function checkClass(el) {
        var selClass = $(el).attr('class');
        if (!selClass) selClass = '';
        if (options.validClass) { 
            for (var c in options.validClass) {
                if (selClass == options.validClass[c]) return true;
            }
            return false;
        }
        if (options.invalidClass && selClass.length) {
            for (var c in options.invalidClass) {
                if (selClass == options.invalidClass[c]) return false;
            }
        }
        return true;
    }
    
    function removeValidateClass(c) {
        if (!c) return '';
        c = c.split(' ');
        var validClass = [];
        for (var i = 0; i < c.length; i++) {
            if (/^validate\[.*$/.test(c[i])) continue;
            validClass.push(c[i]);
        }
        return validClass.join(' ');
    }
    
    function noSelect(elem) {
        $(elem).each(function() {
            var f = (function() { return false; });
            this.onselectstart = this.ondragstart = f; // Webkit & IE
            $(this).mousedown(f) // Webkit & Opera
                .css({ MozUserSelect: 'none' }); // Firefox
        });
    }
    
    function addSelect() {
        try { var ie6 = isIE6; } 
        catch(e) { ie6 = false; }
        if (ie6) return;
        var el = $(this);
        if (el.attr('size') > 1) return;
        if (!checkClass(this)) return;
        var originalClass = removeValidateClass(el.attr('class'));
        var elClass = options.selectClass;
        if (originalClass) elClass += ' '+originalClass;
		el.addClass('alpha-0');
		if (el.attr('disabled')) elClass += ' '+options.disabledClass;
		var wrapper = el.wrap('<div class="'+elClass+'" />');
		var inner = $('<span class="'+options.selectClass+'-inner">'
			+el.find('option:selected').text()+'</span>').insertBefore(el);
		el.bind('change', function() {
			$(inner).text($(this).find('option:selected').text());
		});
    }
    
    function addRadio() {
		if (!checkClass(this)) return;
		var el = $(this);
		var originalClass = removeValidateClass(el.attr('class'));
		var elClass = options.radioClass;
		if (originalClass) elClass += ' '+originalClass;
		var inner = $('<span />'), wrapper = $('<div class="'+elClass+'" />');
		if (el.attr('disabled')) $(wrapper).addClass(options.disabledClass);
		if (el.attr('checked')) $(inner).addClass(options.checkedClass);
		el.wrap(wrapper).wrap(inner);
		el.addClass('alpha-0');
		el.bind('click', function() {
			$('.' + options.radioClass).each(function() {
				var s = $(this).find('span:first'), r = $(this).find('input:first');
				if ($(r).attr('checked')) $(s).addClass(options.checkedClass);
				else $(s).removeClass(options.checkedClass);
			});
		});
	}
    
    function addCheckbox() {
        if (!checkClass(this)) return;
        var el = $(this);
        var originalClass = removeValidateClass(el.attr('class'));
        var elClass = options.checkboxClass;
        if (originalClass) elClass += ' '+originalClass;
        var inner = $('<span />'), wrapper = $('<div class="'+elClass+'" />');
		if (el.attr('disabled')) $(wrapper).addClass(options.disabledClass);
		if (el.attr('checked')) $(inner).addClass(options.checkedClass);
		el.wrap(wrapper).wrap(inner);
		el.addClass('alpha-0');
        el.bind('click', function() {
            if ($(this).attr('checked')) $(this).parent().addClass(options.checkedClass);
            else $(this).parent().removeClass(options.checkedClass);
        });
    }
    
    function addInput() {
		if (!checkClass(this)) return;
		$(this).wrap('<span class="'+options.inputClass+'" />');
		$(this).bind({
			'focus': function() {$(this).parent().addClass(options.focusClass);},
			'blur': function() {$(this).parent().removeClass(options.focusClass)}
		});
		if ($(this).attr('disabled')) $(this).parent().addClass(options.disabledClass);
	}
    
    function addButton() {
        if (!checkClass(this)) return;
        $(this).wrap('<span class="'+options.buttonClass+'" />');
        if ($(this).attr('disabled')) $(this).parent().addClass(options.disabledClass);
    }
    
    function addFile() {
        if (!checkClass(this)) return;
        ++inputCount;
        var fileID = 'fs-file-'+inputCount;
        $(this).wrap('<div class="'+options.fileClass+'" />');
        $(this).addClass('alpha-0');
        $(this).after('<span class="'+options.fileClass+'-button">'+options.fileButton+'</span>');
        $(this).after('<span class="'+options.fileClass+'-text" id="'+fileID+'">'
            +options.fileText+'</span>');
        $(this).attr('size', 100);
        noSelect($(this).siblings('.'+options.fileClass+'-text'));
        noSelect($(this).siblings('.'+options.fileClass+'-button'));
        if ($(this).attr('disabled')) $(wrapper).addClass(options.disabledClass);
        else {
            $(this).bind('change mouseout mouseleave', function() {
                var filename = $(this).attr('value').split(/[\/\\]+/);
                filename = filename[(filename.length-1)];
                if (filename.length) $('#'+fileID).text(filename);
            });
        }
    }
    
    return {
    	initialize: function(o) {
    		if (o) {
    			for (var key in o) options[key] = o[key];
	            if (o.validClass) options.validClass = o.validClass.split(',');
	            if (o.invalidClass) options.invalidClass = o.invalidClass.split(',');
	            if (o.elements) options.elements = o.elements.split(',');
    		}
            for (var i = 0; i < options.elements.length; i++) {
                switch (options.elements[i]) {
                    case 'select':
                        $('select').each(addSelect);   
                        break;
                        
                    case 'radio':
                        $('input[type="radio"]').each(addRadio);
                        break;
                        
                    case 'checkbox':
                        $('input[type="checkbox"]').each(addCheckbox);
                        break;
                    
                    case 'text':
                    	$.merge($('input[type="text"]'), $('input[type="password"]')).each(addInput);
                        break;
                        
                    case 'button':
                        $('input[type="button"], input[type="submit"], button').each(addButton);
    					
    				case 'file':
                        $('input[type="file"]').each(addFile);
                        break;
                    
                    default: break;
                }
            }
        },
        
        add: function(el, type) {
        	switch (type) {
        		case 'select':
        			el.each(addSelect);
        			break;
        			
        		case 'text':
        		case 'password':
        			el.each(addInput);
        			break;
        			
        		case 'radio':
        			el.each(addRadio);
        			break;
        			
        		case 'checkbox':
        			el.each(addCheckbox);
        			break;
        			
        		case 'file':
        			el.each(addFile);
        			break;
        	}
        },
        
        set: function(el, type, active) {
        	switch (type) {
        		case 'select':
        			$(el).prev().text($(el).find('option:selected').text());
                    if ($(el).attr('disabled')) $(el).parent().addClass(options.disabledClass);
                    else $(el).parent().removeClass(options.disabledClass);
        			break;
        			
        		case 'text':
        		case 'password':
        			//el.each(addInput);
        			break;
        			
        		case 'radio':
        			$(el).attr('checked', active);
        			$('.' + options.radioClass).each(function() {
        				var s = $(this).find('span:first'), r = $(this).find('input:first');
        				if ($(r).attr('checked')) $(s).addClass(options.checkedClass);
        				else $(s).removeClass(options.checkedClass);
        			});
        			break;
        			
        		case 'checkbox':
        			$(el).attr('checked', active);
        			if (active) $(el).parent().addClass(options.checkedClass);
                    else $(el).parent().removeClass(options.checkedClass);
        			break;
        			
        		case 'file':
        			//el.each(addFile);
        			break;
        	}
        }
    };
})();
