var PlanOpt = new Class({
	initialize: function(grandparent, parent, needs, brands, place){
		this.grandparent = grandparent;
		this.parent = parent;
		this.needs = needs;
		this.brands = this.parse_brands(brands);
		this.place = place;
	},
	
	parse_brands: function(brands) {
		brands = brands.split(';').map(function(item, index){
			item = item.trim().toLowerCase();
			item = item.charAt(0).toUpperCase() + item.substring(1);
			return item;
		});
		brands = brands.filter(function(item, index){
			return item;
		});
		return brands;
	},

	has_brand: function(brand) {
		for(var i = 0; i < this.brands.length; ++i) {
			if(this.brands[i] == brand)
				return true;
		}
		return false;
	},
	
	has_need: function(number) {
		return this.needs[number];
	}
});

var Plan_NEXT_LABEL = 'Next';
var Plan_BACK_LABEL = 'Previous';
var Plan = new Class({
    initialize: function(xml_url, flash_url, swf_url, perpage, paging_place, div, shop_div, plan_div, tabs_div, c_menu, b_menu, n_menu, plan_title){
		this.xml_url = xml_url;
		this.flash_url = flash_url;
		this.div = div;
		this.shop_div = shop_div;
		this.plan_div = plan_div;
		this.tabs_div = tabs_div;
		this.plan_title = plan_title;
		this.elems = [];
		this.paging_divs = [];
		this.page = 0;
		this.perpage = perpage;
		this.paging_place = paging_place;
		this.swf_url = swf_url;
		
		c_menu.getElements('a').each(function(item){
			item.addEvent('click', function(e){
				e.preventDefault();
				this.plan_title.set('html', item.get('html'));
				this.clear_divs();
				c_menu.getElements('li').removeClass('active');
				item.getParent().addClass('active');
				this.filter_by_name(item.get('id'));
			}.bind(this));
		}.bind(this));
		
		/*
		b_menu.getElements('a').each(function(item){
			item.addEvent('click', function(e){
				e.preventDefault();
				this.plan_title.set('html', item.get('html'));
				this.clear_divs();
				item.getParent().getParent().getChildren().set('class', '');
				item.getParent().set('class', 'active');
				this.filter_by_brand(item.get('title'));
			}.bind(this));
		}.bind(this));
		*/
		
		n_menu.getElements('a').each(function(item, index){
			item.addEvent('click', function(e){
				e.preventDefault();
				this.plan_title.set('html', item.get('html'));
				this.clear_divs();
				item.getParent().getParent().getChildren().set('class', '');
				item.getParent().set('class', 'active');
				this.filter_by_needs(index);
			}.bind(this));
		}.bind(this));
		
		// Not very clear portion
		this.tabs_div.getElements('li').each(function(item, index){
		    item.addEvent('click', function(e){
		    	this.plan_title.set('html', item.get('html'));
		    	plan.clear_divs();
		        item.getParent().getChildren('li').removeClass('active');
		        item.addClass('active');
		        $('submenu').getElements('li').setStyle('display', '').set('class', '');
		        if(item.get('id') == 'tabs-place') {
	        		this.open_all_plan();
		        } else {
		        	$('shops-place').setStyle('display', 'block');
		        	div.getChildren('div').setStyle('display', 'block');
		        }

		        if(item.get('id') == 'tabs-brand') {
		        	$('brand-input').set('value', '');
		        }

		        $('submenu').getChildren('div').setStyle('display', 'none');
		        $('submenu').getChildren('div')[index].setStyle('display', 'block');

		        this.reset_paging();
		        this.render_paging();
		        
		        actionManager.add_action('tab', [index]);
		    }.bind(this));
		}.bind(this));
		
		this.div.getElements('a.more').each(function(item, index){
			item.addEvent('click', function(e){
				e.preventDefault();
				var h = $('right-content').getSize().y;
				this.shop_div.setStyle('display', 'block');
				this.shop_div.setStyle('height', h);
				this.shop_div.empty();
				$(document.body).scrollTo(0, 0);
				this.shop_div.load(item.get('href'));
				
				actionManager.add_action('shop', [item.get('href')]);
				/* tvs_ajax.get_content($('shop-content'), item.get('href')); */
			}.bind(this));
		}.bind(this));
		
		this.div.getElements('div.logo').addEvent('click', function(e){
			e.preventDefault();
			this.getParent().getElement('a.more').fireEvent('click', {'preventDefault': function(){}});
		});
		
		this.render_paging();
	},
	
	set_perpage: function(newval) {
		this.page = 0;
		this.perpage = newval;
		this.render_paging();
	},
	
	reset_paging: function() {
		this.paging_divs = [];
		this.page = 0;
	},
	
	render_paging: function() {
		this.paging_place.empty();
		
		for(var i = 0; i < this.paging_divs.length; ++i) {
			this.paging_divs[i].setStyle('display', 'block');
		}
		
		this.generate_paging();
		this.hide_other_pages();
	},
	
	generate_paging: function() {
		var page_count = Math.ceil(this.get_visible_divs_count() / this.perpage);
		if(page_count < 2)
			return;

		var clicked_fn = function(){
			var self = arguments[0];
			self.page = this.get('text').toInt() - 1;
			self.render_paging();
			return false;
		}
		var back_fn = function(){
			var self = arguments[0];
			self.page--;
			self.render_paging();
			return false;
		}
		var next_fn = function(){
			var self = arguments[0];
			self.page++;
			self.render_paging();
			return false;
		}
		if(this.page != 0) {
			var a = new Element('a', {'text': Plan_BACK_LABEL, 'href': '#'})
				.inject(this.paging_place);
			a.addEvent('click', back_fn.pass([this], a));
			new Element('span', {'text': ' | '}).inject(this.paging_place);
		}
		for(var i = 0; i < page_count; ++i) {
			if(i != 0)
				new Element('span', {'text': ' | '}).inject(this.paging_place);
			if(i == this.page) {
				var a = new Element('a', {'text': (i + 1), 'href': '#', 'class': 'active'}).inject(this.paging_place);
			} else {
				var a = new Element('a', {'text': (i + 1), 'href': '#'}).inject(this.paging_place);
			}
			a.addEvent('click', clicked_fn.pass([this], a));
		}
		
		if(this.page != page_count - 1) {
			new Element('span', {'text': ' | '}).inject(this.paging_place);
			var a = new Element('a', {'text': Plan_NEXT_LABEL, 'href': '#'})
				.inject(this.paging_place);
			a.addEvent('click', next_fn.pass([this], a));
		}
	},
	
	hide_other_pages: function() {
		this.paging_divs = this.get_visible_divs();
		for(var i = 0; i < this.paging_divs.length; ++i) {
			this.paging_divs[i].setStyle('display', 'none');	
		}
		for(var i = 0; i < this.perpage; ++i) {
			var div = this.paging_divs[this.page * this.perpage + i];
			if(!div)
				break;
			div.setStyle('display', 'block');
		}
	},
	
	get_visible_divs: function() {
		var divs = this.div.getChildren('div');
		var visible_divs = [];
		for(var i = 0; i < divs.length; ++i) {
			if(divs[i].getStyle('display') != 'none')
				visible_divs.push(divs[i]);
		}
		return visible_divs;
	},
	
	get_visible_divs_count: function() {
		var divs = this.div.getChildren('div');
		var count = 0;
		for(var i = 0; i < divs.length; ++i) {
			if(divs[i].getStyle('display') != 'none')
				count++;
		}
		return count;
	},
	
	add_info: function(grandparent, parent, needs, brands, place){
		this.elems.push(new PlanOpt(grandparent, parent, needs, brands, place));
	},

	filter_by_name: function(number){
		var elems = this.div.getChildren('div').each(function(item, index){
			var el = this.elems[index];
			if(el.parent == number || el.grandparent == number) {
				item.setStyle('display', 'block');
			} else {
				item.setStyle('display', 'none');
			}
		}.bind(this));
		this.reset_paging();
		this.render_paging();
	},
	
	open_all_plan: function(){
		this._open_plan("-1");
	},
	
	open_shop_plan: function(shop_id) {
		this._open_plan("" + shop_id);
	},
	
	open_shops_plan: function() {
		for(var i = 0; i < this.paging_divs.length; ++i) {
			this.paging_divs[i].setStyle('display', 'block');
		}
		
		var visible_places = [];
		this.div.getChildren('div').each(function(item, index){
			if(item.getStyle('display') != 'none')
				visible_places.push(this.elems[index].place);
		}.bind(this));
		this._open_plan(visible_places.join(";"));
	},
	
	_open_plan: function(shops_str) {
		this.tabs_div.getElements('li').removeClass('active');
		this.tabs_div.getElements('li')[1].addClass('active');
		
    	this.div.getChildren('div').setStyle('display', 'none');
    	this.plan_div.setStyle('display', 'block');
    	this.plan_div.empty();
    	$('shops-place').setStyle('display', 'none');
    	$('submenu').getChildren('div').setStyle('display', 'none');
    	
    	$('shop-content').setStyle('display', 'none');
    	$('plan-content').empty();
    	$('plan-content').setStyle('height', $('right-content').getSize().y);
        var swf = new Swiff(this.flash_url + '?id=' + (new Date()).getTime(), {
            container: 'plan-content', 
            width: 935,
            height: 413,
            params: {'wmode': 'opaque', 'bgcolor': '#fff'},
    	    vars: { 'xmlUrl': this.xml_url, 'selShops': shops_str, 'swfUrl': this.swf_url }
    	});  
	},
	
	filter_by_brand: function(title){
		var elems = this.div.getChildren('div').each(function(item, index){
			if(this.elems[index].has_brand(title))
				item.setStyle('display', 'block');
			else
				item.setStyle('display', 'none');
		}.bind(this));
		this.reset_paging();
		this.render_paging();
	},
	
	filter_by_needs: function(number){
		var elems = this.div.getChildren('div').each(function(item, index){
			if(this.elems[index].has_need(number))
				item.setStyle('display', 'block');
			else
				item.setStyle('display', 'none');
		}.bind(this));
		this.reset_paging();
		this.render_paging();
	},
	
	clear_divs: function(){
		this.shop_div.setStyle('display', 'none');
		this.plan_div.setStyle('display', 'none');
	},
	
	open_shop: function(id) {
		this.tabs_div.getElements('li')[0].fireEvent('click');
		this.div.getElement('#' + id).getElements('.controls a')[0].fireEvent('click', {'preventDefault': function(){}});
	}
});
