//Used for getting the ReturnValue property in a Async callback:
function GetCallback(){	

    //Since this is a shared function by the Page, UserControl, and WebControl classes, we have to determine which controls are currently on the
    //page and then which one is the current control being used for this method:
    var page = document.getElementById("hidCallbackPage_ReturnValue");
    var userControl = document.getElementById("hidCallbackUserControl_ReturnValue");
    var webControl = document.getElementById("hidCallbackWebControl_ReturnValue");
    
    if (page){
    
        if (page.getAttribute("currentflag") == "1"){
        
            //Reset the currentflag attribute so there are no conflicts:
            page.setAttribute("currentflag", "0");
        
            //Get the returnValueItems array from the hidden return value element:
            var returnValueItems = Callback_GetReturnValueItems(Callback_HtmlDecode(document.getElementById("hidCallbackPage_ReturnValue").value));
            
            //Now, pass the ReturnType and ReturnValueString to the ConvertToReturnType method to get the return object in it's correct datatype:
            this.ReturnValue = Callback_CType(returnValueItems[0], returnValueItems[1]);
            
            return this;
        
        }
    
    }
    
    if (userControl){
    
        if (userControl.getAttribute("currentflag") == "1"){
        
            //Reset the currentflag attribute so there are no conflicts:
            userControl.setAttribute("currentflag", "0");
            
            //Get the returnValueItems array from the hidden return value element:
            var returnValueItems = Callback_GetReturnValueItems(Callback_HtmlDecode(document.getElementById("hidCallbackUserControl_ReturnValue").value));
            
            //Now, pass the ReturnType and ReturnValueString to the ConvertToReturnType method to get the return object in it's correct datatype:
            this.ReturnValue = Callback_CType(returnValueItems[0], returnValueItems[1]);        
            
            return this;
        
        }
    
    }	
    
    if (webControl){
    
        if (webControl.getAttribute("currentflag") == "1"){
        
            //Reset the currentflag attribute so there are no conflicts:
            webControl.setAttribute("currentflag", "0");            
            
            //Get the returnValueItems array from the hidden return value element:
            var returnValueItems = Callback_GetReturnValueItems(Callback_HtmlDecode(document.getElementById("hidCallbackWebControl_ReturnValue").value));
            
            //Now, pass the ReturnType and ReturnValueString to the ConvertToReturnType method to get the return object in it's correct datatype:
            this.ReturnValue = Callback_CType(returnValueItems[0], returnValueItems[1]);        
            
            return this;            
        
        }
    
    }	
	
}
//------------------------------------------------------------------------------------------------------------------------------------------------
//Cross browser method for creating the XMLHttp object:
function Callback_CreateXmlHttpObject(){
    
    if (typeof XMLHttpRequest != "undefined"){        
               
        //IE7, FireFox, Netscape, Safari, Opera:
        return new XMLHttpRequest();
    
    }
    else if (window.ActiveXObject){
    
        //IE5, IE6:
        var versions = ["MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp", "Microsoft.XMLHttp"]; 
    
        for (var i = 0; i < versions.length; i++){
        
            try {
            
                var xmlHttp = new ActiveXObject(versions[i]);
                
                return xmlHttp;
                
            }
            catch (err){
            
                //Do nothing
            
            }
        
        }
    
    }
    
    throw new Error("XMLHttp object could not be created.");

}
//------------------------------------------------------------------------------------------------------------------------------------------------
//Note: The ExecuteAsyncCallback function is found inside CallbackPage.js, CallbackWebControl.js, and CallbackUserControl.js:
function Callback_ExecuteSyncCallback(serverFunction){

    //HtmlEncode the serverFunction arg or ASP.NET will consider it a security violation due to the column delimiters and
    //then we must URL Encode the string since HtmlEncode will put in "&" characters which are part of a url:
    serverFunction = Callback_Escape(Callback_HtmlEncode(serverFunction));
    
    //Instantiate the browser specific XmlHttp object:      
    var xmlHttp = Callback_CreateXmlHttpObject();
        
    //Open a Synchronous post to the current page and set the request header:
    xmlHttp.open("POST", document.location.href, false);
    xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    
    //Send the callback sync method to the server which will be executed via reflection:
    xmlHttp.send("InenviXmlHttpCallbackMethod=" + serverFunction);
    
    //Get the returnValueItems array from the server method which was just executed:
    var returnValueItems = Callback_GetReturnValueItems(Callback_HtmlDecode(xmlHttp.responseText));
            
    //Now, pass the ReturnType and ReturnValueString to the ConvertToReturnType method to get the return object in it's correct datatype:
    var returnValue = Callback_CType(returnValueItems[0], returnValueItems[1]);   
    
    //Return the ReturnValue property:
    return returnValue;
    
}
//------------------------------------------------------------------------------------------------------------------------------------------------
function Callback_GetReturnValueItems(returnValueItemsString){

    var returnValueItems = returnValueItemsString.split("<cb20_returntype>");
    
    return returnValueItems;

}
//------------------------------------------------------------------------------------------------------------------------------------------------
//CLIENT SIDE DATATABLE CLASS (Built off of an AspNet2Callback.DataTableString):
//------------------------------------------------------------------------------------------------------------------------------------------------
function DataTable(dataTableString){

    //Split out the dataTableString into an array of rows, the 1st item in the array contains the DataColumn properties and the
    //rest of the rows contain the DataRows and DataCells:
    var rows = dataTableString.split("<cb20_datarow>");
    
    //Split the 1st row into an array of DataColumns:
    var dataColumns = rows[0].split("<cb20_datacol>");
    
    //Loop thru the dataColumns array and replace each item with a new DataColumn object:
    for (var c = 0; c < dataColumns.length; c++){
    
        //Get the DataColumnProperties array:
        var dataColumnProperties = dataColumns[c].split("<cb20_datacol_prop>");
    
        //Replace the existing string item with a DataColumn object:
        dataColumns[c] = new DataColumn(dataColumnProperties[0], dataColumnProperties[1]);    
    
    }
    
    //Set the DataColumns property equal to the new dataColumns collection we just built:
    this.DataColumns = dataColumns;   
    
    //Set the GetDataColumn method, this will allow the developer to get a DataColumn either by index or ColumnName:
    this.GetDataColumn = Callback_GetDataColumn; 
    
    //Create a DataRows array where the length is 1 less than the rows array since the 1st item is just DataColumn properties:
    var dataRows = new Array(rows.length -1);
    for (r = 1; r < rows.length; r++){
    
        //Get the dataRowString from the row item:
        var dataRowString = rows[r];   
        
        //Create a new DataRow object from the dataRowString and set it into the dataRows collection:
        dataRows[r - 1] = new DataRow(dataRowString, this);       
    
    }   
    
    //Set the DataRows property (Collection of DataRows) of the DataTable:
    this.DataRows = dataRows;

}
//--------------------------------------------------------------------------------------------------------------------------------------------------
function DataColumn(columnName, dataType){

    this.ColumnName = Callback_Replace(columnName, " ", "_"); //Make sure column names do not have spaces since they are used a properties
    this.DataType = dataType;

}
//--------------------------------------------------------------------------------------------------------------------------------------------------
function DataRow(dataRowString, dataTable){

    //Declare this outside the if block since this is used to set the DataRow properties below in the DataCells loop:
    var dataColumns = null;

    //If no dataTable was passed, then we are creating a stand-a-lone DataRow so we need to extract the DataColumns and set the property here:
    if (dataTable == null){
    
        //Split out the dataRowString into an array of rows, the 1st item in the array contains the DataColumn properties and the
        //2nd row contains the actual DataRow and DataCells:
        var rows = dataRowString.split("<cb20_datarow>");
    
        //Split the 1st row into an array of DataColumns:
        dataColumns = rows[0].split("<cb20_datacol>");
    
        //Loop thru the dataColumns array and replace each item with a new DataColumn object:
        for (var c = 0; c < dataColumns.length; c++){
        
            //Get the DataColumnProperties array:
            var dataColumnProperties = dataColumns[c].split("<cb20_datacol_prop>");
        
            //Replace the existing string item with a DataColumn object:
            dataColumns[c] = new DataColumn(dataColumnProperties[0], dataColumnProperties[1]);    
        
        }
        
        //Set the DataColumns property equal to the new dataColumns collection we just built:
        this.DataColumns = dataColumns;          
        
        //Then reset the dataRowString to the DataRow that was passed in the 2nd item in the rows array:
        dataRowString = rows[1];
    
    }
    else {
    
        //Get a reference to the ParentDataTable:
        this.ParentDataTable = dataTable; 
        
        dataColumns = dataTable.DataColumns;
    
    }

    //Split the dataRowString string into an array of DataCells:
    var dataCells = dataRowString.split("<cb20_datacol>");
        
    //Loop thru the aray and replace each item with a new DataCell object:    
    for (var c = 0; c < dataCells.length; c++){
            
        //Set the datacell property, notice we set it to an empty string because once the property is dynamically created,
        //we then reset the property to it's correct value/datatype in the following line:
        eval("this." + dataColumns[c].ColumnName + " = \"\"");
        
        //Convert the datacell property the matching datatype:
        this[dataColumns[c].ColumnName] = Callback_CType(dataColumns[c].DataType, dataCells[c]);
                  
    }    
    
    //Set the GetValue method so the user could iterate through the datacell colleciton if they needed to by index:
    this.GetValue = Callback_GetDataCellValue;

}
//--------------------------------------------------------------------------------------------------------------------------------------------------
function Callback_GetDataColumn(index){

    //If no index was passed, return null:
    if (index == null){    
        
        return null;
         
    }
    else {
    
        //Find out if an integer or column name was passed:
        var isInteger = Callback_IsInteger(index);
        
        //If it's a column name, then we need to figure out what the columnname index is by looping thru the DataTable.ColumnNames property:
        if (!isInteger){  
        
            for (var c = 0; c < this.DataColumns.length; c++){
            
                //If we find a match, reset the index and break from the loop:
                var columnName = this.DataColumns[c].ColumnName.toLowerCase();
                if (columnName == index.toLowerCase()){
                
                    index = c;
                    break;
                
                }  
            
            }           
        
        }
        
        //If it's not null, then return the dataCell if it exists:
        var dataColumn = this.DataColumns[index];          
         
        return dataColumn;
    
    }

}
//--------------------------------------------------------------------------------------------------------------------------------------------------
function Callback_GetDataCellValue(index){
   
    //Figure out what the columnName is if an integer index was passed: 
    var columnName = "";
    
    //If no index was passed, return null:
    if (index == null){    
        
        return null;
         
    }
    else {
    
        //Find out if an integer or column name was passed:
        var isInteger = Callback_IsInteger(index);
        
        //If its an integer, then we need to figure out what the columnname is by looping thru the DataTable.ColumnNames property:
        if (isInteger){ 
        
            //Make sure it's a integer and not a string representing one:
            index = index * 1;
        
            if (this.ParentDataTable){
            
                for (var c = 0; c < this.ParentDataTable.DataColumns.length; c++){
                
                    //If we find a match, set the columName and break from the loop:                    
                    if (c == index){
                    
                        columnName = this.ParentDataTable.DataColumns[c].ColumnName;
                        break;
                    
                    }  
                
                }    
                
            }
            else {
            
                for (var c = 0; c < this.DataColumns.length; c++){                    
                    
                    //If we find a match, set the columName and break from the loop:                    
                    if (c == index){
                    
                        columnName = this.DataColumns[c].ColumnName;
                        break;
                    
                    }  
                
                }    
            
            }       
            
        }
        else {
        
            //ColumnName was passed:
            columnName = index;
        
        }    
                 
        //Return the data cell value:
        return this[columnName];
        
    }

}
//--------------------------------------------------------------------------------------------------------------------------------------------------
//UTILITY FUNCTIONS:
//------------------------------------------------------------------------------------------------------------------------------------------------
function Callback_CType(dataType, value){    

    var returnValueObject = null;
    
    switch (dataType.toLowerCase()){
    
        case "boolean":
        
            returnValueObject = CBln(value);
            
            break;
    
        case "string": 
        
            returnValueObject = value; 
            
            break;
        
        case "int16":
        case "int32":
        case "int64":
        case "integer":
        case "decimal":
        case "double":
        
            returnValueObject = (value * 1);
            
            break;
            
        case "datetime":
        
            returnValueObject = new Date(value);  
            
            break;  
            
        case "datarow":
        
            returnValueObject = new DataRow(value);
        
            break;
            
        case "datatable":
        
            returnValueObject = new DataTable(value);
        
            break;
            
        case "string[]":
        
            returnValueObject = value.split("<cb20_array>");
        
            break;
        
    
    }
    
    return returnValueObject;

}
//--------------------------------------------------------------------------------------------------------------------------------------------------
function Callback_Replace(text, find, replace){

	text = text.toString();	

	return text.split(find).join(replace);	
}
//--------------------------------------------------------------------------------------------------------------------------------------------------
function Callback_Escape(text){

    //This function inherits from the window escape() method and adds special formatting for the "+" symbol by
    //replacing it with "&pls", and "·" with "&middot" this is necessary because Synchronous callbacks need these encoded and they are not
    //encoded natively by HtmlEncode or UrlEncode (escape), also handle middots as well:
    return escape(Callback_Replace(Callback_Replace(text, "+", "&pls;"), "·", "&middot;"));

}
//--------------------------------------------------------------------------------------------------------------------------------------------------
function Callback_Trim(value){

    if (value == null) value = "";
    
    value = value.toString();
    
    //First LTrim it:
    var space = value.search(/^\s*(\S.*)/);
	value = ((space == -1)?"":RegExp.$1);

	//Then RTrim it:
	space = value.search( /\s+$/ );
	value = ((space == -1)?value:value.substr(0, space));

	return value;
	
}
//--------------------------------------------------------------------------------------------------------------------------------------------------
function Callback_IsInteger(value){

    //Make sure its a string:
    value = value.toString();

	if (value == ""){
		return true;
	}
	
	//Since this is a function for checking for integers, the
	//isNaN() function does most of the work for us, however,
	//the isNaN() function allows "." and "-" so we must 
	//check for the presence of these two symbols.  If either
	//exist in the string, then we return false:
	if (value.indexOf(".") != -1){
		return false;
	}	
	if (value.indexOf("-") != -1){
		return false;
	}		
	if (value.indexOf(",") != -1){
		return false;
	}		
	
	//Check for e or E since isNaN allows them:
	if (value.indexOf("e") != -1){
		return false;
	}
	if (value.indexOf("E") != -1){
		return false;
	}
	
	//Finish the validation:
	if (isNaN(value)){
		return false;
	}
	
	//If we made it here, then its a integer so we return true:
	return true;
	
}
//--------------------------------------------------------------------------------------------------------------------------------------------------
function CBln(value){ 

	value = Trim(value.toLowerCase());
	return (value == "true"?true:false);
	
}
//--------------------------------------------------------------------------------------------------------------------------------------------------
function Callback_HtmlEncode(text) {
    
	return text.replace(/&/g, "&amp;").replace(/\"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
	
}
//--------------------------------------------------------------------------------------------------------------------------------------------------
function Callback_HtmlDecode(text){ 

      var out = ""; 
      if (text==null) return;   

      var l = text.length; 
      for (var i=0; i<l; i++){ 

            var ch = text.charAt(i);    
            if (ch == '&'){ 

				var semicolonIndex = text.indexOf(';', i+1);                   

            if (semicolonIndex > 0){ 

                        var entity = text.substring(i + 1, semicolonIndex); 

                        if (entity.length > 1 && entity.charAt(0) == '#'){ 

                              if (entity.charAt(1) == 'x' || entity.charAt(1) == 'X') 

                                    ch = String.fromCharCode(eval('0'+entity.substring(1))); 

                              else 

                                    ch = String.fromCharCode(eval(entity.substring(1))); 

                        } 

                    else 

                      { 

								switch (entity){ 
									case 'quot': ch = String.fromCharCode(0x0022); break; 
									case 'amp': ch = String.fromCharCode(0x0026); break; 
									case 'lt': ch = String.fromCharCode(0x003c); break; 
									case 'gt': ch = String.fromCharCode(0x003e); break; 
									case 'nbsp': ch = String.fromCharCode(0x00a0); break; 
									case 'iexcl': ch = String.fromCharCode(0x00a1); break; 
									case 'cent': ch = String.fromCharCode(0x00a2); break; 
									case 'pound': ch = String.fromCharCode(0x00a3); break;
									case 'curren': ch = String.fromCharCode(0x00a4); break;
									case 'yen': ch = String.fromCharCode(0x00a5); break; 
									case 'brvbar': ch = String.fromCharCode(0x00a6); break;
									case 'sect': ch = String.fromCharCode(0x00a7); break; 
									case 'uml': ch = String.fromCharCode(0x00a8); break; 
									case 'copy': ch = String.fromCharCode(0x00a9); break;
									case 'ordf': ch = String.fromCharCode(0x00aa); break;
									case 'laquo': ch = String.fromCharCode(0x00ab); break;
									case 'not': ch = String.fromCharCode(0x00ac); break; 
									case 'shy': ch = String.fromCharCode(0x00ad); break; 
									case 'reg': ch = String.fromCharCode(0x00ae); break; 
									case 'macr': ch = String.fromCharCode(0x00af); break;
									case 'deg': ch = String.fromCharCode(0x00b0); break; 
									case 'plusmn': ch = String.fromCharCode(0x00b1); break;
									case 'sup2': ch = String.fromCharCode(0x00b2); break; 
									case 'sup3': ch = String.fromCharCode(0x00b3); break; 
									case 'acute': ch = String.fromCharCode(0x00b4); break;
									case 'micro': ch = String.fromCharCode(0x00b5); break;
									case 'para': ch = String.fromCharCode(0x00b6); break; 
									case 'middot': ch = String.fromCharCode(0x00b7); break;
									case 'cedil': ch = String.fromCharCode(0x00b8); break; 
									case 'sup1': ch = String.fromCharCode(0x00b9); break; 
									case 'ordm': ch = String.fromCharCode(0x00ba); break; 
									case 'raquo': ch = String.fromCharCode(0x00bb); break;
									case 'frac14': ch = String.fromCharCode(0x00bc); break; 
									case 'frac12': ch = String.fromCharCode(0x00bd); break; 
									case 'frac34': ch = String.fromCharCode(0x00be); break; 
									case 'iquest': ch = String.fromCharCode(0x00bf); break; 
									case 'Agrave': ch = String.fromCharCode(0x00c0); break; 
									case 'Aacute': ch = String.fromCharCode(0x00c1); break; 
									case 'Acirc': ch = String.fromCharCode(0x00c2); break; 
									case 'Atilde': ch = String.fromCharCode(0x00c3); break;
									case 'Auml': ch = String.fromCharCode(0x00c4); break; 
									case 'Aring': ch = String.fromCharCode(0x00c5); break;
									case 'AElig': ch = String.fromCharCode(0x00c6); break;
									case 'Ccedil': ch = String.fromCharCode(0x00c7); break;
									case 'Egrave': ch = String.fromCharCode(0x00c8); break;
									case 'Eacute': ch = String.fromCharCode(0x00c9); break;
									case 'Ecirc': ch = String.fromCharCode(0x00ca); break; 
									case 'Euml': ch = String.fromCharCode(0x00cb); break; 
									case 'Igrave': ch = String.fromCharCode(0x00cc); break;
									case 'Iacute': ch = String.fromCharCode(0x00cd); break;
									case 'Icirc': ch = String.fromCharCode(0x00ce ); break;
									case 'Iuml': ch = String.fromCharCode(0x00cf); break; 
									case 'ETH': ch = String.fromCharCode(0x00d0); break; 
									case 'Ntilde': ch = String.fromCharCode(0x00d1); break;
									case 'Ograve': ch = String.fromCharCode(0x00d2); break;
									case 'Oacute': ch = String.fromCharCode(0x00d3); break;
									case 'Ocirc': ch = String.fromCharCode(0x00d4); break; 
									case 'Otilde': ch = String.fromCharCode(0x00d5); break;
									case 'Ouml': ch = String.fromCharCode(0x00d6); break; 
									case 'times': ch = String.fromCharCode(0x00d7); break;
									case 'Oslash': ch = String.fromCharCode(0x00d8); break;
									case 'Ugrave': ch = String.fromCharCode(0x00d9); break;
									case 'Uacute': ch = String.fromCharCode(0x00da); break;
									case 'Ucirc': ch = String.fromCharCode(0x00db); break; 
									case 'Uuml': ch = String.fromCharCode(0x00dc); break; 
									case 'Yacute': ch = String.fromCharCode(0x00dd); break;
									case 'THORN': ch = String.fromCharCode(0x00de); break; 
									case 'szlig': ch = String.fromCharCode(0x00df); break; 
									case 'agrave': ch = String.fromCharCode(0x00e0); break;
									case 'aacute': ch = String.fromCharCode(0x00e1); break;
									case 'acirc': ch = String.fromCharCode(0x00e2); break; 
									case 'atilde': ch = String.fromCharCode(0x00e3); break;
									case 'auml': ch = String.fromCharCode(0x00e4); break; 
									case 'aring': ch = String.fromCharCode(0x00e5); break;
									case 'aelig': ch = String.fromCharCode(0x00e6); break;
									case 'ccedil': ch = String.fromCharCode(0x00e7); break;
									case 'egrave': ch = String.fromCharCode(0x00e8); break;
									case 'eacute': ch = String.fromCharCode(0x00e9); break;
									case 'ecirc': ch = String.fromCharCode(0x00ea); break; 
									case 'euml': ch = String.fromCharCode(0x00eb); break; 
									case 'igrave': ch = String.fromCharCode(0x00ec); break;
									case 'iacute': ch = String.fromCharCode(0x00ed); break;
									case 'icirc': ch = String.fromCharCode(0x00ee); break; 
									case 'iuml': ch = String.fromCharCode(0x00ef); break; 
									case 'eth': ch = String.fromCharCode(0x00f0); break; 
									case 'ntilde': ch = String.fromCharCode(0x00f1); break;
									case 'ograve': ch = String.fromCharCode(0x00f2); break;
									case 'oacute': ch = String.fromCharCode(0x00f3); break;
									case 'ocirc': ch = String.fromCharCode(0x00f4); break; 
									case 'otilde': ch = String.fromCharCode(0x00f5); break; 
									case 'ouml': ch = String.fromCharCode(0x00f6); break; 
									case 'divide': ch = String.fromCharCode(0x00f7); break;
									case 'oslash': ch = String.fromCharCode(0x00f8); break;
									case 'ugrave': ch = String.fromCharCode(0x00f9); break;
									case 'uacute': ch = String.fromCharCode(0x00fa); break;
									case 'ucirc': ch = String.fromCharCode(0x00fb); break; 
									case 'uuml': ch = String.fromCharCode(0x00fc); break; 
									case 'yacute': ch = String.fromCharCode(0x00fd); break;
									case 'thorn': ch = String.fromCharCode(0x00fe); break; 
									case 'yuml': ch = String.fromCharCode(0x00ff); break; 
									case 'OElig': ch = String.fromCharCode(0x0152); break;
									case 'oelig': ch = String.fromCharCode(0x0153); break;
									case 'Scaron': ch = String.fromCharCode(0x0160); break;
									case 'scaron': ch = String.fromCharCode(0x0161); break;
									case 'Yuml': ch = String.fromCharCode(0x0178); break; 
									case 'fnof': ch = String.fromCharCode(0x0192); break; 
									case 'circ': ch = String.fromCharCode(0x02c6); break; 
									case 'tilde': ch = String.fromCharCode(0x02dc); break;
									case 'Alpha': ch = String.fromCharCode(0x0391); break;
									case 'Beta': ch = String.fromCharCode(0x0392); break; 
									case 'Gamma': ch = String.fromCharCode(0x0393); break;
									case 'Delta': ch = String.fromCharCode(0x0394); break;
									case 'Epsilon': ch = String.fromCharCode(0x0395); break;
									case 'Zeta': ch = String.fromCharCode(0x0396); break; 
									case 'Eta': ch = String.fromCharCode(0x0397); break; 
									case 'Theta': ch = String.fromCharCode(0x0398); break;
									case 'Iota': ch = String.fromCharCode(0x0399); break; 
									case 'Kappa': ch = String.fromCharCode(0x039a); break;
									case 'Lambda': ch = String.fromCharCode(0x039b); break;
									case 'Mu': ch = String.fromCharCode(0x039c); break; 
									case 'Nu': ch = String.fromCharCode(0x039d); break; 
									case 'Xi': ch = String.fromCharCode(0x039e); break; 
									case 'Omicron': ch = String.fromCharCode(0x039f); break;
									case 'Pi': ch = String.fromCharCode(0x03a0); break; 
									case ' Rho ': ch = String.fromCharCode(0x03a1); break;
									case 'Sigma': ch = String.fromCharCode(0x03a3); break;
									case 'Tau': ch = String.fromCharCode(0x03a4); break; 
									case 'Upsilon': ch = String.fromCharCode(0x03a5); break;
									case 'Phi': ch = String.fromCharCode(0x03a6); break; 
									case 'Chi': ch = String.fromCharCode(0x03a7); break; 
									case 'Psi': ch = String.fromCharCode(0x03a8); break; 
									case 'Omega': ch = String.fromCharCode(0x03a9); break;
									case 'alpha': ch = String.fromCharCode(0x03b1); break;
									case 'beta': ch = String.fromCharCode(0x03b2); break; 
									case 'gamma': ch = String.fromCharCode(0x03b3); break;
									case 'delta': ch = String.fromCharCode(0x03b4); break;
									case 'epsilon': ch = String.fromCharCode(0x03b5); break;
									case 'zeta': ch = String.fromCharCode(0x03b6); break; 
									case 'eta': ch = String.fromCharCode(0x03b7); break; 
									case 'theta': ch = String.fromCharCode(0x03b8); break;
									case 'iota': ch = String.fromCharCode(0x03b9); break; 
									case 'kappa': ch = String.fromCharCode(0x03ba); break;
									case 'lambda': ch = String.fromCharCode(0x03bb); break;
									case 'mu': ch = String.fromCharCode(0x03bc); break; 
									case 'nu': ch = String.fromCharCode(0x03bd); break; 
									case 'xi': ch = String.fromCharCode(0x03be); break; 
									case 'omicron': ch = String.fromCharCode(0x03bf); break;
									case 'pi': ch = String.fromCharCode(0x03c0); break; 
									case 'rho': ch = String.fromCharCode(0x03c1); break; 
									case 'sigmaf': ch = String.fromCharCode(0x03c2); break;
									case 'sigma': ch = String.fromCharCode(0x03c3); break; 
									case 'tau': ch = String.fromCharCode(0x03c4); break; 
									case 'upsilon': ch = String.fromCharCode(0x03c5); break;
									case 'phi': ch = String.fromCharCode(0x03c6); break; 
									case 'chi': ch = String.fromCharCode(0x03c7); break; 
									case 'psi': ch = String.fromCharCode(0x03c8); break; 
									case 'omega': ch = String.fromCharCode(0x03c9); break;
									case 'thetasym': ch = String.fromCharCode(0x03d1); break;
									case 'upsih': ch = String.fromCharCode(0x03d2); break; 
									case 'piv': ch = String.fromCharCode(0x03d6); break; 
									case 'ensp': ch = String.fromCharCode(0x2002); break;
									case 'emsp': ch = String.fromCharCode(0x2003); break;
									case 'thinsp': ch = String.fromCharCode(0x2009); break;
									case 'zwnj': ch = String.fromCharCode(0x200c); break; 
									case 'zwj': ch = String.fromCharCode(0x200d); break; 
									case 'lrm': ch = String.fromCharCode(0x200e); break; 
									case 'rlm': ch = String.fromCharCode(0x200f); break; 
									case 'ndash': ch = String.fromCharCode(0x2013); break;
									case 'mdash': ch = String.fromCharCode(0x2014); break;
									case 'lsquo': ch = String.fromCharCode(0x2018); break;
									case 'rsquo': ch = String.fromCharCode(0x2019); break;
									case 'sbquo': ch = String.fromCharCode(0x201a); break;
									case 'ldquo': ch = String.fromCharCode(0x201c); break;
									case 'rdquo': ch = String.fromCharCode(0x201d); break;
									case 'bdquo': ch = String.fromCharCode(0x201e); break;
									case 'dagger': ch = String.fromCharCode(0x2020); break;
									case 'Dagger': ch = String.fromCharCode(0x2021); break;
									case 'bull': ch = String.fromCharCode(0x2022); break; 
									case 'hellip': ch = String.fromCharCode(0x2026); break;
									case 'permil': ch = String.fromCharCode(0x2030); break;
									case 'prime': ch = String.fromCharCode(0x2032); break; 
									case 'Prime': ch = String.fromCharCode(0x2033); break; 
									case 'lsaquo': ch = String.fromCharCode(0x2039); break;
									case 'rsaquo': ch = String.fromCharCode(0x203a); break;
									case 'oline': ch = String.fromCharCode(0x203e); break; 
									case 'frasl': ch = String.fromCharCode(0x2044); break; 
									case 'euro': ch = String.fromCharCode(0x20ac); break; 
									case 'image': ch = String.fromCharCode(0x2111); break;
									case 'weierp': ch = String.fromCharCode(0x2118); break;
									case 'real': ch = String.fromCharCode(0x211c); break; 
									case 'trade': ch = String.fromCharCode(0x2122); break;
									case 'alefsym': ch = String.fromCharCode(0x2135); break; 
									case 'larr': ch = String.fromCharCode(0x2190); break; 
									case 'uarr': ch = String.fromCharCode(0x2191); break; 
									case 'rarr': ch = String.fromCharCode(0x2192); break; 
									case 'darr': ch = String.fromCharCode(0x2193); break; 
									case 'harr': ch = String.fromCharCode(0x2194); break; 
									case 'crarr': ch = String.fromCharCode(0x21b5); break; 
									case 'lArr': ch = String.fromCharCode(0x21d0); break; 
									case 'uArr': ch = String.fromCharCode(0x21d1); break; 
									case 'rArr': ch = String.fromCharCode(0x21d2); break; 
									case 'dArr': ch = String.fromCharCode(0x21d3); break; 
									case 'hArr': ch = String.fromCharCode(0x21d4); break; 
									case 'forall': ch = String.fromCharCode(0x2200); break;
									case 'part': ch = String.fromCharCode(0x2202); break; 
									case 'exist': ch = String.fromCharCode(0x2203); break;
									case 'empty': ch = String.fromCharCode(0x2205); break;
									case 'nabla': ch = String.fromCharCode(0x2207); break;
									case 'isin': ch = String.fromCharCode(0x2208); break; 
									case 'notin': ch = String.fromCharCode(0x2209); break;
									case 'ni': ch = String.fromCharCode(0x220b); break; 
									case 'prod': ch = String.fromCharCode(0x220f); break;
									case 'sum': ch = String.fromCharCode(0x2211); break; 
									case 'minus': ch = String.fromCharCode(0x2212); break;
									case 'lowast': ch = String.fromCharCode(0x2217); break;
									case 'radic': ch = String.fromCharCode(0x221a); break; 
									case 'prop': ch = String.fromCharCode(0x221d); break; 
									case 'infin': ch = String.fromCharCode(0x221e); break;
									case 'ang': ch = String.fromCharCode(0x2220); break; 
									case 'and': ch = String.fromCharCode(0x2227); break; 
									case 'or': ch = String.fromCharCode(0x2228); break; 
									case 'cap': ch = String.fromCharCode(0x2229); break;
									case 'cup': ch = String.fromCharCode(0x222a); break;
									case 'int': ch = String.fromCharCode(0x222b); break;
									case 'there4': ch = String.fromCharCode(0x2234); break;
									case 'sim': ch = String.fromCharCode(0x223c); break; 
									case 'cong': ch = String.fromCharCode(0x2245); break;
									case 'asymp': ch = String.fromCharCode(0x2248); break;
									case 'ne': ch = String.fromCharCode(0x2260); break; 
									case 'equiv': ch = String.fromCharCode(0x2261); break;
									case 'le': ch = String.fromCharCode(0x2264); break; 
									case 'ge': ch = String.fromCharCode(0x2265); break; 
									case 'sub': ch = String.fromCharCode(0x2282); break;
									case 'sup': ch = String.fromCharCode(0x2283); break;
									case 'nsub': ch = String.fromCharCode(0x2284); break;
									case 'sube': ch = String.fromCharCode(0x2286); break;
									case 'supe': ch = String.fromCharCode(0x2287); break;
									case 'oplus': ch = String.fromCharCode(0x2295); break;
									case 'otimes': ch = String.fromCharCode(0x2297); break;
									case 'perp': ch = String.fromCharCode(0x22a5); break; 
									case 'sdot': ch = String.fromCharCode(0x22c5); break; 
									case 'lceil': ch = String.fromCharCode(0x2308); break;
									case 'rceil': ch = String.fromCharCode(0x2309); break;
									case 'lfloor': ch = String.fromCharCode(0x230a); break; 
									case 'rfloor': ch = String.fromCharCode(0x230b); break; 
									case 'lang': ch = String.fromCharCode(0x2329); break; 
									case 'rang': ch = String.fromCharCode(0x232a); break; 
									case 'loz': ch = String.fromCharCode(0x25ca); break; 
									case 'spades': ch = String.fromCharCode(0x2660); break;
									case 'clubs': ch = String.fromCharCode(0x2663); break; 
									case 'hearts': ch = String.fromCharCode(0x2665); break;
									case 'diams': ch = String.fromCharCode(0x2666); break; 
									default: ch = ''; break; 

                              } 

                        } 

                        i = semicolonIndex; 

                  } 

            } 

            out += ch; 

      } 

      return out; 

} 
//------------------------------------------------------------------------------------------------------------------------------------------------