//****************************************************************
//****************************************************************
//	COPYRIGHT 2008, Vertex Software
//****************************************************************
//****************************************************************

//----------------------------------------------------------------
//----------------------------------------------------------------
// For elements that use the js_columnize class, splits the content
// evenly across N elements identical to the first where N is
// an integer specifying the total number of columns that must follow. 
// the js_columnize class. For example,
// js_columnize 3 woudl split into 3 columns. If an element has the
// the "section" class, all items after it and before the next item
// with a section class will NOT ever be split to a bew column. 
// Additionally, all of the first elemenets of every column have the
// firstItemInColumn class added.
// EXAMPLE: http://setonnet.setonnetdev.vertex.com/admin/facility_doctors.asp?FacilityCode=DCMC
//----------------------------------------------------------------
//----------------------------------------------------------------



//-----------------------------------------------------------
// columnize
//-----------------------------------------------------------
function columnize( element ) {
	var mElement = element;
	var mColumnCount = mElement.className.match( /([0-9]+)/g ) ? RegExp.$1 : 1;
	if (mColumnCount < 2) return; 
	var mListItems = $("li",mElement );
	if (mListItems.length == 0) return; 
	var mItemsPerColumn = Math.ceil(mListItems.length/mColumnCount);
	var mColumnWidth = CalculateColumnWidth();
	var mColumnPadding = CalculateColumnPadding();
	var mPixelsPerColumn = Math.ceil(element.offsetHeight/mColumnCount);
	var mSplitAtNextSection = false;
	var mListTop;
	var mAdjustBy = element.className.match( /AdjustBy([^ ]+)/g) ? RegExp.$1 : "count";
	var mCurrentColumn = -1;
	var mCurrentSectionListItem;
	var mNextSectionListItem;

	Columnize();

	//-----------------------------------------------------------
	// Columnize
	// See http://www.communitymx.com/content/article.cfm?page=2&cid=27F87
	// for details on css used to columnize
	//-----------------------------------------------------------
	function Columnize( ) {
		try {
			var maxHeight = 0;
			var firstItemInColumn;
			for (var itemIndex=0; itemIndex<mListItems.length; itemIndex++) {
				var listItem = mListItems[itemIndex];
				if (itemIndex == 0) mListTop = listItem.offsetTop; 
				if (IsSectionItem(listItem)) mCurrentSectionListItem = listItem; 
				if (IsColumnStart(itemIndex,listItem)) {
					mCurrentColumn += 1;
					if (firstItemInColumn ) {
						maxHeight = AdjustColumnTop( firstItemInColumn );
						} 
					if (itemIndex > 0) {
						firstItemInColumn = listItem;
						}
					$(listItem).addClass( "firstItemInColumn" );
					}
				listItem.style.marginLeft = mCurrentColumn*mColumnWidth  + "px";
				listItem.style.width = (mColumnWidth-mColumnPadding) + "px";
				lastItem = listItem;
				}
			AdjustColumnTop( firstItemInColumn );
			/* Attemp to fix overflow problems in Firefox
			var clearItem = document.createElement( "li" );
			clearItem.className = "clearAll";
			mElement.appendChild( clearItem );
			*/
			}
		catch (error) {
			alert( "columnize.Columnize: " + error.description  );
			}
		}


	//===========================================================
	// CalculateColumnWidth
	//===========================================================
	function CalculateColumnWidth( ) {
		try {
			var columnWidth = Math.floor(mElement.offsetWidth / mColumnCount);
			return columnWidth;
			}
		catch (error) {
			alert( "CalculateColumnWidth: " + error.description  );
			}
		return 100;
		}


	//===========================================================
	// CalculateColumnPadding
	//===========================================================
	function CalculateColumnPadding( ) {
		try {
			var styles = "padding-left,padding-right,border-left-width,border-right-width,margin-left,margin-right".split(",");
			var padding = 0;
			for (var item=0; item<styles .length; item++) {
				var amount =  $(mListItems[0]).css(styles[item] ).replace( /[^0-9]/g, "");
				if (amount) padding += Number( amount );
				}
			return padding;
			}
		catch (error) {
			alert( "CalculateColumnWidth: " + error.description  );
			}
		return 0;
		}



	//===========================================================
	// HasSections
	//===========================================================
	function HasSections( ) {
		return mCurrentSectionListItem;
		}


	//===========================================================
	// IsSectionItem
	//===========================================================
	function IsSectionItem( listItem ) {
		try {
			return listItem.className.match(/section/i);
			}
		catch (error) {
			alert( "IsSectionItem: " + error.description  );
			}
		return false;
		}


	//===========================================================
	// IsColumnStart
	//===========================================================
	function IsColumnStart( itemIndex, listItem ) {
		try {
			switch (mAdjustBy.toLowerCase()) {
				case "height":	return IsColumnStartByHeight( itemIndex, listItem );
				default:		return IsColumnStartByCount( itemIndex, listItem );
				}
			}
		catch (error) {
			alert( "IsColumnStart: " + error.description  );
			}
		return false;
		}


	//===========================================================
	// IsColumnStartByHeight
	//===========================================================
	function IsColumnStartByHeight( itemIndex, listItem ) {
		try {
			// -1 required for IE - not sure why
			var isColumnStart = (listItem.offsetTop+listItem.offsetHeight-mElement.offsetTop-1) - mPixelsPerColumn*(mCurrentColumn) > mPixelsPerColumn;
			// On split on sections
			if (mSplitAtNextSection && IsSectionItem(listItem)) {
				mSplitAtNextSection = false;
				return true;
				} 
			if (HasSections() && isColumnStart && !IsSectionItem(listItem) ) {
				// If the height of the remaining section is greater than that of
				// a column, then split anyway.
				mSplitAtNextSection = true;
				return false;
				}
			return isColumnStart;
			}
		catch (error) {
			alert( "IsColumnStartByHeight: " + error.description  );
			}
		return false;
		}


	//===========================================================
	// GetSectionHeight
	//===========================================================
	function GetSectionHeight( listItem ) {
		try {
			if (!mNextSectionListItem) {
				mNextSectionListItem = listItem;
				while (mNextSectionListItem.nextSibling && !IsSectionItem(mNextSectionListItem.nextSibling)) {
					mNextSectionListItem = mNextSectionListItem.nextSibling;
					}
				}
			return mNextSectionListItem.offsetTop - mCurrentSectionListItem.offsetTop + mNextSectionListItem.offsetHeight;
			}
		catch (error) {
			alert( "GetSectionHeight: " + error.description  );
			}
		return 0;
		}


	//===========================================================
	// IsColumnStartByCount
	//===========================================================
	function IsColumnStartByCount( itemIndex, listItem ) {
		try {
			var isColumnStart = itemIndex % mItemsPerColumn == 0;
			// On split on sections
			if (mSplitAtNextSection && IsSectionItem(listItem)) {
				mSplitAtNextSection = false;
				return true;
				} 
			if (HasSections() && isColumnStart && !IsSectionItem(listItem) ) {
				mSplitAtNextSection = true;
				return false;
				}
			return isColumnStart;
			}
		catch (error) {
			alert( "IsColumnStart: " + error.description  );
			}
		return false;
		}


	//===========================================================
	// AdjustColumnTop
	//===========================================================
	function AdjustColumnTop( firstItemInColumn  ) {
		try {
			if (!firstItemInColumn) return 0; 
			var columnHeight = (firstItemInColumn.offsetTop - mListTop);
			firstItemInColumn.style.marginTop = -columnHeight + "px";
			return columnHeight;
			}
		catch (error) {
			alert( "AdjustColumnTop: " + error.description  );
			}
		return 0;
		}

	}


AttachBehaviors("columnize");