var Fse; if (!Fse) Fse = {};

if( !Fse.UI ) Fse.UI = {};

Fse.UI.applyStripes = function( sClassName, sOddClass, sEvenClass ) {
	
	var reClassName = new RegExp( sClassName );
	var aElements = document.getElementsByTagName( "TABLE" );
	for( var idx = 0; idx < aElements.length; idx++ ) {
		if( reClassName.test( aElements[idx].className )) {
			Fse.UI._stripeTable( aElements[idx], sOddClass, sEvenClass );
		}
	}
	
};

Fse.UI.applyStripesToTable = function( sTableId, sOddClass, sEvenClass ) {

	var oTable = document.getElementById( sTableId );
	if( oTable ) {
		Fse.UI._stripeTable( oTable, sOddClass, sEvenClass );
	}
	
};


Fse.UI.toggleMultipleSelect = function( sSelectId, nHeight, fnAfter ) {
	
	if( ! nHeight ) {
		var nHeight = 8;
	}
	var oSelect = document.getElementById( sSelectId );
	if( oSelect ) {
		
		var oToggleLink = YAHOO.util.Dom.getNextSibling( oSelect.parentNode );
		if( ! oToggleLink ) {
			oToggleLink = YAHOO.util.Dom.getNextSibling( oSelect );
		}
		var bMultiple = false;
		var sType = oSelect.type;
		if( sType == "select-multiple" ) {
			bMultiple = true;
		}

		if( bMultiple ) {
			// the type attribute is read only so we can't switch types back to single
			// so reset the HTML after removing the "multiple" attribute
			var oParent = oSelect.parentNode;
			if( oParent == oToggleLink.parentNode ) {
				oSocket = document.createElement( "span" );
				oSocket.setAttribute( "id", sSelectId + "_socket" );
				oParent.insertBefore( oSocket, oToggleLink );
				oSocket.appendChild( oSelect );
				oParent = oSocket;
			} 
			var currentHTML = oParent.innerHTML;
			var selectHTML = currentHTML.replace( /multiple\S*/, "" );
			selectHTML = selectHTML.replace( /size\S*/, "" );
			oParent.innerHTML = selectHTML;
			oSelect = oParent.firstChild;
			oSelect.selectedIndex = 0;
			oToggleLink.innerHTML = "multiple";
		} else {
			oSelect.setAttribute( "multiple", "multiple" );
			oSelect.size = nHeight;
			oSelect.selectedIndex = 0;
			oToggleLink.innerHTML = "single";;
		}


		if( fnAfter ) {
			fnAfter( oSelect );
		}
		
	}
	
};

Fse.UI.applyStripesToTable_obsolete = function ( sTableId, sOddClass, sEvenClass ) {
	var oTable = document.getElementById( sTableId );
	if( oTable && oTable.tagName == "TABLE" ) {
		Fse.UI._stripeTable( oTable, sOddClass, sEvenClass );
	}
}

Fse.UI._stripeTable = function( oTable, sOddClass, sEvenClass ) {

	
	/*
	if( sOddClass == null ) {
		sOddClass = "odd";
	}
	if( sEvenClass == null ) {
		sEvenClass = "even";
	}
	*/
	
	// find body
	var oTBody = oTable.tBodies[0];
	
	/*
	var oChild = oTable.firstChild;
	var oTBody;
	while( oChild && ! oTBody ) {
		
		if( oChild.tagName == "TBODY" ) {
			oTBody = oChild;
			break;
		} else {
			oChild = oChild.nextSibling;
		}
		
	}
	*/
	var sStripeClasses = oTBody.getAttribute( "fse:stripeClasses" );
	if( sStripeClasses ) {
		var aClasses = sStripeClasses.split(" ");
		sOddClass = aClasses[0];
		if( aClasses.length >= 2 ) {
			sEvenClass = aClasses[1];
		}
	}	

	if( sOddClass == null ) {
		sOddClass = "odd";
	}
	if( sEvenClass == null ) {
		sEvenClass = "even";
	}
	
	// stripe the rows
	if( oTBody ) {
		/*
		var oRow = oTBody.firstChild;
		var iRowNumber = 0;
		while( oRow ) {
			iRowNumber++;
			if( iRowNumber % 2 == 0 ) {
				Spry.Utils.removeClassName( oRow, sOddClass );
				Spry.Utils.addClassName( oRow, sEvenClass );
			} else {
				Spry.Utils.removeClassName( oRow, sEvenClass );
				Spry.Utils.addClassName( oRow, sOddClass );
			}
			oRow = oRow.nextSibling;
		}
		*/
		for( var iRowNumber = 1; iRowNumber <= oTBody.rows.length; iRowNumber++ ) {
			var oRow = oTBody.rows[iRowNumber-1];
			if( iRowNumber % 2 == 0 ) {
				Spry.Utils.addClassName( oRow, sEvenClass );
				Spry.Utils.removeClassName( oRow, sOddClass );
			} else {
				Spry.Utils.addClassName( oRow, sOddClass );
				Spry.Utils.removeClassName( oRow, sEvenClass );
			}
		}
	}
	
};

Fse.UI.CURSOR_WAIT = "wait";
Fse.UI.CURSOR_AUTO = "auto";
Fse.UI.CURSOR_POINTER = "pointer";
Fse.UI.CURSOR_DEFAULT = "default";

Fse.UI.setCursor = function( sCursor ) {
	document.body.style.cursor = sCursor;
};


Fse.UI.toggleClass = function ( oObject, sClassName ) {
	var reClass = new RegExp( sClassName );
	if( oObject.className.match( reClass )) {
		Spry.Utils.removeClassName( oObject, sClassName );
	} else { 
		Spry.Utils.addClassName( oObject, sClassName );
	}
};


Fse.UI._generateCompareTRs = function( iCol, sType, iDirection ) {
	
	if( ! iDirection ) {
		iDirection = 1;
	}
	
	if( sType == "a" ) {
		// alpha
		return function ( oTR1, oTR2 ) {
			var sValue1 = Fse.UI._getCellValue( oTR1.cells[iCol] );
			var sValue2 = Fse.UI._getCellValue( oTR2.cells[iCol] );
			if( sValue1 && sValue2 ) {
				return sValue1.toUpperCase().localeCompare( sValue2.toUpperCase() ) * iDirection;		
			} else if ( ! sValue1 ) {
				// no value 1
				return iDirection * -1;
			} else {
				// no value 2
				return iDirection;
			}
		};
	} else if ( sType == "d" ) {
		// date time
		return function ( oTR1, oTR2 ) {
			var sValue1 = Fse.UI._getCellValue( oTR1.cells[iCol] );
			var sValue2 = Fse.UI._getCellValue( oTR2.cells[iCol] );
			
			try {
				if( sValue1 ) {
					var aParts = sValue1.split( /\s+/ );
					sValue1 = aParts[0];
				}
				tValue1 = Date.parse( sValue1 ); 
			} catch(x) {
				tValue1 = 0;
			}
			try {
				if( sValue2 ) {
					sValue2 = sValue2.split(/\s+/)[0];
				}
				tValue2 = Date.parse( sValue2 );
			} catch(x) {
				tValue2 = 0;
			}

			var iResult;
			if( tValue1 < tValue2 ) {
				iResult = -1;
			} else if ( tValue1 > tValue2 ) {
				iResult = 1;
			} else {
				iResult = 0;
			}
			iResult = iResult * iDirection;
			return iResult;
		};
	} else {
		// numeric
		return function ( oTR1, oTR2 ) {
			
			var sValue1 = Fse.UI._getCellValue( oTR1.cells[iCol] );
			if( sValue1 == "" ) {
				sValue1 = "0";
			}
			var sValue2 = Fse.UI._getCellValue( oTR2.cells[iCol] );
			if( sValue2 == "" ) {
				sValue2 = "0";
			}
			var nValue1 = parseFloat( sValue1.replace( /[^0-9\.]|\s/, "" ));
			var nValue2 = parseFloat( sValue2.replace( /[^0-9\.]|\s/, "" ));

			var iResult;
			if( nValue1 < nValue2 ) {
				iResult = -1;
			} else if ( nValue1 > nValue2 ) {
				iResult = 1;
			} else {
				iResult = 0;
			}
			iResult = iResult * iDirection;
			return iResult;		
		};
	}
};

Fse.UI._getCellValue = function( oCell ) {
	
	var oContainer = oCell;
	var oFirstChild;	
	do {
		oFirstChild = YAHOO.util.Dom.getFirstChild( oContainer );
		if( oFirstChild ) {
			if( oFirstChild.tagName.toUpperCase() == "SELECT" ) {
				
				var oSelect = oFirstChild;
				var idx = oSelect.selectedIndex;
				oContainer = oSelect.options[idx];	
				break;
			} else {
				oContainer = oFirstChild;
			}
		}
	} while( oFirstChild );
	
	var sValue;
	if( oContainer.firstChild ) {
		sValue =  oContainer.firstChild.nodeValue;
	}

	return sValue;
};

Fse.UI.sortTable = function( oColumn, sTableId, iColIdx, sType, sDirection ) {
	
	/*
	var oRow = oColumn.parentNode;
	var iCellIdx = 0;
	var sCellIdx = oColumn.getAttribute( "fse:idx" );
	if( sCellIdx ) {
		iCellIdx = parseInt( sCellIdx );	
	} else {
		for( var i = 0; i < oRow.cells.length; i++ ) {
			if( oRow.cells[i] == oColumn ) {
				iCellIdx = i;
			}
		}
	}
	*/

	if( ! sDirection ) {
		sDirection = "a";
	} else {
		sDirection = (sDirection.toLowerCase() + "a").substring( 0, 1 );
	}
	if( sDirection == "d" ){
		iDirection = -1;
	} else {
		iDirection = 1;
	}
	
	if( !sType ) {
		sType = "a";
	} else {
		sType = ( sType.toLowerCase() + "a" ).substring( 0, 1 );
	}
	
	var iCurrentDirection = oColumn.getAttribute( "fse:sortDir" );
	if( ! iCurrentDirection ) {
		iCurrentDirection = iDirection;
	}
	
	var iNewDirection = iCurrentDirection * -1;
	oColumn.setAttribute( "fse:sortDir", iNewDirection );	
	
	var aColumns = oColumn.parentNode.cells;
	for( var x = 0; x < aColumns.length; x++ ) {
		var oTestColumn = aColumns[x];
		if( oTestColumn != oColumn ) {
			YAHOO.util.Dom.removeClass( oTestColumn, "asc" );
			YAHOO.util.Dom.removeClass( oTestColumn, "desc" );
		} else {
			var sDirectionClass = "asc";
			if( iNewDirection == -1 ) {
				YAHOO.util.Dom.removeClass( oTestColumn, "asc" );
				sDirectionClass = "desc";
			} else {
				YAHOO.util.Dom.removeClass( oTestColumn, "desc" );
			}
			YAHOO.util.Dom.addClass( oTestColumn, sDirectionClass );
		}
	}

	document.body.style.cursor = "wait";
	
	var oTable = document.getElementById( sTableId );
	var oTBody = oTable.tBodies[0];
	var colDataRows = oTBody.rows;
	
	var aTRs = new Array();

	
	for( var i = 0; i < colDataRows.length; i++ ) {
		aTRs.push( colDataRows[i] ); 
	}
	
	aTRs.sort( Fse.UI._generateCompareTRs( iColIdx, sType, iNewDirection ) );
	
	
	var oFragment = document.createDocumentFragment();
	for( var i = 0; i < aTRs.length; i++ ) {
		oFragment.appendChild( aTRs[i] );
	}
	
	oTBody.appendChild( oFragment );
	document.body.style.cursor = "auto";
	
	Fse.UI.applyStripesToTable( sTableId );
	
};

Fse.UI.addTableRowFromContent = function ( oTable, sContent ) {
	
	var bAdded;
	
	var oNewDiv = document.createElement( "div" );
	oNewDiv.innerHTML = "<table><tbody>" + sContent + "</tbody></table>";
	var oNewTable;
	var oNode = oNewDiv.firstChild;
	while( oNode ) {
		var test = oNode.tagName && oNode.tagName.toLowerCase() == "table";
		if( test ) {
			oNewTable = oNode;
			break;
		}
		oNode = oNode.nextSibling;
	}
	
	var oNewRow = null;
	if( oNewTable ) {
		oNewRow = oNewTable.tBodies[0].rows[0];
		oTable.tBodies[0].appendChild( oNewRow );
	} 
	
	return oNewRow;
};
