HomeService = Class.create();
HomeService.prototype = {

    initialize: function(is404) {
		if (!is404) 
		{
	        this.current_view = 'All';
	        this.go_home = $('go_home');
	        this.go_home.observe('click', this.show_intro.bind(this));
	        this.filter_all = $('filter_all');
	        this.filter_all.observe('click', this.respond_filter_all.bind(this));
	        this.filter_mens = $('filter_mens');
	        this.filter_mens.observe('click', this.respond_filter_mens.bind(this));
	        this.filter_womens = $('filter_womens');
	        this.filter_womens.observe('click', this.respond_filter_womens.bind(this));
	        this.filter_all_sizes = $('size_all');
	        this.filter_all_sizes.observe('click', this.respond_filter_all_sizes.bind(this));
	        this.initialize_size_filter_handlers();
	        this.layoutMaker = new LayoutMaker($('items'), 16);
            this.in_layout = false;
            this.layout_pending = false;
	        this.setRequestedFilter();
	        Event.observe(document.onresize ? document : window, 'resize', this.resizeLayout.bind(this));

	        this.createImagePreloader();
	        this.getNextImage();
	        new PeriodicalExecuter(this.changeBackground.bind(this), 15);
		}
		else 
		{
			this.init_intro();
		}
    },
    
    createImagePreloader: function()
    {
        this.image_preloader = new Element('img');
        this.image_preloader.setStyle({display: 'none'});
        $(document.body).insert(this.image_preloader);
    },
    
    getNextImage: function()
    {
    	var num = Math.floor(Math.random()*10) + 1;
    	var path = $('intro_img').readAttribute('src');
    	var lastSlash = path.lastIndexOf('/');
    	path = path.substr(0, lastSlash + 1);
    	path = path + num.toString() + '.jpg';
        this.image_preloader.writeAttribute('src', path);
    },
    
    changeBackground: function() 
    {
    	$('intro_img').writeAttribute('src', this.image_preloader.readAttribute('src'));
    	this.getNextImage();
    },
    
    initialize_size_filter_handlers: function () {
        this.selected_sizes = new Array(null);
        this.selected_genders = new Array();
        for (var i = 0; i < violet_available_genders.length; i++)
        {
            this.selected_genders.push(violet_available_genders[i]);
        }
        for (var i = 0; i < violet_available_sizes.length; i++) 
        {
            var size_id = violet_available_sizes[i];
            var filter_element = $('size_' + size_id);
            if (filter_element != null) 
            {
                this.selected_sizes.push(size_id);
                var click_handler = 
                function (a_size_id, a_size_element) 
                { 
                    return function (event) 
                    {
                        if (event != null) Event.stop(event);
                        this.respond_filter_change_size_selection(a_size_id, a_size_element);
                    }
                }
                (size_id, filter_element);

                filter_element.observe('click', click_handler.bind(this));
            }
        }
    },
    
    setRequestedFilter: function() {
        var filter = 'none';
        var hash = window.location.hash;
        if (typeof(hash) === 'string' &&  hash.length > 2) 
        {
            filter = hash.substring(1, hash.length - ((hash[hash.length - 1] == '/') ? 1 : 0));
        }
        switch (filter) 
        {
            case 'none':
                this.show_intro(null, true);
                break;
            case 'all':
            case 'all/':
                this.show_items();
                this.respond_filter_all();
                break;
            case 'mens':
            case 'mens/':
                this.show_items();
                this.respond_filter_mens();
                break;
            case 'womens':
            case 'womens/':
                this.show_items();
                this.respond_filter_womens();
                break;
            case 'admin':
            case 'admin/':
                this.show_items();
                this.respond_filter_all();
                this.show_hints();
                break;
            default:
                this.show_items();
                this.respond_filter_all();
                break;
        }
    },
    
    setActive: function(element)
    {
        var all = $$('.violet_item_filter');
        all.each(function(e) { e.removeClassName('active'); });
        if (element != null) 
        {
            element.addClassName('active');
        }
    },

    show_hints: function(event)
    {
        if (event != null) Event.stop(event);
        var all = $$('.orderHint');
        all.each(function(e) { e.show(); e.removeClassName('orderHint'); });
    },
    
    apply_filter: function()
    {
        var selected = new Array();
        var local_selected_sizes = this.selected_sizes.length <= 1 ? violet_available_sizes : this.selected_sizes;
        for (var i = 0; i < this.selected_genders.length; i++)
        for (var j = 0; j < local_selected_sizes.length; j++) 
        {
            selected.push('.gs_' + this.selected_genders[i] + '_' + local_selected_sizes[j]);
        }
        if (this.current_view == 'All' && (this.selected_sizes.length == violet_available_sizes.length || this.selected_sizes.length == 1))
        {
            selected.push('.iteminfoblock');
            selected.push('.soldOut');
        }
        var to_show = $$(selected);
        var add_pattern_to_hide = '#not_existing_id';
        if (to_show.any())
        {
        	add_pattern_to_hide = '.noitems_infoblock';
        }
        else 
        {
        	to_show = $$('.noitems_infoblock');
        }
        var to_hide = $$('.gender_Mens', '.gender_Womens', '.iteminfoblock', add_pattern_to_hide);
        to_hide.each(function(e) { e.addClassName('filtered_out'); });
        to_show.each(function(e) { e.removeClassName('filtered_out'); });
        this.layout();
    },
    
    respond_filter_change_size_selection: function (size_id, size_element) {
        var test_f = function(v){return v == size_id;};
        if (this.selected_sizes.any(test_f))
        {
            this.selected_sizes = this.selected_sizes.reject(test_f);
            size_element.removeClassName('violet_selected_gender_size');
        }
        else 
        {
            this.selected_sizes.push(size_id);
            size_element.addClassName('violet_selected_gender_size');
        }
        this.fix_all_sizes_selected();
        this.apply_filter();
    },
    
    respond_filter_all_sizes: function(event) {
        if (event != null) Event.stop(event);
        this.selected_sizes = new Array(null);
        this.setActive(this.filter_all);
        this.fix_all_sizes_selected();
        this.apply_filter();
    },
    
    fix_all_sizes_selected: function()
    {
        var selected_length = this.selected_sizes.length;
        if (selected_length == 1 || selected_length == violet_available_sizes.length) // last null
        {
            $('size_all').addClassName('violet_selected_gender_size');
            for (var i = 0; i < violet_available_sizes.length; i++) 
            {
                var i_size_id = violet_available_sizes[i];
                if (i_size_id != null)
                {
                    $('size_' + i_size_id).removeClassName('violet_selected_gender_size');
                }
            }
            this.selected_sizes = new Array(null);
        }
        else 
        {
            $('size_all').removeClassName('violet_selected_gender_size');
        }
    },

    respond_filter_all: function(event) {
        if (event != null) Event.stop(event);
        this.current_view = 'All';
        this.selected_genders = violet_available_genders.slice(0);
        this.selected_sizes = new Array(null);
        this.setActive(this.filter_all);
        this.fix_all_sizes_selected();
        this.apply_filter();
    },

    respond_filter_mens: function(event) {
        if (event != null) Event.stop(event);
        this.current_view = 'Mens';
        this.selected_genders = new Array(violet_available_genders[0]);
        this.setActive(this.filter_mens);
        this.apply_filter();
    },

    respond_filter_womens: function(event) {
        if (event != null) Event.stop(event);
        this.current_view = 'Womens';
        this.selected_genders = new Array(violet_available_genders[1]);
        this.setActive(this.filter_womens);
        this.apply_filter();
    },
    
    show_intro: function(event, do_not_animate) {
        var animate = !do_not_animate;
        if (event != null) Event.stop(event);
        $('loading_message').hide();
        $('intro_container').show();
        var intro_container = $('intro_container');
        var wrapper = $('wrapper');
        
        $(document.body).removeClassName('homepage-items');
        $(document.body).addClassName('homepage-intro');
        $(document.documentElement).setStyle({overflow: 'hidden'});

        
        var height = $(document.body).getHeight();
        
        if (animate) {
            intro_container.setStyle({top: (-height) + "px"});
        }
        else 
        {
            intro_container.setStyle({top: "0px"});
        }
        this.init_intro();
        if (animate) 
        {
            if (height != 0) 
            {
                 
                 new Effect.Move('intro_container', {x: 0, y: height, mode: 'relative',
                 afterFinish: 
                    function() {        
                        $('wrapper').hide();
                    }
                 });
            }
        }
        else 
        {
            $('wrapper').hide();
        }
        
    },
    
    show_items: function() {
        $('loading_message').hide();
        $('intro_container').hide();
        $('wrapper').show();
        $(document.body).removeClassName('homepage-intro');
        $(document.body).addClassName('homepage-items');
        $(document.documentElement).setStyle({overflow: 'scroll'});
    },
    
    resizing: function()
    {
        this.layout();      
    },

    resizeLayout: function()
    {
        if (!this.layout_pending)
        {
            this.layout_pending = true;
            this.deferredLayout.bind(this).defer();    
        }
    },

    deferredLayout: function()
    {
        this.layout_pending = false;
        this.layout();
    },

    layout: function()
    {
        if (!this.in_layout)
        {
            this.in_layout = true;
            try
            {
                this.layoutMaker.layout();

                
            }
            catch (ex)
            {
                alert(ex);
            }
            this.in_layout = false;
        }
    },
    
    init_intro: function() {
        var container = $('container');
        var resizing = function () {
            var h = (container.getWidth() * 599 / 1280);
            var h2 = document.body.offsetHeight;
            container.style.height =  (h > h2 ? h : h2) + "px";
            container.style.fontSize = (16 * (container.getHeight() / 960)) + "px";
        };
        Event.observe(document.onresize ? document : window, 'resize', resizing);
        resizing();  
        if (!this.is404) 
        {
	        var me = this;
	        var finisher = 
	           function() {
	               me.show_items();
	           };
	           
	        $('a_enter').observe('click', function (event) 
	        {
	            $('wrapper').show();
	            homeService.respond_filter_all();
	            new Effect.Move('intro_container', {x: 0, y: -$('intro_container').getHeight(), mode: 'relative', afterFinish: finisher});
	        });
        }
    }

}


 