function NavPannelBuilder(settings)
{
  this._construct(settings);
}
(function(){
  var _this= null;
  
  NavPannelBuilder.prototype={
    dataSet: null,
    dataSetId: null,
    quickNavInput: null,
    quickNavBtn: null,
    quickNavInputValidator: null, 
    quickNavInputId: null,
    
    eventListeners: {},
    
    Events: {
      onMoveToPage: 'onMoveToPage'
    },

    addEventListener: function(event,listener)
    {
      if (typeof(_this.eventListeners[event])=='undefined')
        _this.eventListeners[event]=[];
        
      _this.eventListeners[event].push(listener);
      return false;
    },
    
    notifyListeners: function(evt,customEvent,data)
    {
    	if (typeof(_this.eventListeners)=='undefined' || typeof(_this.eventListeners[customEvent])=='undefined')
    		return;
    		
    	for (i=0;i<_this.eventListeners[customEvent].length;i++)
    	{
    		_this.eventListeners[customEvent][i](evt,data);
    	}
    },
    
    toString: function()
    {
      return '[NavPannelBuilder object]';
    },
    
    _construct: function(settings)
    {
      _this=this;
      _this.container=document.getElementById('ID_NAV_PANNEL_CONTAINER');
      
      
      switch (true)
      {
        case typeof(settings)=='undefined': break;
        case typeof(settings.containerId)!='undefined': _this.container=document.getElementById(settings.containerId);
        case typeof(settings.dataSetId)!='undefined': _this.dataSetId=settings.dataSetId;
        case typeof(settings.quickNavInputId)!='undefined': _this.quickNavInput=document.getElementById(settings.quickNavInputId); _this.quickNavInputId=settings.quickNavInputId;
        case typeof(settings.quickNavBtnId)!='undefined': _this.quickNavBtn=document.getElementById(settings.quickNavBtnId);
      }
      
      if (typeof(_this.container)=='undefined')
        throw 'Nav pannel container not found.';
        
      if (typeof(_this.quickNavInput)!='undefined' && typeof(_this.quickNavBtn)!='undefined')
      {
        Spry.Utils.addEventListener(settings.quickNavBtnId, "click", function(evt){_this.quickNav(); return false;});
        _this.quickNavInputValidator=new Spry.Widget.ValidationTextField(_this.quickNavInputId, "integer", {validateOn:["change","blur"]});
      }

      Spry.Utils.addEventListener(_this.container.id, "click", _this.onClick);
      
      _this.dataSet=MyTools.createDataSet(_this.dataSetId);
      
    },
    
    
    moveToPage: function(evt,pageId)
    {
      _this.notifyListeners(evt,_this.Events.onMoveToPage,pageId);
    },
    
    onClick: function(e)
    {
//      alert(e);
      var target=MyTools.getTarget(e);
      var regExp=/ID_NAV_PANNEL_PAGE_(\w+)/;
      var tmpArr=regExp.exec(target.id);
      if (tmpArr)
      	_this.moveToPage(e,tmpArr[1]);
      return false;
    },
    
    quickNav: function()
    {
      if (_this.quickNavInputValidator.validate())
        _this.moveToPage(null,_this.quickNavInput.value);
      return true;
    },
    
    buildPannel: function(evt,result)
    {
      var pages=[];
      
      var settings=result.navPannelSettings;
      
      if(settings.pagesTotal<2)
      {
        Spry.Utils.addClassName(_this.container,'hidden');
        return false;
      }
      
      Spry.Utils.removeClassName(_this.container,'hidden');
      
      settings.page=Number(settings.page);
      settings.pagesTotal=Number(settings.pagesTotal);
      
      //alert ("buildPannel: function() "+[settings.page , settings.pagesTotal]);
      
      if (typeof(_this.quickNavInput)!='undefined')
      {
        _this.quickNavInputValidator.destroy();
        _this.quickNavInputValidator=new Spry.Widget.ValidationTextField(_this.quickNavInputId, "integer", {minValue:1, maxValue:settings.pagesTotal, validateOn:["change","blur"]});
        _this.quickNavInput.value=settings.page;
      }
      
      if (settings.pagesTotal<10)
      {
        for (i=1;i<=settings.pagesTotal;i++)
          pages[i]={id:i,text:i};
      }else{
        pages[1]={id:1,text:'1'};
        pages[2]={id:2,text:'2'};
        pages[3]={id:3,text:'3'};
        
        pages[settings.pagesTotal-2]={id:settings.pagesTotal-2,text:settings.pagesTotal-2};
        pages[settings.pagesTotal-1]={id:settings.pagesTotal-1,text:settings.pagesTotal-1};
        pages[settings.pagesTotal]={id:settings.pagesTotal,text:settings.pagesTotal};
        
        pages[settings.page]={id:settings.page,text:settings.page};
        if (settings.page>4)
          pages[settings.page-1]={id:settings.page-1,text:settings.page-1};
        if (settings.page<settings.pagesTotal-3)
          pages[settings.page+1]={id:settings.page+1,text:settings.page+1};
        if (settings.page>5)
        {
          var tmpPage=Math.ceil((settings.page+2)/2);
          pages[tmpPage]={id:tmpPage,text:'...'};
        }
        if (settings.page<settings.pagesTotal-4)
        {
          var tmpPage=Math.floor((settings.page+settings.pagesTotal-1)/2);
          pages[tmpPage]={id:tmpPage,text:'...'};
        }
      }
      
      var tmpData=[];
      var newIndex=0;
      for (i=1;i<pages.length;i++)
      {
        if (typeof(pages[i])=='undefined')
          continue;
        tmpData[newIndex++]=pages[i];
      }
      
/*      _this.dataSet.data = tmpData;
      _this.dataSet.dataHash = hashTable;/**/
      
      
      _this.dataSet.setDataFromArray(tmpData);
      _this.dataSet.loadData();
      
      
      return false;
    }
    

  }
})();