// JavaScript Document

(function($) { 

$.extend($.ui.tabs.prototype, {
  ID : null,
  slideContainer : null,
  slider : null,
  slideTimer : null,
  minWidth: 200,
  scrollSpeed : 30,
  acceleration : 2,
  useAnimation : true,
  listTimer:null,  
 
  /*Public methods*/
  SlideToTab : function(_index){
    var sl = $(this.slideContainer).scrollLeft();
    var left = $(this.$tabs[_index])[0].offsetLeft;
    if (left > $(this.slideContainer).width()+sl - $(this.$tabs[_index]).width()){
      //Move from right
      var _toX = $(this.$tabs[_index]).width() + $(this.$tabs[_index])[0].offsetLeft - $(this.slideContainer).width();
    }else if (left < sl){
      //move from left
      var mar = parseInt($(this.slideContainer).css("margin-left")) + parseInt($(this.slideContainer).css("padding-left"));
      var _toX = $(this.$tabs[_index])[0].offsetLeft-mar;
    }else return;
    this.slideTo(_toX);
  },
  
  MoveToNextTab : function(){
    var mar = parseInt($(this.slideContainer).css("margin-left")) + parseInt($(this.slideContainer).css("padding-left"));
    if ($(this.slideContainer).scrollLeft() + $(this.slideContainer).width()  >= this.slideContainer.scrollWidth - mar ) {return}
    var ind = this.getRightVisibleTab();
    if (ind !=-1){
      var _toX = $(this.$tabs[ind]).width() + $(this.$tabs[ind])[0].offsetLeft - $(this.slideContainer).width()+mar;
      this.slideTo(_toX);
    }else {
      this.turnNextTabButton(false);
    }
    this.turnPrevTabButton(true);
  },
  
  MoveToPrevTab : function(){
    var mar = parseInt($(this.slideContainer).css("margin-left")) + parseInt($(this.slideContainer).css("padding-left"));
    if ($(this.slideContainer).scrollLeft() <= mar+2) {return}
    var ind = this.getLeftVisibleTab();
    if (ind != -1){
      var _toX = $(this.$tabs[ind])[0].offsetLeft-mar;
      this.slideTo(_toX);
    }else {
      this.turnPrevTabButton(false);
    }
    this.turnNextTabButton(true);
  },
  
  ChangeTab : function(e){
    var _id = e.data;
    this.SlideToTab(_id);
    var href = $(this.$tabs[_id]).attr("href");
    if (href.indexOf("#") != 0){
		window.location = href;
	}else{
		this.select(_id);
		this.HideList();
    }
  },
  
  ShowHideList : function(){
    if ($(this.ListPath).css("display") == "none") this.ShowList();
    else this.HideList();
  },
  
  HideList : function(){
    $(this.ListPath).hide();
  },
  
  ShowList : function(){
    $(this.ListPath).show();
  },
  /*-end of public*/
  
  stopHideList : function(){
    if (this.listTimer != null) clearTimeout(this.listTimer);
  },
  
  startHideList : function(){
    var t = this;
    this.listTimer = setTimeout(function(){t.HideList()}, 400);
  },
 
  seek4init : function(_args){       
    _args = eval(_args);
    
	this.ID = _args.toolbar;
	this._urls = _args.urls;
	this._onClick = _args.onclick;
	this.select(_args.selected);
	
    this.createDOMObjects();
    this.bindEvents();
    this.resizeContainer();
    this.initWidths();
    this.buildList();
    this.SlideToTab(_args.selected);
  },
  
  initWidths : function(){
    var w = this.totalWidth()+40;
    $(this.slider).width(w);
  },  
  
  createDOMObjects : function(){
    this.btnNextTabPath = this.ID+" .btn_nextTab";
    this.btnPrevTabPath = this.ID+" .btn_prevTab";
    this.slider = this.element[0].parentNode;
    this.slideContainer = this.slider.parentNode;
    this.btnShowListPath = this.ID +" .btn_showList";
    this.ListPath = this.ID +" .list";
    this.Container = this.slideContainer.parentNode;
    this.RemoveIconsPath = "#"+this.element[0].id+" .icn_remove";
  }, 
  
  bindEvents : function(){
    var t = this;   
    this.element.bind("tabsselect", function(e, ui){            
      if(t._urls[ui.index]!=null){ window.location=t._urls[ui.index];return false;}
      if (t._onClick!=null)t._onClick(e, ui);      
    });
    
    $(this.btnNextTabPath).bind("click", function(){t.MoveToNextTab()});
    $(this.btnPrevTabPath).bind("click", function(){t.MoveToPrevTab()});
    $(this.btnShowListPath).bind("click",function(){t.ShowHideList()});
    $(this.ListPath).bind("mouseover", function(){t.stopHideList()});
    $(this.ListPath).bind("mouseout", function(){t.startHideList()});

    $(window).bind("resize", function(){t.resizeContainer()});
    var l = this.$tabs.length;
    for (var i=0;i<l;i++){
        //alert($(this.$tabs[i]).attr("href")+":"+$(this.$tabs[i]).attr("href").indexOf("#"));
        if ($(this.$tabs[i]).attr("href").indexOf("#") == 0 || $(this.$tabs[i]).attr("href") == "javascript:"){
            $(this.$tabs[i]).bind('click', i, function(e){t.tabSelectClick(e)});
        }else{$(this.$tabs[i]).unbind('click');}
      $(this.$tabs[i]).bind('mouseover', i, function(e){t.tabMouseOver(e)});
    }
    $(this.RemoveIconsPath).bind("click", function(e){t.OnRemoveClick(e)});
        
  },
  
  OnRemoveClick : function(e){
    var _tab = $(e.target).parent("span").parent("a");
    var _index = this.$tabs.index(_tab);
    var _data = {tab:_tab, selectedIndex:_index};
    var r = this.element.triggerHandler("onremoveclick",[e, this.PrepareRemoveEvent(_data)],e.stopPropagation());
    if (!r) return;
    this.remove(_index);
  },
  
  PrepareRemoveEvent : function(e){
    return e;
  },
  
  resizeContainer : function (){
    var padd = 0
    var padd = parseInt($(this.Container).css("padding-left")) + parseInt($(this.Container).css("padding-right"));
    var border = 0;
    if (typeof($(this.ID).css("border-left-width")) == "Number" && typeof ($(this.ID).css("border-left-width")) == "Number"){
        border = parseInt($(this.ID).css("border-left-width")) + parseInt($(this.ID).css("border-left-width"));
    }
    $(this.slideContainer).width($(this.Container).width()-$(this.ID).width()-padd-border);
  },
  
  tabSelectClick : function(e){	
    var _tab = $(e.target).parent("span").parent("a");
    var _i = this.$tabs.index(_tab);    
    var i = e.data;    
    if(_i==i){
		//if(this._urls[i] == null) window.location.reload(true);
		//else
		if(this._urls[i] != null) window.location=this._urls[i];
    }    
    this.SlideToTab(e.data);
  },
  
  tabMouseOver : function(e){
    var i = e.data;
    if(this._urls[i] != null) window.status = this._urls[i]; 
  },
  
  slideTo : function (_toX){
    if (this.useAnimation){
      var sl = this.slideContainer.scrollLeft;
      if (Math.abs (sl-_toX) < 2){return}   //4 - approximate for tab position: TODO - move ta parameters
      var newSl = sl + (_toX - sl) / this.acceleration;
      this.slideContainer.scrollLeft = newSl;
      var t = this;
      if (this.slideTimer != null) clearTimeout(this.slideTimer);
      this.slideTimer = setTimeout( function(e) {t.slideTo(_toX)} , this.scrollSpeed);
    }else{
        this.slideContainer.scrollLeft = _toX;
    }
  },
  
  turnNextTabButton : function(_on){
    /*
    var t = this;
    if (_on)
      $(this.btnNextTabPath).bind("click", function(){t.MoveToNextTab()});
    else
      $(this.btnNextTabPath).unbind("click");
    */
  },
  
  turnPrevTabButton : function(_on){
    /*
    var t = this;
    if (_on)
      $(this.btnPrevTabPath).bind("click", function(){t.MoveToPrevTab()});
    else
      $(this.btnPrevTabPath).unbind("click");
      */
  },
  
  totalWidth : function(){
    var l = this.$tabs.length; var tw = 0; 
    for (var i=0;i<l;i++){
      tw += $(this.$tabs[i].parentNode).width();
    }
    return tw;
  },
  
  getLeftVisibleTab :function(){
    var l=this.$tabs.length;
    var s = "";
    for (var i=0;i<l;i++){
      var tab = this.$tabs[i];
      var sl = $(this.slideContainer).scrollLeft();
      var w = $(tab).width();
      var left = $(tab)[0].offsetLeft;
      if (sl-3 > left+3 && sl-3 < left + w){
        //alert($(tab).text());
        return i;
      }
    }
    return -1;
  },
  
  getRightVisibleTab :function(){
    var l=this.$tabs.length;
    var s = "";
    for (var i=0;i<l;i++){
      var tab = this.$tabs[i];
      var mar = parseInt($(this.slideContainer).css("margin-left")) + parseInt($(this.slideContainer).css("padding-left"));
      var sl = $(this.slideContainer).scrollLeft()+$(this.slideContainer).width()+ mar;
      var w = $(tab).width();
      var left = $(tab)[0].offsetLeft;
      if (sl+3 > left && sl+3 < left+w){
        return i;
      }
    }
    return -1;
  },
  
  buildList : function(){
    var l = this.$tabs.length;
    var t = this;
    for (var i=0;i<l;i++){
       $(this.$tabs[i]).css("z-index", 140-i);
      var path = "listitem_"+i;
      var label = $(this.$tabs[i]).children(".middle").children(".label").text();
      var _html = "<li class='"+path+"'><a href='javascript:'>"+label+"</a></li>";
      $(this.ListPath).append(_html);
      var fp = this.ListPath +" ."+path;
      $(fp).bind("click",i,function(e){t.ChangeTab(e)});      
    }
  }
  
});
})(jQuery);