function Tabs(element){
	
	this.tabs = element;
	this.rows = new Array();
	// alert(element.length);
	
	this.readTabs = function(){
		var tabDetails = new Array();
		var total = 0;
      var maxHeight = 0;
		for(var i = 0; i < element.length; i++){
			var width = element.eq(i).outerWidth(true);
         var height = element.eq(i).outerHeight();
         if(height >  maxHeight)
            maxHeight = height;
			total += width;
			var tabObject = {width : width, height : height, index : i};
			tabDetails.push(tabObject);
			// alert(tabObject);
		}
		this.addRow(tabDetails, total);
      
      // Set all Tabs to the same height
      element.css("padding-bottom", function(index){
         var result = $(this).css("padding-bottom");
         var height = $(this).outerHeight();
         if(height < maxHeight){
            var padding = result.match(/\d*/);
            result = (maxHeight - height + parseInt(padding[0])) + "px";
         }
         return result;
        });
	}
	
	this.splitIntoRows = function(){
		if(this.rows[0].totalLength > Tabs.MAXWIDTH){
			var rowMax = Tabs.MAXWIDTH;
			for(var i = 0; i < this.rows.length; i++){
				while(this.rows[i].totalLength > rowMax){
					this.moveTabDown(i);
					// alert(this.rows[i].totalLength);
				}
				rowMax = this.rows[i].totalLength;
				// alert("rowmax = " + rowMax);
			}
		}
	}
			
	this.moveTabDown = function(rowIndex){
		if(! this.rows[rowIndex +1]){
			this.addRow(new Array, 0);
		}
		var tabDetail = this.rows[rowIndex].tabDetails;
		var tab = tabDetail.shift();
		// alert("moving tab " + tab.index + " from row " + rowIndex + " to row " + (rowIndex + 1));
		this.rows[rowIndex].totalLength -= tab.width;
		this.rows[rowIndex +1].tabDetails.push(tab);
		this.rows[rowIndex +1].totalLength += tab.width;
	}
	
	this.addRow = function(tabArray, length, maxHeight){
		this.rows.push({tabDetails : tabArray, totalLength : length});
	}
	
	this.adjustRows = function(){
		if(this.rows[this.rows.length -1].totalLength < (Tabs.MAXWIDTH / 2)){
			// fix top row
			var retry = true;
			while(retry){
				retry = false;
				for(var i = 0; i < this.rows.length; i++){
					if(this.canMoveDown(i)){
						this.moveTabDown(i);
						retry = true;
					}
				}
			}
			//alert("fix top row");
		}
	}
	
	this.canMoveDown = function(rowIndex){
		var result = false;
		if(this.rows[rowIndex +1]){
			var tabDetail = this.rows[rowIndex].tabDetails;
			var tab = tabDetail[tabDetail.length - 1];
			var currentRowLength = this.rows[rowIndex].totalLength - tab.width;
			var nextRowLength = this.rows[rowIndex +1].totalLength + tab.width;
			//alert("result = " + (currentRowLength >= nextRowLength));
			result = (currentRowLength >= nextRowLength);
		} 
		return result;
	}
	
	this.finished = function(){
		// this.rows.reverse();
		for(var i =0; i < this.rows.length; i++){
			// alert(this.rows[i].tabDetails[0].index); 
			element.eq(this.rows[i].tabDetails[0].index).addClass("StartingTab");
			var tabs = this.rows[i].tabDetails;
			var whitespace = Tabs.MAXWIDTH - this.rows[i].totalLength - 10;
			element.eq(tabs[tabs.length - 1].index).css("margin-right", whitespace + "px");
		}
	}
}

Tabs.MAXWIDTH = 709;

Tabs.start = function(){
    var browser = navigator.userAgent;
    
    //Make sure that the browser is not IE 6
    if (!(browser.match(/MSIE 6[.]0/)))
    {
        var myTabs = new Tabs($(".TabbedPanelsTab"));
        myTabs.readTabs();
        myTabs.splitIntoRows();
        myTabs.adjustRows();
        myTabs.finished();
    }
    // alert("done");
}
