var CNavigator = Class.create();

CNavigator.prototype = {

	initialize: function(_config)
	{
		this.options = {
			'ContainerID': _config['id'],
			'paginationSelector': _config['paginationSelector'],
			'loadingEffectID': 'loadingEffect',
			'loadingEffectCSS': 'navigatorLoadingEffect',
			'callback': _config['callback']
		};

		this.navigatorEl = null;		
	},
	
	getElement: function()
	{
		return this.navigatorEl;
	},
	
	init: function()
	{
		this.navigatorEl = $(this.options['ContainerID']);
		if (this.navigatorEl)
		{
			var pagination = this.navigatorEl.getElementsBySelector(this.options['paginationSelector']);
			if (pagination)
			{
				pagination.each(function(el) { el.onclick = function() { return false } } )
				pagination.invoke('observe', 'click', this.paginationNavigator.bindAsEventListener(this) );
			}
			
			if (Prototype.Browser.IE)
			{				
				$$('div.top-navigation input.page-number').each(function(el) {
					Event.observe(el, 'keydown', this.processSubmitByEnter.bindAsEventListener(this));
				}.bind(this));
			}

			var gotoBtns = this.navigatorEl.getElementsBySelector('form input[class="button-go"]');
			if (gotoBtns)
			{
				gotoBtns.each(function(el) { el.onclick = function() { return false } } )
                gotoBtns.invoke('observe', 'click', this.submitGotoForm.bindAsEventListener(this) );
			}

			var sorting = this.navigatorEl.getElementsBySelector('th a');
			if (sorting)
			{
				sorting.each(function(el) { el.onclick = function() { return false } } )
                sorting.invoke('observe', 'click', this.paginationNavigator.bindAsEventListener(this) );
			}

			var rows = this.navigatorEl.getElementsBySelector('table[class="data-table"] tbody tr');
            if (rows)
            {
				rows.invoke('observe', 'mouseout', function(evt) { var el = Event.findElement(evt,'tr'); $(el).removeClassName('hover'); } );
                rows.invoke('observe', 'mouseover', function(evt) { var el = Event.findElement(evt,'tr'); $(el).addClassName('hover'); } );

				var expanders = this.navigatorEl.getElementsBySelector('a[rel="expand"]');
                if ( expanders && expanders.length )
                {
					rows.each(function(v){
						var colspan = v.getElementsByTagName('td');
						new Insertion.After(v, '<tr style="display:none"><td colspan="'+colspan.length+'" class="rowLoadingEffect">&nbsp;</td></tr>');
					});
                    for ( var i = 0; i < expanders.length; i++ )
                    {
                        expanders[i].onclick = function() { return false }	
                        Event.observe ( expanders[i], 'click', this.getExpandedRowContent.bindAsEventListener(this) );
                    }

					if ( Prototype.Browser.IE )
		            {
		                var table = this.navigatorEl.getElementsBySelector('table[class="data-table"]');
		                if ( table && table[0] )
		                {
		                    table[0].addClassName('bottomBorder');
		                }
		            }
                }
            }
            
            var getInfortamtion = this.navigatorEl.getElementsBySelector('table[class="data-table"] a[rel="getInfo"]');
            {
				getInfortamtion.each(function(el) { el.onclick = function() { return false } } )
                getInfortamtion.invoke('observe', 'click', this.getBlocksInformation.bindAsEventListener(this) );
            }            

			if (this.options['callback'])
			{
				this.options['callback']();
			}
		}
		
		return false;
	},

	reload: function(url)
	{
		if (url)
		{
			//this.setLoadingEffect();
            new Ajax.Request(url, {
                //onCreate: this.onCreateLoading.bind(this),
                //onFailure: this.onFailureLoading.bind(this),
                'onSuccess':this.successLoading.bind(this)
            });
		}
	},

	getExpandedRowContent: function ( evt )
    {
        this.request    = null;
        var elHref      = Event.findElement(evt,'a');
        var elTd        = Event.findElement(evt,'td');
        var expandedRow = $(Event.findElement(evt,'tr')).next(0);

        if ( elHref && elTd )
        {
            if ( elHref.className == 'closed' )
            {
                elHref.className = 'opened';
                $(elTd).addClassName ( 'selected' );
                this.openExpandedRow ( $(expandedRow) );
                var loadingEffect = expandedRow.getElementsBySelector('td[class="rowLoadingEffect"]');
                if ( loadingEffect && loadingEffect[0] )
                {
					interfaceObj.resetHeight();					
                    new Ajax.Request ( elHref.href, { onSuccess: function(response)
                    {
                        loadingEffect[0].update(response.responseText);
						loadingEffect[0].className = 'expandedRow';
						interfaceObj.resizeLayout();
                    }.bind(this)
                    } );
                }
            }
            else
            {
                elHref.className = 'closed';
                elTd.removeClassName ( 'selected' );
                this.closeExpandedRow ( expandedRow );
            }
        }
    },

	openExpandedRow: function ( expandedRow )
    {
		interfaceObj.resetHeight();
        if ( !expandedRow ) return;
        expandedRow.setStyle(
            {'display':''}
        );
		interfaceObj.resizeLayout();
    },

    closeExpandedRow: function ( expandedRow )
    {
		interfaceObj.resetHeight();
        if ( !expandedRow ) return;
        expandedRow.setStyle(
            {'display':'none'}
        );
		interfaceObj.resizeLayout();
    },

	gotoDialog: function (el)
	{
		var cont = el.up('div').down('div[class="go-page-open"]');
		if (cont)
		{
			if (cont.getStyle('display') == 'block')
			{
				el.removeClassName('change-page-open');
				cont.setStyle({'display':'none','visibility':'hidden'});
				var inputs = cont.getElementsBySelector('input[class="page-number"]');
				if (inputs)
				{
					inputs.invoke('disable');
				}
			}
			else
			{
				el.addClassName('change-page-open');
			    cont.setStyle({'display':'block'});
				var inputs = cont.getElementsBySelector('input[class="page-number"]');
                if (inputs)
                {
					cont.setStyle({
						'top':Prototype.Browser.IE?20:17+'px',
						'z-index':100
					});
					inputs.invoke('enable');
					var leftPos = Utils.getLeftPos(cont);
					var w = (leftPos+cont.getWidth());
					var W = Utils.getViewportWidth();
					var offset = w - W;
					if (offset>0)
					{
						cont.setStyle({
	                        'left':'-'+offset+'px',
	                        'visibility':'visible'
	                    });
					}
					else
					{
						cont.setStyle({
                            'visibility':'visible'
                        });
					}
                }
			}
		}
		return false;
	},

	submitGotoForm: function(evt)
	{
		var f = Event.findElement(evt,'form');
		var formParams = f.serialize();
		this.setLoadingEffect();
        if (f.method == 'post')
		{        	
			new Ajax.Request(f.action, {
				//onCreate: this.onCreateLoading.bind(this),
				//onFailure: this.onFailureLoading.bind(this),
				'onSuccess':this.successLoading.bind(this),
				'postBody':formParams
			});
	 	}
		else
		{
			new Ajax.Request(f.action+'?'+formParams, {
                //onCreate: this.onCreateLoading.bind(this),
                //onFailure: this.onFailureLoading.bind(this),
                'onSuccess':this.successLoading.bind(this)
            });
		}
		return false;
	},

	paginationNavigator: function(evt)
	{
		var el = Event.findElement(evt, 'a');

		switch ( el.rel )
        {
            case 'go-to-page':
            {
                this.gotoDialog(el);
                break;
            }
            default:
            {
                this.setLoadingEffect();
                
                var navCheckboxes = Element.select($(this.options['containerID']),'input[type=checkbox]');
                var additionalAjaxParameters = ''; 
                for (var k=0; k<navCheckboxes.length; k++) {
                	if (navCheckboxes[k].checked) {
                		if (navCheckboxes[k].name == 'chAll') {
//                			break;
                		}
                		else {
                			additionalAjaxParameters =  additionalAjaxParameters + '&ch[' + k +']=' + navCheckboxes[k].value;
                		}
                	}
                }
                
                new Ajax.Request ( el.href + additionalAjaxParameters, {
                 //onCreate: this.onCreateLoading.bind(this),
                 //onFailure: this.onFailureLoading.bind(this),
                 onSuccess:this.successLoading.bind(this)
                 }
                );
            }
        }
		return false;
	},

	getBlocksInformation: function(evt)
	{
		var el = Event.findElement(evt, 'a');

        this.setLoadingEffect();

         new Ajax.Request ( el.href, {
                 //onCreate: this.onCreateLoading.bind(this),
                 //onFailure: this.onFailureLoading.bind(this),
                 onSuccess:this.successLoading.bind(this)
                 }
                );
		return false;
	},

	setLoadingEffect: function()
    {
        if ( this.navigatorEl )
        {
	    	if(this.ajaxLoadingEffect != null){
	    		this.removeLoadingEffect();
	    	}    	
			this.ajaxLoadingEffect = new AjaxLoadingEffect({'containerId':this.navigatorEl,cssLoadingEffect: 'winLoadingEffectTopMenu'});
			this.ajaxLoadingEffect.setLoadingEffect();
			return;
        }			
		/*
		if ( this.navigatorEl )
        {
    	
            var body = document.getElementsByTagName('body')[0];
            var LoadingEffect = document.createElement('div');
            LoadingEffect.id = this.options['loadingEffectID'];
            if ( LoadingEffect )
            {
                $(LoadingEffect).addClassName(this.options['loadingEffectCSS']);
                $(LoadingEffect).setStyle(
                    {
                        'width':this.navigatorEl.getWidth()+'px',
                        'height':this.navigatorEl.getHeight()+'px',
                        'left':(Utils.getLeftPos(this.navigatorEl))+'px',
                        'top':Utils.getTopPos(this.navigatorEl)+'px'
                    }
                );
                body.appendChild(LoadingEffect);
                //this.tabAjaxRequestProperties["tabLoadingProgressShown"] = true;
            }
        }
        */ 
    },

    removeLoadingEffect: function()
    {
        if(this.ajaxLoadingEffect != null){
			this.ajaxLoadingEffect.removeLoadingEffect();
			this.ajaxLoadingEffect =null;
		}	

		return;
		/*        
        var tabLoadingEffect = $(this.options['loadingEffectID']);

        if ( tabLoadingEffect )
        {
            tabLoadingEffect.remove();
            //this.tabAjaxRequestProperties["tabLoadingProgressShown"] = false;
        }
        **/
    },

	successLoading: function (response)
	{		
		try {
			this.removeLoadingEffect();
			this.navigatorEl.update(response.responseText.stripScripts());
			this.init();
	
			interfaceObj.initLayout();
		}
		catch (e)
		{
			alert($H(e).inspect());	
		}
		
		

		return false;
	},
	
	processSubmitByEnter: function(evt)
	{
		evt = evt || window.event;		
        if (evt.keyCode == 13)
        {
        	this.submitGotoForm(evt);
            return false;            
        }
	}
};
