/**
	Klasa do nawigacji 'zakladkowej' -  nawigacja opiera sie na hash'ach w linkach, ktore musza byc rowne ID elemenu na ktory wskazuja.
	Uwaga: to jest już dość przestarzaly kod. mam w planie go przepisać /pio
		
	@version 1.0
	@autor pio
	@param oConfig - obiekt
 
	@require: mootools-1.2.1-core
 
	@example:
	var tabSheet = new TabNavigation({
		sNavId: 'tabs',
		sActiveClassName: 'active',
		sDisplayNoneClassName: 'hide',
		bAddClassToParentElement: 0
	});
	tabSheet.init();
 
 */
var TabNavigation = new Class({
    initialize: function(oConfig) {
        this.sNavId = oConfig.sNavId;
        this.sActiveClassName = oConfig.sActiveClassName || '';
        this.sDisplayNoneClassName = oConfig.sDisplayNoneClassName;
        this.bAddClassToParentElement = oConfig.bAddClassToParentElement || 0; // ustaw na true, jezeli klasa 'sActiveClassName' ma byc nadawana rodzicowi linka (np. elementowi li)    	
        this.aCustomElements = oConfig.aCustomElements;    
        this.prefix = oConfig.prefix || '';
            
        this.aItems = [];
        this.oActive;
    },
    
    init: function() {
        this.getItemsFromAnchors();
    	this.getItemsFromCustomElements();
        if (this.aItems.length == 0) return;
        
        this.addEvent();
        this.getActive();
        this.run();
    },
    
    run: function() {
        this.aItems.each(function(item, i) {
        	if (item == this.oActive) {
                this._show(item.target);
                if (this.sActiveClassName != '')
                    item.elWithClass.addClass(this.sActiveClassName);
                if (this.prefix != '')
                    location.replace('#' + item.prefix + item.target.id);
            } else {
            	this._hide(item.target);
                if (this.sActiveClassName != '')
                	item.elWithClass.removeClass(this.sActiveClassName);
            }
        }, this);
    },
    
    addEvent: function() {
    	var This = this;
        this.aItems.each(function(el, i) {
        	el.el.addEvent('click', function(e) {
        		This.handleEvent(e, el);
        	});
        });
    },
    
    handleEvent: function(e, oItem) {
        e.stop();
        this.oActive = oItem;
        this.run();
    },
   
    getItemsFromAnchors: function() {
        $(this.sNavId).getElements('a').each(function(el, i) {
            var id = el.hash.substring(1);
            var targetEl = $(id);
            
            if (targetEl) {
                this.aItems.push({
                    el: el,
                    target: targetEl,
                    prefix: this.prefix,
                    elWithClass: ((this.bAddClassToParentElement) ? el.getParent() : el)
                });
            }           
        }, this);    
    },
    
    getItemsFromCustomElements: function() {
    	if (!this.aCustomElements || this.aCustomElements.length == 0) return;
        this.aCustomElements.each(function(el, i) {
            this.aItems.push({
                el: $(el.el),
                target: $(el.target),
                prefix: (el.prefix) ? el.prefix : '',
                elWithClass: ((el.elWidthClass) ? el.elWidthClass : $(el.el))
            });
        }, this);
    },
    
    getActive: function() {
        var hash = window.location.hash.substring(1);
        if (hash != '') {
        	for (var i=0; i<this.aItems.length; i++) {
                if (this.aItems[i].prefix + this.aItems[i].target.id == hash) {
                    this.oActive = this.aItems[i];
                    return;
                }
    		}
        }
        
        if (this.sActiveClassName != '') {
    		for (var i=0; i<this.aItems.length; i++) {
                if (this.aItems[i].elWithClass.hasClass(this.sActiveClassName)) {
                    this.oActive = this.aItems[i];
                    break;
                }
    		}
    	} else {
    		this.oActive = this.aItems[0];
    	}
    },
       
    _show: function(el) {
        if (!this.sDisplayNoneClassName)
            el.style.display = "block";
        else
    	    el.removeClass(this.sDisplayNoneClassName);
    },
    
    _hide: function(el) {
        if (!this.sDisplayNoneClassName)
            el.style.display = "none";
        else
    	    el.addClass(this.sDisplayNoneClassName);
    }
});
