var XLayer = Class.create();
XLayer.prototype = {

	initialize: function(id) {
		this.id = id;
	},

	showhide: function(hide) {
		if (hide) {
			Element.hide(this.id);
		} else {
			Element.show(this.id);
		}
	}

}

var XLayerToggle = Class.create();
XLayerToggle.prototype = {
	
	initialize: function(id) {
		this.id = id;
		this.id_on = id+'_on';
		this.id_off = id+'_off';
	},

	showhide: function(hide) {
		if (hide) {
			Element.hide(this.id_on);
			Element.show(this.id_off);
		} else {
			Element.hide(this.id_off);
			Element.show(this.id_on);
		}
	}
}

var XLayerRemote = Class.create();
XLayerRemote.urlwrapperURL = '/';
XLayerRemote.baseURL = '.';
XLayerRemote.prototype = {
	
	initialize: function(id) {
		this.id = id;
	},

	showhide: function(hide) {
		if (hide) {
			Element.hide(this.id);
		} else {
			Element.show(this.id);
			new Ajax.Updater(
				this.id,
				XLayerRemote.urlwrapperURL+'urlwrapper.php?url='+XLayerRemote.baseURL + "/" + this.id + ".htm",
				{
					method: 'get'
				}
			);
		}
	}
}

var XLayerList = Class.create();
XLayerList.prototype = {

	initialize: function(layers) {
		this.layers = new Array();
		this.selected = null;
		this.register(layers);
	},

	register: function(layers) {
		for (var i=0; i<layers.length; i++) {
			this.layers[layers[i].id] = layers[i];
			layers[i].showhide(true);
		}
	},

	select: function(id) {
		if (this.selected!=null) {
			this.selected.showhide(true);
		}
		this.selected = this.layers[id];
		this.selected.showhide();
	}
}

Object.extend(XLayerList, {

	byRange: function(base_id, cls, start, end) {
		var ret = new Array();
		for (var i=start; i<=end; i++) {
			ret.push(new cls(base_id+i));
		}
		return new XLayerList(ret);
	}
});

var XLayerGroup = Class.create();
XLayerGroup.prototype = {

	initialize: function() {
		this.start = arguments[0];
		this.end = arguments[1];
		this.layergroups = new Array();
		for (var i=2; i<arguments.length; i+=2) {
			this.layergroups.push( {
				base_id: arguments[i],
				layerlist: XLayerList.byRange( arguments[i], arguments[i+1], this.start, this.end )
			} );
		}
		this.selected = null;
		this.select(this.start);
	},

	select: function(nr) {
		for (var i=0; i<this.layergroups.length; i++) {
			this.layergroups[i].layerlist.select(this.layergroups[i].base_id+nr);
		}
		this.selected = nr;
	}
}

var _pagenavs = new Array();

XLayerGroupPageNav = Class.create();
XLayerGroupPageNav.prototype = {
	
	initialize: function(layergroup, id, config) {
		this.layergroup = layergroup
		this.id = id;

		this.setConfig(config);

		this.generate();

		_pagenavs[id] = this;
	},

	setConfig: function(config) {
		this.config = {
			prev_class: '',
			prev_text: 'Previous',
			prev_separator: '',
			next_class: '',
			next_text: 'Next',
			next_separator: '',
			page_class: '',
			page_selected_class: 'selected',
			page_separator: ' | '
		}
		Object.extend(this.config, config || {});
	},

	generate: function() {
		var prev = this.layergroup.selected-1;
		var next = this.layergroup.selected+1;
		if (prev<this.layergroup.start) {
			prev = this.layergroup.end;
		}
		if (next>this.layergroup.end) {
			next = this.layergroup.start;
		}

		var html = '';
		html += '<a class="'+this.config.prev_class+'" href="'+this.genNavLink(prev)+'">'+this.config.prev_text+'</a> ';
		html += this.config.prev_separator;
		

		html += '<a class="'+this.config.next_class+'" href="'+this.genNavLink(next)+'">'+this.config.next_text+'</a> ';
		$(this.id).innerHTML = html;
	},

	nav: function(nr) {
		this.layergroup.select(nr);
		this.generate();
	},

	genNavLink: function(nr) {
		return 'javascript:_pagenavs.'+this.id+'.nav('+nr+')';
	}
}
