Beispiel #1
0
        public static string ValidateIDs(string[] arrID, bool bQuoted)
        {
            if (arrID.Length == 0)
            {
                return(String.Empty);
            }
            if (arrID.Length > 200)
            {
                L10N L10n = HttpContext.Current.Items["L10n"] as L10N;
                throw(new Exception(L10n.Term(".LBL_TOO_MANY_RECORDS")));
            }

            foreach (string sID in arrID)
            {
                Guid gID = Sql.ToGuid(sID);
                if (Sql.IsEmptyGuid(gID))
                {
                    // 05/02/2006 Paul.  Provide a more descriptive error message by including the ID.
                    throw(new Exception("Invalid ID: " + sID));
                }
            }
            string sIDs = String.Empty;

            if (bQuoted)
            {
                sIDs = "'" + String.Join("','", arrID) + "'";
            }
            else
            {
                sIDs = String.Join(",", arrID);
            }
            return(sIDs);
        }
Beispiel #2
0
        public static Stack FilterByACL_Stack(string sMODULE_NAME, string sACCESS_TYPE, string[] arrID, string sTABLE_NAME)
        {
            Stack         stk        = new Stack();
            StringBuilder sb         = new StringBuilder();
            int           nACLACCESS = Security.GetUserAccess(sMODULE_NAME, sACCESS_TYPE);

            if (nACLACCESS >= 0 && arrID.Length > 0)
            {
                if (nACLACCESS == ACL_ACCESS.OWNER)
                {
                    DbProviderFactory dbf = DbProviderFactories.GetFactory();
                    using (IDbConnection con = dbf.CreateConnection())
                    {
                        // 09/26/2006 Paul.  The connection needed to be opened.
                        con.Open();
                        string sSQL;
                        sSQL = "select ID              " + ControlChars.CrLf
                               + "  from vw" + sTABLE_NAME + ControlChars.CrLf
                               + " where 1 = 1           " + ControlChars.CrLf;
                        using (IDbCommand cmd = con.CreateCommand())
                        {
                            cmd.CommandText = sSQL;
                            Sql.AppendGuids(cmd, arrID, "ID");
                            Sql.AppendParameter(cmd, Security.USER_ID, "ASSIGNED_USER_ID", false);
                            using (IDataReader rdr = cmd.ExecuteReader())
                            {
                                while (rdr.Read())
                                {
                                    stk.Push(Sql.ToString(rdr["ID"]));
                                }
                            }
                        }
                    }
                    if (stk.Count == 0)
                    {
                        L10N L10n = HttpContext.Current.Items["L10n"] as L10N;
                        throw(new Exception(L10n.Term("ACL.LBL_INSUFFICIENT_ACCESS")));
                    }
                }
                else
                {
                    foreach (string sID in arrID)
                    {
                        if (sID.Length > 0)
                        {
                            stk.Push(sID);
                        }
                    }
                }
            }
            return(stk);
        }
        public static string FilterByACL(string sMODULE_NAME, string sACCESS_TYPE, string[] arrID, string sTABLE_NAME)
        {
            StringBuilder sb         = new StringBuilder();
            int           nACLACCESS = Security.GetUserAccess(sMODULE_NAME, sACCESS_TYPE);

            if (nACLACCESS >= 0 && arrID.Length > 0)
            {
                if (nACLACCESS == ACL_ACCESS.OWNER)
                {
                    DbProviderFactory dbf = DbProviderFactories.GetFactory();
                    using (IDbConnection con = dbf.CreateConnection())
                    {
                        string sSQL;
                        sSQL = "select ID              " + ControlChars.CrLf
                               + "  from vw" + sTABLE_NAME + ControlChars.CrLf
                               + " where 1 = 1           " + ControlChars.CrLf;
                        using (IDbCommand cmd = con.CreateCommand())
                        {
                            cmd.CommandText = sSQL;
                            Sql.AppendGuids(cmd, arrID, "ID");
                            Sql.AppendParameter(cmd, Security.USER_ID, "ASSIGNED_USER_ID", false);
                            using (IDataReader rdr = cmd.ExecuteReader(CommandBehavior.SingleRow))
                            {
                                while (rdr.Read())
                                {
                                    if (sb.Length > 0)
                                    {
                                        sb.Append(",");
                                    }
                                    sb.Append(Sql.ToString(rdr["ID"]));
                                }
                            }
                        }
                    }
                    if (sb.Length == 0)
                    {
                        L10N L10n = HttpContext.Current.Items["L10n"] as L10N;
                        throw(new Exception(L10n.Term("ACL.LBL_INSUFFICIENT_ACCESS")));
                    }
                }
                else
                {
                    return(String.Join(",", arrID));
                }
            }
            return(sb.ToString());
        }
Beispiel #4
0
 public static string TableColumnName(L10N L10n, string sModule, string sDISPLAY_NAME)
 {
     // 07/04/2006 Paul.  Some columns have global terms.
     // 06/05/2007 Paul.  Add Team global term.
     if (sDISPLAY_NAME == "DATE_ENTERED" ||
         sDISPLAY_NAME == "DATE_MODIFIED" ||
         sDISPLAY_NAME == "ASSIGNED_TO" ||
         sDISPLAY_NAME == "CREATED_BY" ||
         sDISPLAY_NAME == "MODIFIED_BY" ||
         sDISPLAY_NAME == "TEAM_NAME")
     {
         sDISPLAY_NAME = L10n.Term(".LBL_" + sDISPLAY_NAME).Replace(":", "");
     }
     else
     {
         // 07/04/2006 Paul.  Column names are aliased so that we don't have to redefine terms.
         sDISPLAY_NAME = L10n.AliasedTerm(sModule + ".LBL_" + sDISPLAY_NAME).Replace(":", "");
     }
     return(sDISPLAY_NAME);
 }
Beispiel #5
0
        public get_entry_result get_entry(string session, string module_name, string id, string[] select_fields)
        {
            Guid gUSER_ID = GetSessionUserID(session);

            string sTABLE_NAME = VerifyModuleName(module_name);
            int nACLACCESS = Security.GetUserAccess(module_name, "list");
            if ( nACLACCESS < 0 )
            {
                L10N L10n = new L10N("en-US");
                throw(new Exception(L10n.Term("ACL.LBL_INSUFFICIENT_ACCESS")));
            }

            get_entry_result results = new get_entry_result();
            DbProviderFactory dbf = DbProviderFactories.GetFactory();
            using ( IDbConnection con = dbf.CreateConnection() )
            {
                con.Open();
                string sSQL;
                sSQL = "select *" + ControlChars.CrLf
                     + "  from " + sTABLE_NAME + ControlChars.CrLf
                     + " where ID = @ID" + ControlChars.CrLf;
                using ( IDbCommand cmd = con.CreateCommand() )
                {
                    cmd.CommandText = sSQL;
                    Sql.AddParameter(cmd, "@ID", id);
                    if ( nACLACCESS == ACL_ACCESS.OWNER )
                    {
                        // 09/01/2006 Paul.  Notes do not have an ASSIGNED_USER_ID.
                        if ( sTABLE_NAME != "NOTES" )
                            Sql.AppendParameter(cmd, gUSER_ID, "ASSIGNED_USER_ID");
                    }
                    try
                    {
                        using ( DbDataAdapter da = dbf.CreateDataAdapter() )
                        {
                            ((IDbDataAdapter)da).SelectCommand = cmd;
                            using ( DataTable dt = new DataTable() )
                            {
                                da.Fill(dt);
                                if ( dt.Rows.Count > 0 )
                                {
                                    // 02/20/2006 Paul.  First initialize the array.
                                    results.field_list = new field      [select_fields.Length];
                                    results.entry_list = new entry_value[select_fields.Length];
                                    DataRow row = dt.Rows[0];
                                    for ( int i=0; i < select_fields.Length; i++ )
                                    {
                                        string sColumnName = select_fields[i];
                                        DataColumn col = dt.Columns[sColumnName];
                                        // 02/20/2006 Paul.  Then initialize each element in the array.
                                        // varchar, bool, datetime, int, text, blob
                                        results.field_list[i] = new field(sColumnName.ToLower(), col.DataType.ToString(), sColumnName, 0);
                                        // 02/20/2006 Paul.  Then initialize each element in the array.
                                        results.entry_list[i] = new entry_value(id, module_name, sColumnName, Sql.ToString(row[sColumnName]));
                                    }
                                }
                            }
                        }
                    }
                    catch(Exception ex)
                    {
                        SplendidError.SystemError(new StackTrace(true).GetFrame(0), ex);
                        throw(new Exception("SOAP: Failed contact_by_email", ex));
                    }
                }
            }
            return results;
        }
        /// <summary>
        /// CronDescription
        /// </summary>
        public static string CronDescription(L10N L10n, string sCRON)
        {
            StringBuilder sb = new StringBuilder();

            sCRON = sCRON.Replace(" ", "");
            if (sCRON == "*::*::*::*::*")
            {
                return(L10n.Term("Schedulers.LBL_OFTEN"));
            }

            CultureInfo culture          = CultureInfo.CreateSpecificCulture(L10n.NAME);
            string      sCRON_MONTH      = "*";
            string      sCRON_DAYOFMONTH = "*";
            string      sCRON_DAYOFWEEK  = "*";
            string      sCRON_HOUR       = "*";
            string      sCRON_MINUTE     = "*";

            string[] arrCRON           = sCRON.Replace("::", "|").Split('|');
            string[] arrCRON_TEMP      = new string[] {};
            string[] arrCRON_VALUE     = new string[] {};
            string[] arrDaySuffixes    = new string[32];
            int      nCRON_VALUE       = 0;
            int      nCRON_VALUE_START = 0;
            int      nCRON_VALUE_END   = 0;
            int      nON_THE_MINUTE    = -1;

            for (int n = 0; n < arrDaySuffixes.Length; n++)
            {
                arrDaySuffixes[n] = "th";
            }
            arrDaySuffixes[0] = "";
            arrDaySuffixes[1] = "st";
            arrDaySuffixes[2] = "nd";
            arrDaySuffixes[3] = "rd";

            // minute  hour  dayOfMonth  month  dayOfWeek
            if (arrCRON.Length > 0)
            {
                sCRON_MINUTE = arrCRON[0];
            }
            if (arrCRON.Length > 1)
            {
                sCRON_HOUR = arrCRON[1];
            }
            if (arrCRON.Length > 2)
            {
                sCRON_DAYOFMONTH = arrCRON[2];
            }
            if (arrCRON.Length > 3)
            {
                sCRON_MONTH = arrCRON[3];
            }
            if (arrCRON.Length > 4)
            {
                sCRON_DAYOFWEEK = arrCRON[4];
            }
            if (sCRON_MINUTE != "*")
            {
                arrCRON_TEMP = sCRON_MINUTE.Split(',');
                // 12/31/2007 Paul.  Check for either comma or dash.
                if (sCRON_MINUTE.Split(",-".ToCharArray()).Length == 1)
                {
                    nON_THE_MINUTE = Sql.ToInteger(sCRON_MINUTE);
                    sb.Append(L10n.Term("Schedulers.LBL_ON_THE"));
                    if (nON_THE_MINUTE == 0)
                    {
                        sb.Append(L10n.Term("Schedulers.LBL_HOUR_SING"));
                    }
                    else
                    {
                        sb.Append(nON_THE_MINUTE.ToString("00"));
                        sb.Append(L10n.Term("Schedulers.LBL_MIN_MARK"));
                    }
                }
                else
                {
                    for (int i = 0, nCronEntries = 0; i < arrCRON_TEMP.Length; i++)
                    {
                        if (arrCRON_TEMP[i].IndexOf('-') >= 0)
                        {
                            arrCRON_VALUE = arrCRON_TEMP[i].Split('-');
                            if (arrCRON_VALUE.Length >= 2)
                            {
                                nCRON_VALUE_START = Sql.ToInteger(arrCRON_VALUE[0]);
                                nCRON_VALUE_END   = Sql.ToInteger(arrCRON_VALUE[1]);
                                if (nCRON_VALUE_START >= 0 && nCRON_VALUE_START <= 23 && nCRON_VALUE_END >= 0 && nCRON_VALUE_END <= 23)
                                {
                                    if (nCronEntries > 0)
                                    {
                                        sb.Append(L10n.Term("Schedulers.LBL_AND"));
                                    }
                                    sb.Append(L10n.Term("Schedulers.LBL_FROM"));
                                    sb.Append(L10n.Term("Schedulers.LBL_ON_THE"));
                                    if (nCRON_VALUE_START == 0)
                                    {
                                        sb.Append(L10n.Term("Schedulers.LBL_HOUR_SING"));
                                    }
                                    else
                                    {
                                        sb.Append(nCRON_VALUE_START.ToString("0"));
                                        sb.Append(L10n.Term("Schedulers.LBL_MIN_MARK"));
                                    }
                                    sb.Append(L10n.Term("Schedulers.LBL_RANGE"));
                                    sb.Append(L10n.Term("Schedulers.LBL_ON_THE"));
                                    sb.Append(nCRON_VALUE_END.ToString("0"));
                                    sb.Append(L10n.Term("Schedulers.LBL_MIN_MARK"));
                                    nCronEntries++;
                                }
                            }
                        }
                        else
                        {
                            nCRON_VALUE = Sql.ToInteger(arrCRON_TEMP[i]);
                            if (nCRON_VALUE >= 0 && nCRON_VALUE <= 23)
                            {
                                if (nCronEntries > 0)
                                {
                                    sb.Append(L10n.Term("Schedulers.LBL_AND"));
                                }
                                sb.Append(L10n.Term("Schedulers.LBL_ON_THE"));
                                if (nCRON_VALUE == 0)
                                {
                                    sb.Append(L10n.Term("Schedulers.LBL_HOUR_SING"));
                                }
                                else
                                {
                                    sb.Append(nCRON_VALUE.ToString("0"));
                                    sb.Append(L10n.Term("Schedulers.LBL_MIN_MARK"));
                                }
                                nCronEntries++;
                            }
                        }
                    }
                }
            }
            if (sCRON_HOUR != "*")
            {
                if (sb.Length > 0)
                {
                    sb.Append("; ");
                }
                arrCRON_TEMP = sCRON_HOUR.Split(',');
                for (int i = 0, nCronEntries = 0; i < arrCRON_TEMP.Length; i++)
                {
                    if (arrCRON_TEMP[i].IndexOf('-') >= 0)
                    {
                        arrCRON_VALUE = arrCRON_TEMP[i].Split('-');
                        if (arrCRON_VALUE.Length >= 2)
                        {
                            nCRON_VALUE_START = Sql.ToInteger(arrCRON_VALUE[0]);
                            nCRON_VALUE_END   = Sql.ToInteger(arrCRON_VALUE[1]);
                            if (nCRON_VALUE_START >= 1 && nCRON_VALUE_START <= 31 && nCRON_VALUE_END >= 1 && nCRON_VALUE_END <= 31)
                            {
                                if (nCronEntries > 0)
                                {
                                    sb.Append(L10n.Term("Schedulers.LBL_AND"));
                                }
                                sb.Append(L10n.Term("Schedulers.LBL_FROM"));
                                sb.Append(arrCRON_VALUE[0]);
                                if (nON_THE_MINUTE >= 0)
                                {
                                    sb.Append(":" + nON_THE_MINUTE.ToString("00"));
                                }
                                sb.Append(L10n.Term("Schedulers.LBL_RANGE"));
                                sb.Append(arrCRON_VALUE[1]);
                                if (nON_THE_MINUTE >= 0)
                                {
                                    sb.Append(":" + nON_THE_MINUTE.ToString("00"));
                                }
                                nCronEntries++;
                            }
                        }
                    }
                    else
                    {
                        nCRON_VALUE = Sql.ToInteger(arrCRON_TEMP[i]);
                        if (nCRON_VALUE >= 1 && nCRON_VALUE <= 31)
                        {
                            if (nCronEntries > 0)
                            {
                                sb.Append(L10n.Term("Schedulers.LBL_AND"));
                            }
                            sb.Append(arrCRON_TEMP[i]);
                            if (nON_THE_MINUTE >= 0)
                            {
                                sb.Append(":" + nON_THE_MINUTE.ToString("00"));
                            }
                            nCronEntries++;
                        }
                    }
                }
            }
            if (sCRON_DAYOFMONTH != "*")
            {
                if (sb.Length > 0)
                {
                    sb.Append("; ");
                }
                arrCRON_TEMP = sCRON_DAYOFMONTH.Split(',');
                for (int i = 0, nCronEntries = 0; i < arrCRON_TEMP.Length; i++)
                {
                    if (arrCRON_TEMP[i].IndexOf('-') >= 0)
                    {
                        arrCRON_VALUE = arrCRON_TEMP[i].Split('-');
                        if (arrCRON_VALUE.Length >= 2)
                        {
                            nCRON_VALUE_START = Sql.ToInteger(arrCRON_VALUE[0]);
                            nCRON_VALUE_END   = Sql.ToInteger(arrCRON_VALUE[1]);
                            if (nCRON_VALUE_START >= 1 && nCRON_VALUE_START <= 31 && nCRON_VALUE_END >= 1 && nCRON_VALUE_END <= 31)
                            {
                                if (nCronEntries > 0)
                                {
                                    sb.Append(L10n.Term("Schedulers.LBL_AND"));
                                }
                                sb.Append(L10n.Term("Schedulers.LBL_FROM"));
                                sb.Append(nCRON_VALUE_START.ToString() + arrDaySuffixes[nCRON_VALUE_START]);
                                sb.Append(L10n.Term("Schedulers.LBL_RANGE"));
                                sb.Append(nCRON_VALUE_END.ToString() + arrDaySuffixes[nCRON_VALUE_END]);
                                nCronEntries++;
                            }
                        }
                    }
                    else
                    {
                        nCRON_VALUE = Sql.ToInteger(arrCRON_TEMP[i]);
                        if (nCRON_VALUE >= 1 && nCRON_VALUE <= 31)
                        {
                            if (nCronEntries > 0)
                            {
                                sb.Append(L10n.Term("Schedulers.LBL_AND"));
                            }
                            sb.Append(nCRON_VALUE.ToString() + arrDaySuffixes[nCRON_VALUE]);
                            nCronEntries++;
                        }
                    }
                }
            }
            if (sCRON_MONTH != "*")
            {
                if (sb.Length > 0)
                {
                    sb.Append("; ");
                }
                arrCRON_TEMP = sCRON_MONTH.Split(',');
                for (int i = 0, nCronEntries = 0; i < arrCRON_TEMP.Length; i++)
                {
                    if (arrCRON_TEMP[i].IndexOf('-') >= 0)
                    {
                        arrCRON_VALUE = arrCRON_TEMP[i].Split('-');
                        if (arrCRON_VALUE.Length >= 2)
                        {
                            nCRON_VALUE_START = Sql.ToInteger(arrCRON_VALUE[0]);
                            nCRON_VALUE_END   = Sql.ToInteger(arrCRON_VALUE[1]);
                            if (nCRON_VALUE_START >= 1 && nCRON_VALUE_START <= 12 && nCRON_VALUE_END >= 1 && nCRON_VALUE_END <= 12)
                            {
                                if (nCronEntries > 0)
                                {
                                    sb.Append(L10n.Term("Schedulers.LBL_AND"));
                                }
                                sb.Append(L10n.Term("Schedulers.LBL_FROM"));
                                sb.Append(culture.DateTimeFormat.MonthNames[nCRON_VALUE_START]);
                                sb.Append(L10n.Term("Schedulers.LBL_RANGE"));
                                sb.Append(culture.DateTimeFormat.MonthNames[nCRON_VALUE_END]);
                                nCronEntries++;
                            }
                        }
                    }
                    else
                    {
                        nCRON_VALUE = Sql.ToInteger(arrCRON_TEMP[i]);
                        if (nCRON_VALUE >= 1 && nCRON_VALUE <= 12)
                        {
                            if (nCronEntries > 0)
                            {
                                sb.Append(L10n.Term("Schedulers.LBL_AND"));
                            }
                            sb.Append(culture.DateTimeFormat.MonthNames[nCRON_VALUE]);
                            nCronEntries++;
                        }
                    }
                }
            }
            if (sCRON_DAYOFWEEK != "*")
            {
                if (sb.Length > 0)
                {
                    sb.Append("; ");
                }
                arrCRON_TEMP = sCRON_DAYOFWEEK.Split(',');
                for (int i = 0, nCronEntries = 0; i < arrCRON_TEMP.Length; i++)
                {
                    if (arrCRON_TEMP[i].IndexOf('-') >= 0)
                    {
                        arrCRON_VALUE = arrCRON_TEMP[i].Split('-');
                        if (arrCRON_VALUE.Length >= 2)
                        {
                            nCRON_VALUE_START = Sql.ToInteger(arrCRON_VALUE[0]);
                            nCRON_VALUE_END   = Sql.ToInteger(arrCRON_VALUE[1]);
                            if (nCRON_VALUE_START >= 0 && nCRON_VALUE_START <= 6 && nCRON_VALUE_END >= 0 && nCRON_VALUE_END <= 6)
                            {
                                if (nCronEntries > 0)
                                {
                                    sb.Append(L10n.Term("Schedulers.LBL_AND"));
                                }
                                sb.Append(L10n.Term("Schedulers.LBL_FROM"));
                                sb.Append(culture.DateTimeFormat.DayNames[nCRON_VALUE_START]);
                                sb.Append(L10n.Term("Schedulers.LBL_RANGE"));
                                sb.Append(culture.DateTimeFormat.DayNames[nCRON_VALUE_END]);
                                nCronEntries++;
                            }
                        }
                    }
                    else
                    {
                        nCRON_VALUE = Sql.ToInteger(arrCRON_TEMP[i]);
                        if (nCRON_VALUE >= 0 && nCRON_VALUE <= 6)
                        {
                            if (nCronEntries > 0)
                            {
                                sb.Append(L10n.Term("Schedulers.LBL_AND"));
                            }
                            sb.Append(culture.DateTimeFormat.DayNames[nCRON_VALUE]);
                            nCronEntries++;
                        }
                    }
                }
            }
            return(sb.ToString());
        }
Beispiel #7
0
        public user_detail[] user_list(string user_name, string password)
        {
            // 03/12/2007 Paul.  If using NTLM, then user_name will be updated with value from Identity object.
            Guid gUSER_ID = LoginUser(ref user_name, password);

            if ( !IsAdmin(gUSER_ID) )
            {
                L10N L10n = new L10N("en-US");
                throw(new Exception(L10n.Term("ACL.LBL_INSUFFICIENT_ACCESS")));
            }

            user_detail[] results = new user_detail[0];
            DbProviderFactory dbf = DbProviderFactories.GetFactory();
            using ( IDbConnection con = dbf.CreateConnection() )
            {
                con.Open();
                string sSQL;
                sSQL = "select *               " + ControlChars.CrLf
                     + "  from vwSOAP_User_List" + ControlChars.CrLf
                     + " where 1 = 1           " + ControlChars.CrLf;
                using ( IDbCommand cmd = con.CreateCommand() )
                {
                    cmd.CommandText = sSQL;
                    try
                    {
                        using ( DbDataAdapter da = dbf.CreateDataAdapter() )
                        {
                            ((IDbDataAdapter)da).SelectCommand = cmd;
                            using ( DataTable dt = new DataTable() )
                            {
                                da.Fill(dt);
                                if ( dt.Rows.Count > 0 )
                                {
                                    // 02/20/2006 Paul.  First initialize the array.
                                    results = new user_detail[dt.Rows.Count];
                                    for ( int i=0; i < dt.Rows.Count ; i++ )
                                    {
                                        // 02/20/2006 Paul.  Then initialize each element in the array.
                                        results[i] = new user_detail();
                                        results[i].email_address = Sql.ToString(dt.Rows[i]["EMAIL_ADDRESS"]);
                                        results[i].user_name     = Sql.ToString(dt.Rows[i]["USER_NAME"    ]);
                                        results[i].first_name    = Sql.ToString(dt.Rows[i]["FIRST_NAME"   ]);
                                        results[i].last_name     = Sql.ToString(dt.Rows[i]["LAST_NAME"    ]);
                                        results[i].department    = Sql.ToString(dt.Rows[i]["DEPARTMENT"   ]);
                                        results[i].id            = Sql.ToString(dt.Rows[i]["ID"           ]);
                                        results[i].title         = Sql.ToString(dt.Rows[i]["TITLE"        ]);
                                    }
                                }
                            }
                        }
                    }
                    catch(Exception ex)
                    {
                        SplendidError.SystemError(new StackTrace(true).GetFrame(0), ex);
                        throw(new Exception("SOAP: Failed user_list", ex));
                    }
                }
            }
            return results;
        }
Beispiel #8
0
        public string create_opportunity(string user_name, string password, string name, string amount)
        {
            // 03/12/2007 Paul.  If using NTLM, then user_name will be updated with value from Identity object.
            Guid gUSER_ID = LoginUser(ref user_name, password);

            int nACLACCESS = Security.GetUserAccess("Opportunities", "edit");
            if ( nACLACCESS < 0 )
            {
                L10N L10n = new L10N("en-US");
                throw(new Exception(L10n.Term("ACL.LBL_INSUFFICIENT_ACCESS")));
            }
            Guid gID = Guid.Empty;
            SqlProcs.spOPPORTUNITIES_New(ref gID, Guid.Empty, name, Sql.ToDecimal(amount), Guid.Empty, DateTime.MinValue, String.Empty);
            return "1";
        }
Beispiel #9
0
        public set_entry_result set_note_attachment(string session, note_attachment note)
        {
            Guid   gUSER_ID        = GetSessionUserID(session);
            Guid   gNOTE_ID        = Sql.ToGuid(note.id);
            string sFILENAME       = Path.GetFileName (note.filename);
            string sFILE_EXT       = Path.GetExtension(sFILENAME);
            string sFILE_MIME_TYPE = "application/octet-stream";

            int nACLACCESS = Security.GetUserAccess("Notes", "edit");
            if ( nACLACCESS < 0 )
            {
                L10N L10n = new L10N("en-US");
                throw(new Exception(L10n.Term("ACL.LBL_INSUFFICIENT_ACCESS")));
            }

            set_entry_result result = new set_entry_result();
            byte[] byData = Convert.FromBase64String(note.file);
            // 02/20/2006 Paul.  Try and reduce the memory requirements by releasing the original data as soon as possible.
            note.file = null;
            using ( MemoryStream stm = new System.IO.MemoryStream(byData) )
            {
                DbProviderFactory dbf = DbProviderFactories.GetFactory();
                using ( IDbConnection con = dbf.CreateConnection() )
                {
                    con.Open();
                    Guid gASSIGNED_USER_ID = Guid.Empty;

                    /*
                    // 09/01/2006 Paul.  Notes do not have an ASSIGNED_USER_ID.
                    string sSQL = String.Empty;
                    sSQL = "select *           " + ControlChars.CrLf
                         + "  from vwNOTES_Edit" + ControlChars.CrLf
                         + " where ID = @ID    " + ControlChars.CrLf;
                    using ( IDbCommand cmd = con.CreateCommand() )
                    {
                        cmd.CommandText = sSQL;
                        Sql.AddParameter(cmd, "@ID", gNOTE_ID);
                        using ( IDataReader rdr = cmd.ExecuteReader() )
                        {
                            if ( rdr.Read() )
                            {
                                gASSIGNED_USER_ID = Sql.ToGuid(rdr["ASSIGNED_USER_ID"]);
                            }
                        }
                    }
                    */
                    if ( nACLACCESS != ACL_ACCESS.OWNER || (nACLACCESS == ACL_ACCESS.OWNER  && gASSIGNED_USER_ID == gUSER_ID) )
                    {
                        using ( IDbTransaction trn = con.BeginTransaction() )
                        {
                            try
                            {
                                Guid gAttachmentID = Guid.Empty;
                                SqlProcs.spNOTE_ATTACHMENTS_Insert(ref gAttachmentID, gNOTE_ID, note.filename, sFILENAME, sFILE_EXT, sFILE_MIME_TYPE, trn);
                                SplendidCRM.Notes.EditView.LoadFile(gAttachmentID, stm, trn);
                                trn.Commit();
                            }
                            catch(Exception ex)
                            {
                                trn.Rollback();
                                SplendidError.SystemError(new StackTrace(true).GetFrame(0), ex);
                                throw ( new Exception(ex.Message) );
                            }
                        }
                    }
                }
            }
            byData = null;
            return result;
        }
Beispiel #10
0
        public set_relationship_list_result set_relationships(string session, set_relationship_value[] set_relationship_list)
        {
            Guid gUSER_ID = GetSessionUserID(session);

            set_relationship_list_result results = new set_relationship_list_result();
            results.created = 0;
            results.failed  = 0;
            for ( int i=0; i < set_relationship_list.Length; i ++ )
            {
                int nACLACCESS = Security.GetUserAccess(set_relationship_list[i].module1, "edit");
                if ( nACLACCESS < 0 )
                {
                    L10N L10n = new L10N("en-US");
                    throw(new Exception(L10n.Term("ACL.LBL_INSUFFICIENT_ACCESS")));
                }
                SetRelationship(set_relationship_list[i].module1, set_relationship_list[i].module1_id, set_relationship_list[i].module2, set_relationship_list[i].module2_id);
                results.created++ ;
            }
            return results;
        }
Beispiel #11
0
        public string create_account(string user_name, string password, string name, string phone, string website)
        {
            Guid gUSER_ID = LoginUser(user_name, password);

            int nACLACCESS = Security.GetUserAccess("Accounts", "edit");
            if ( nACLACCESS < 0 )
            {
                L10N L10n = new L10N("en-US");
                throw(new Exception(L10n.Term("ACL.LBL_INSUFFICIENT_ACCESS")));
            }
            Guid gID = Guid.Empty;
            SqlProcs.spACCOUNTS_New(ref gID, name, phone, website);
            return "1";
        }
Beispiel #12
0
        public string create_account(string user_name, string password, string name, string phone, string website)
        {
            // 03/12/2007 Paul.  If using NTLM, then user_name will be updated with value from Identity object.
            Guid gUSER_ID = LoginUser(ref user_name, password);

            int nACLACCESS = Security.GetUserAccess("Accounts", "edit");
            if ( nACLACCESS < 0 )
            {
                L10N L10n = new L10N("en-US");
                throw(new Exception(L10n.Term("ACL.LBL_INSUFFICIENT_ACCESS")));
            }
            Guid gID = Guid.Empty;
            SqlProcs.spACCOUNTS_New(ref gID, name, phone, website);
            return "1";
        }
        public static void AppendDetailViewFields(DataView dvFields, HtmlTable tbl, IDataReader rdr, L10N L10n, TimeZone T10n, CommandEventHandler Page_Command, bool bLayoutMode)
        {
            HtmlTableRow tr = null;
            // 11/28/2005 Paul.  Start row index using the existing count so that headers can be specified.
            int nRowIndex = tbl.Rows.Count - 1;
            int nColIndex = 0;
            // 01/07/2006 Paul.  Show table borders in layout mode. This will help distinguish blank lines from wrapped lines.
            if ( bLayoutMode )
                tbl.Border = 1;
            HttpSessionState Session = HttpContext.Current.Session;
            foreach(DataRowView row in dvFields)
            {
                Guid   gID          = Sql.ToGuid   (row["ID"         ]);
                int    nFIELD_INDEX = Sql.ToInteger(row["FIELD_INDEX"]);
                string sFIELD_TYPE  = Sql.ToString (row["FIELD_TYPE" ]);
                string sDATA_LABEL  = Sql.ToString (row["DATA_LABEL" ]);
                string sDATA_FIELD  = Sql.ToString (row["DATA_FIELD" ]);
                string sDATA_FORMAT = Sql.ToString (row["DATA_FORMAT"]);
                string sLIST_NAME   = Sql.ToString (row["LIST_NAME"  ]);
                int    nCOLSPAN     = Sql.ToInteger(row["COLSPAN"    ]);
                string sLABEL_WIDTH = Sql.ToString (row["LABEL_WIDTH"]);
                string sFIELD_WIDTH = Sql.ToString (row["FIELD_WIDTH"]);
                if ( nColIndex == 0 )
                {
                    // 11/25/2005 Paul.  Don't pre-create a row as we don't want a blank
                    // row at the bottom.  Add rows just before they are needed.
                    nRowIndex++;
                    tr = new HtmlTableRow();
                    tbl.Rows.Insert(nRowIndex, tr);
                }
                if ( bLayoutMode )
                {
                    HtmlTableCell tdAction = new HtmlTableCell();
                    tr.Cells.Add(tdAction);
                    tdAction.Attributes.Add("class", "tabDetailViewDL");
                    tdAction.NoWrap = true;

                    Literal litIndex = new Literal();
                    tdAction.Controls.Add(litIndex);
                    litIndex.Text = " " + nFIELD_INDEX.ToString() + " ";

                    ImageButton btnMoveUp   = CreateLayoutImageButton(gID, "Layout.MoveUp"  , nFIELD_INDEX, L10n.Term(".LNK_UP"    ), Sql.ToString(Session["themeURL"]) + "images/uparrow_inline.gif"  , Page_Command);
                    ImageButton btnMoveDown = CreateLayoutImageButton(gID, "Layout.MoveDown", nFIELD_INDEX, L10n.Term(".LNK_DOWN"  ), Sql.ToString(Session["themeURL"]) + "images/downarrow_inline.gif", Page_Command);
                    ImageButton btnInsert   = CreateLayoutImageButton(gID, "Layout.Insert"  , nFIELD_INDEX, L10n.Term(".LNK_INS"   ), Sql.ToString(Session["themeURL"]) + "images/plus_inline.gif"     , Page_Command);
                    ImageButton btnEdit     = CreateLayoutImageButton(gID, "Layout.Edit"    , nFIELD_INDEX, L10n.Term(".LNK_EDIT"  ), Sql.ToString(Session["themeURL"]) + "images/edit_inline.gif"     , Page_Command);
                    ImageButton btnDelete   = CreateLayoutImageButton(gID, "Layout.Delete"  , nFIELD_INDEX, L10n.Term(".LNK_DELETE"), Sql.ToString(Session["themeURL"]) + "images/delete_inline.gif"   , Page_Command);
                    tdAction.Controls.Add(btnMoveUp  );
                    tdAction.Controls.Add(btnMoveDown);
                    tdAction.Controls.Add(btnInsert  );
                    tdAction.Controls.Add(btnEdit    );
                    tdAction.Controls.Add(btnDelete  );
                }
                HtmlTableCell tdLabel = new HtmlTableCell();
                HtmlTableCell tdField = new HtmlTableCell();
                tr.Cells.Add(tdLabel);
                tr.Cells.Add(tdField);
                if ( nCOLSPAN > 0 )
                {
                    tdField.ColSpan = nCOLSPAN;
                    if ( bLayoutMode )
                        tdField.ColSpan++;
                }
                tdLabel.Attributes.Add("class", "tabDetailViewDL");
                tdLabel.VAlign = "top";
                tdLabel.Width  = sLABEL_WIDTH;
                tdField.Attributes.Add("class", "tabDetailViewDF");
                tdField.VAlign = "top";
                // 11/28/2005 Paul.  Don't use the field width if COLSPAN is specified as we want it to take the rest of the table.  The label width will be sufficient.
                if ( nCOLSPAN == 0 )
                    tdField.Width  = sFIELD_WIDTH;

                Literal   litLabel = new Literal();
                HyperLink lnkField = null;
                tdLabel.Controls.Add(litLabel);
                //litLabel.Text = nFIELD_INDEX.ToString() + " (" + nRowIndex.ToString() + "," + nColIndex.ToString() + ")";
                try
                {
                    if ( bLayoutMode )
                        litLabel.Text = sDATA_LABEL;
                    else if ( sDATA_LABEL.IndexOf(".") >= 0 )
                        litLabel.Text = L10n.Term(sDATA_LABEL);
                    else if ( !Sql.IsEmptyString(sDATA_LABEL) && rdr != null )
                        litLabel.Text = Sql.ToString(rdr[sDATA_LABEL]) + L10n.Term("Calls.LBL_COLON");
                    // 07/15/2006 Paul.  Always put something for the label so that table borders will look right.
                    else
                        litLabel.Text = "&nbsp;";
                }
                catch(Exception ex)
                {
                    SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex.Message);
                    litLabel.Text = ex.Message;
                }
                if ( String.Compare(sFIELD_TYPE, "Blank", true) == 0 )
                {
                    Literal litField = new Literal();
                    tdField.Controls.Add(litField);
                    if ( bLayoutMode )
                    {
                        litLabel.Text = "*** BLANK ***";
                        litField.Text = "*** BLANK ***";
                    }
                    else
                    {
                        litField.Text = "&nbsp;";
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "Line", true) == 0 )
                {
                    if ( bLayoutMode )
                    {
                        Literal litField = new Literal();
                        tdField.Controls.Add(litField);
                        litLabel.Text = "*** LINE ***";
                        litField.Text = "*** LINE ***";
                    }
                    else
                    {
                        tr.Cells.Clear();
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "String", true) == 0 )
                {
                    if ( bLayoutMode )
                    {
                        Literal litField = new Literal();
                        litField.Text = sDATA_FIELD;
                        tdField.Controls.Add(litField);
                    }
                    else if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        // 12/06/2005 Paul.  Wrap all string fields in a SPAN tag to simplify regression testing.
                        HtmlGenericControl spnField = new HtmlGenericControl("span");
                        tdField.Controls.Add(spnField);
                        spnField.ID = sDATA_FIELD;

                        Literal litField = new Literal();
                        spnField.Controls.Add(litField);
                        try
                        {
                            string[] arrLIST_NAME  = sLIST_NAME .Split(' ');
                            string[] arrDATA_FIELD = sDATA_FIELD.Split(' ');
                            object[] objDATA_FIELD = new object[arrDATA_FIELD.Length];
                            for ( int i=0 ; i < arrDATA_FIELD.Length; i++ )
                            {
                                if ( arrDATA_FIELD[i].IndexOf(".") >= 0 )
                                {
                                    objDATA_FIELD[i] = L10n.Term(arrDATA_FIELD[i]);
                                }
                                else if ( !Sql.IsEmptyString(sLIST_NAME) )
                                {
                                    if ( arrLIST_NAME.Length == arrDATA_FIELD.Length )
                                    {
                                        if ( rdr != null )
                                            objDATA_FIELD[i] = L10n.Term("." + arrLIST_NAME[i] + ".", rdr[arrDATA_FIELD[i]]);
                                        else
                                            objDATA_FIELD[i] = String.Empty;
                                    }
                                }
                                else if ( !Sql.IsEmptyString(arrDATA_FIELD[i]) )
                                {
                                    if ( rdr != null && rdr[arrDATA_FIELD[i]] != DBNull.Value)
                                    {
                                        // 12/05/2005 Paul.  If the data is a DateTime field, then make sure to perform the timezone conversion.
                                        if ( rdr[arrDATA_FIELD[i]].GetType() == Type.GetType("System.DateTime") )
                                            objDATA_FIELD[i] = T10n.FromServerTime(rdr[arrDATA_FIELD[i]]);
                                        else
                                            objDATA_FIELD[i] = rdr[arrDATA_FIELD[i]];
                                    }
                                    else
                                        objDATA_FIELD[i] = String.Empty;
                                }
                            }
                            if ( rdr != null )
                            {
                                // 01/09/2006 Paul.  Allow DATA_FORMAT to be optional.   If missing, write data directly.
                                if ( sDATA_FORMAT == String.Empty )
                                {
                                    for ( int i=0; i < arrDATA_FIELD.Length; i++ )
                                        arrDATA_FIELD[i] = Sql.ToString(objDATA_FIELD[i]);
                                    litField.Text = String.Join(" ", arrDATA_FIELD);
                                }
                                else
                                    litField.Text = String.Format(sDATA_FORMAT, objDATA_FIELD);
                            }
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex.Message);
                            litField.Text = ex.Message;
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "CheckBox", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        CheckBox chkField = new CheckBox();
                        tdField.Controls.Add(chkField);
                        chkField.Enabled  = false     ;
                        chkField.CssClass = "checkbox";
                        // 03/16/2006 Paul.  Give the checkbox a name so that it can be validated with SplendidTest.
                        chkField.ID       = sDATA_FIELD;
                        try
                        {
                            if ( rdr != null )
                                chkField.Checked = Sql.ToBoolean(rdr[sDATA_FIELD]);
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex.Message);
                        }
                        if ( bLayoutMode )
                        {
                            Literal litField = new Literal();
                            litField.Text = sDATA_FIELD;
                            tdField.Controls.Add(litField);
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "Button", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        Button btnField = new Button();
                        tdField.Controls.Add(btnField);
                        btnField.CssClass = "button";
                        // 03/16/2006 Paul.  Give the button a name so that it can be validated with SplendidTest.
                        btnField.ID       = sDATA_FIELD;
                        if ( Page_Command != null )
                        {
                            btnField.Command    += Page_Command;
                            btnField.CommandName = sDATA_FORMAT  ;
                        }
                        try
                        {
                            if ( bLayoutMode )
                            {
                                btnField.Text    = sDATA_FIELD;
                                btnField.Enabled = false      ;
                            }
                            else if ( sDATA_FIELD.IndexOf(".") >= 0 )
                            {
                                btnField.Text = L10n.Term(sDATA_FIELD);
                            }
                            else if ( !Sql.IsEmptyString(sDATA_FIELD) && rdr != null )
                            {
                                btnField.Text = Sql.ToString(rdr[sDATA_FIELD]);
                            }
                            btnField.Attributes.Add("title", btnField.Text);
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex.Message);
                            btnField.Text = ex.Message;
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "Textbox", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        TextBox txtField = new TextBox();
                        tdField.Controls.Add(txtField);
                        txtField.ReadOnly = true;
                        txtField.TextMode = TextBoxMode.MultiLine;
                        // 03/16/2006 Paul.  Give the textbox a name so that it can be validated with SplendidTest.
                        txtField.ID       = sDATA_FIELD;
                        try
                        {
                            string[] arrDATA_FORMAT = sDATA_FORMAT.Split(',');
                            if ( arrDATA_FORMAT.Length == 2 )
                            {
                                txtField.Rows    = Sql.ToInteger(arrDATA_FORMAT[0]);
                                txtField.Columns = Sql.ToInteger(arrDATA_FORMAT[1]);
                            }
                            if ( bLayoutMode )
                            {
                                txtField.Text = sDATA_FIELD;
                            }
                            else if ( !Sql.IsEmptyString(sDATA_FIELD) && rdr != null )
                            {
                                txtField.Text = Sql.ToString(rdr[sDATA_FIELD]);
                            }
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex.Message);
                            txtField.Text = ex.Message;
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "HyperLink", true) == 0 )
                {
                    string sURL_FIELD = Sql.ToString (row["URL_FIELD"]);
                    if ( !Sql.IsEmptyString(sDATA_FIELD) && !Sql.IsEmptyString(sURL_FIELD) )
                    {
                        string sURL_FORMAT = Sql.ToString (row["URL_FORMAT"]);
                        string sURL_TARGET = Sql.ToString (row["URL_TARGET"]);
                        lnkField = new HyperLink();
                        tdField.Controls.Add(lnkField);
                        lnkField.Target   = sURL_TARGET;
                        lnkField.CssClass = "tabDetailViewDFLink";
                        // 03/16/2006 Paul.  Give the hyperlink a name so that it can be validated with SplendidTest.
                        lnkField.ID       = sDATA_FIELD;
                        try
                        {
                            if ( bLayoutMode )
                            {
                                lnkField.Text    = sDATA_FIELD;
                                lnkField.Enabled = false      ;
                            }
                            else if ( rdr != null )
                            {
                                if ( !Sql.IsEmptyString(rdr[sDATA_FIELD]) )
                                {
                                    // 01/09/2006 Paul.  Allow DATA_FORMAT to be optional.   If missing, write data directly.
                                    if ( sDATA_FORMAT == String.Empty )
                                        lnkField.Text = Sql.ToString(rdr[sDATA_FIELD]);
                                    else
                                        lnkField.Text = String.Format(sDATA_FORMAT, Sql.ToString(rdr[sDATA_FIELD]));
                                }
                            }
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex.Message);
                            lnkField.Text = ex.Message;
                        }
                        try
                        {
                            if ( bLayoutMode )
                            {
                                lnkField.NavigateUrl = sURL_FIELD;
                            }
                            else if ( rdr != null )
                            {
                                if ( !Sql.IsEmptyString(rdr[sURL_FIELD]) )
                                {
                                    // 01/09/2006 Paul.  Allow DATA_FORMAT to be optional.   If missing, write data directly.
                                    if ( sDATA_FORMAT == String.Empty )
                                        lnkField.NavigateUrl = Sql.ToString(rdr[sURL_FIELD]);
                                    else
                                        lnkField.NavigateUrl = String.Format(sURL_FORMAT, Sql.ToString(rdr[sURL_FIELD]));
                                }
                            }
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex.Message);
                            lnkField.NavigateUrl = ex.Message;
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "Image", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        Image imgField = new Image();
                        // 04/13/2006 Paul.  Give the image a name so that it can be validated with SplendidTest.
                        imgField.ID = sDATA_FIELD;
                        try
                        {
                            if ( bLayoutMode )
                            {
                                Literal litField = new Literal();
                                litField.Text = sDATA_FIELD;
                                tdField.Controls.Add(litField);
                            }
                            else if ( rdr != null )
                            {
                                if ( !Sql.IsEmptyString(rdr[sDATA_FIELD]) )
                                {
                                    imgField.ImageUrl = "~/Images/Image.aspx?ID=" + Sql.ToString(rdr[sDATA_FIELD]);
                                    // 04/13/2006 Paul.  Only add the image if it exists.
                                    tdField.Controls.Add(imgField);
                                }
                            }
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex.Message);
                            lnkField.Text = ex.Message;
                        }
                    }
                }
                else
                {
                    Literal litField = new Literal();
                    tdField.Controls.Add(litField);
                    litField.Text = "Unknown field type " + sFIELD_TYPE;
                    // 01/07/2006 Paul.  Don't report the error in layout mode.
                    if ( !bLayoutMode )
                        SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), "Unknown field type " + sFIELD_TYPE);
                }
                if ( nCOLSPAN > 0 )
                    nColIndex = 0;
                else
                {
                    nColIndex++;
                    if ( nColIndex > 1 )
                        nColIndex = 0;
                }
            }
        }
Beispiel #14
0
        public static string FillTrackers(string sBODY_HTML, DataTable dtTrackers, string sSiteURL, Guid gTARGET_TRACKER_KEY, L10N L10n)
        {
            bool bHAS_OPTOUT_LINKS = false;
            foreach ( DataRow row in dtTrackers.Rows )
            {
                Guid   gTRACKER_ID   = Sql.ToGuid   (row["ID"          ]);
                string sTRACKER_NAME = Sql.ToString (row["TRACKER_NAME"]);
                string sTRACKER_URL  = Sql.ToString (row["TRACKER_URL" ]);
                bool   bIS_OPTOUT    = Sql.ToBoolean(row["IS_OPTOUT"   ]);
                string sTrackerPath = String.Empty;
                if ( bIS_OPTOUT )
                {
                    bHAS_OPTOUT_LINKS = true;
                    sTrackerPath += "RemoveMe.aspx?identifier=" + gTARGET_TRACKER_KEY.ToString();
                }
                else
                {
                    sTrackerPath += "campaign_trackerv2.aspx?identifier=" + gTARGET_TRACKER_KEY.ToString();
                    sTrackerPath += "&track=" + gTRACKER_ID.ToString();
                }
                sBODY_HTML = sBODY_HTML.Replace("{" + sTRACKER_NAME + "}", sSiteURL + sTrackerPath);
            }

            if ( !bHAS_OPTOUT_LINKS )
                sBODY_HTML += "<br><font size='2'>" + HttpUtility.HtmlEncode(L10n.Term("EmailMan.TXT_REMOVE_ME")) + "<a href='" + sSiteURL + "RemoveMe.aspx?identifier=" + gTARGET_TRACKER_KEY.ToString() + "'>" + HttpUtility.HtmlEncode(L10n.Term("EmailMan.TXT_REMOVE_ME_CLICK")) + "</a></font>";
            sBODY_HTML += "<br><img height='1' width='1' src='" + sSiteURL + "image.aspx?identifier=" + gTARGET_TRACKER_KEY.ToString() + "'>";
            return sBODY_HTML;
        }
        /*
        // 01/16/2006 Paul.  If we disable the validator, it will hide it's error message.
        // The solution may be to always require server-side validation (disable EnableClientScript).
        public static void DisableValidationEditViewFields(string sEDIT_NAME, Control parent)
        {
            DataTable dtFields = SplendidCache.EditViewFields(sEDIT_NAME);
            DataView dvFields = new DataView(dtFields);
            dvFields.RowFilter = "UI_REQUIRED = 1";
            foreach(DataRowView row in dvFields)
            {
                string sFIELD_TYPE        = Sql.ToString (row["FIELD_TYPE"       ]);
                string sDATA_FIELD        = Sql.ToString (row["DATA_FIELD"       ]);
                bool   bUI_REQUIRED       = Sql.ToBoolean(row["UI_REQUIRED"      ]);
                if ( bUI_REQUIRED && !Sql.IsEmptyString(sDATA_FIELD) )
                {
                    if ( String.Compare(sFIELD_TYPE, "DatePicker", true) == 0 )
                    {
                        DatePicker ctlDate = parent.FindControl(sDATA_FIELD) as DatePicker;
                        if ( ctlDate != null )
                            ctlDate.DisableValidation();
                    }
                    else if ( String.Compare(sFIELD_TYPE, "DateTimePicker", true) == 0 )
                    {
                        DateTimePicker ctlDate = parent.FindControl(sDATA_FIELD) as DateTimePicker;
                        if ( ctlDate != null )
                            ctlDate.DisableValidation();
                    }
                    else if ( String.Compare(sFIELD_TYPE, "DateTimeEdit", true) == 0 )
                    {
                        DateTimeEdit ctlDate = parent.FindControl(sDATA_FIELD) as DateTimeEdit;
                        if ( ctlDate != null )
                            ctlDate.DisableValidation();
                    }
                    else
                    {
                        BaseValidator req = parent.FindControl(sDATA_FIELD + "_REQUIRED") as BaseValidator;
                        if ( req != null )
                        {
                            // 01/16/2006 Paul.  Enable validator before validating page.
                            // If we leave the validator control enabled, then it may block an alternate action, like Cancel.
                            req.Enabled = false;
                        }
                    }
                }
            }
        }
        */
        public static void AppendEditViewFields(DataView dvFields, HtmlTable tbl, IDataReader rdr, L10N L10n, TimeZone T10n, CommandEventHandler Page_Command, bool bLayoutMode)
        {
            HtmlTableRow tr = null;
            // 11/28/2005 Paul.  Start row index using the existing count so that headers can be specified.
            int nRowIndex = tbl.Rows.Count - 1;
            int nColIndex = 0;
            HtmlTableCell tdLabel = null;
            HtmlTableCell tdField = null;
            // 01/07/2006 Paul.  Show table borders in layout mode. This will help distinguish blank lines from wrapped lines.
            if ( bLayoutMode )
                tbl.Border = 1;
            HttpSessionState Session = HttpContext.Current.Session;
            foreach(DataRowView row in dvFields)
            {
                Guid   gID                = Sql.ToGuid   (row["ID"               ]);
                int    nFIELD_INDEX       = Sql.ToInteger(row["FIELD_INDEX"      ]);
                string sFIELD_TYPE        = Sql.ToString (row["FIELD_TYPE"       ]);
                string sDATA_LABEL        = Sql.ToString (row["DATA_LABEL"       ]);
                string sDATA_FIELD        = Sql.ToString (row["DATA_FIELD"       ]);
                string sDISPLAY_FIELD     = Sql.ToString (row["DISPLAY_FIELD"    ]);
                string sCACHE_NAME        = Sql.ToString (row["CACHE_NAME"       ]);
                bool   bDATA_REQUIRED     = Sql.ToBoolean(row["DATA_REQUIRED"    ]);
                bool   bUI_REQUIRED       = Sql.ToBoolean(row["UI_REQUIRED"      ]);
                string sONCLICK_SCRIPT    = Sql.ToString (row["ONCLICK_SCRIPT"   ]);
                string sFORMAT_SCRIPT     = Sql.ToString (row["FORMAT_SCRIPT"    ]);
                short  nFORMAT_TAB_INDEX  = Sql.ToShort  (row["FORMAT_TAB_INDEX" ]);
                int    nFORMAT_MAX_LENGTH = Sql.ToInteger(row["FORMAT_MAX_LENGTH"]);
                int    nFORMAT_SIZE       = Sql.ToInteger(row["FORMAT_SIZE"      ]);
                int    nFORMAT_ROWS       = Sql.ToInteger(row["FORMAT_ROWS"      ]);
                int    nFORMAT_COLUMNS    = Sql.ToInteger(row["FORMAT_COLUMNS"   ]);
                int    nCOLSPAN           = Sql.ToInteger(row["COLSPAN"          ]);
                int    nROWSPAN           = Sql.ToInteger(row["ROWSPAN"          ]);
                string sLABEL_WIDTH       = Sql.ToString (row["LABEL_WIDTH"      ]);
                string sFIELD_WIDTH       = Sql.ToString (row["FIELD_WIDTH"      ]);
                // 12/02/2005 Paul. COLSPAN == -1 means that a new column should not be created.
                if ( (nCOLSPAN >= 0 && nColIndex == 0) || tr == null )
                {
                    // 11/25/2005 Paul.  Don't pre-create a row as we don't want a blank
                    // row at the bottom.  Add rows just before they are needed.
                    nRowIndex++;
                    tr = new HtmlTableRow();
                    tbl.Rows.Insert(nRowIndex, tr);
                }
                if ( bLayoutMode )
                {
                    HtmlTableCell tdAction = new HtmlTableCell();
                    tr.Cells.Add(tdAction);
                    tdAction.Attributes.Add("class", "tabDetailViewDL");
                    tdAction.NoWrap = true;

                    Literal litIndex = new Literal();
                    tdAction.Controls.Add(litIndex);
                    litIndex.Text = " " + nFIELD_INDEX.ToString() + " ";

                    ImageButton btnMoveUp   = CreateLayoutImageButton(gID, "Layout.MoveUp"  , nFIELD_INDEX, L10n.Term(".LNK_UP"    ), Sql.ToString(Session["themeURL"]) + "images/uparrow_inline.gif"  , Page_Command);
                    ImageButton btnMoveDown = CreateLayoutImageButton(gID, "Layout.MoveDown", nFIELD_INDEX, L10n.Term(".LNK_DOWN"  ), Sql.ToString(Session["themeURL"]) + "images/downarrow_inline.gif", Page_Command);
                    ImageButton btnInsert   = CreateLayoutImageButton(gID, "Layout.Insert"  , nFIELD_INDEX, L10n.Term(".LNK_INS"   ), Sql.ToString(Session["themeURL"]) + "images/plus_inline.gif"     , Page_Command);
                    ImageButton btnEdit     = CreateLayoutImageButton(gID, "Layout.Edit"    , nFIELD_INDEX, L10n.Term(".LNK_EDIT"  ), Sql.ToString(Session["themeURL"]) + "images/edit_inline.gif"     , Page_Command);
                    ImageButton btnDelete   = CreateLayoutImageButton(gID, "Layout.Delete"  , nFIELD_INDEX, L10n.Term(".LNK_DELETE"), Sql.ToString(Session["themeURL"]) + "images/delete_inline.gif"   , Page_Command);
                    tdAction.Controls.Add(btnMoveUp  );
                    tdAction.Controls.Add(btnMoveDown);
                    tdAction.Controls.Add(btnInsert  );
                    tdAction.Controls.Add(btnEdit    );
                    tdAction.Controls.Add(btnDelete  );
                }
                if ( nCOLSPAN >= 0 || tdLabel == null || tdField == null )
                {
                    tdLabel = new HtmlTableCell();
                    tdField = new HtmlTableCell();
                    tr.Cells.Add(tdLabel);
                    tr.Cells.Add(tdField);
                    if ( nCOLSPAN > 0 )
                    {
                        tdField.ColSpan = nCOLSPAN;
                        if ( bLayoutMode )
                            tdField.ColSpan++;
                    }
                    tdLabel.Attributes.Add("class", "dataLabel");
                    tdLabel.VAlign = "top";
                    tdLabel.Width  = sLABEL_WIDTH;
                    tdField.Attributes.Add("class", "dataField");
                    tdField.VAlign = "top";
                    // 11/28/2005 Paul.  Don't use the field width if COLSPAN is specified as we want it to take the rest of the table.  The label width will be sufficient.
                    if ( nCOLSPAN == 0 )
                        tdField.Width  = sFIELD_WIDTH;

                    Literal   litLabel = new Literal();
                    tdLabel.Controls.Add(litLabel);
                    //litLabel.Text = nFIELD_INDEX.ToString() + " (" + nRowIndex.ToString() + "," + nColIndex.ToString() + ")";
                    try
                    {
                        if ( bLayoutMode )
                        {
                            if ( String.Compare(sFIELD_TYPE, "Blank", true) == 0 )
                                litLabel.Text = "*** BLANK ***";
                            else
                                litLabel.Text = sDATA_LABEL;
                        }
                        else if ( sDATA_LABEL.IndexOf(".") >= 0 )
                            litLabel.Text = L10n.Term(sDATA_LABEL);
                        else if ( !Sql.IsEmptyString(sDATA_LABEL) && rdr != null )
                            litLabel.Text = Sql.ToString(rdr[sDATA_LABEL]) + L10n.Term("Calls.LBL_COLON");
                        // 07/15/2006 Paul.  Always put something for the label so that table borders will look right.
                        else
                            litLabel.Text = "&nbsp;";
                    }
                    catch(Exception ex)
                    {
                        SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex.Message);
                        litLabel.Text = ex.Message;
                    }
                    if ( !bLayoutMode && bUI_REQUIRED )
                    {
                        Label lblRequired = new Label();
                        tdLabel.Controls.Add(lblRequired);
                        lblRequired.CssClass = "required";
                        lblRequired.Text = L10n.Term(".LBL_REQUIRED_SYMBOL");
                    }
                }

                if ( String.Compare(sFIELD_TYPE, "Blank", true) == 0 )
                {
                    Literal litField = new Literal();
                    tdField.Controls.Add(litField);
                    if ( bLayoutMode )
                        litField.Text = "*** BLANK ***";
                    else
                        litField.Text = "&nbsp;";
                }
                else if ( String.Compare(sFIELD_TYPE, "Label", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        Literal litField = new Literal();
                        tdField.Controls.Add(litField);
                        // 07/25/2006 Paul.  Align label values to the middle so the line-up with the label.
                        tdField.VAlign = "middle";
                        // 07/24/2006 Paul.  Set the ID so that the literal control can be accessed.
                        litField.ID = sDATA_FIELD;
                        try
                        {
                            if ( bLayoutMode )
                                litField.Text = sDATA_FIELD;
                            else if ( sDATA_FIELD.IndexOf(".") >= 0 )
                                litField.Text = L10n.Term(sDATA_FIELD);
                            else if ( rdr != null )
                                litField.Text = Sql.ToString(rdr[sDATA_FIELD]);
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex.Message);
                            litField.Text = ex.Message;
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "ListBox", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        DropDownList lstField = new DropDownList();
                        tdField.Controls.Add(lstField);
                        lstField.ID       = sDATA_FIELD;
                        lstField.TabIndex = nFORMAT_TAB_INDEX;
                        try
                        {
                            if ( !Sql.IsEmptyString(sDATA_FIELD) )
                            {
                                // 12/04/2005 Paul.  Don't populate list if this is a post back.
                                if ( !Sql.IsEmptyString(sCACHE_NAME) && (bLayoutMode || !tbl.Page.IsPostBack) )
                                {
                                    switch ( sCACHE_NAME )
                                    {
                                        case "AssignedUser":
                                            lstField.DataValueField = "ID"       ;
                                            lstField.DataTextField  = "USER_NAME";
                                            lstField.DataSource     = SplendidCache.AssignedUser();
                                            break;
                                        case "Currencies":
                                            lstField.DataValueField = "ID"         ;
                                            lstField.DataTextField  = "NAME_SYMBOL";
                                            lstField.DataSource     = SplendidCache.Currencies();
                                            break;
                                        case "Release":
                                            lstField.DataValueField = "ID"  ;
                                            lstField.DataTextField  = "NAME";
                                            lstField.DataSource     = SplendidCache.Release();
                                            break;
                                        case "Manufacturers":
                                            lstField.DataValueField = "ID"  ;
                                            lstField.DataTextField  = "NAME";
                                            lstField.DataSource     = SplendidCache.Manufacturers();
                                            break;
                                        case "Shippers":
                                            lstField.DataValueField = "ID"  ;
                                            lstField.DataTextField  = "NAME";
                                            lstField.DataSource     = SplendidCache.Shippers();
                                            break;
                                        case "ProductTypes":
                                            lstField.DataValueField = "ID"  ;
                                            lstField.DataTextField  = "NAME";
                                            lstField.DataSource     = SplendidCache.ProductTypes();
                                            break;
                                        case "ProductCategories":
                                            lstField.DataValueField = "ID"  ;
                                            lstField.DataTextField  = "NAME";
                                            lstField.DataSource     = SplendidCache.ProductCategories();
                                            break;
                                        case "ContractTypes":
                                            lstField.DataValueField = "ID"  ;
                                            lstField.DataTextField  = "NAME";
                                            lstField.DataSource     = SplendidCache.ContractTypes();
                                            break;
                                        default:
                                            lstField.DataValueField = "NAME"        ;
                                            lstField.DataTextField  = "DISPLAY_NAME";
                                            lstField.DataSource     = SplendidCache.List(sCACHE_NAME);
                                            break;
                                    }
                                    lstField.DataBind();
                                    // 08/08/2006 Paul.  Allow onchange code to be stored in the database.
                                    // ListBoxes do not have a useful onclick event, so there should be no problem overloading this field.
                                    if ( !Sql.IsEmptyString(sONCLICK_SCRIPT) )
                                        lstField.Attributes.Add("onchange" , sONCLICK_SCRIPT);
                                    // 02/21/2006 Paul.  Move the NONE item inside the !IsPostBack code.
                                    if ( !bUI_REQUIRED )
                                        lstField.Items.Insert(0, new ListItem(L10n.Term(".LBL_NONE"), ""));
                                }
                                if ( rdr != null )
                                {
                                    try
                                    {
                                        // 02/21/2006 Paul.  All the DropDownLists in the Calls and Meetings edit views were not getting set.
                                        // The problem was a Page.DataBind in the SchedulingGrid and in the InviteesView. Both binds needed to be removed.
                                        lstField.SelectedValue = Sql.ToString(rdr[sDATA_FIELD]);
                                    }
                                    catch(Exception ex)
                                    {
                                        SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex.Message);
                                    }
                                }
                                    // 12/04/2005 Paul.  Assigned To field will always default to the current user.
                                else if ( rdr == null && !tbl.Page.IsPostBack && sCACHE_NAME == "AssignedUser")
                                {
                                    try
                                    {
                                        lstField.SelectedValue = Security.USER_ID.ToString();
                                    }
                                    catch(Exception ex)
                                    {
                                        SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex.Message);
                                    }
                                }
                            }
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex.Message);
                        }
                        if ( bLayoutMode )
                        {
                            Literal litField = new Literal();
                            litField.Text = sDATA_FIELD;
                            tdField.Controls.Add(litField);
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "CheckBox", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        CheckBox chkField = new CheckBox();
                        tdField.Controls.Add(chkField);
                        chkField.ID = sDATA_FIELD;
                        chkField.CssClass = "checkbox";
                        chkField.TabIndex = nFORMAT_TAB_INDEX;
                        try
                        {
                            if ( rdr != null )
                                chkField.Checked = Sql.ToBoolean(rdr[sDATA_FIELD]);
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex.Message);
                        }
                        if ( bLayoutMode )
                        {
                            Literal litField = new Literal();
                            litField.Text = sDATA_FIELD;
                            tdField.Controls.Add(litField);
                            chkField.Enabled  = false     ;
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "ChangeButton", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        // 12/04/2005 Paul.  If the label is PARENT_TYPE, then change the label to a DropDownList.
                        if ( sDATA_LABEL == "PARENT_TYPE" )
                        {
                            tdLabel.Controls.Clear();
                            DropDownList lstField = new DropDownList();
                            tdLabel.Controls.Add(lstField);
                            lstField.ID       = sDATA_LABEL;
                            lstField.TabIndex = nFORMAT_TAB_INDEX;
                            lstField.Attributes.Add("onChange", "ChangeParentType();");
                            if ( bLayoutMode || !tbl.Page.IsPostBack )
                            {
                                // 07/29/2005 Paul.  SugarCRM 3.0 does not allow the NONE option.
                                lstField.DataValueField = "NAME"        ;
                                lstField.DataTextField  = "DISPLAY_NAME";
                                lstField.DataSource     = SplendidCache.List("record_type_display");
                                lstField.DataBind();
                                if ( rdr != null )
                                {
                                    try
                                    {
                                        lstField.SelectedValue = Sql.ToString(rdr[sDATA_LABEL]);
                                    }
                                    catch(Exception ex)
                                    {
                                        SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex.Message);
                                    }
                                }
                            }
                        }
                        TextBox txtNAME = new TextBox();
                        tdField.Controls.Add(txtNAME);
                        txtNAME.ID       = sDISPLAY_FIELD;
                        txtNAME.ReadOnly = true;
                        txtNAME.TabIndex = nFORMAT_TAB_INDEX;
                        try
                        {
                            if ( bLayoutMode )
                            {
                                txtNAME.Text    = sDISPLAY_FIELD;
                                txtNAME.Enabled = false         ;
                            }
                            else if ( !Sql.IsEmptyString(sDISPLAY_FIELD) && rdr != null )
                                txtNAME.Text = Sql.ToString(rdr[sDISPLAY_FIELD]);
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex.Message);
                            txtNAME.Text = ex.Message;
                        }
                        HtmlInputHidden hidID = new HtmlInputHidden();
                        tdField.Controls.Add(hidID);
                        hidID.ID = sDATA_FIELD;
                        try
                        {
                            if ( !Sql.IsEmptyString(sDATA_FIELD) && rdr != null )
                                hidID.Value = Sql.ToString(rdr[sDATA_FIELD]);
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex.Message);
                            txtNAME.Text = ex.Message;
                        }

                        Literal litNBSP = new Literal();
                        tdField.Controls.Add(litNBSP);
                        litNBSP.Text = "&nbsp;";

                        HtmlInputButton btnChange = new HtmlInputButton("button");
                        tdField.Controls.Add(btnChange);
                        // 05/07/2006 Paul.  Specify a name for the check button so that it can be referenced by SplendidTest.
                        btnChange.ID = sDATA_FIELD + "_btnChange";
                        btnChange.Attributes.Add("class", "button");
                        if ( !Sql.IsEmptyString(sONCLICK_SCRIPT) )
                            btnChange.Attributes.Add("onclick"  , sONCLICK_SCRIPT);
                        btnChange.Attributes.Add("title"    , L10n.Term(".LBL_CHANGE_BUTTON_TITLE"));
                        // 07/31/2006 Paul.  Stop using VisualBasic library to increase compatibility with Mono.
                        btnChange.Attributes.Add("accessKey", L10n.Term(".LBL_CHANGE_BUTTON_KEY").Substring(0, 1));
                        btnChange.Value = L10n.Term(".LBL_CHANGE_BUTTON_LABEL");
                        if ( !bLayoutMode && bUI_REQUIRED && !Sql.IsEmptyString(sDATA_FIELD) )
                        {
                            RequiredFieldValidatorForHiddenInputs reqID = new RequiredFieldValidatorForHiddenInputs();
                            reqID.ID                 = sDATA_FIELD + "_REQUIRED";
                            reqID.ControlToValidate  = hidID.ID;
                            reqID.ErrorMessage       = L10n.Term(".ERR_REQUIRED_FIELD");
                            reqID.CssClass           = "required";
                            reqID.EnableViewState    = false;
                            // 01/16/2006 Paul.  We don't enable required fields until we attempt to save.
                            // This is to allow unrelated form actions; the Cancel button is a good example.
                            reqID.EnableClientScript = false;
                            reqID.Enabled            = false;
                            tdField.Controls.Add(reqID);
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "TextBox", true) == 0 || String.Compare(sFIELD_TYPE, "Password", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        TextBox txtField = new TextBox();
                        tdField.Controls.Add(txtField);
                        txtField.ID       = sDATA_FIELD;
                        txtField.TabIndex = nFORMAT_TAB_INDEX;
                        try
                        {
                            if ( nFORMAT_ROWS > 0 && nFORMAT_COLUMNS > 0 )
                            {
                                txtField.Rows     = nFORMAT_ROWS   ;
                                txtField.Columns  = nFORMAT_COLUMNS;
                                txtField.TextMode = TextBoxMode.MultiLine;
                            }
                            else
                            {
                                txtField.MaxLength = nFORMAT_MAX_LENGTH   ;
                                txtField.Attributes.Add("size", nFORMAT_SIZE.ToString());
                                txtField.TextMode  = TextBoxMode.SingleLine;
                            }
                            if ( bLayoutMode )
                            {
                                txtField.Text     = sDATA_FIELD;
                                txtField.ReadOnly = true       ;
                            }
                            else if ( !Sql.IsEmptyString(sDATA_FIELD) && rdr != null )
                            {
                                int    nOrdinal  = rdr.GetOrdinal(sDATA_FIELD);
                                string sTypeName = rdr.GetDataTypeName(nOrdinal);
                                // 03/04/2006 Paul.  Display currency in the proper format.
                                // Only SQL Server is likely to return the money type, so also include the decimal type.
                                if ( sTypeName == "money" || rdr[sDATA_FIELD].GetType() == typeof(System.Decimal) )
                                    txtField.Text = Sql.ToDecimal(rdr[sDATA_FIELD]).ToString("#,##0.00");
                                else
                                    txtField.Text = Sql.ToString(rdr[sDATA_FIELD]);
                            }
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex.Message);
                            txtField.Text = ex.Message;
                        }
                        if ( String.Compare(sFIELD_TYPE, "Password", true) == 0 )
                            txtField.TextMode = TextBoxMode.Password;
                        if ( !bLayoutMode && bUI_REQUIRED && !Sql.IsEmptyString(sDATA_FIELD) )
                        {
                            RequiredFieldValidator reqNAME = new RequiredFieldValidator();
                            reqNAME.ID                 = sDATA_FIELD + "_REQUIRED";
                            reqNAME.ControlToValidate  = txtField.ID;
                            reqNAME.ErrorMessage       = L10n.Term(".ERR_REQUIRED_FIELD");
                            reqNAME.CssClass           = "required";
                            reqNAME.EnableViewState    = false;
                            // 01/16/2006 Paul.  We don't enable required fields until we attempt to save.
                            // This is to allow unrelated form actions; the Cancel button is a good example.
                            reqNAME.EnableClientScript = false;
                            reqNAME.Enabled            = false;
                            tdField.Controls.Add(reqNAME);
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "DatePicker", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        // 12/03/2005 Paul.  UserControls must be loaded.
                        DatePicker ctlDate = tbl.Page.LoadControl("~/_controls/DatePicker.ascx") as DatePicker;
                        tdField.Controls.Add(ctlDate);
                        ctlDate.ID = sDATA_FIELD;
                        // 05/10/2006 Paul.  Set the tab index.
                        ctlDate.TabIndex = nFORMAT_TAB_INDEX;
                        try
                        {
                            if ( rdr != null )
                                ctlDate.Value = T10n.FromServerTime(rdr[sDATA_FIELD]);
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex.Message);
                        }
                        // 01/16/2006 Paul.  We validate elsewhere.
                        /*
                        if ( !bLayoutMode && bUI_REQUIRED && !Sql.IsEmptyString(sDATA_FIELD) )
                        {
                            ctlDate.Required = true;
                        }
                        */
                        if ( bLayoutMode )
                        {
                            Literal litField = new Literal();
                            litField.Text = sDATA_FIELD;
                            tdField.Controls.Add(litField);
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "DateTimePicker", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        // 12/03/2005 Paul.  UserControls must be loaded.
                        DateTimePicker ctlDate = tbl.Page.LoadControl("~/_controls/DateTimePicker.ascx") as DateTimePicker;
                        tdField.Controls.Add(ctlDate);
                        ctlDate.ID = sDATA_FIELD;
                        // 05/10/2006 Paul.  Set the tab index.
                        ctlDate.TabIndex = nFORMAT_TAB_INDEX;
                        try
                        {
                            if ( rdr != null )
                                ctlDate.Value = T10n.FromServerTime(rdr[sDATA_FIELD]);
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex.Message);
                        }
                        if ( bLayoutMode )
                        {
                            Literal litField = new Literal();
                            litField.Text = sDATA_FIELD;
                            tdField.Controls.Add(litField);
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "DateTimeEdit", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        // 12/03/2005 Paul.  UserControls must be loaded.
                        DateTimeEdit ctlDate = tbl.Page.LoadControl("~/_controls/DateTimeEdit.ascx") as DateTimeEdit;
                        tdField.Controls.Add(ctlDate);
                        ctlDate.ID = sDATA_FIELD;
                        // 05/10/2006 Paul.  Set the tab index.
                        ctlDate.TabIndex = nFORMAT_TAB_INDEX;
                        try
                        {
                            if ( rdr != null )
                                ctlDate.Value = T10n.FromServerTime(rdr[sDATA_FIELD]);
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex.Message);
                        }
                        if ( !bLayoutMode && bUI_REQUIRED )
                        {
                            ctlDate.EnableNone = false;
                        }
                        if ( bLayoutMode )
                        {
                            Literal litField = new Literal();
                            litField.Text = sDATA_FIELD;
                            tdField.Controls.Add(litField);
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "File", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        HtmlInputFile ctlField = new HtmlInputFile();
                        tdField.Controls.Add(ctlField);
                        ctlField.ID        = sDATA_FIELD;
                        ctlField.MaxLength = nFORMAT_MAX_LENGTH;
                        ctlField.Size      = nFORMAT_SIZE;
                        ctlField.Attributes.Add("TabIndex", nFORMAT_TAB_INDEX.ToString());
                        if ( !bLayoutMode && bUI_REQUIRED )
                        {
                            RequiredFieldValidator reqNAME = new RequiredFieldValidator();
                            reqNAME.ID                 = sDATA_FIELD + "_REQUIRED";
                            reqNAME.ControlToValidate  = ctlField.ID;
                            reqNAME.ErrorMessage       = L10n.Term(".ERR_REQUIRED_FIELD");
                            reqNAME.CssClass           = "required";
                            reqNAME.EnableViewState    = false;
                            // 01/16/2006 Paul.  We don't enable required fields until we attempt to save.
                            // This is to allow unrelated form actions; the Cancel button is a good example.
                            reqNAME.EnableClientScript = false;
                            reqNAME.Enabled            = false;
                            tdField.Controls.Add(reqNAME);
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "Image", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        HtmlInputHidden ctlHidden = new HtmlInputHidden();
                        if ( !bLayoutMode )
                        {
                            tdField.Controls.Add(ctlHidden);
                            ctlHidden.ID = sDATA_FIELD;

                            HtmlInputFile ctlField = new HtmlInputFile();
                            tdField.Controls.Add(ctlField);
                            // 04/17/2006 Paul.  The image needs to reference the file control.
                            ctlField.ID = sDATA_FIELD + "_File";

                            Literal litBR = new Literal();
                            litBR.Text = "<br />";
                            tdField.Controls.Add(litBR);
                        }

                        Image imgField = new Image();
                        // 04/13/2006 Paul.  Give the image a name so that it can be validated with SplendidTest.
                        imgField.ID = "img" + sDATA_FIELD;
                        try
                        {
                            if ( bLayoutMode )
                            {
                                Literal litField = new Literal();
                                litField.Text = sDATA_FIELD;
                                tdField.Controls.Add(litField);
                            }
                            else if ( rdr != null )
                            {
                                if ( !Sql.IsEmptyString(rdr[sDATA_FIELD]) )
                                {
                                    ctlHidden.Value = Sql.ToString(rdr[sDATA_FIELD]);
                                    imgField.ImageUrl = "~/Images/Image.aspx?ID=" + ctlHidden.Value;
                                    // 04/13/2006 Paul.  Only add the image if it exists.
                                    tdField.Controls.Add(imgField);

                                    // 04/17/2006 Paul.  Provide a clear button.
                                    Literal litClear = new Literal();
                                    litClear.Text = "<br /><input type=\"button\" class=\"button\" onclick=\"form." + ctlHidden.ClientID + ".value='';form." + imgField.ClientID + ".src='';" + "\"  value='" + "  " + L10n.Term(".LBL_CLEAR_BUTTON_LABEL" ) + "  " + "' title='" + L10n.Term(".LBL_CLEAR_BUTTON_TITLE" ) + "' />";
                                    tdField.Controls.Add(litClear);
                                }
                            }
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex.Message);
                            Literal litField = new Literal();
                            litField.Text = ex.Message;
                            tdField.Controls.Add(litField);
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "AddressButtons", true) == 0 )
                {
                    tr.Cells.Remove(tdField);
                    tdLabel.Width = "10%";
                    tdLabel.RowSpan = nROWSPAN;
                    tdLabel.VAlign  = "middle";
                    tdLabel.Align   = "center";
                    tdLabel.Attributes.Remove("class");
                    tdLabel.Attributes.Add("class", "tabFormAddDel");
                    HtmlInputButton btnCopyRight = new HtmlInputButton("button");
                    Literal         litSpacer    = new Literal();
                    HtmlInputButton btnCopyLeft  = new HtmlInputButton("button");
                    tdLabel.Controls.Add(btnCopyRight);
                    tdLabel.Controls.Add(litSpacer   );
                    tdLabel.Controls.Add(btnCopyLeft );
                    btnCopyRight.Attributes.Add("title"  , L10n.Term("Accounts.NTC_COPY_BILLING_ADDRESS" ));
                    btnCopyRight.Attributes.Add("onclick", "return copyAddressRight()");
                    btnCopyRight.Value = ">>";
                    litSpacer.Text = "<br><br>";
                    btnCopyLeft .Attributes.Add("title"  , L10n.Term("Accounts.NTC_COPY_SHIPPING_ADDRESS" ));
                    btnCopyLeft .Attributes.Add("onclick", "return copyAddressLeft()");
                    btnCopyLeft .Value = "<<";
                    nColIndex = 0;
                }
                else
                {
                    Literal litField = new Literal();
                    tdField.Controls.Add(litField);
                    litField.Text = "Unknown field type " + sFIELD_TYPE;
                    SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), "Unknown field type " + sFIELD_TYPE);
                }
                if ( nCOLSPAN > 0 )
                    nColIndex = 0;
                else if ( nCOLSPAN == 0 )
                {
                    nColIndex++;
                    if ( nColIndex > 1 )
                        nColIndex = 0;
                }
            }
        }
        public static void AppendGridColumns(DataView dvFields, HtmlTable tbl, IDataReader rdr, L10N L10n, TimeZone T10n, CommandEventHandler Page_Command)
        {
            if ( tbl == null )
            {
                SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), "HtmlTable is not defined");
                return;
            }
            // 01/07/2006 Paul.  Show table borders in layout mode. This will help distinguish blank lines from wrapped lines.
            tbl.Border = 1;

            HtmlTableRow trAction = new HtmlTableRow();
            HtmlTableRow trHeader = new HtmlTableRow();
            HtmlTableRow trField  = new HtmlTableRow();
            tbl.Rows.Insert(0, trAction);
            tbl.Rows.Insert(1, trHeader);
            tbl.Rows.Insert(2, trField );
            trAction.Attributes.Add("class", "listViewThS1");
            trHeader.Attributes.Add("class", "listViewThS1");
            trField .Attributes.Add("class", "oddListRowS1");

            HttpSessionState Session = HttpContext.Current.Session;
            foreach(DataRowView row in dvFields)
            {
                Guid   gID                         = Sql.ToGuid   (row["ID"                        ]);
                int    nCOLUMN_INDEX               = Sql.ToInteger(row["COLUMN_INDEX"              ]);
                string sCOLUMN_TYPE                = Sql.ToString (row["COLUMN_TYPE"               ]);
                string sHEADER_TEXT                = Sql.ToString (row["HEADER_TEXT"               ]);
                string sSORT_EXPRESSION            = Sql.ToString (row["SORT_EXPRESSION"           ]);
                string sITEMSTYLE_WIDTH            = Sql.ToString (row["ITEMSTYLE_WIDTH"           ]);
                string sITEMSTYLE_CSSCLASS         = Sql.ToString (row["ITEMSTYLE_CSSCLASS"        ]);
                string sITEMSTYLE_HORIZONTAL_ALIGN = Sql.ToString (row["ITEMSTYLE_HORIZONTAL_ALIGN"]);
                string sITEMSTYLE_VERTICAL_ALIGN   = Sql.ToString (row["ITEMSTYLE_VERTICAL_ALIGN"  ]);
                bool   bITEMSTYLE_WRAP             = Sql.ToBoolean(row["ITEMSTYLE_WRAP"            ]);
                string sDATA_FIELD                 = Sql.ToString (row["DATA_FIELD"                ]);
                string sDATA_FORMAT                = Sql.ToString (row["DATA_FORMAT"               ]);
                string sURL_FIELD                  = Sql.ToString (row["URL_FIELD"                 ]);
                string sURL_FORMAT                 = Sql.ToString (row["URL_FORMAT"                ]);
                string sURL_TARGET                 = Sql.ToString (row["URL_TARGET"                ]);
                string sLIST_NAME                  = Sql.ToString (row["LIST_NAME"                 ]);

                HtmlTableCell tdAction = new HtmlTableCell();
                trAction.Cells.Add(tdAction);
                tdAction.NoWrap = true;

                Literal litIndex = new Literal();
                tdAction.Controls.Add(litIndex);
                litIndex.Text = " " + nCOLUMN_INDEX.ToString() + " ";

                ImageButton btnMoveUp   = CreateLayoutImageButton(gID, "Layout.MoveUp"  , nCOLUMN_INDEX, L10n.Term(".LNK_LEFT"  ), Sql.ToString(Session["themeURL"]) + "images/leftarrow.gif"    , Page_Command);
                ImageButton btnMoveDown = CreateLayoutImageButton(gID, "Layout.MoveDown", nCOLUMN_INDEX, L10n.Term(".LNK_RIGHT" ), Sql.ToString(Session["themeURL"]) + "images/rightarrow.gif"   , Page_Command);
                ImageButton btnInsert   = CreateLayoutImageButton(gID, "Layout.Insert"  , nCOLUMN_INDEX, L10n.Term(".LNK_INS"   ), Sql.ToString(Session["themeURL"]) + "images/plus_inline.gif"  , Page_Command);
                ImageButton btnEdit     = CreateLayoutImageButton(gID, "Layout.Edit"    , nCOLUMN_INDEX, L10n.Term(".LNK_EDIT"  ), Sql.ToString(Session["themeURL"]) + "images/edit_inline.gif"  , Page_Command);
                ImageButton btnDelete   = CreateLayoutImageButton(gID, "Layout.Delete"  , nCOLUMN_INDEX, L10n.Term(".LNK_DELETE"), Sql.ToString(Session["themeURL"]) + "images/delete_inline.gif", Page_Command);
                tdAction.Controls.Add(btnMoveUp  );
                tdAction.Controls.Add(btnMoveDown);
                tdAction.Controls.Add(btnInsert  );
                tdAction.Controls.Add(btnEdit    );
                tdAction.Controls.Add(btnDelete  );

                HtmlTableCell tdHeader = new HtmlTableCell();
                trHeader.Cells.Add(tdHeader);
                tdHeader.NoWrap = true;

                HtmlTableCell tdField = new HtmlTableCell();
                trField.Cells.Add(tdField);
                tdField.NoWrap = true;

                Literal litHeader = new Literal();
                tdHeader.Controls.Add(litHeader);
                litHeader.Text = sHEADER_TEXT;

                Literal litField = new Literal();
                tdField.Controls.Add(litField);
                litField.Text = sDATA_FIELD;
            }
        }
Beispiel #17
0
        public static void Export(DataView vw, string sModuleName, string sExportFormat, string sExportRange, int nCurrentPage, int nPageSize, string[] arrID)
        {
            int nStartRecord = 0;
            int nEndRecord   = vw.Count;

            switch (sExportRange)
            {
            case "Page":
                nStartRecord = nCurrentPage * nPageSize;
                nEndRecord   = Math.Min(nStartRecord + nPageSize, vw.Count);
                break;

            case "Selected":
            {
                // 10/17/2006 Paul.  There must be one selected record to continue.
                if (arrID == null)
                {
                    L10N L10n = HttpContext.Current.Items["L10n"] as L10N;
                    throw(new Exception(L10n.Term(".LBL_LISTVIEW_NO_SELECTED")));
                }
                StringBuilder sbIDs  = new StringBuilder();
                int           nCount = 0;
                foreach (string item in arrID)
                {
                    if (nCount > 0)
                    {
                        sbIDs.Append(" or ");
                    }
                    sbIDs.Append("ID = \'" + item.Replace("\'", "\'\'") + "\'" + ControlChars.CrLf);
                    nCount++;
                }
                //vw.RowFilter = "ID in (" + sbIDs.ToString() + ")";
                // 11/03/2006 Paul.  A filter might already exist, so make sure to maintain the existing filter.
                if (vw.RowFilter.Length > 0)
                {
                    vw.RowFilter = " and (" + sbIDs.ToString() + ")";
                }
                else
                {
                    vw.RowFilter = sbIDs.ToString();
                }
                nEndRecord = vw.Count;
                break;
            }
            }

            HttpResponse  Response = HttpContext.Current.Response;
            StringBuilder sb       = new StringBuilder();

            switch (sExportFormat)
            {
            case "csv":
                Response.ContentType = "text/csv";
                Response.AddHeader("Content-Disposition", "attachment;filename=" + sModuleName + ".csv");
                ExportDelimited(Response.OutputStream, vw, sModuleName.ToLower(), nStartRecord, nEndRecord, ',');
                Response.End();
                break;

            case "tab":
                Response.ContentType = "text/txt";
                Response.AddHeader("Content-Disposition", "attachment;filename=" + sModuleName + ".txt");
                ExportDelimited(Response.OutputStream, vw, sModuleName.ToLower(), nStartRecord, nEndRecord, '\t');
                Response.End();
                break;

            case "xml":
                Response.ContentType = "text/xml";
                Response.AddHeader("Content-Disposition", "attachment;filename=" + sModuleName + ".xml");
                ExportXml(Response.OutputStream, vw, sModuleName.ToLower(), nStartRecord, nEndRecord);
                Response.End();
                break;

            //case "Excel":
            default:
                Response.ContentType = "application/vnd.ms-excel";
                Response.AddHeader("Content-Disposition", "attachment;filename=" + sModuleName + ".xlb");
                ExportExcel(Response.OutputStream, vw, sModuleName.ToLower(), nStartRecord, nEndRecord);
                Response.End();
                break;
            }
            //vw.RowFilter = null;
        }
        /// <summary>
        /// CronDescription
        /// </summary>
        public static string CronDescription(L10N L10n, string sCRON)
        {
            StringBuilder sb = new StringBuilder();
            sCRON = sCRON.Replace(" ", "");
            if ( sCRON == "*::*::*::*::*" )
                return L10n.Term("Schedulers.LBL_OFTEN");

            CultureInfo culture = CultureInfo.CreateSpecificCulture(L10n.NAME);
            string sCRON_MONTH       = "*";
            string sCRON_DAYOFMONTH  = "*";
            string sCRON_DAYOFWEEK   = "*";
            string sCRON_HOUR        = "*";
            string sCRON_MINUTE      = "*";
            string[] arrCRON         = sCRON.Replace("::", "|").Split('|');
            string[] arrCRON_TEMP    = new string[] {};
            string[] arrCRON_VALUE   = new string[] {};
            string[] arrDaySuffixes  = new string[32];
            int    nCRON_VALUE       = 0;
            int    nCRON_VALUE_START = 0;
            int    nCRON_VALUE_END   = 0;
            int    nON_THE_MINUTE    = -1;
            for ( int n = 0; n < arrDaySuffixes.Length; n++ )
                arrDaySuffixes[n] = "th";
            arrDaySuffixes[0] = "";
            arrDaySuffixes[1] = "st";
            arrDaySuffixes[2] = "nd";
            arrDaySuffixes[3] = "rd";

            // minute  hour  dayOfMonth  month  dayOfWeek
            if ( arrCRON.Length > 0 ) sCRON_MINUTE     = arrCRON[0];
            if ( arrCRON.Length > 1 ) sCRON_HOUR       = arrCRON[1];
            if ( arrCRON.Length > 2 ) sCRON_DAYOFMONTH = arrCRON[2];
            if ( arrCRON.Length > 3 ) sCRON_MONTH      = arrCRON[3];
            if ( arrCRON.Length > 4 ) sCRON_DAYOFWEEK  = arrCRON[4];
            if ( sCRON_MINUTE != "*" )
            {
                arrCRON_TEMP = sCRON_MINUTE.Split(',');
                // 12/31/2007 Paul.  Check for either comma or dash.
                if ( sCRON_MINUTE.Split(",-".ToCharArray()).Length == 1 )
                {
                    nON_THE_MINUTE = Sql.ToInteger(sCRON_MINUTE);
                    sb.Append(L10n.Term("Schedulers.LBL_ON_THE"));
                    if ( nON_THE_MINUTE == 0 )
                    {
                        sb.Append(L10n.Term("Schedulers.LBL_HOUR_SING"));
                    }
                    else
                    {
                        sb.Append(nON_THE_MINUTE.ToString("00"));
                        sb.Append(L10n.Term("Schedulers.LBL_MIN_MARK"));
                    }
                }
                else
                {
                    for ( int i = 0, nCronEntries = 0; i < arrCRON_TEMP.Length; i++ )
                    {
                        if ( arrCRON_TEMP[i].IndexOf('-') >= 0 )
                        {
                            arrCRON_VALUE = arrCRON_TEMP[i].Split('-');
                            if ( arrCRON_VALUE.Length >= 2 )
                            {
                                nCRON_VALUE_START = Sql.ToInteger(arrCRON_VALUE[0]);
                                nCRON_VALUE_END   = Sql.ToInteger(arrCRON_VALUE[1]);
                                if ( nCRON_VALUE_START >= 0 && nCRON_VALUE_START <= 23 && nCRON_VALUE_END >= 0 && nCRON_VALUE_END <= 23 )
                                {
                                    if ( nCronEntries > 0 )
                                        sb.Append(L10n.Term("Schedulers.LBL_AND"));
                                    sb.Append(L10n.Term("Schedulers.LBL_FROM"));
                                    sb.Append(L10n.Term("Schedulers.LBL_ON_THE"));
                                    if ( nCRON_VALUE_START == 0 )
                                    {
                                        sb.Append(L10n.Term("Schedulers.LBL_HOUR_SING"));
                                    }
                                    else
                                    {
                                        sb.Append(nCRON_VALUE_START.ToString("0"));
                                        sb.Append(L10n.Term("Schedulers.LBL_MIN_MARK"));
                                    }
                                    sb.Append(L10n.Term("Schedulers.LBL_RANGE"));
                                    sb.Append(L10n.Term("Schedulers.LBL_ON_THE"));
                                    sb.Append(nCRON_VALUE_END.ToString("0"));
                                    sb.Append(L10n.Term("Schedulers.LBL_MIN_MARK"));
                                    nCronEntries++;
                                }
                            }
                        }
                        else
                        {
                            nCRON_VALUE = Sql.ToInteger(arrCRON_TEMP[i]);
                            if ( nCRON_VALUE >= 0 && nCRON_VALUE <= 23 )
                            {
                                if ( nCronEntries > 0 )
                                    sb.Append(L10n.Term("Schedulers.LBL_AND"));
                                sb.Append(L10n.Term("Schedulers.LBL_ON_THE"));
                                if ( nCRON_VALUE == 0 )
                                {
                                    sb.Append(L10n.Term("Schedulers.LBL_HOUR_SING"));
                                }
                                else
                                {
                                    sb.Append(nCRON_VALUE.ToString("0"));
                                    sb.Append(L10n.Term("Schedulers.LBL_MIN_MARK"));
                                }
                                nCronEntries++;
                            }
                        }
                    }
                }
            }
            if ( sCRON_HOUR != "*" )
            {
                if ( sb.Length > 0 )
                    sb.Append("; ");
                arrCRON_TEMP = sCRON_HOUR.Split(',');
                for ( int i = 0, nCronEntries = 0; i < arrCRON_TEMP.Length; i++ )
                {
                    if ( arrCRON_TEMP[i].IndexOf('-') >= 0 )
                    {
                        arrCRON_VALUE = arrCRON_TEMP[i].Split('-');
                        if ( arrCRON_VALUE.Length >= 2 )
                        {
                            nCRON_VALUE_START = Sql.ToInteger(arrCRON_VALUE[0]);
                            nCRON_VALUE_END   = Sql.ToInteger(arrCRON_VALUE[1]);
                            if ( nCRON_VALUE_START >= 1 && nCRON_VALUE_START <= 31 && nCRON_VALUE_END >= 1 && nCRON_VALUE_END <= 31 )
                            {
                                if ( nCronEntries > 0 )
                                    sb.Append(L10n.Term("Schedulers.LBL_AND"));
                                sb.Append(L10n.Term("Schedulers.LBL_FROM"));
                                sb.Append(arrCRON_VALUE[0]);
                                if ( nON_THE_MINUTE >= 0 )
                                    sb.Append(":" + nON_THE_MINUTE.ToString("00"));
                                sb.Append(L10n.Term("Schedulers.LBL_RANGE"));
                                sb.Append(arrCRON_VALUE[1]);
                                if ( nON_THE_MINUTE >= 0 )
                                    sb.Append(":" + nON_THE_MINUTE.ToString("00"));
                                nCronEntries++;
                            }
                        }
                    }
                    else
                    {
                        nCRON_VALUE = Sql.ToInteger(arrCRON_TEMP[i]);
                        if ( nCRON_VALUE >= 1 && nCRON_VALUE <= 31 )
                        {
                            if ( nCronEntries > 0 )
                                sb.Append(L10n.Term("Schedulers.LBL_AND"));
                            sb.Append(arrCRON_TEMP[i]);
                            if ( nON_THE_MINUTE >= 0 )
                                sb.Append(":" + nON_THE_MINUTE.ToString("00"));
                            nCronEntries++;
                        }
                    }
                }
            }
            if ( sCRON_DAYOFMONTH != "*" )
            {
                if ( sb.Length > 0 )
                    sb.Append("; ");
                arrCRON_TEMP = sCRON_DAYOFMONTH.Split(',');
                for ( int i = 0, nCronEntries = 0; i < arrCRON_TEMP.Length; i++ )
                {
                    if ( arrCRON_TEMP[i].IndexOf('-') >= 0 )
                    {
                        arrCRON_VALUE = arrCRON_TEMP[i].Split('-');
                        if ( arrCRON_VALUE.Length >= 2 )
                        {
                            nCRON_VALUE_START = Sql.ToInteger(arrCRON_VALUE[0]);
                            nCRON_VALUE_END   = Sql.ToInteger(arrCRON_VALUE[1]);
                            if ( nCRON_VALUE_START >= 1 && nCRON_VALUE_START <= 31 && nCRON_VALUE_END >= 1 && nCRON_VALUE_END <= 31 )
                            {
                                if ( nCronEntries > 0 )
                                    sb.Append(L10n.Term("Schedulers.LBL_AND"));
                                sb.Append(L10n.Term("Schedulers.LBL_FROM"));
                                sb.Append(nCRON_VALUE_START.ToString() + arrDaySuffixes[nCRON_VALUE_START]);
                                sb.Append(L10n.Term("Schedulers.LBL_RANGE"));
                                sb.Append(nCRON_VALUE_END.ToString() + arrDaySuffixes[nCRON_VALUE_END]);
                                nCronEntries++;
                            }
                        }
                    }
                    else
                    {
                        nCRON_VALUE = Sql.ToInteger(arrCRON_TEMP[i]);
                        if ( nCRON_VALUE >= 1 && nCRON_VALUE <= 31 )
                        {
                            if ( nCronEntries > 0 )
                                sb.Append(L10n.Term("Schedulers.LBL_AND"));
                            sb.Append(nCRON_VALUE.ToString() + arrDaySuffixes[nCRON_VALUE]);
                            nCronEntries++;
                        }
                    }
                }
            }
            if ( sCRON_MONTH != "*" )
            {
                if ( sb.Length > 0 )
                    sb.Append("; ");
                arrCRON_TEMP = sCRON_MONTH.Split(',');
                for ( int i = 0, nCronEntries = 0; i < arrCRON_TEMP.Length; i++ )
                {
                    if ( arrCRON_TEMP[i].IndexOf('-') >= 0 )
                    {
                        arrCRON_VALUE = arrCRON_TEMP[i].Split('-');
                        if ( arrCRON_VALUE.Length >= 2 )
                        {
                            nCRON_VALUE_START = Sql.ToInteger(arrCRON_VALUE[0]);
                            nCRON_VALUE_END   = Sql.ToInteger(arrCRON_VALUE[1]);
                            if ( nCRON_VALUE_START >= 1 && nCRON_VALUE_START <= 12 && nCRON_VALUE_END >= 1 && nCRON_VALUE_END <= 12 )
                            {
                                if ( nCronEntries > 0 )
                                    sb.Append(L10n.Term("Schedulers.LBL_AND"));
                                sb.Append(L10n.Term("Schedulers.LBL_FROM"));
                                sb.Append(culture.DateTimeFormat.MonthNames[nCRON_VALUE_START]);
                                sb.Append(L10n.Term("Schedulers.LBL_RANGE"));
                                sb.Append(culture.DateTimeFormat.MonthNames[nCRON_VALUE_END]);
                                nCronEntries++;
                            }
                        }
                    }
                    else
                    {
                        nCRON_VALUE = Sql.ToInteger(arrCRON_TEMP[i]);
                        if ( nCRON_VALUE >= 1 && nCRON_VALUE <= 12 )
                        {
                            if ( nCronEntries > 0 )
                                sb.Append(L10n.Term("Schedulers.LBL_AND"));
                            sb.Append(culture.DateTimeFormat.MonthNames[nCRON_VALUE]);
                            nCronEntries++;
                        }
                    }
                }
            }
            if ( sCRON_DAYOFWEEK != "*" )
            {
                if ( sb.Length > 0 )
                    sb.Append("; ");
                arrCRON_TEMP = sCRON_DAYOFWEEK.Split(',');
                for ( int i = 0, nCronEntries = 0; i < arrCRON_TEMP.Length; i++ )
                {
                    if ( arrCRON_TEMP[i].IndexOf('-') >= 0 )
                    {
                        arrCRON_VALUE = arrCRON_TEMP[i].Split('-');
                        if ( arrCRON_VALUE.Length >= 2 )
                        {
                            nCRON_VALUE_START = Sql.ToInteger(arrCRON_VALUE[0]);
                            nCRON_VALUE_END   = Sql.ToInteger(arrCRON_VALUE[1]);
                            if ( nCRON_VALUE_START >= 0 && nCRON_VALUE_START <= 6 && nCRON_VALUE_END >= 0 && nCRON_VALUE_END <= 6 )
                            {
                                if ( nCronEntries > 0 )
                                    sb.Append(L10n.Term("Schedulers.LBL_AND"));
                                sb.Append(L10n.Term("Schedulers.LBL_FROM"));
                                sb.Append(culture.DateTimeFormat.DayNames[nCRON_VALUE_START]);
                                sb.Append(L10n.Term("Schedulers.LBL_RANGE"));
                                sb.Append(culture.DateTimeFormat.DayNames[nCRON_VALUE_END]);
                                nCronEntries++;
                            }
                        }
                    }
                    else
                    {
                        nCRON_VALUE = Sql.ToInteger(arrCRON_TEMP[i]);
                        if ( nCRON_VALUE >= 0 && nCRON_VALUE <= 6 )
                        {
                            if ( nCronEntries > 0 )
                                sb.Append(L10n.Term("Schedulers.LBL_AND"));
                            sb.Append(culture.DateTimeFormat.DayNames[nCRON_VALUE]);
                            nCronEntries++;
                        }
                    }
                }
            }
            return sb.ToString();
        }
Beispiel #19
0
        public string create_case(string user_name, string password, string name)
        {
            Guid gUSER_ID = LoginUser(user_name, password);

            int nACLACCESS = Security.GetUserAccess("Cases", "edit");
            if ( nACLACCESS < 0 )
            {
                L10N L10n = new L10N("en-US");
                throw(new Exception(L10n.Term("ACL.LBL_INSUFFICIENT_ACCESS")));
            }
            Guid gID = Guid.Empty;
            SqlProcs.spCASES_New(ref gID, name, String.Empty, Guid.Empty);
            return "1";
        }
Beispiel #20
0
        public error_value relate_note_to_module(string session, string note_id, string module_name, string module_id)
        {
            Guid   gUSER_ID     = GetSessionUserID(session);
            Guid   gNOTE_ID     = Sql.ToGuid(note_id);
            string sPARENT_TYPE = module_name;
            Guid   gPARENT_ID   = Guid.Empty;
            Guid   gCONTACT_ID  = Guid.Empty;
            if ( String.Compare(sPARENT_TYPE, "Contacts", true) == 0 )
                gCONTACT_ID = Sql.ToGuid(module_id);
            else
                gPARENT_ID = Sql.ToGuid(module_id);

            int nACLACCESS = Security.GetUserAccess("Notes", "edit");
            if ( nACLACCESS < 0 )
            {
                L10N L10n = new L10N("en-US");
                throw(new Exception(L10n.Term("ACL.LBL_INSUFFICIENT_ACCESS")));
            }

            error_value results = new error_value();
            DbProviderFactory dbf = DbProviderFactories.GetFactory();
            using ( IDbConnection con = dbf.CreateConnection() )
            {
                con.Open();
                string sSQL;
                sSQL = "select *           " + ControlChars.CrLf
                     + "  from vwNOTES_Edit" + ControlChars.CrLf
                     + " where ID = @ID    " + ControlChars.CrLf;
                using ( IDbCommand cmd = con.CreateCommand() )
                {
                    cmd.CommandText = sSQL;
                    Sql.AddParameter(cmd, "@ID", gNOTE_ID);
                    using ( IDataReader rdr = cmd.ExecuteReader() )
                    {
                        if ( rdr.Read() )
                        {
                            string sNAME             = Sql.ToString(rdr["NAME"            ]);
                            string sDESCRIPTION      = Sql.ToString(rdr["DESCRIPTION"     ]);
                            // 09/01/2006 Paul.  Notes do not have an ASSIGNED_USER_ID.
                            Guid   gASSIGNED_USER_ID = Guid.Empty;  // Sql.ToGuid  (rdr["ASSIGNED_USER_ID"]);
                            if ( nACLACCESS != ACL_ACCESS.OWNER || (nACLACCESS == ACL_ACCESS.OWNER  && gASSIGNED_USER_ID == gUSER_ID) )
                            {
                                SqlProcs.spNOTES_Update
                                    ( ref gNOTE_ID
                                    , sNAME
                                    , sPARENT_TYPE
                                    , gPARENT_ID
                                    , gCONTACT_ID
                                    , sDESCRIPTION
                                    , Sql.ToGuid(rdr["TEAM_ID"])
                                    );
                            }
                        }
                    }
                }
            }

            return results;
        }
Beispiel #21
0
        public string create_lead(string user_name, string password, string first_name, string last_name, string email_address)
        {
            Guid gUSER_ID = LoginUser(user_name, password);

            int nACLACCESS = Security.GetUserAccess("Leads", "edit");
            if ( nACLACCESS < 0 )
            {
                L10N L10n = new L10N("en-US");
                throw(new Exception(L10n.Term("ACL.LBL_INSUFFICIENT_ACCESS")));
            }
            Guid gID = Guid.Empty;
            SqlProcs.spLEADS_New(ref gID, first_name, last_name, String.Empty, email_address);
            return "1";
        }
Beispiel #22
0
        public set_entry_result set_entry(string session, string module_name, name_value[] name_value_list)
        {
            Guid gUSER_ID  = GetSessionUserID(session);
            Guid gTIMEZONE = Sql.ToGuid(HttpContext.Current.Cache.Get("soap.user.timezone." + gUSER_ID.ToString()));
            TimeZone T10n = TimeZone.CreateTimeZone(gTIMEZONE);

            string sTABLE_NAME = VerifyModuleName(module_name);
            int nACLACCESS = Security.GetUserAccess(module_name, "edit");
            if ( nACLACCESS < 0 )
            {
                L10N L10n = new L10N("en-US");
                throw(new Exception(L10n.Term("ACL.LBL_INSUFFICIENT_ACCESS")));
            }

            set_entry_result results = new set_entry_result();

            DbProviderFactory dbf = DbProviderFactories.GetFactory();
            using ( IDbConnection con = dbf.CreateConnection() )
            {
                con.Open();
                // 02/21/2006 Paul.  Delete operations come in as set_entry with deleted = 1.
                if ( DeleteEntry(name_value_list) )
                {
                    IDbCommand cmdDelete = SqlProcs.Factory(con, "sp" + sTABLE_NAME + "_Delete");
                    // 10/10/2006 Paul.  Use IDbDataParameter to be consistent.
                    foreach(IDbDataParameter par in cmdDelete.Parameters)
                    {
                        par.Value = DBNull.Value;
                    }
                    Sql.SetParameter(cmdDelete, "@MODIFIED_USER_ID", gUSER_ID.ToString());
                    Guid gID = FindID(name_value_list);
                    if ( gID != Guid.Empty )
                    {
                        Sql.SetParameter(cmdDelete, "@ID", gID.ToString());
                        cmdDelete.ExecuteNonQuery();
                    }
                }
                else
                {
                    IDbCommand cmdUpdate = SqlProcs.Factory(con, "sp" + sTABLE_NAME + "_Update");
                    IDbDataParameter parID = Sql.FindParameter(cmdUpdate, "@ID");
                    // 10/10/2006 Paul.  Use IDbDataParameter to be consistent.
                    foreach(IDbDataParameter par in cmdUpdate.Parameters)
                    {
                        par.Value = DBNull.Value;
                    }
                    // 08/31/2006 Paul.  We need to initialize the values of any fields not provided.
                    // The stored procedure always updates all fields, so we need to make sure not to clear fields that are not provided.
                    // This problem was first noticed when the Outlook Plug-in kept clearing the ASSIGNED_USER_ID field.
                    Guid gID = FindID(name_value_list);
                    if ( gID != Guid.Empty )
                    {
                        // 08/31/2006 Paul.  If the ID is not found, then this must be a new
                        InitializeParameters(con, sTABLE_NAME, gID, cmdUpdate);
                    }
                    Sql.SetParameter(cmdUpdate, "@MODIFIED_USER_ID", gUSER_ID.ToString());

                    for ( int j = 0; j < name_value_list.Length; j++ )
                    {
                        // 04/04/2006 Paul.  DATE_START & TIME_START need to be combined into DATE_TIME.
                        if ( name_value_list[j].name.ToUpper() == "TIME_START" )
                        {
                            // 04/04/2006 Paul.  Modules that have a TIME_START field are MEETINGS, CALLS, TASKS, EMAILS, EMAIL_MARKETING, PROJECT_TASK
                            string sDateTime = EntryDateTime(name_value_list, "DATE_START", "TIME_START");
                            if ( sTABLE_NAME == "TASKS" || sTABLE_NAME == "PROJECT_TASK" )
                            {
                                Sql.SetParameter(cmdUpdate, "@DATE_TIME_START", T10n.ToServerTimeFromUniversalTime(sDateTime));
                            }
                            else
                            {
                                Sql.SetParameter(cmdUpdate, "@DATE_TIME", T10n.ToServerTimeFromUniversalTime(sDateTime));
                            }
                        }
                        // 04/04/2006 Paul.  DATE_DUE & TIME_DUE need to be combined into DATE_TIME_DUE.
                        else if ( name_value_list[j].name.ToUpper() == "TIME_DUE" )
                        {
                            // 04/04/2006 Paul.  Modules that have a TIME_DUE field are TASKS, PROJECT_TASK
                            string sDateTime = EntryDateTime(name_value_list, "DATE_DUE", "TIME_DUE");
                            Sql.SetParameter(cmdUpdate, "@DATE_TIME_DUE", T10n.ToServerTimeFromUniversalTime(sDateTime));
                        }
                        else
                        {
                            Sql.SetParameter(cmdUpdate, "@" + name_value_list[j].name, name_value_list[j].value);
                        }
                    }
                    cmdUpdate.ExecuteNonQuery();

                    if ( parID != null )
                    {
                        results.id = Sql.ToString(parID.Value);
                    }
                }
            }
            return results;
        }
Beispiel #23
0
        protected void OnItemCreated(object sender, DataGridItemEventArgs e)
        {
            // 08/21/2006 Lawrence Zamorano.  Add the record count to the pager control.
            // 08/21/2006 Paul.  Enhance to include page range.
            if (e.Item.ItemType == ListItemType.Pager)
            {
                TableCell pgr = e.Item.Controls[0] as TableCell;
                DataView  vw  = this.DataSource as DataView;
                if (vw != null && vw.Count > 0)
                {
                    // 08/21/2006 Paul.  Grab references to the Prev and Next controls while we know their indexes.
                    // 08/21/2006 Paul.  The previous and next controls will either be a LinkButton if active, or a Label if inactive.
                    LinkButton lnkPrev = pgr.Controls[0] as LinkButton;
                    LinkButton lnkNext = pgr.Controls[2] as LinkButton;
                    Label      lblPrev = pgr.Controls[0] as Label;
                    Label      lblNext = pgr.Controls[2] as Label;

                    L10N           L10n         = HttpContext.Current.Items["L10n"] as L10N;
                    string         sOf          = L10n.Term(".LBL_LIST_OF");
                    int            nPageStart   = this.CurrentPageIndex * this.PageSize + 1;
                    int            nPageEnd     = Math.Min((this.CurrentPageIndex + 1) * this.PageSize, vw.Count);
                    LiteralControl litPageRange = new LiteralControl();
                    litPageRange.Text = String.Format("&nbsp; <span class=\"pageNumbers\">({0} - {1} {2} {3})</span> ", nPageStart, nPageEnd, sOf, vw.Count);
                    pgr.Controls.AddAt(1, litPageRange);

                    string sThemeURL = Sql.ToString(HttpContext.Current.Session["themeURL"]);
                    if (lblPrev != null)
                    {
                        lblPrev.Text = "<img src=\"" + sThemeURL + "images/previous_off.gif" + "\" border=\"0\" height=\"10\" width=\"6\" />&nbsp;" + lblPrev.Text;
                    }
                    if (lnkPrev != null)
                    {
                        lnkPrev.Text = "<img src=\"" + sThemeURL + "images/previous.gif" + "\" border=\"0\" height=\"10\" width=\"6\" />&nbsp;" + lnkPrev.Text;
                        //LinkButton lnkStart = new LinkButton();
                        //lnkStart.CommandArgument = "1";
                        //lnkStart.CommandName = "Page";
                        //lnkStart.Text = "<img src=\"" + sThemeURL + "images/start.gif" + "\" border=\"0\" height=\"10\" width=\"11\" />&nbsp;" + L10n.Term(".LNK_LIST_START") + "&nbsp;";
                        //pgr.Controls.AddAt(0, lnkStart);
                    }
                    if (lblNext != null)
                    {
                        lblNext.Text = lblNext.Text + "&nbsp;<img src=\"" + sThemeURL + "images/next_off.gif" + "\" border=\"0\" height=\"10\" width=\"6\" />";
                    }
                    if (lnkNext != null)
                    {
                        lnkNext.Text = lnkNext.Text + "&nbsp;<img src=\"" + sThemeURL + "images/next.gif" + "\" border=\"0\" height=\"10\" width=\"6\" />";
                        //LinkButton lnkEnd = new LinkButton();
                        //lnkEnd.CommandArgument = this.PageCount.ToString();
                        //lnkEnd.CommandName = "Page";
                        //lnkEnd.Text = "&nbsp;" + L10n.Term(".LNK_LIST_END") + "&nbsp;<img src=\"" + sThemeURL + "images/end.gif" + "\" border=\"0\" height=\"10\" width=\"11\" />";
                        //pgr.Controls.Add(lnkEnd);
                    }
                }
            }
            else if (e.Item.ItemType == ListItemType.Header)
            {
                // 06/09/2006 Paul.  Move the translation to overridden DataBind.
                //L10nTranslate();
                // 11/21/2005 Paul.  The header cells should never wrap, the background image was not designed to wrap.
                foreach (TableCell cell in e.Item.Cells)
                {
                    cell.Wrap = false;
                }
                HttpSessionState Session         = HttpContext.Current.Session;
                string           sLastSortColumn = (string)ViewState["LastSortColumn"];
                string           sLastSortOrder  = (string)ViewState["LastSortOrder"];
                // 08/28/2006 Paul.  We need to watch for overflow.  This has occurred when a grid was created with no columns.
                for (int i = 0; i < e.Item.Controls.Count && i < this.Columns.Count; i++)
                {
                    // 11/13/2005 Paul.  If sorting is not enabled, this code will cause the header text to disappear.
                    if (this.AllowSorting && !Sql.IsEmptyString(Columns[i].SortExpression))
                    {
                        Image img = new Image();
                        img.Width  = 8;
                        img.Height = 10;
                        if (Columns[i].SortExpression == sLastSortColumn)
                        {
                            if (sLastSortOrder == "asc")
                            {
                                img.ImageUrl = Session["themeURL"] + "images/arrow_down.gif";
                            }
                            else
                            {
                                img.ImageUrl = Session["themeURL"] + "images/arrow_up.gif";
                            }
                        }
                        else
                        {
                            img.ImageUrl = Session["themeURL"] + "images/arrow.gif";
                        }
                        Literal lit = new Literal();
                        lit.Text = "&nbsp;";
                        e.Item.Cells[i].Controls.Add(lit);
                        e.Item.Cells[i].Controls.Add(img);
                    }
                }
            }
            else if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                // 09/05/2005 Paul.  Reducing viewstate data in a table can be done at the row level.
                // This will provide a major performance benefit while not loosing the ability to sort a grid.
                // http://authors.aspalliance.com/jimross/Articles/DatagridDietPartTwo.aspx
                // 10/13/2005 Paul.  Can't disable the content otherwise the data is not retained during certain postback operations.
                //e.Item.EnableViewState = false;
            }
        }
Beispiel #24
0
        public error_value set_relationship(string session, set_relationship_value set_relationship_value)
        {
            Guid gUSER_ID = GetSessionUserID(session);

            // 02/16/2006 Paul.  Don't need to verify the modules as it will be done inside SetRelationship();
            //VerifyModuleName(set_relationship_value.module1);
            //VerifyModuleName(set_relationship_value.module2);
            int nACLACCESS = Security.GetUserAccess(set_relationship_value.module1, "edit");
            if ( nACLACCESS < 0 )
            {
                L10N L10n = new L10N("en-US");
                throw(new Exception(L10n.Term("ACL.LBL_INSUFFICIENT_ACCESS")));
            }

            error_value results = new error_value();
            SetRelationship(set_relationship_value.module1, set_relationship_value.module1_id, set_relationship_value.module2, set_relationship_value.module2_id);
            return results;
        }
        public static void AppendEditViewFields(DataView dvFields, HtmlTable tbl, IDataReader rdr, L10N L10n, TimeZone T10n, CommandEventHandler Page_Command, bool bLayoutMode)
        {
            bool bIsMobile = false;
            SplendidPage Page = tbl.Page as SplendidPage;
            if ( Page != null )
                bIsMobile = Page.IsMobile;

            HtmlTableRow tr = null;
            // 11/28/2005 Paul.  Start row index using the existing count so that headers can be specified.
            int nRowIndex = tbl.Rows.Count - 1;
            int nColIndex = 0;
            HtmlTableCell tdLabel = null;
            HtmlTableCell tdField = null;
            // 01/07/2006 Paul.  Show table borders in layout mode. This will help distinguish blank lines from wrapped lines.
            if ( bLayoutMode )
                tbl.Border = 1;
            // 11/15/2007 Paul.  If there are no fields in the detail view, then hide the entire table.
            // This allows us to hide the table by removing all detail view fields.
            if ( dvFields.Count == 0 && tbl.Rows.Count <= 1 )
                tbl.Visible = false;

            // 01/27/2008 Paul.  We need the schema table to determine if the data label is free-form text.
            DataTable tblSchema = null;
            if ( rdr != null )
                tblSchema = rdr.GetSchemaTable();
            // 01/01/2008 Paul.  Pull config flag outside the loop.
            bool bEnableTeamManagement  = Crm.Config.enable_team_management();
            bool bRequireTeamManagement = Crm.Config.require_team_management();
            // 01/01/2008 Paul.  We need a quick way to require user assignments across the system.
            bool bRequireUserAssignment = Crm.Config.require_user_assignment();
            HttpSessionState Session = HttpContext.Current.Session;
            foreach(DataRowView row in dvFields)
            {
                Guid   gID                = Sql.ToGuid   (row["ID"               ]);
                int    nFIELD_INDEX       = Sql.ToInteger(row["FIELD_INDEX"      ]);
                string sFIELD_TYPE        = Sql.ToString (row["FIELD_TYPE"       ]);
                string sDATA_LABEL        = Sql.ToString (row["DATA_LABEL"       ]);
                string sDATA_FIELD        = Sql.ToString (row["DATA_FIELD"       ]);
                string sDISPLAY_FIELD     = Sql.ToString (row["DISPLAY_FIELD"    ]);
                string sCACHE_NAME        = Sql.ToString (row["CACHE_NAME"       ]);
                bool   bDATA_REQUIRED     = Sql.ToBoolean(row["DATA_REQUIRED"    ]);
                bool   bUI_REQUIRED       = Sql.ToBoolean(row["UI_REQUIRED"      ]);
                string sONCLICK_SCRIPT    = Sql.ToString (row["ONCLICK_SCRIPT"   ]);
                string sFORMAT_SCRIPT     = Sql.ToString (row["FORMAT_SCRIPT"    ]);
                short  nFORMAT_TAB_INDEX  = Sql.ToShort  (row["FORMAT_TAB_INDEX" ]);
                int    nFORMAT_MAX_LENGTH = Sql.ToInteger(row["FORMAT_MAX_LENGTH"]);
                int    nFORMAT_SIZE       = Sql.ToInteger(row["FORMAT_SIZE"      ]);
                int    nFORMAT_ROWS       = Sql.ToInteger(row["FORMAT_ROWS"      ]);
                int    nFORMAT_COLUMNS    = Sql.ToInteger(row["FORMAT_COLUMNS"   ]);
                int    nCOLSPAN           = Sql.ToInteger(row["COLSPAN"          ]);
                int    nROWSPAN           = Sql.ToInteger(row["ROWSPAN"          ]);
                string sLABEL_WIDTH       = Sql.ToString (row["LABEL_WIDTH"      ]);
                string sFIELD_WIDTH       = Sql.ToString (row["FIELD_WIDTH"      ]);
                int    nDATA_COLUMNS      = Sql.ToInteger(row["DATA_COLUMNS"     ]);
                // 12/02/2007 Paul.  Each view can now have its own number of data columns.
                // This was needed so that search forms can have 4 data columns. The default is 2 columns.
                if ( nDATA_COLUMNS == 0 )
                    nDATA_COLUMNS = 2;
                // 11/25/2006 Paul.  If Team Management has been disabled, then convert the field to a blank.
                // Keep the field, but treat it as blank so that field indexes will still be valid.
                // 12/03/2006 Paul.  Allow the team field to be visible during layout.
                if ( !bLayoutMode && sDATA_FIELD == "TEAM_ID" )
                {
                    if ( !bEnableTeamManagement )
                    {
                        sFIELD_TYPE = "Blank";
                        bUI_REQUIRED = false;
                    }
                    else
                    {
                        // 11/25/2006 Paul.  Override the required flag with the system value.
                        // 01/01/2008 Paul.  If Team Management is not required, then let the admin decide.
                        if ( bRequireTeamManagement )
                            bUI_REQUIRED = true;
                    }
                }
                if ( !bLayoutMode && sDATA_FIELD == "ASSIGNED_USER_ID" )
                {
                    // 01/01/2008 Paul.  We need a quick way to require user assignments across the system.
                    if ( bRequireUserAssignment )
                        bUI_REQUIRED = true;
                }
                if ( bIsMobile && String.Compare(sFIELD_TYPE, "AddressButtons", true) == 0 )
                {
                    // 11/17/2007 Paul.  Skip the address buttons on a mobile device.
                    continue;
                }
                // 11/17/2007 Paul.  On a mobile device, each new field is on a new row.
                // 12/02/2005 Paul. COLSPAN == -1 means that a new column should not be created.
                if ( (nCOLSPAN >= 0 && nColIndex == 0) || tr == null || bIsMobile )
                {
                    // 11/25/2005 Paul.  Don't pre-create a row as we don't want a blank
                    // row at the bottom.  Add rows just before they are needed.
                    nRowIndex++;
                    tr = new HtmlTableRow();
                    tbl.Rows.Insert(nRowIndex, tr);
                }
                if ( bLayoutMode )
                {
                    HtmlTableCell tdAction = new HtmlTableCell();
                    tr.Cells.Add(tdAction);
                    tdAction.Attributes.Add("class", "tabDetailViewDL");
                    tdAction.NoWrap = true;

                    Literal litIndex = new Literal();
                    tdAction.Controls.Add(litIndex);
                    litIndex.Text = " " + nFIELD_INDEX.ToString() + " ";

                    // 05/26/2007 Paul.  Fix the terms. The are in the Dropdown module.
                    ImageButton btnMoveUp   = CreateLayoutImageButton(gID, "Layout.MoveUp"  , nFIELD_INDEX, L10n.Term("Dropdown.LNK_UP"    ), Sql.ToString(Session["themeURL"]) + "images/uparrow_inline.gif"  , Page_Command);
                    ImageButton btnMoveDown = CreateLayoutImageButton(gID, "Layout.MoveDown", nFIELD_INDEX, L10n.Term("Dropdown.LNK_DOWN"  ), Sql.ToString(Session["themeURL"]) + "images/downarrow_inline.gif", Page_Command);
                    ImageButton btnInsert   = CreateLayoutImageButton(gID, "Layout.Insert"  , nFIELD_INDEX, L10n.Term("Dropdown.LNK_INS"   ), Sql.ToString(Session["themeURL"]) + "images/plus_inline.gif"     , Page_Command);
                    ImageButton btnEdit     = CreateLayoutImageButton(gID, "Layout.Edit"    , nFIELD_INDEX, L10n.Term("Dropdown.LNK_EDIT"  ), Sql.ToString(Session["themeURL"]) + "images/edit_inline.gif"     , Page_Command);
                    ImageButton btnDelete   = CreateLayoutImageButton(gID, "Layout.Delete"  , nFIELD_INDEX, L10n.Term("Dropdown.LNK_DELETE"), Sql.ToString(Session["themeURL"]) + "images/delete_inline.gif"   , Page_Command);
                    tdAction.Controls.Add(btnMoveUp  );
                    tdAction.Controls.Add(btnMoveDown);
                    tdAction.Controls.Add(btnInsert  );
                    tdAction.Controls.Add(btnEdit    );
                    tdAction.Controls.Add(btnDelete  );
                }
                // 12/03/2006 Paul.  Move literal label up so that it can be accessed when processing a blank.
                Literal litLabel = new Literal();
                if ( nCOLSPAN >= 0 || tdLabel == null || tdField == null )
                {
                    tdLabel = new HtmlTableCell();
                    tdField = new HtmlTableCell();
                    tr.Cells.Add(tdLabel);
                    tr.Cells.Add(tdField);
                    if ( nCOLSPAN > 0 )
                    {
                        tdField.ColSpan = nCOLSPAN;
                        if ( bLayoutMode )
                            tdField.ColSpan++;
                    }
                    tdLabel.Attributes.Add("class", "dataLabel");
                    tdLabel.VAlign = "top";
                    tdLabel.Width  = sLABEL_WIDTH;
                    tdField.Attributes.Add("class", "dataField");
                    tdField.VAlign = "top";
                    // 11/28/2005 Paul.  Don't use the field width if COLSPAN is specified as we want it to take the rest of the table.  The label width will be sufficient.
                    if ( nCOLSPAN == 0 )
                        tdField.Width  = sFIELD_WIDTH;

                    tdLabel.Controls.Add(litLabel);
                    //litLabel.Text = nFIELD_INDEX.ToString() + " (" + nRowIndex.ToString() + "," + nColIndex.ToString() + ")";
                    try
                    {
                        // 12/03/2006 Paul.  Move code to blank able in layout mode to blank section below.
                        if ( bLayoutMode )
                            litLabel.Text = sDATA_LABEL;
                        else if ( sDATA_LABEL.IndexOf(".") >= 0 )
                            litLabel.Text = L10n.Term(sDATA_LABEL);
                        else if ( !Sql.IsEmptyString(sDATA_LABEL) && rdr != null )
                        {
                            // 01/27/2008 Paul.  If the data label is not in the schema table, then it must be free-form text.
                            // It is not used often, but we allow the label to come from the result set.  For example,
                            // when the parent is stored in the record, we need to pull the module name from the record.
                            if ( tblSchema != null && tblSchema.Columns.Contains(sDATA_LABEL) )
                                litLabel.Text = Sql.ToString(rdr[sDATA_LABEL]) + L10n.Term("Calls.LBL_COLON");
                            else
                                litLabel.Text = sDATA_LABEL;
                        }
                        // 07/15/2006 Paul.  Always put something for the label so that table borders will look right.
                        // 07/20/2007 Vandalo.  Skip the requirement to create a terminology entry and just so the label.
                        else
                            litLabel.Text = sDATA_LABEL;  // "&nbsp;";
                    }
                    catch(Exception ex)
                    {
                        SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                        litLabel.Text = ex.Message;
                    }
                    if ( !bLayoutMode && bUI_REQUIRED )
                    {
                        Label lblRequired = new Label();
                        tdLabel.Controls.Add(lblRequired);
                        lblRequired.CssClass = "required";
                        lblRequired.Text = L10n.Term(".LBL_REQUIRED_SYMBOL");
                    }
                }

                if ( String.Compare(sFIELD_TYPE, "Blank", true) == 0 )
                {
                    Literal litField = new Literal();
                    tdField.Controls.Add(litField);
                    if ( bLayoutMode )
                    {
                        litLabel.Text = "*** BLANK ***";
                        litField.Text = "*** BLANK ***";
                    }
                    else
                    {
                        // 12/03/2006 Paul.  Make sure to clear the label.  This is necessary to convert a TEAM to blank when disabled.
                        litLabel.Text = "&nbsp;";
                        litField.Text = "&nbsp;";
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "Label", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        Literal litField = new Literal();
                        tdField.Controls.Add(litField);
                        // 07/25/2006 Paul.  Align label values to the middle so the line-up with the label.
                        tdField.VAlign = "middle";
                        // 07/24/2006 Paul.  Set the ID so that the literal control can be accessed.
                        litField.ID = sDATA_FIELD;
                        try
                        {
                            if ( bLayoutMode )
                                litField.Text = sDATA_FIELD;
                            else if ( sDATA_FIELD.IndexOf(".") >= 0 )
                                litField.Text = L10n.Term(sDATA_FIELD);
                            else if ( rdr != null )
                                litField.Text = Sql.ToString(rdr[sDATA_FIELD]);
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                            litField.Text = ex.Message;
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "ListBox", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        // 12/02/2007 Paul.  If format rows > 0 then this is a list box and not a drop down list.
                        ListControl lstField = null;
                        if ( nFORMAT_ROWS > 0 )
                        {
                            ListBox lb = new ListBox();
                            lb.SelectionMode = ListSelectionMode.Multiple;
                            lb.Rows          = nFORMAT_ROWS;
                            lstField = lb;
                        }
                        else
                        {
                            lstField = new DropDownList();
                        }
                        tdField.Controls.Add(lstField);
                        lstField.ID       = sDATA_FIELD;
                        lstField.TabIndex = nFORMAT_TAB_INDEX;
                        try
                        {
                            if ( !Sql.IsEmptyString(sDATA_FIELD) )
                            {
                                // 12/04/2005 Paul.  Don't populate list if this is a post back.
                                if ( !Sql.IsEmptyString(sCACHE_NAME) && (bLayoutMode || !tbl.Page.IsPostBack) )
                                {
                                    // 12/24/2007 Paul.  Use an array to define the custom caches so that list is in the Cache module.
                                    // This should reduce the number of times that we have to edit the SplendidDynamic module.
                                    bool bCustomCache = false;
                                    SplendidCacheReference[] arrCustomCaches = SplendidCache.CustomCaches;
                                    foreach ( SplendidCacheReference cache in arrCustomCaches )
                                    {
                                        if ( cache.Name == sCACHE_NAME )
                                        {
                                            lstField.DataValueField = cache.DataValueField;
                                            lstField.DataTextField  = cache.DataTextField ;
                                            SplendidCacheCallback cbkDataSource = cache.DataSource;
                                            lstField.DataSource     = cbkDataSource();
                                            bCustomCache = true;
                                        }
                                    }
                                    if ( !bCustomCache )
                                    {
                                        lstField.DataValueField = "NAME"        ;
                                        lstField.DataTextField  = "DISPLAY_NAME";
                                        lstField.DataSource     = SplendidCache.List(sCACHE_NAME);
                                    }
                                    lstField.DataBind();
                                    // 08/08/2006 Paul.  Allow onchange code to be stored in the database.
                                    // ListBoxes do not have a useful onclick event, so there should be no problem overloading this field.
                                    if ( !Sql.IsEmptyString(sONCLICK_SCRIPT) )
                                        lstField.Attributes.Add("onchange" , sONCLICK_SCRIPT);
                                    // 02/21/2006 Paul.  Move the NONE item inside the !IsPostBack code.
                                    // 12/02/2007 Paul.  We don't need a NONE record when using multi-selection.
                                    // 12/03/2007 Paul.  We do want the NONE record when using multi-selection.
                                    // This will allow searching of fields that are null instead of using the unassigned only checkbox.
                                    if ( !bUI_REQUIRED )
                                    {
                                        lstField.Items.Insert(0, new ListItem(L10n.Term(".LBL_NONE"), ""));
                                        // 12/02/2007 Paul.  AppendEditViewFields should be called inside Page_Load when not a postback,
                                        // and in InitializeComponent when it is a postback. If done wrong,
                                        // the page will bind after the list is populated, causing the list to populate again.
                                        // This event will cause the NONE entry to be cleared.  Add a handler to catch this problem,
                                        // but the real solution is to call AppendEditViewFields at the appropriate times based on the postback event.
                                        lstField.DataBound += new EventHandler(ListControl_DataBound_AllowNull);
                                    }
                                }
                                if ( rdr != null )
                                {
                                    try
                                    {
                                        // 02/21/2006 Paul.  All the DropDownLists in the Calls and Meetings edit views were not getting set.
                                        // The problem was a Page.DataBind in the SchedulingGrid and in the InviteesView. Both binds needed to be removed.
                                        // 12/30/2007 Paul.  A customer needed the ability to save and restore the multiple selection.
                                        // 12/30/2007 Paul.  Require the XML declaration in the data before trying to treat as XML.
                                        string sVALUE = Sql.ToString(rdr[sDATA_FIELD]);
                                        if ( nFORMAT_ROWS > 0 && sVALUE.StartsWith("<?xml") )
                                        {
                                            XmlDocument xml = new XmlDocument();
                                            xml.LoadXml(sVALUE);
                                            XmlNodeList nlValues = xml.DocumentElement.SelectNodes("Value");
                                            foreach ( XmlNode xValue in nlValues )
                                            {
                                                foreach ( ListItem item in lstField.Items )
                                                {
                                                    if ( item.Value == xValue.InnerText )
                                                        item.Selected = true;
                                                }
                                            }
                                        }
                                        else
                                        {
                                            lstField.SelectedValue = sVALUE;
                                        }
                                    }
                                    catch(Exception ex)
                                    {
                                        SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                                    }
                                }
                                // 12/04/2005 Paul.  Assigned To field will always default to the current user.
                                else if ( rdr == null && !tbl.Page.IsPostBack && sCACHE_NAME == "AssignedUser")
                                {
                                    try
                                    {
                                        // 12/02/2007 Paul.  We don't default the user when using multi-selection.
                                        // This is because this mode is typically used for searching.
                                        if ( nFORMAT_ROWS == 0 )
                                            lstField.SelectedValue = Security.USER_ID.ToString();
                                    }
                                    catch(Exception ex)
                                    {
                                        SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                                    }
                                }
                            }
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                        }
                        if ( bLayoutMode )
                        {
                            Literal litField = new Literal();
                            litField.Text = sDATA_FIELD;
                            tdField.Controls.Add(litField);
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "CheckBox", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        CheckBox chkField = new CheckBox();
                        tdField.Controls.Add(chkField);
                        chkField.ID = sDATA_FIELD;
                        chkField.CssClass = "checkbox";
                        chkField.TabIndex = nFORMAT_TAB_INDEX;
                        try
                        {
                            if ( rdr != null )
                                chkField.Checked = Sql.ToBoolean(rdr[sDATA_FIELD]);
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                        }
                        // 07/11/2007 Paul.  A checkbox can have a click event.
                        if ( !Sql.IsEmptyString(sONCLICK_SCRIPT) )
                            chkField.Attributes.Add("onclick", sONCLICK_SCRIPT);
                        if ( bLayoutMode )
                        {
                            Literal litField = new Literal();
                            litField.Text = sDATA_FIELD;
                            tdField.Controls.Add(litField);
                            chkField.Enabled  = false     ;
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "ChangeButton", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        // 12/04/2005 Paul.  If the label is PARENT_TYPE, then change the label to a DropDownList.
                        if ( sDATA_LABEL == "PARENT_TYPE" )
                        {
                            tdLabel.Controls.Clear();
                            DropDownList lstField = new DropDownList();
                            tdLabel.Controls.Add(lstField);
                            lstField.ID       = sDATA_LABEL;
                            lstField.TabIndex = nFORMAT_TAB_INDEX;
                            lstField.Attributes.Add("onChange", "ChangeParentType();");
                            if ( bLayoutMode || !tbl.Page.IsPostBack )
                            {
                                // 07/29/2005 Paul.  SugarCRM 3.0 does not allow the NONE option.
                                lstField.DataValueField = "NAME"        ;
                                lstField.DataTextField  = "DISPLAY_NAME";
                                lstField.DataSource     = SplendidCache.List("record_type_display");
                                lstField.DataBind();
                                if ( rdr != null )
                                {
                                    try
                                    {
                                        lstField.SelectedValue = Sql.ToString(rdr[sDATA_LABEL]);
                                    }
                                    catch(Exception ex)
                                    {
                                        SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                                    }
                                }
                            }
                        }
                        TextBox txtNAME = new TextBox();
                        tdField.Controls.Add(txtNAME);
                        txtNAME.ID       = sDISPLAY_FIELD;
                        txtNAME.ReadOnly = true;
                        txtNAME.TabIndex = nFORMAT_TAB_INDEX;
                        // 11/25/2006 Paul.   Turn off viewstate so that we can fix the text on postback.
                        txtNAME.EnableViewState = false;
                        try
                        {
                            if ( bLayoutMode )
                            {
                                txtNAME.Text    = sDISPLAY_FIELD;
                                txtNAME.Enabled = false         ;
                            }
                            // 11/25/2006 Paul.  The Change text field is losing its value during a postback error.
                            else if ( tbl.Page.IsPostBack )
                            {
                                // 11/25/2006 Paul.  In order for this posback fix to work, viewstate must be disabled for this field.
                                if ( tbl.Page.Request[txtNAME.UniqueID] != null )
                                    txtNAME.Text = Sql.ToString(tbl.Page.Request[txtNAME.UniqueID]);
                            }
                            else if ( !Sql.IsEmptyString(sDISPLAY_FIELD) && rdr != null )
                                txtNAME.Text = Sql.ToString(rdr[sDISPLAY_FIELD]);
                            // 11/25/2006 Paul.  The team name should always default to the current user's private team.
                            // Make sure not to overwrite the value if this is a postback.
                            else if ( sDATA_FIELD == "TEAM_ID" && rdr == null && !tbl.Page.IsPostBack )
                                txtNAME.Text = Security.TEAM_NAME;
                            // 01/15/2007 Paul.  Assigned To field will always default to the current user.
                            else if ( sDATA_FIELD == "ASSIGNED_USER_ID" && rdr == null && !tbl.Page.IsPostBack )
                                txtNAME.Text = Security.USER_NAME;
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                            txtNAME.Text = ex.Message;
                        }
                        HtmlInputHidden hidID = new HtmlInputHidden();
                        tdField.Controls.Add(hidID);
                        hidID.ID = sDATA_FIELD;
                        try
                        {
                            if ( !bLayoutMode )
                            {
                                if ( !Sql.IsEmptyString(sDATA_FIELD) && rdr != null )
                                    hidID.Value = Sql.ToString(rdr[sDATA_FIELD]);
                                // 11/25/2006 Paul.  The team name should always default to the current user's private team.
                                // Make sure not to overwrite the value if this is a postback.
                                // The hidden field does not require the same viewstate fix as the txtNAME field.
                                else if ( sDATA_FIELD == "TEAM_ID" && rdr == null && !tbl.Page.IsPostBack )
                                    hidID.Value = Security.TEAM_ID.ToString();
                                // 01/15/2007 Paul.  Assigned To field will always default to the current user.
                                else if ( sDATA_FIELD == "ASSIGNED_USER_ID" && rdr == null && !tbl.Page.IsPostBack )
                                    hidID.Value = Security.USER_ID.ToString();
                            }
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                            txtNAME.Text = ex.Message;
                        }

                        Literal litNBSP = new Literal();
                        tdField.Controls.Add(litNBSP);
                        litNBSP.Text = "&nbsp;";

                        HtmlInputButton btnChange = new HtmlInputButton("button");
                        tdField.Controls.Add(btnChange);
                        // 05/07/2006 Paul.  Specify a name for the check button so that it can be referenced by SplendidTest.
                        btnChange.ID = sDATA_FIELD + "_btnChange";
                        btnChange.Attributes.Add("class", "button");
                        if ( !Sql.IsEmptyString(sONCLICK_SCRIPT) )
                            btnChange.Attributes.Add("onclick"  , sONCLICK_SCRIPT);
                        // 03/31/2007 Paul.  SugarCRM now uses Select instead of Change.
                        btnChange.Attributes.Add("title"    , L10n.Term(".LBL_SELECT_BUTTON_TITLE"));
                        // 07/31/2006 Paul.  Stop using VisualBasic library to increase compatibility with Mono.
                        // 03/31/2007 Paul.  Stop using AccessKey for change button.
                        //btnChange.Attributes.Add("accessKey", L10n.Term(".LBL_SELECT_BUTTON_KEY").Substring(0, 1));
                        btnChange.Value = L10n.Term(".LBL_SELECT_BUTTON_LABEL");

                        // 12/03/2007 Paul.  Also create a Clear button.
                        if ( sONCLICK_SCRIPT.IndexOf("Popup();") > 0 )
                        {
                            litNBSP = new Literal();
                            tdField.Controls.Add(litNBSP);
                            litNBSP.Text = "&nbsp;";

                            HtmlInputButton btnClear = new HtmlInputButton("button");
                            tdField.Controls.Add(btnClear);
                            btnClear.ID = sDATA_FIELD + "_btnClear";
                            btnClear.Attributes.Add("class", "button");
                            btnClear.Attributes.Add("onclick"  , sONCLICK_SCRIPT.Replace("Popup();", "('', '');").Replace("return ", "return Change"));
                            btnClear.Attributes.Add("title"    , L10n.Term(".LBL_CLEAR_BUTTON_TITLE"));
                            btnClear.Value = L10n.Term(".LBL_CLEAR_BUTTON_LABEL");
                        }
                        if ( !bLayoutMode && bUI_REQUIRED && !Sql.IsEmptyString(sDATA_FIELD) )
                        {
                            RequiredFieldValidatorForHiddenInputs reqID = new RequiredFieldValidatorForHiddenInputs();
                            reqID.ID                 = sDATA_FIELD + "_REQUIRED";
                            reqID.ControlToValidate  = hidID.ID;
                            reqID.ErrorMessage       = L10n.Term(".ERR_REQUIRED_FIELD");
                            reqID.CssClass           = "required";
                            reqID.EnableViewState    = false;
                            // 01/16/2006 Paul.  We don't enable required fields until we attempt to save.
                            // This is to allow unrelated form actions; the Cancel button is a good example.
                            reqID.EnableClientScript = false;
                            reqID.Enabled            = false;
                            tdField.Controls.Add(reqID);
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "TextBox", true) == 0 || String.Compare(sFIELD_TYPE, "Password", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        TextBox txtField = new TextBox();
                        tdField.Controls.Add(txtField);
                        txtField.ID       = sDATA_FIELD;
                        txtField.TabIndex = nFORMAT_TAB_INDEX;
                        try
                        {
                            if ( nFORMAT_ROWS > 0 && nFORMAT_COLUMNS > 0 )
                            {
                                txtField.Rows     = nFORMAT_ROWS   ;
                                txtField.Columns  = nFORMAT_COLUMNS;
                                txtField.TextMode = TextBoxMode.MultiLine;
                            }
                            else
                            {
                                txtField.MaxLength = nFORMAT_MAX_LENGTH   ;
                                txtField.Attributes.Add("size", nFORMAT_SIZE.ToString());
                                txtField.TextMode  = TextBoxMode.SingleLine;
                            }
                            if ( bLayoutMode )
                            {
                                txtField.Text     = sDATA_FIELD;
                                txtField.ReadOnly = true       ;
                            }
                            else if ( !Sql.IsEmptyString(sDATA_FIELD) && rdr != null )
                            {
                                int    nOrdinal  = rdr.GetOrdinal(sDATA_FIELD);
                                string sTypeName = rdr.GetDataTypeName(nOrdinal);
                                // 03/04/2006 Paul.  Display currency in the proper format.
                                // Only SQL Server is likely to return the money type, so also include the decimal type.
                                if ( sTypeName == "money" || rdr[sDATA_FIELD].GetType() == typeof(System.Decimal) )
                                    txtField.Text = Sql.ToDecimal(rdr[sDATA_FIELD]).ToString("#,##0.00");
                                else
                                    txtField.Text = Sql.ToString(rdr[sDATA_FIELD]);
                            }
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                            txtField.Text = ex.Message;
                        }
                        if ( String.Compare(sFIELD_TYPE, "Password", true) == 0 )
                            txtField.TextMode = TextBoxMode.Password;
                        if ( !bLayoutMode && bUI_REQUIRED && !Sql.IsEmptyString(sDATA_FIELD) )
                        {
                            RequiredFieldValidator reqNAME = new RequiredFieldValidator();
                            reqNAME.ID                 = sDATA_FIELD + "_REQUIRED";
                            reqNAME.ControlToValidate  = txtField.ID;
                            reqNAME.ErrorMessage       = L10n.Term(".ERR_REQUIRED_FIELD");
                            reqNAME.CssClass           = "required";
                            reqNAME.EnableViewState    = false;
                            // 01/16/2006 Paul.  We don't enable required fields until we attempt to save.
                            // This is to allow unrelated form actions; the Cancel button is a good example.
                            reqNAME.EnableClientScript = false;
                            reqNAME.Enabled            = false;
                            tdField.Controls.Add(reqNAME);
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "DatePicker", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        // 12/03/2005 Paul.  UserControls must be loaded.
                        DatePicker ctlDate = tbl.Page.LoadControl("~/_controls/DatePicker.ascx") as DatePicker;
                        tdField.Controls.Add(ctlDate);
                        ctlDate.ID = sDATA_FIELD;
                        // 05/10/2006 Paul.  Set the tab index.
                        ctlDate.TabIndex = nFORMAT_TAB_INDEX;
                        try
                        {
                            if ( rdr != null )
                                ctlDate.Value = T10n.FromServerTime(rdr[sDATA_FIELD]);
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                        }
                        // 01/16/2006 Paul.  We validate elsewhere.
                        /*
                        if ( !bLayoutMode && bUI_REQUIRED && !Sql.IsEmptyString(sDATA_FIELD) )
                        {
                            ctlDate.Required = true;
                        }
                        */
                        if ( bLayoutMode )
                        {
                            Literal litField = new Literal();
                            litField.Text = sDATA_FIELD;
                            tdField.Controls.Add(litField);
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "DateRange", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        // 12/17/2007 Paul.  Use table to align before and after labels.
                        Table tblDateRange = new Table();
                        tdField.Controls.Add(tblDateRange);
                        TableRow trAfter = new TableRow();
                        TableRow trBefore = new TableRow();
                        tblDateRange.Rows.Add(trAfter);
                        tblDateRange.Rows.Add(trBefore);
                        TableCell tdAfterLabel  = new TableCell();
                        TableCell tdAfterData   = new TableCell();
                        TableCell tdBeforeLabel = new TableCell();
                        TableCell tdBeforeData  = new TableCell();
                        trAfter .Cells.Add(tdAfterLabel );
                        trAfter .Cells.Add(tdAfterData  );
                        trBefore.Cells.Add(tdBeforeLabel);
                        trBefore.Cells.Add(tdBeforeData );

                        // 12/03/2005 Paul.  UserControls must be loaded.
                        DatePicker ctlDateStart = tbl.Page.LoadControl("~/_controls/DatePicker.ascx") as DatePicker;
                        DatePicker ctlDateEnd   = tbl.Page.LoadControl("~/_controls/DatePicker.ascx") as DatePicker;
                        Literal litAfterLabel  = new Literal();
                        Literal litBeforeLabel = new Literal();
                        litAfterLabel .Text = L10n.Term("SavedSearch.LBL_SEARCH_AFTER" );
                        litBeforeLabel.Text = L10n.Term("SavedSearch.LBL_SEARCH_BEFORE");
                        //tdField.Controls.Add(litAfterLabel );
                        //tdField.Controls.Add(ctlDateStart  );
                        //tdField.Controls.Add(litBeforeLabel);
                        //tdField.Controls.Add(ctlDateEnd    );
                        tdAfterLabel .Controls.Add(litAfterLabel );
                        tdAfterData  .Controls.Add(ctlDateStart  );
                        tdBeforeLabel.Controls.Add(litBeforeLabel);
                        tdBeforeData .Controls.Add(ctlDateEnd    );

                        ctlDateStart.ID = sDATA_FIELD + "_AFTER";
                        ctlDateEnd  .ID = sDATA_FIELD + "_BEFORE";
                        // 05/10/2006 Paul.  Set the tab index.
                        ctlDateStart.TabIndex = nFORMAT_TAB_INDEX;
                        ctlDateEnd  .TabIndex = nFORMAT_TAB_INDEX;
                        try
                        {
                            if ( rdr != null )
                            {
                                ctlDateStart.Value = T10n.FromServerTime(rdr[sDATA_FIELD]);
                                ctlDateEnd  .Value = T10n.FromServerTime(rdr[sDATA_FIELD]);
                            }
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                        }
                        // 01/16/2006 Paul.  We validate elsewhere.
                        /*
                        if ( !bLayoutMode && bUI_REQUIRED && !Sql.IsEmptyString(sDATA_FIELD) )
                        {
                            ctlDateStart.Required = true;
                            ctlDateEnd  .Required = true;
                        }
                        */
                        if ( bLayoutMode )
                        {
                            Literal litField = new Literal();
                            litField.Text = sDATA_FIELD;
                            tdField.Controls.Add(litField);
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "DateTimePicker", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        // 12/03/2005 Paul.  UserControls must be loaded.
                        DateTimePicker ctlDate = tbl.Page.LoadControl("~/_controls/DateTimePicker.ascx") as DateTimePicker;
                        tdField.Controls.Add(ctlDate);
                        ctlDate.ID = sDATA_FIELD;
                        // 05/10/2006 Paul.  Set the tab index.
                        ctlDate.TabIndex = nFORMAT_TAB_INDEX;
                        try
                        {
                            if ( rdr != null )
                                ctlDate.Value = T10n.FromServerTime(rdr[sDATA_FIELD]);
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                        }
                        if ( bLayoutMode )
                        {
                            Literal litField = new Literal();
                            litField.Text = sDATA_FIELD;
                            tdField.Controls.Add(litField);
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "DateTimeEdit", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        // 12/03/2005 Paul.  UserControls must be loaded.
                        DateTimeEdit ctlDate = tbl.Page.LoadControl("~/_controls/DateTimeEdit.ascx") as DateTimeEdit;
                        tdField.Controls.Add(ctlDate);
                        ctlDate.ID = sDATA_FIELD;
                        // 05/10/2006 Paul.  Set the tab index.
                        ctlDate.TabIndex = nFORMAT_TAB_INDEX;
                        try
                        {
                            if ( rdr != null )
                                ctlDate.Value = T10n.FromServerTime(rdr[sDATA_FIELD]);
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                        }
                        if ( !bLayoutMode && bUI_REQUIRED )
                        {
                            ctlDate.EnableNone = false;
                        }
                        if ( bLayoutMode )
                        {
                            Literal litField = new Literal();
                            litField.Text = sDATA_FIELD;
                            tdField.Controls.Add(litField);
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "File", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        HtmlInputFile ctlField = new HtmlInputFile();
                        tdField.Controls.Add(ctlField);
                        ctlField.ID        = sDATA_FIELD;
                        ctlField.MaxLength = nFORMAT_MAX_LENGTH;
                        ctlField.Size      = nFORMAT_SIZE;
                        ctlField.Attributes.Add("TabIndex", nFORMAT_TAB_INDEX.ToString());
                        if ( !bLayoutMode && bUI_REQUIRED )
                        {
                            RequiredFieldValidator reqNAME = new RequiredFieldValidator();
                            reqNAME.ID                 = sDATA_FIELD + "_REQUIRED";
                            reqNAME.ControlToValidate  = ctlField.ID;
                            reqNAME.ErrorMessage       = L10n.Term(".ERR_REQUIRED_FIELD");
                            reqNAME.CssClass           = "required";
                            reqNAME.EnableViewState    = false;
                            // 01/16/2006 Paul.  We don't enable required fields until we attempt to save.
                            // This is to allow unrelated form actions; the Cancel button is a good example.
                            reqNAME.EnableClientScript = false;
                            reqNAME.Enabled            = false;
                            tdField.Controls.Add(reqNAME);
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "Image", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        HtmlInputHidden ctlHidden = new HtmlInputHidden();
                        if ( !bLayoutMode )
                        {
                            tdField.Controls.Add(ctlHidden);
                            ctlHidden.ID = sDATA_FIELD;

                            HtmlInputFile ctlField = new HtmlInputFile();
                            tdField.Controls.Add(ctlField);
                            // 04/17/2006 Paul.  The image needs to reference the file control.
                            ctlField.ID = sDATA_FIELD + "_File";

                            Literal litBR = new Literal();
                            litBR.Text = "<br />";
                            tdField.Controls.Add(litBR);
                        }

                        Image imgField = new Image();
                        // 04/13/2006 Paul.  Give the image a name so that it can be validated with SplendidTest.
                        imgField.ID = "img" + sDATA_FIELD;
                        try
                        {
                            if ( bLayoutMode )
                            {
                                Literal litField = new Literal();
                                litField.Text = sDATA_FIELD;
                                tdField.Controls.Add(litField);
                            }
                            else if ( rdr != null )
                            {
                                if ( !Sql.IsEmptyString(rdr[sDATA_FIELD]) )
                                {
                                    ctlHidden.Value = Sql.ToString(rdr[sDATA_FIELD]);
                                    imgField.ImageUrl = "~/Images/Image.aspx?ID=" + ctlHidden.Value;
                                    // 04/13/2006 Paul.  Only add the image if it exists.
                                    tdField.Controls.Add(imgField);

                                    // 04/17/2006 Paul.  Provide a clear button.
                                    Literal litClear = new Literal();
                                    litClear.Text = "<br /><input type=\"button\" class=\"button\" onclick=\"form." + ctlHidden.ClientID + ".value='';form." + imgField.ClientID + ".src='';" + "\"  value='" + "  " + L10n.Term(".LBL_CLEAR_BUTTON_LABEL" ) + "  " + "' title='" + L10n.Term(".LBL_CLEAR_BUTTON_TITLE" ) + "' />";
                                    tdField.Controls.Add(litClear);
                                }
                            }
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                            Literal litField = new Literal();
                            litField.Text = ex.Message;
                            tdField.Controls.Add(litField);
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "AddressButtons", true) == 0 )
                {
                    tr.Cells.Remove(tdField);
                    tdLabel.Width = "10%";
                    tdLabel.RowSpan = nROWSPAN;
                    tdLabel.VAlign  = "middle";
                    tdLabel.Align   = "center";
                    tdLabel.Attributes.Remove("class");
                    tdLabel.Attributes.Add("class", "tabFormAddDel");
                    HtmlInputButton btnCopyRight = new HtmlInputButton("button");
                    Literal         litSpacer    = new Literal();
                    HtmlInputButton btnCopyLeft  = new HtmlInputButton("button");
                    tdLabel.Controls.Add(btnCopyRight);
                    tdLabel.Controls.Add(litSpacer   );
                    tdLabel.Controls.Add(btnCopyLeft );
                    btnCopyRight.Attributes.Add("title"  , L10n.Term("Accounts.NTC_COPY_BILLING_ADDRESS" ));
                    btnCopyRight.Attributes.Add("onclick", "return copyAddressRight()");
                    btnCopyRight.Value = ">>";
                    litSpacer.Text = "<br><br>";
                    btnCopyLeft .Attributes.Add("title"  , L10n.Term("Accounts.NTC_COPY_SHIPPING_ADDRESS" ));
                    btnCopyLeft .Attributes.Add("onclick", "return copyAddressLeft()");
                    btnCopyLeft .Value = "<<";
                    nColIndex = 0;
                }
                else
                {
                    Literal litField = new Literal();
                    tdField.Controls.Add(litField);
                    litField.Text = "Unknown field type " + sFIELD_TYPE;
                    SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), "Unknown field type " + sFIELD_TYPE);
                }
                // 12/02/2007 Paul.  Each view can now have its own number of data columns.
                // This was needed so that search forms can have 4 data columns. The default is 2 columns.
                if ( nCOLSPAN > 0 )
                    nColIndex += nCOLSPAN;
                else if ( nCOLSPAN == 0 )
                    nColIndex++;
                if ( nColIndex >= nDATA_COLUMNS )
                    nColIndex = 0;
            }
        }
Beispiel #26
0
        public get_entry_list_result_encoded sync_get_modified_relationships(string session, string module_name, string related_module, string from_date, string to_date, int offset, int max_results, int deleted, string module_id, string[] select_fields, string[] ids, string relationship_name, string deletion_date, int php_serialize)
        {
            Guid gUSER_ID  = GetSessionUserID(session);
            Guid gTIMEZONE = Sql.ToGuid(HttpContext.Current.Cache.Get("soap.user.timezone." + gUSER_ID.ToString()));
            TimeZone T10n = TimeZone.CreateTimeZone(gTIMEZONE);

            string sTABLE_NAME = VerifyModuleName(module_name   );
            int nACLACCESS = Security.GetUserAccess(module_name, "list");
            if ( nACLACCESS < 0 )
            {
                L10N L10n = new L10N("en-US");
                throw(new Exception(L10n.Term("ACL.LBL_INSUFFICIENT_ACCESS")));
            }
            sTABLE_NAME = VerifyModuleName(related_module);
            nACLACCESS = Security.GetUserAccess(related_module, "list");
            if ( nACLACCESS < 0 )
            {
                L10N L10n = new L10N("en-US");
                throw(new Exception(L10n.Term("ACL.LBL_INSUFFICIENT_ACCESS")));
            }

            get_entry_list_result_encoded results = new get_entry_list_result_encoded();
            results.error.name        = "not supported";
            results.error.number      = "-1";
            results.error.description = "sync_get_modified_relationships is not supported at this time";
            return results;
        }
Beispiel #27
0
        public contact_detail[] contact_by_email(string user_name, string password, string email_address)
        {
            // 03/12/2007 Paul.  If using NTLM, then user_name will be updated with value from Identity object.
            Guid gUSER_ID = LoginUser(ref user_name, password);

            int nACLACCESS = Security.GetUserAccess("Contacts", "list");
            if ( nACLACCESS < 0 )
            {
                L10N L10n = new L10N("en-US");
                throw(new Exception(L10n.Term("ACL.LBL_INSUFFICIENT_ACCESS")));
            }

            contact_detail[] results = new contact_detail[0];
            DbProviderFactory dbf = DbProviderFactories.GetFactory();
            using ( IDbConnection con = dbf.CreateConnection() )
            {
                con.Open();
                string sSQL;
                sSQL = "select *                      " + ControlChars.CrLf
                     + "  from vwSOAP_Contact_By_Email" + ControlChars.CrLf
                     + " where 1 = 0                  " + ControlChars.CrLf;
                using ( IDbCommand cmd = con.CreateCommand() )
                {
                    cmd.CommandText = sSQL;
                    // 12/29/2005 Paul.  Allow multiple email addresses, separated by a semicolon.
                    email_address = email_address.Replace(" ", "");
                    string[] aAddresses = email_address.Split(';');
                    // 02/20/2006 Paul.  Need to use the IN clause.
                    Sql.AppendParameter(cmd, aAddresses, "EMAIL1", true);
                    Sql.AppendParameter(cmd, aAddresses, "EMAIL2", true);
                    if ( nACLACCESS == ACL_ACCESS.OWNER )
                    {
                        Sql.AppendParameter(cmd, gUSER_ID, "ASSIGNED_USER_ID");
                    }
                    try
                    {
                        using ( DbDataAdapter da = dbf.CreateDataAdapter() )
                        {
                            ((IDbDataAdapter)da).SelectCommand = cmd;
                            using ( DataTable dt = new DataTable() )
                            {
                                da.Fill(dt);
                                if ( dt.Rows.Count > 0 )
                                {
                                    // 02/20/2006 Paul.  First initialize the array.
                                    results = new contact_detail[dt.Rows.Count];
                                    for ( int i=0; i < dt.Rows.Count ; i++ )
                                    {
                                        // 02/20/2006 Paul.  Then initialize each element in the array.
                                        results[i] = new contact_detail();
                                        results[i].email_address = Sql.ToString(dt.Rows[i]["EMAIL_ADDRESS"]);
                                        results[i].name1         = Sql.ToString(dt.Rows[i]["NAME1"        ]);
                                        results[i].name2         = Sql.ToString(dt.Rows[i]["NAME2"        ]);
                                        results[i].association   = Sql.ToString(dt.Rows[i]["ASSOCIATION"  ]);
                                        results[i].id            = Sql.ToString(dt.Rows[i]["ID"           ]);
                                        results[i].type          = Sql.ToString(dt.Rows[i]["TYPE"         ]);
                                        results[i].msi_id        = (i+1).ToString();
                                    }
                                }
                            }
                        }
                    }
                    catch(Exception ex)
                    {
                        SplendidError.SystemError(new StackTrace(true).GetFrame(0), ex);
                        throw(new Exception("SOAP: Failed contact_by_email", ex));
                    }
                }
            }
            return results;
        }
Beispiel #28
0
        public string create_lead(string user_name, string password, string first_name, string last_name, string email_address)
        {
            // 03/12/2007 Paul.  If using NTLM, then user_name will be updated with value from Identity object.
            Guid gUSER_ID = LoginUser(ref user_name, password);

            int nACLACCESS = Security.GetUserAccess("Leads", "edit");
            if ( nACLACCESS < 0 )
            {
                L10N L10n = new L10N("en-US");
                throw(new Exception(L10n.Term("ACL.LBL_INSUFFICIENT_ACCESS")));
            }
            Guid gID = Guid.Empty;
            SqlProcs.spLEADS_New(ref gID, first_name, last_name, String.Empty, email_address);
            return "1";
        }
        public static void AppendDetailViewFields(DataView dvFields, HtmlTable tbl, IDataReader rdr, L10N L10n, TimeZone T10n, CommandEventHandler Page_Command, bool bLayoutMode)
        {
            bool bIsMobile = false;
            SplendidPage Page = tbl.Page as SplendidPage;
            if ( Page != null )
                bIsMobile = Page.IsMobile;

            HtmlTableRow tr = null;
            // 11/28/2005 Paul.  Start row index using the existing count so that headers can be specified.
            int nRowIndex = tbl.Rows.Count - 1;
            int nColIndex = 0;
            // 01/07/2006 Paul.  Show table borders in layout mode. This will help distinguish blank lines from wrapped lines.
            if ( bLayoutMode )
                tbl.Border = 1;
            // 03/30/2007 Paul.  Convert the currency values before displaying.
            // The UI culture should already be set to format the currency.
            Currency C10n = HttpContext.Current.Items["C10n"] as Currency;
            HttpSessionState Session = HttpContext.Current.Session;
            // 11/15/2007 Paul.  If there are no fields in the detail view, then hide the entire table.
            // This allows us to hide the table by removing all detail view fields.
            if ( dvFields.Count == 0 && tbl.Rows.Count <= 1 )
                tbl.Visible = false;

            // 01/27/2008 Paul.  We need the schema table to determine if the data label is free-form text.
            DataTable tblSchema = null;
            if ( rdr != null )
                tblSchema = rdr.GetSchemaTable();
            // 01/01/2008 Paul.  Pull config flag outside the loop.
            bool bEnableTeamManagement = Crm.Config.enable_team_management();
            foreach(DataRowView row in dvFields)
            {
                Guid   gID          = Sql.ToGuid   (row["ID"         ]);
                int    nFIELD_INDEX = Sql.ToInteger(row["FIELD_INDEX"]);
                string sFIELD_TYPE  = Sql.ToString (row["FIELD_TYPE" ]);
                string sDATA_LABEL  = Sql.ToString (row["DATA_LABEL" ]);
                string sDATA_FIELD  = Sql.ToString (row["DATA_FIELD" ]);
                string sDATA_FORMAT = Sql.ToString (row["DATA_FORMAT"]);
                string sLIST_NAME   = Sql.ToString (row["LIST_NAME"  ]);
                int    nCOLSPAN     = Sql.ToInteger(row["COLSPAN"    ]);
                string sLABEL_WIDTH = Sql.ToString (row["LABEL_WIDTH"]);
                string sFIELD_WIDTH = Sql.ToString (row["FIELD_WIDTH"]);
                int    nDATA_COLUMNS= Sql.ToInteger(row["DATA_COLUMNS"]);
                // 12/02/2007 Paul.  Each view can now have its own number of data columns.
                // This was needed so that search forms can have 4 data columns. The default is 2 columns.
                if ( nDATA_COLUMNS == 0 )
                    nDATA_COLUMNS = 2;
                // 11/25/2006 Paul.  If Team Management has been disabled, then convert the field to a blank.
                // Keep the field, but treat it as blank so that field indexes will still be valid.
                // 12/03/2006 Paul.  Allow the team field to be visible during layout.
                // 12/03/2006 Paul.  The correct field is TEAM_NAME.  We don't use TEAM_ID in the detail view.
                if ( !bLayoutMode && sDATA_FIELD == "TEAM_NAME" && !bEnableTeamManagement )
                {
                    sFIELD_TYPE = "Blank";
                }
                // 11/17/2007 Paul.  On a mobile device, each new field is on a new row.
                if ( nColIndex == 0 || bIsMobile )
                {
                    // 11/25/2005 Paul.  Don't pre-create a row as we don't want a blank
                    // row at the bottom.  Add rows just before they are needed.
                    nRowIndex++;
                    tr = new HtmlTableRow();
                    tbl.Rows.Insert(nRowIndex, tr);
                }
                if ( bLayoutMode )
                {
                    HtmlTableCell tdAction = new HtmlTableCell();
                    tr.Cells.Add(tdAction);
                    tdAction.Attributes.Add("class", "tabDetailViewDL");
                    tdAction.NoWrap = true;

                    Literal litIndex = new Literal();
                    tdAction.Controls.Add(litIndex);
                    litIndex.Text = " " + nFIELD_INDEX.ToString() + " ";

                    // 05/26/2007 Paul.  Fix the terms. The are in the Dropdown module.
                    ImageButton btnMoveUp   = CreateLayoutImageButton(gID, "Layout.MoveUp"  , nFIELD_INDEX, L10n.Term("Dropdown.LNK_UP"    ), Sql.ToString(Session["themeURL"]) + "images/uparrow_inline.gif"  , Page_Command);
                    ImageButton btnMoveDown = CreateLayoutImageButton(gID, "Layout.MoveDown", nFIELD_INDEX, L10n.Term("Dropdown.LNK_DOWN"  ), Sql.ToString(Session["themeURL"]) + "images/downarrow_inline.gif", Page_Command);
                    ImageButton btnInsert   = CreateLayoutImageButton(gID, "Layout.Insert"  , nFIELD_INDEX, L10n.Term("Dropdown.LNK_INS"   ), Sql.ToString(Session["themeURL"]) + "images/plus_inline.gif"     , Page_Command);
                    ImageButton btnEdit     = CreateLayoutImageButton(gID, "Layout.Edit"    , nFIELD_INDEX, L10n.Term("Dropdown.LNK_EDIT"  ), Sql.ToString(Session["themeURL"]) + "images/edit_inline.gif"     , Page_Command);
                    ImageButton btnDelete   = CreateLayoutImageButton(gID, "Layout.Delete"  , nFIELD_INDEX, L10n.Term("Dropdown.LNK_DELETE"), Sql.ToString(Session["themeURL"]) + "images/delete_inline.gif"   , Page_Command);
                    tdAction.Controls.Add(btnMoveUp  );
                    tdAction.Controls.Add(btnMoveDown);
                    tdAction.Controls.Add(btnInsert  );
                    tdAction.Controls.Add(btnEdit    );
                    tdAction.Controls.Add(btnDelete  );
                }
                HtmlTableCell tdLabel = new HtmlTableCell();
                HtmlTableCell tdField = new HtmlTableCell();
                tr.Cells.Add(tdLabel);
                tr.Cells.Add(tdField);
                if ( nCOLSPAN > 0 )
                {
                    tdField.ColSpan = nCOLSPAN;
                    if ( bLayoutMode )
                        tdField.ColSpan++;
                }
                tdLabel.Attributes.Add("class", "tabDetailViewDL");
                tdLabel.VAlign = "top";
                tdLabel.Width  = sLABEL_WIDTH;
                tdField.Attributes.Add("class", "tabDetailViewDF");
                tdField.VAlign = "top";
                // 11/28/2005 Paul.  Don't use the field width if COLSPAN is specified as we want it to take the rest of the table.  The label width will be sufficient.
                if ( nCOLSPAN == 0 )
                    tdField.Width  = sFIELD_WIDTH;

                Literal   litLabel = new Literal();
                HyperLink lnkField = null;
                tdLabel.Controls.Add(litLabel);
                //litLabel.Text = nFIELD_INDEX.ToString() + " (" + nRowIndex.ToString() + "," + nColIndex.ToString() + ")";
                try
                {
                    if ( bLayoutMode )
                        litLabel.Text = sDATA_LABEL;
                    else if ( sDATA_LABEL.IndexOf(".") >= 0 )
                        litLabel.Text = L10n.Term(sDATA_LABEL);
                    else if ( !Sql.IsEmptyString(sDATA_LABEL) && rdr != null )
                    {
                        // 01/27/2008 Paul.  If the data label is not in the schema table, then it must be free-form text.
                        // It is not used often, but we allow the label to come from the result set.  For example,
                        // when the parent is stored in the record, we need to pull the module name from the record.
                        if ( tblSchema != null && tblSchema.Columns.Contains(sDATA_LABEL) )
                            litLabel.Text = Sql.ToString(rdr[sDATA_LABEL]) + L10n.Term("Calls.LBL_COLON");
                        else
                            litLabel.Text = sDATA_LABEL;
                    }
                    // 07/15/2006 Paul.  Always put something for the label so that table borders will look right.
                    else
                        litLabel.Text = "&nbsp;";
                }
                catch(Exception ex)
                {
                    SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                    litLabel.Text = ex.Message;
                }
                if ( String.Compare(sFIELD_TYPE, "Blank", true) == 0 )
                {
                    Literal litField = new Literal();
                    tdField.Controls.Add(litField);
                    if ( bLayoutMode )
                    {
                        litLabel.Text = "*** BLANK ***";
                        litField.Text = "*** BLANK ***";
                    }
                    else
                    {
                        // 12/03/2006 Paul.  Make sure to clear the label.  This is necessary to convert a TEAM to blank when disabled.
                        litLabel.Text = "&nbsp;";
                        litField.Text = "&nbsp;";
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "Line", true) == 0 )
                {
                    if ( bLayoutMode )
                    {
                        Literal litField = new Literal();
                        tdField.Controls.Add(litField);
                        litLabel.Text = "*** LINE ***";
                        litField.Text = "*** LINE ***";
                    }
                    else
                    {
                        tr.Cells.Clear();
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "String", true) == 0 )
                {
                    if ( bLayoutMode )
                    {
                        Literal litField = new Literal();
                        litField.Text = sDATA_FIELD;
                        tdField.Controls.Add(litField);
                    }
                    else if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        // 12/06/2005 Paul.  Wrap all string fields in a SPAN tag to simplify regression testing.
                        HtmlGenericControl spnField = new HtmlGenericControl("span");
                        tdField.Controls.Add(spnField);
                        spnField.ID = sDATA_FIELD;

                        Literal litField = new Literal();
                        spnField.Controls.Add(litField);
                        try
                        {
                            string[] arrLIST_NAME  = sLIST_NAME .Split(' ');
                            string[] arrDATA_FIELD = sDATA_FIELD.Split(' ');
                            object[] objDATA_FIELD = new object[arrDATA_FIELD.Length];
                            for ( int i=0 ; i < arrDATA_FIELD.Length; i++ )
                            {
                                if ( arrDATA_FIELD[i].IndexOf(".") >= 0 )
                                {
                                    objDATA_FIELD[i] = L10n.Term(arrDATA_FIELD[i]);
                                }
                                else if ( !Sql.IsEmptyString(sLIST_NAME) )
                                {
                                    if ( arrLIST_NAME.Length == arrDATA_FIELD.Length )
                                    {
                                        if ( rdr != null )
                                        {
                                            // 01/18/2007 Paul.  If AssignedUser list, then use the cached value to find the value.
                                            if ( sLIST_NAME == "AssignedUser" )
                                            {
                                                objDATA_FIELD[i] = SplendidCache.AssignedUser(Sql.ToGuid(rdr[arrDATA_FIELD[i]]));
                                            }
                                            else
                                            {
                                                objDATA_FIELD[i] = L10n.Term("." + arrLIST_NAME[i] + ".", rdr[arrDATA_FIELD[i]]);
                                            }
                                        }
                                        else
                                            objDATA_FIELD[i] = String.Empty;
                                    }
                                }
                                else if ( !Sql.IsEmptyString(arrDATA_FIELD[i]) )
                                {
                                    if ( rdr != null && rdr[arrDATA_FIELD[i]] != DBNull.Value)
                                    {
                                        // 12/05/2005 Paul.  If the data is a DateTime field, then make sure to perform the timezone conversion.
                                        if ( rdr[arrDATA_FIELD[i]].GetType() == Type.GetType("System.DateTime") )
                                            objDATA_FIELD[i] = T10n.FromServerTime(rdr[arrDATA_FIELD[i]]);
                                        else
                                            objDATA_FIELD[i] = rdr[arrDATA_FIELD[i]];
                                    }
                                    else
                                        objDATA_FIELD[i] = String.Empty;
                                }
                            }
                            if ( rdr != null )
                            {
                                // 01/09/2006 Paul.  Allow DATA_FORMAT to be optional.   If missing, write data directly.
                                if ( sDATA_FORMAT == String.Empty )
                                {
                                    for ( int i=0; i < arrDATA_FIELD.Length; i++ )
                                        arrDATA_FIELD[i] = Sql.ToString(objDATA_FIELD[i]);
                                    litField.Text = String.Join(" ", arrDATA_FIELD);
                                }
                                else if ( sDATA_FORMAT == "{0:c}" && C10n != null )
                                {
                                    // 03/30/2007 Paul.  Convert DetailView currencies on the fly.
                                    // 05/05/2007 Paul.  In an earlier step, we convert NULLs to empty strings.
                                    // Attempts to convert to decimal will generate an error: Input string was not in a correct format.
                                    if ( !(objDATA_FIELD[0] is string) )
                                    {
                                        Decimal d = C10n.ToCurrency(Convert.ToDecimal(objDATA_FIELD[0]));
                                        litField.Text = d.ToString("c");
                                    }
                                }
                                else
                                    litField.Text = String.Format(sDATA_FORMAT, objDATA_FIELD);
                            }
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                            litField.Text = ex.Message;
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "CheckBox", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        CheckBox chkField = new CheckBox();
                        tdField.Controls.Add(chkField);
                        chkField.Enabled  = false     ;
                        chkField.CssClass = "checkbox";
                        // 03/16/2006 Paul.  Give the checkbox a name so that it can be validated with SplendidTest.
                        chkField.ID       = sDATA_FIELD;
                        try
                        {
                            if ( rdr != null )
                                chkField.Checked = Sql.ToBoolean(rdr[sDATA_FIELD]);
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                        }
                        if ( bLayoutMode )
                        {
                            Literal litField = new Literal();
                            litField.Text = sDATA_FIELD;
                            tdField.Controls.Add(litField);
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "Button", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        Button btnField = new Button();
                        tdField.Controls.Add(btnField);
                        btnField.CssClass = "button";
                        // 03/16/2006 Paul.  Give the button a name so that it can be validated with SplendidTest.
                        btnField.ID       = sDATA_FIELD;
                        if ( Page_Command != null )
                        {
                            btnField.Command    += Page_Command;
                            btnField.CommandName = sDATA_FORMAT  ;
                        }
                        try
                        {
                            if ( bLayoutMode )
                            {
                                btnField.Text    = sDATA_FIELD;
                                btnField.Enabled = false      ;
                            }
                            else if ( sDATA_FIELD.IndexOf(".") >= 0 )
                            {
                                btnField.Text = L10n.Term(sDATA_FIELD);
                            }
                            else if ( !Sql.IsEmptyString(sDATA_FIELD) && rdr != null )
                            {
                                btnField.Text = Sql.ToString(rdr[sDATA_FIELD]);
                            }
                            btnField.Attributes.Add("title", btnField.Text);
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                            btnField.Text = ex.Message;
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "Textbox", true) == 0 )
                {
                    /*
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        TextBox txtField = new TextBox();
                        tdField.Controls.Add(txtField);
                        txtField.ReadOnly = true;
                        txtField.TextMode = TextBoxMode.MultiLine;
                        // 03/16/2006 Paul.  Give the textbox a name so that it can be validated with SplendidTest.
                        txtField.ID       = sDATA_FIELD;
                        try
                        {
                            string[] arrDATA_FORMAT = sDATA_FORMAT.Split(',');
                            if ( arrDATA_FORMAT.Length == 2 )
                            {
                                txtField.Rows    = Sql.ToInteger(arrDATA_FORMAT[0]);
                                txtField.Columns = Sql.ToInteger(arrDATA_FORMAT[1]);
                            }
                            if ( bLayoutMode )
                            {
                                txtField.Text = sDATA_FIELD;
                            }
                            else if ( !Sql.IsEmptyString(sDATA_FIELD) && rdr != null )
                            {
                                txtField.Text = Sql.ToString(rdr[sDATA_FIELD]);
                            }
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                            txtField.Text = ex.Message;
                        }
                    }
                    */
                    // 07/07/2007 Paul.  Instead of using a real textbox, just replace new lines with <br />.
                    // This will perserve a majority of the HTML formating if it exists.
                    if ( bLayoutMode )
                    {
                        Literal litField = new Literal();
                        litField.Text = sDATA_FIELD;
                        tdField.Controls.Add(litField);
                    }
                    else if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        // 12/06/2005 Paul.  Wrap all string fields in a SPAN tag to simplify regression testing.
                        HtmlGenericControl spnField = new HtmlGenericControl("span");
                        tdField.Controls.Add(spnField);
                        spnField.ID = sDATA_FIELD;

                        Literal litField = new Literal();
                        spnField.Controls.Add(litField);
                        try
                        {
                            if ( rdr != null )
                            {
                                string sDATA = Sql.ToString(rdr[sDATA_FIELD]);
                                // 07/07/2007 Paul.  Emails may not have the proper \r\n terminators, so perform a few extra steps to ensure clean data.
                                sDATA = sDATA.Replace("\r\n", "\n");
                                sDATA = sDATA.Replace("\r"  , "\n");
                                sDATA = sDATA.Replace("\n"  , "<br />\r\n");
                                litField.Text = sDATA;
                            }
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                            litField.Text = ex.Message;
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "HyperLink", true) == 0 )
                {
                    string sURL_FIELD = Sql.ToString (row["URL_FIELD"]);
                    if ( !Sql.IsEmptyString(sDATA_FIELD) && !Sql.IsEmptyString(sURL_FIELD) )
                    {
                        string sURL_FORMAT = Sql.ToString (row["URL_FORMAT"]);
                        string sURL_TARGET = Sql.ToString (row["URL_TARGET"]);
                        lnkField = new HyperLink();
                        tdField.Controls.Add(lnkField);
                        lnkField.Target   = sURL_TARGET;
                        lnkField.CssClass = "tabDetailViewDFLink";
                        // 03/16/2006 Paul.  Give the hyperlink a name so that it can be validated with SplendidTest.
                        lnkField.ID       = sDATA_FIELD;
                        try
                        {
                            if ( bLayoutMode )
                            {
                                lnkField.Text    = sDATA_FIELD;
                                lnkField.Enabled = false      ;
                            }
                            else if ( rdr != null )
                            {
                                if ( !Sql.IsEmptyString(rdr[sDATA_FIELD]) )
                                {
                                    // 01/09/2006 Paul.  Allow DATA_FORMAT to be optional.   If missing, write data directly.
                                    if ( sDATA_FORMAT == String.Empty )
                                        lnkField.Text = Sql.ToString(rdr[sDATA_FIELD]);
                                    else
                                        lnkField.Text = String.Format(sDATA_FORMAT, Sql.ToString(rdr[sDATA_FIELD]));
                                }
                            }
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                            lnkField.Text = ex.Message;
                        }
                        try
                        {
                            if ( bLayoutMode )
                            {
                                lnkField.NavigateUrl = sURL_FIELD;
                            }
                            else if ( rdr != null )
                            {
                                if ( !Sql.IsEmptyString(rdr[sURL_FIELD]) )
                                {
                                    // 01/09/2006 Paul.  Allow DATA_FORMAT to be optional.   If missing, write data directly.
                                    if ( sDATA_FORMAT == String.Empty )
                                        lnkField.NavigateUrl = Sql.ToString(rdr[sURL_FIELD]);
                                    else
                                        lnkField.NavigateUrl = String.Format(sURL_FORMAT, Sql.ToString(rdr[sURL_FIELD]));
                                }
                            }
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                            lnkField.NavigateUrl = ex.Message;
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "Image", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        Image imgField = new Image();
                        // 04/13/2006 Paul.  Give the image a name so that it can be validated with SplendidTest.
                        imgField.ID = sDATA_FIELD;
                        try
                        {
                            if ( bLayoutMode )
                            {
                                Literal litField = new Literal();
                                litField.Text = sDATA_FIELD;
                                tdField.Controls.Add(litField);
                            }
                            else if ( rdr != null )
                            {
                                if ( !Sql.IsEmptyString(rdr[sDATA_FIELD]) )
                                {
                                    imgField.ImageUrl = "~/Images/Image.aspx?ID=" + Sql.ToString(rdr[sDATA_FIELD]);
                                    // 04/13/2006 Paul.  Only add the image if it exists.
                                    tdField.Controls.Add(imgField);
                                }
                            }
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                            lnkField.Text = ex.Message;
                        }
                    }
                }
                else
                {
                    Literal litField = new Literal();
                    tdField.Controls.Add(litField);
                    litField.Text = "Unknown field type " + sFIELD_TYPE;
                    // 01/07/2006 Paul.  Don't report the error in layout mode.
                    if ( !bLayoutMode )
                        SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), "Unknown field type " + sFIELD_TYPE);
                }
                // 12/02/2007 Paul.  Each view can now have its own number of data columns.
                // This was needed so that search forms can have 4 data columns. The default is 2 columns.
                if ( nCOLSPAN > 0 )
                    nColIndex += nCOLSPAN;
                else if ( nCOLSPAN == 0 )
                    nColIndex++;
                if ( nColIndex >= nDATA_COLUMNS )
                    nColIndex = 0;
            }
        }
Beispiel #30
0
        public get_entry_result get_entries(string session, string module_name, string[] ids, string[] select_fields)
        {
            Guid gUSER_ID = GetSessionUserID(session);
            Guid gTIMEZONE = Sql.ToGuid(HttpContext.Current.Cache.Get("soap.user.timezone." + gUSER_ID.ToString()));
            TimeZone T10n = TimeZone.CreateTimeZone(gTIMEZONE);

            string sTABLE_NAME = VerifyModuleName(module_name);
            int nACLACCESS = Security.GetUserAccess(module_name, "list");
            if ( nACLACCESS < 0 )
            {
                L10N L10n = new L10N("en-US");
                throw(new Exception(L10n.Term("ACL.LBL_INSUFFICIENT_ACCESS")));
            }

            get_entry_result results = new get_entry_result();
            // 02/19/2006 Paul.  Exit early if nothing to get.  We need to prevent fetching all recods.
            if ( ids.Length == 0 )
                return results;

            DbProviderFactory dbf = DbProviderFactories.GetFactory();
            using ( IDbConnection con = dbf.CreateConnection() )
            {
                con.Open();
                string sSQL;
                // 02/16/2006 Paul.  Convert the table name to a VIEW.  We can do this because we don't want deleted records.
                // 02/18/2006 Paul.  Use the Edit view as it will include description, content, etc.
                sSQL = "select *" + ControlChars.CrLf
                     + "  from vw" + sTABLE_NAME + "_Edit" + ControlChars.CrLf
                     + " where 1 = 1" + ControlChars.CrLf;
                using ( IDbCommand cmd = con.CreateCommand() )
                {
                    cmd.CommandText = sSQL;
                    // 02/19/2006 Paul.  Need to filter by the IDs povided.
                    Sql.AppendParameter(cmd, ids, "ID");
                    if ( nACLACCESS == ACL_ACCESS.OWNER )
                    {
                        // 09/01/2006 Paul.  Notes do not have an ASSIGNED_USER_ID.
                        if ( sTABLE_NAME != "NOTES" )
                            Sql.AppendParameter(cmd, gUSER_ID, "ASSIGNED_USER_ID");
                    }
                    try
                    {
                        CultureInfo ciEnglish = CultureInfo.CreateSpecificCulture("en-US");
                        using ( DbDataAdapter da = dbf.CreateDataAdapter() )
                        {
                            ((IDbDataAdapter)da).SelectCommand = cmd;
                            using ( DataTable dt = new DataTable() )
                            {
                                da.Fill(dt);
                                if ( dt.Rows.Count > 0 )
                                {
                                    // 02/20/2006 Paul.  First initialize the array.
                                    results.field_list = new field      [select_fields.Length];
                                    results.entry_list = new entry_value[dt.Rows.Count];
                                    for ( int i=0; i < select_fields.Length; i++ )
                                    {
                                        string sColumnName = select_fields[i];
                                        DataColumn col = dt.Columns[sColumnName];
                                        // 02/21/2006 Paul.  Column may not exist.  For example, we don't return a MEETINGS.TIME_START.
                                        if ( col != null )
                                        {
                                            // 02/20/2006 Paul.  Then initialize each element in the array.
                                            // 02/16/2006 Paul.  We don't have a mapping for the labels, so just return the column name.
                                            // varchar, bool, datetime, int, text, blob
                                            results.field_list[i] = new field(sColumnName.ToLower(), col.DataType.ToString(), sColumnName, 0);
                                        }
                                    }

                                    // 02/16/2006 Paul.  SugarCRM 3.5.1 returns all fields even though only a few were requested.  We will do the same.
                                    int nItem = 0;
                                    foreach ( DataRow row in dt.Rows )
                                    {
                                        // 02/20/2006 Paul.  Then initialize each element in the array.
                                        results.entry_list[nItem] = new entry_value();
                                        results.entry_list[nItem].id              = Sql.ToGuid(row["ID"]).ToString();
                                        results.entry_list[nItem].module_name     = module_name;
                                        // 02/20/2006 Paul.  First initialize the array.
                                        results.entry_list[nItem].name_value_list = new name_value[dt.Columns.Count];
                                        int nColumn = 0;
                                        foreach ( DataColumn col in dt.Columns )
                                        {
                                            // 02/20/2006 Paul.  Then initialize each element in the array.
                                            // 08/17/2006 Paul.  We need to convert all dates to UniversalTime.
                                            if ( Information.IsDate(row[col.ColumnName]) )
                                            {
                                                // 08/17/2006 Paul.  The time on the server and the time in the database are both considered ServerTime.
                                                DateTime dtServerTime = Sql.ToDateTime(row[col.ColumnName]);
                                                // 08/17/2006 Paul.  We need a special function to convert to UniversalTime because it might already be in UniversalTime, based on m_bGMTStorage flag.
                                                DateTime dtUniversalTime = T10n.ToUniversalTimeFromServerTime(dtServerTime);
                                                results.entry_list[nItem].name_value_list[nColumn] = new name_value(col.ColumnName.ToLower(), dtUniversalTime.ToString(CalendarControl.SqlDateTimeFormat, ciEnglish.DateTimeFormat));
                                            }
                                            else
                                            {
                                                results.entry_list[nItem].name_value_list[nColumn] = new name_value(col.ColumnName.ToLower(), Sql.ToString(row[col.ColumnName]));
                                            }
                                            nColumn++;
                                        }
                                        nItem++;
                                    }
                                }
                            }
                        }
                    }
                    catch(Exception ex)
                    {
                        SplendidError.SystemError(new StackTrace(true).GetFrame(0), ex);
                        throw(new Exception("SOAP: Failed get_entries", ex));
                    }
                }
            }
            return results;
        }
 public static DataTable ReportingModules()
 {
     System.Web.Caching.Cache Cache = HttpContext.Current.Cache;
     DataTable dt = Cache.Get("vwMODULES_Reporting_" + Security.USER_ID.ToString()) as DataTable;
     if ( dt == null )
     {
         L10N L10n = new L10N(HttpContext.Current.Session["USER_SETTINGS/CULTURE"] as string);
         try
         {
             DbProviderFactory dbf = DbProviderFactories.GetFactory();
             using ( IDbConnection con = dbf.CreateConnection() )
             {
                 con.Open();
                 string sSQL;
                 sSQL = "select MODULE_NAME             " + ControlChars.CrLf
                      + "     , DISPLAY_NAME            " + ControlChars.CrLf
                      + "  from vwMODULES_Reporting     " + ControlChars.CrLf
                      + " where USER_ID = @USER_ID      " + ControlChars.CrLf
                      + "    or USER_ID is null         " + ControlChars.CrLf;
                 using ( IDbCommand cmd = con.CreateCommand() )
                 {
                     cmd.CommandText = sSQL;
                     Sql.AddParameter(cmd, "@USER_ID", Security.USER_ID);
                     using ( DbDataAdapter da = dbf.CreateDataAdapter() )
                     {
                         ((IDbDataAdapter)da).SelectCommand = cmd;
                         dt = new DataTable();
                         da.Fill(dt);
                         foreach(DataRow row in dt.Rows)
                         {
                             row["DISPLAY_NAME"] = L10n.Term(Sql.ToString(row["DISPLAY_NAME"]));
                         }
                         Cache.Insert("vwMODULES_Reporting_" + Security.USER_ID.ToString(), dt, null, DefaultCacheExpiration(), Cache.NoSlidingExpiration);
                     }
                 }
             }
         }
         catch(Exception ex)
         {
             SplendidError.SystemError(new StackTrace(true).GetFrame(0), ex.Message);
             // 10/16/2005 Paul. Ignore list errors.
         }
     }
     return dt;
 }
Beispiel #32
0
        public get_entry_list_result get_entry_list(string session, string module_name, string query, string order_by, int offset, string[] select_fields, int max_results, int deleted)
        {
            Guid gUSER_ID = GetSessionUserID(session);
            Guid gTIMEZONE = Sql.ToGuid(HttpContext.Current.Cache.Get("soap.user.timezone." + gUSER_ID.ToString()));
            TimeZone T10n = TimeZone.CreateTimeZone(gTIMEZONE);

            if ( offset < 0 )
                throw(new Exception("offset must be a non-negative number"));
            if ( max_results <= 0 )
                throw(new Exception("max_results must be a postive number"));

            string sTABLE_NAME = VerifyModuleName(module_name);
            query       = query.ToUpper();
            order_by    = order_by.ToUpper();
            query    = query   .Replace(sTABLE_NAME + ".", String.Empty);
            order_by = order_by.Replace(sTABLE_NAME + ".", String.Empty);

            int nACLACCESS = Security.GetUserAccess(module_name, "list");
            if ( nACLACCESS < 0 )
            {
                L10N L10n = new L10N("en-US");
                throw(new Exception(L10n.Term("ACL.LBL_INSUFFICIENT_ACCESS")));
            }

            get_entry_list_result results = new get_entry_list_result();
            DbProviderFactory dbf = DbProviderFactories.GetFactory();
            using ( IDbConnection con = dbf.CreateConnection() )
            {
                con.Open();
                string sSQL;
                sSQL = "select *" + ControlChars.CrLf
                     + "  from " + sTABLE_NAME + ControlChars.CrLf
                     + " where DELETED = @DELETED" + ControlChars.CrLf;
                using ( IDbCommand cmd = con.CreateCommand() )
                {
                    if ( !Sql.IsEmptyString(query) )
                    {
                        // 02/16/2006 Paul.  As much as I dislike the idea of allowing a query string,
                        // I don't have the time to parse this.
                        // 03/08/2006 Paul.  Prepend the AND clause.
                        sSQL += "   and " + query + ControlChars.CrLf;
                    }
                    cmd.CommandText = sSQL;
                    Sql.AddParameter(cmd, "@DELETED", Math.Min(deleted, 1));
                    if ( nACLACCESS == ACL_ACCESS.OWNER )
                    {
                        // 09/01/2006 Paul.  Notes do not have an ASSIGNED_USER_ID.
                        if ( sTABLE_NAME != "NOTES" )
                            Sql.AppendParameter(cmd, gUSER_ID, "ASSIGNED_USER_ID");
                    }
                    try
                    {
                        CultureInfo ciEnglish = CultureInfo.CreateSpecificCulture("en-US");
                        using ( DbDataAdapter da = dbf.CreateDataAdapter() )
                        {
                            ((IDbDataAdapter)da).SelectCommand = cmd;
                            using ( DataTable dt = new DataTable() )
                            {
                                da.Fill(dt);
                                if ( dt.Rows.Count > 0 )
                                {
                                    // 02/16/2006 Paul.  Don't sort in the database as it provides a hacker another attempt at SQL-Injection.
                                    // Bad sort values will just throw an exception here.
                                    DataView dv = new DataView(dt);
                                    dv.Sort = order_by;

                                    results.result_count = Math.Min(dt.Rows.Count - offset, max_results);
                                    results.next_offset  = offset + results.result_count;

                                    // 02/20/2006 Paul.  First initialize the array.
                                    results.field_list = new field      [select_fields.Length];
                                    results.entry_list = new entry_value[results.result_count];
                                    for ( int i=0; i < select_fields.Length; i++ )
                                    {
                                        string sColumnName = select_fields[i];
                                        DataColumn col = dt.Columns[sColumnName];
                                        // 02/20/2006 Paul.  Then initialize each element in the array.
                                        // 02/16/2006 Paul.  We don't have a mapping for the labels, so just return the column name.
                                        // varchar, bool, datetime, int, text, blob
                                        results.field_list[i] = new field(sColumnName.ToLower(), col.DataType.ToString(), sColumnName, 0);
                                    }

                                    // 02/16/2006 Paul.  SugarCRM 3.5.1 returns all fields even though only a few were requested.  We will do the same.
                                    int j = 0;
                                    foreach ( DataRowView row in dv )
                                    {
                                        if ( j >= offset && j < offset + results.result_count )
                                        {
                                            int nItem = j - offset;
                                            // 02/20/2006 Paul.  Then initialize each element in the array.
                                            results.entry_list[nItem] = new entry_value();
                                            results.entry_list[nItem].id              = Sql.ToGuid(row["ID"]).ToString();
                                            results.entry_list[nItem].module_name     = module_name;
                                            // 02/20/2006 Paul.  First initialize the array.
                                            results.entry_list[nItem].name_value_list = new name_value[dt.Columns.Count];
                                            int nColumn = 0;
                                            foreach ( DataColumn col in dt.Columns )
                                            {
                                                // 02/20/2006 Paul.  Then initialize each element in the array.
                                                // 08/17/2006 Paul.  We need to convert all dates to UniversalTime.
                                                if ( Information.IsDate(row[col.ColumnName]) )
                                                {
                                                    // 08/17/2006 Paul.  The time on the server and the time in the database are both considered ServerTime.
                                                    DateTime dtServerTime = Sql.ToDateTime(row[col.ColumnName]);
                                                    // 08/17/2006 Paul.  We need a special function to convert to UniversalTime because it might already be in UniversalTime, based on m_bGMTStorage flag.
                                                    DateTime dtUniversalTime = T10n.ToUniversalTimeFromServerTime(dtServerTime);
                                                    results.entry_list[nItem].name_value_list[nColumn] = new name_value(col.ColumnName.ToLower(), dtUniversalTime.ToString(CalendarControl.SqlDateTimeFormat, ciEnglish.DateTimeFormat));
                                                }
                                                else
                                                {
                                                    results.entry_list[nItem].name_value_list[nColumn] = new name_value(col.ColumnName.ToLower(), Sql.ToString(row[col.ColumnName]));
                                                }
                                                nColumn++;
                                            }
                                        }
                                        j++;
                                    }
                                }
                            }
                        }
                    }
                    catch(Exception ex)
                    {
                        SplendidError.SystemError(new StackTrace(true).GetFrame(0), ex);
                        throw(new Exception("SOAP: Failed get_entry_list", ex));
                    }
                }
            }
            return results;
        }
Beispiel #33
0
 public static string TableColumnName(L10N L10n, string sModule, string sDISPLAY_NAME)
 {
     // 07/04/2006 Paul.  Some columns have global terms.
     // 06/05/2007 Paul.  Add Team global term.
     if (  sDISPLAY_NAME == "DATE_ENTERED"
        || sDISPLAY_NAME == "DATE_MODIFIED"
        || sDISPLAY_NAME == "ASSIGNED_TO"
        || sDISPLAY_NAME == "CREATED_BY"
        || sDISPLAY_NAME == "MODIFIED_BY"
        || sDISPLAY_NAME == "TEAM_NAME"    )
     {
         sDISPLAY_NAME = L10n.Term(".LBL_" + sDISPLAY_NAME).Replace(":", "");
     }
     else
     {
         // 07/04/2006 Paul.  Column names are aliased so that we don't have to redefine terms.
         sDISPLAY_NAME = L10n.AliasedTerm(sModule + ".LBL_" + sDISPLAY_NAME).Replace(":", "");
     }
     return sDISPLAY_NAME;
 }
Beispiel #34
0
        public get_relationships_result get_relationships(string session, string module_name, string module_id, string related_module, string related_module_query, int deleted)
        {
            Guid gUSER_ID  = GetSessionUserID(session);
            Guid gTIMEZONE = Sql.ToGuid(HttpContext.Current.Cache.Get("soap.user.timezone." + gUSER_ID.ToString()));
            TimeZone T10n = TimeZone.CreateTimeZone(gTIMEZONE);

            string sTABLE_NAME = VerifyModuleName(module_name   );
            int nACLACCESS = Security.GetUserAccess(module_name, "list");
            if ( nACLACCESS < 0 )
            {
                L10N L10n = new L10N("en-US");
                throw(new Exception(L10n.Term("ACL.LBL_INSUFFICIENT_ACCESS")));
            }
            sTABLE_NAME = VerifyModuleName(related_module);
            nACLACCESS = Security.GetUserAccess(related_module, "list");
            if ( nACLACCESS < 0 )
            {
                L10N L10n = new L10N("en-US");
                throw(new Exception(L10n.Term("ACL.LBL_INSUFFICIENT_ACCESS")));
            }

            get_relationships_result results = new get_relationships_result();
            DbProviderFactory dbf = DbProviderFactories.GetFactory();
            using ( IDbConnection con = dbf.CreateConnection() )
            {
                con.Open();
                string sSQL;
                // 02/16/2006 Paul.  Providing a way to directly access tables is a hacker's dream.
                // We will not do that here.  We will require that all relationships be defined in a SQL view.
                using ( IDbCommand cmd = con.CreateCommand() )
                {
                    switch ( module_name )
                    {
                        case "Contacts":
                        {
                            switch ( related_module )
                            {
                                case "Calls":
                                {
                                    sSQL = "select *                       " + ControlChars.CrLf
                                         + "  from vwCONTACTS_CALLS_Soap   " + ControlChars.CrLf
                                         + " where PRIMARY_ID = @PRIMARY_ID" + ControlChars.CrLf
                                         + "   and DELETED    = @DELETED   " + ControlChars.CrLf;
                                    cmd.CommandText = sSQL;
                                    Sql.AddParameter(cmd, "@PRIMARY_ID", module_id           );
                                    Sql.AddParameter(cmd, "@DELETED"   , Math.Min(deleted, 1));
                                    if ( !Sql.IsEmptyString(related_module_query) )
                                    {
                                        DateTime dtBeginDate = DateTime.MinValue;
                                        DateTime dtEndDate   = DateTime.MinValue;
                                        ParseDateRange(related_module_query, "DATE_START", T10n, ref dtBeginDate, ref dtEndDate);
                                        if ( dtBeginDate != DateTime.MinValue )
                                        {
                                            cmd.CommandText += "   and DATE_START > @BEGIN_DATE" + ControlChars.CrLf;
                                            Sql.AddParameter(cmd, "@BEGIN_DATE", dtBeginDate);
                                        }
                                        if ( dtEndDate != DateTime.MinValue )
                                        {
                                            cmd.CommandText += "   and DATE_START < @END_DATE  " + ControlChars.CrLf;
                                            Sql.AddParameter(cmd, "@END_DATE"  , dtEndDate  );
                                        }
                                    }
                                    break;
                                }
                                case "Meetings":
                                {
                                    sSQL = "select *                       " + ControlChars.CrLf
                                         + "  from vwCONTACTS_MEETINGS_Soap" + ControlChars.CrLf
                                         + " where PRIMARY_ID = @PRIMARY_ID" + ControlChars.CrLf
                                         + "   and DELETED    = @DELETED   " + ControlChars.CrLf;
                                    cmd.CommandText = sSQL;
                                    Sql.AddParameter(cmd, "@PRIMARY_ID", module_id           );
                                    Sql.AddParameter(cmd, "@DELETED"   , Math.Min(deleted, 1));
                                    if ( !Sql.IsEmptyString(related_module_query) )
                                    {
                                        DateTime dtBeginDate = DateTime.MinValue;
                                        DateTime dtEndDate   = DateTime.MinValue;
                                        ParseDateRange(related_module_query, "DATE_START", T10n, ref dtBeginDate, ref dtEndDate);
                                        if ( dtBeginDate != DateTime.MinValue )
                                        {
                                            cmd.CommandText += "   and DATE_START > @BEGIN_DATE" + ControlChars.CrLf;
                                            Sql.AddParameter(cmd, "@BEGIN_DATE", dtBeginDate);
                                        }
                                        if ( dtEndDate != DateTime.MinValue )
                                        {
                                            cmd.CommandText += "   and DATE_START < @END_DATE  " + ControlChars.CrLf;
                                            Sql.AddParameter(cmd, "@END_DATE"  , dtEndDate  );
                                        }
                                    }
                                    break;
                                }
                                case "Users":
                                {
                                    sSQL = "select *                       " + ControlChars.CrLf
                                         + "  from vwCONTACTS_USERS_Soap   " + ControlChars.CrLf
                                         + " where PRIMARY_ID = @PRIMARY_ID" + ControlChars.CrLf
                                         + "   and DELETED    = @DELETED   " + ControlChars.CrLf;
                                    cmd.CommandText = sSQL;
                                    Sql.AddParameter(cmd, "@PRIMARY_ID", module_id           );
                                    Sql.AddParameter(cmd, "@DELETED"   , Math.Min(deleted, 1));
                                    if ( !Sql.IsEmptyString(related_module_query) )
                                    {
                                        throw(new Exception(String.Format("A related_module_query is not allowed at this time.", module_name, related_module)));
                                    }
                                    break;
                                }
                                default:
                                {
                                    throw(new Exception(String.Format("Relationship between {0} and {1} is not defined", module_name, related_module)));
                                }
                            }
                            break;
                        }
                        case "Users":
                        {
                            switch ( related_module )
                            {
                                case "Calls":
                                {
                                    sSQL = "select *                       " + ControlChars.CrLf
                                         + "  from vwUSERS_CALLS_Soap      " + ControlChars.CrLf
                                         + " where PRIMARY_ID  = @PRIMARY_ID" + ControlChars.CrLf
                                         + "   and DELETED    = @DELETED   " + ControlChars.CrLf;
                                    cmd.CommandText = sSQL;
                                    Sql.AddParameter(cmd, "@PRIMARY_ID", module_id           );
                                    Sql.AddParameter(cmd, "@DELETED"   , Math.Min(deleted, 1));
                                    if ( !Sql.IsEmptyString(related_module_query) )
                                    {
                                        DateTime dtBeginDate = DateTime.MinValue;
                                        DateTime dtEndDate   = DateTime.MinValue;
                                        ParseDateRange(related_module_query, "DATE_START", T10n, ref dtBeginDate, ref dtEndDate);
                                        if ( dtBeginDate != DateTime.MinValue )
                                        {
                                            cmd.CommandText += "   and DATE_START > @BEGIN_DATE" + ControlChars.CrLf;
                                            Sql.AddParameter(cmd, "@BEGIN_DATE", dtBeginDate);
                                        }
                                        if ( dtEndDate != DateTime.MinValue )
                                        {
                                            cmd.CommandText += "   and DATE_START < @END_DATE  " + ControlChars.CrLf;
                                            Sql.AddParameter(cmd, "@END_DATE"  , dtEndDate  );
                                        }
                                    }
                                    break;
                                }
                                case "Meetings":
                                {
                                    sSQL = "select *                       " + ControlChars.CrLf
                                         + "  from vwUSERS_MEETINGS_Soap   " + ControlChars.CrLf
                                         + " where PRIMARY_ID  = @PRIMARY_ID" + ControlChars.CrLf
                                         + "   and DELETED    = @DELETED   " + ControlChars.CrLf;
                                    cmd.CommandText = sSQL;
                                    Sql.AddParameter(cmd, "@PRIMARY_ID", module_id           );
                                    Sql.AddParameter(cmd, "@DELETED"   , Math.Min(deleted, 1));
                                    if ( !Sql.IsEmptyString(related_module_query) )
                                    {
                                        DateTime dtBeginDate = DateTime.MinValue;
                                        DateTime dtEndDate   = DateTime.MinValue;
                                        ParseDateRange(related_module_query, "DATE_START", T10n, ref dtBeginDate, ref dtEndDate);
                                        if ( dtBeginDate != DateTime.MinValue )
                                        {
                                            cmd.CommandText += "   and DATE_START > @BEGIN_DATE" + ControlChars.CrLf;
                                            Sql.AddParameter(cmd, "@BEGIN_DATE", dtBeginDate);
                                        }
                                        if ( dtEndDate != DateTime.MinValue )
                                        {
                                            cmd.CommandText += "   and DATE_START < @END_DATE  " + ControlChars.CrLf;
                                            Sql.AddParameter(cmd, "@END_DATE"  , dtEndDate  );
                                        }
                                    }
                                    break;
                                }
                                case "Contacts":
                                {
                                    sSQL = "select *                       " + ControlChars.CrLf
                                         + "  from vwUSERS_CONTACTS_Soap   " + ControlChars.CrLf
                                         + " where PRIMARY_ID = @PRIMARY_ID" + ControlChars.CrLf
                                         + "   and DELETED    = @DELETED   " + ControlChars.CrLf;
                                    cmd.CommandText = sSQL;
                                    Sql.AddParameter(cmd, "@PRIMARY_ID", module_id           );
                                    Sql.AddParameter(cmd, "@DELETED"   , Math.Min(deleted, 1));
                                    if ( !Sql.IsEmptyString(related_module_query) )
                                    {
                                        throw(new Exception(String.Format("A related_module_query is not allowed at this time.", module_name, related_module)));
                                    }
                                    break;
                                }
                                default:
                                {
                                    throw(new Exception(String.Format("Relationship between {0} and {1} is not defined", module_name, related_module)));
                                }
                            }
                            break;
                        }
                        case "Meetings":
                        {
                            switch ( related_module )
                            {
                                case "Contacts":
                                {
                                    sSQL = "select *                       " + ControlChars.CrLf
                                         + "  from vwMEETINGS_CONTACTS_Soap" + ControlChars.CrLf
                                         + " where PRIMARY_ID = @PRIMARY_ID" + ControlChars.CrLf
                                         + "   and DELETED    = @DELETED   " + ControlChars.CrLf;
                                    cmd.CommandText = sSQL;
                                    Sql.AddParameter(cmd, "@PRIMARY_ID", module_id           );
                                    Sql.AddParameter(cmd, "@DELETED"   , Math.Min(deleted, 1));
                                    if ( !Sql.IsEmptyString(related_module_query) )
                                    {
                                        DateTime dtBeginDate = DateTime.MinValue;
                                        DateTime dtEndDate   = DateTime.MinValue;
                                        ParseDateRange(related_module_query, "DATE_START", T10n, ref dtBeginDate, ref dtEndDate);
                                        if ( dtBeginDate != DateTime.MinValue )
                                        {
                                            cmd.CommandText += "   and DATE_START > @BEGIN_DATE" + ControlChars.CrLf;
                                            Sql.AddParameter(cmd, "@BEGIN_DATE", dtBeginDate);
                                        }
                                        if ( dtEndDate != DateTime.MinValue )
                                        {
                                            cmd.CommandText += "   and DATE_START < @END_DATE  " + ControlChars.CrLf;
                                            Sql.AddParameter(cmd, "@END_DATE"  , dtEndDate  );
                                        }
                                    }
                                    break;
                                }
                                case "Users":
                                {
                                    sSQL = "select *                       " + ControlChars.CrLf
                                         + "  from vwMEETINGS_USERS_Soap   " + ControlChars.CrLf
                                         + " where PRIMARY_ID = @PRIMARY_ID" + ControlChars.CrLf
                                         + "   and DELETED    = @DELETED   " + ControlChars.CrLf;
                                    cmd.CommandText = sSQL;
                                    Sql.AddParameter(cmd, "@PRIMARY_ID", module_id           );
                                    Sql.AddParameter(cmd, "@DELETED"   , Math.Min(deleted, 1));
                                    if ( !Sql.IsEmptyString(related_module_query) )
                                    {
                                        DateTime dtBeginDate = DateTime.MinValue;
                                        DateTime dtEndDate   = DateTime.MinValue;
                                        ParseDateRange(related_module_query, "DATE_START", T10n, ref dtBeginDate, ref dtEndDate);
                                        if ( dtBeginDate != DateTime.MinValue )
                                        {
                                            cmd.CommandText += "   and DATE_START > @BEGIN_DATE" + ControlChars.CrLf;
                                            Sql.AddParameter(cmd, "@BEGIN_DATE", dtBeginDate);
                                        }
                                        if ( dtEndDate != DateTime.MinValue )
                                        {
                                            cmd.CommandText += "   and DATE_START < @END_DATE  " + ControlChars.CrLf;
                                            Sql.AddParameter(cmd, "@END_DATE"  , dtEndDate  );
                                        }
                                    }
                                    break;
                                }
                                default:
                                {
                                    throw(new Exception(String.Format("Relationship between {0} and {1} is not defined", module_name, related_module)));
                                }
                            }
                            break;
                        }
                        case "Calls":
                        {
                            switch ( related_module )
                            {
                                case "Contacts":
                                {
                                    sSQL = "select *                       " + ControlChars.CrLf
                                         + "  from vwCALLS_CONTACTS_Soap   " + ControlChars.CrLf
                                         + " where PRIMARY_ID = @PRIMARY_ID" + ControlChars.CrLf
                                         + "   and DELETED    = @DELETED   " + ControlChars.CrLf;
                                    cmd.CommandText = sSQL;
                                    Sql.AddParameter(cmd, "@PRIMARY_ID", module_id           );
                                    Sql.AddParameter(cmd, "@DELETED"   , Math.Min(deleted, 1));
                                    if ( !Sql.IsEmptyString(related_module_query) )
                                    {
                                        DateTime dtBeginDate = DateTime.MinValue;
                                        DateTime dtEndDate   = DateTime.MinValue;
                                        ParseDateRange(related_module_query, "DATE_START", T10n, ref dtBeginDate, ref dtEndDate);
                                        if ( dtBeginDate != DateTime.MinValue )
                                        {
                                            cmd.CommandText += "   and DATE_START > @BEGIN_DATE" + ControlChars.CrLf;
                                            Sql.AddParameter(cmd, "@BEGIN_DATE", dtBeginDate);
                                        }
                                        if ( dtEndDate != DateTime.MinValue )
                                        {
                                            cmd.CommandText += "   and DATE_START < @END_DATE  " + ControlChars.CrLf;
                                            Sql.AddParameter(cmd, "@END_DATE"  , dtEndDate  );
                                        }
                                    }
                                    break;
                                }
                                case "Users":
                                {
                                    sSQL = "select *                       " + ControlChars.CrLf
                                         + "  from vwCALLS_USERS_Soap      " + ControlChars.CrLf
                                         + " where PRIMARY_ID = @PRIMARY_ID" + ControlChars.CrLf
                                         + "   and DELETED    = @DELETED   " + ControlChars.CrLf;
                                    cmd.CommandText = sSQL;
                                    Sql.AddParameter(cmd, "@PRIMARY_ID", module_id           );
                                    Sql.AddParameter(cmd, "@DELETED"   , Math.Min(deleted, 1));
                                    if ( !Sql.IsEmptyString(related_module_query) )
                                    {
                                        DateTime dtBeginDate = DateTime.MinValue;
                                        DateTime dtEndDate   = DateTime.MinValue;
                                        ParseDateRange(related_module_query, "DATE_START", T10n, ref dtBeginDate, ref dtEndDate);
                                        if ( dtBeginDate != DateTime.MinValue )
                                        {
                                            cmd.CommandText += "   and DATE_START > @BEGIN_DATE" + ControlChars.CrLf;
                                            Sql.AddParameter(cmd, "@BEGIN_DATE", dtBeginDate);
                                        }
                                        if ( dtEndDate != DateTime.MinValue )
                                        {
                                            cmd.CommandText += "   and DATE_START < @END_DATE  " + ControlChars.CrLf;
                                            Sql.AddParameter(cmd, "@END_DATE"  , dtEndDate  );
                                        }
                                    }
                                    break;
                                }
                                default:
                                {
                                    throw(new Exception(String.Format("Relationship between {0} and {1} is not defined", module_name, related_module)));
                                }
                            }
                            break;
                        }
                        case  "Accounts":
                        {
                            switch ( related_module )
                            {
                                case "Contacts":
                                {
                                    sSQL = "select *                       " + ControlChars.CrLf
                                         + "  from vwACCOUNTS_CONTACTS_Soap" + ControlChars.CrLf
                                         + " where PRIMARY_ID = @PRIMARY_ID" + ControlChars.CrLf
                                         + "   and DELETED    = @DELETED   " + ControlChars.CrLf;
                                    cmd.CommandText = sSQL;
                                    Sql.AddParameter(cmd, "@PRIMARY_ID", module_id           );
                                    Sql.AddParameter(cmd, "@DELETED"   , Math.Min(deleted, 1));
                                    if ( !Sql.IsEmptyString(related_module_query) )
                                    {
                                        throw(new Exception(String.Format("A related_module_query is not allowed at this time.", module_name, related_module)));
                                    }
                                    break;
                                }
                                case "Users":
                                {
                                    sSQL = "select *                       " + ControlChars.CrLf
                                         + "  from vwACCOUNTS_USERS_Soap   " + ControlChars.CrLf
                                         + " where PRIMARY_ID = @PRIMARY_ID" + ControlChars.CrLf
                                         + "   and DELETED    = @DELETED   " + ControlChars.CrLf;
                                    cmd.CommandText = sSQL;
                                    Sql.AddParameter(cmd, "@PRIMARY_ID", module_id           );
                                    Sql.AddParameter(cmd, "@DELETED"   , Math.Min(deleted, 1));
                                    if ( !Sql.IsEmptyString(related_module_query) )
                                    {
                                        throw(new Exception(String.Format("A related_module_query is not allowed at this time.", module_name, related_module)));
                                    }
                                    break;
                                }
                                default:
                                {
                                    throw(new Exception(String.Format("Relationship between {0} and {1} is not defined", module_name, related_module)));
                                }
                            }
                            break;
                        }
                        default:
                        {
                            throw(new Exception(String.Format("Relationship between {0} and {1} is not defined", module_name, related_module)));
                        }
                    }

                    try
                    {
                        CultureInfo ciEnglish = CultureInfo.CreateSpecificCulture("en-US");
                        using ( DbDataAdapter da = dbf.CreateDataAdapter() )
                        {
                            ((IDbDataAdapter)da).SelectCommand = cmd;
                            using ( DataTable dt = new DataTable() )
                            {
                                da.Fill(dt);
                                if ( dt.Rows.Count > 0 )
                                {
                                    results.ids = new id_mod[dt.Rows.Count];
                                    int i = 0;
                                    foreach ( DataRow row in dt.Rows )
                                    {
                                        results.ids[i] = new id_mod();
                                        results.ids[i].id            = Sql.ToString  (row["RELATED_ID"   ]);
                                        results.ids[i].deleted       = Sql.ToInteger (row["DELETED"      ]);
                                        // 06/13/2006 Paul.  Italian has a problem with the time separator.  Use the value from the culture from CalendarControl.SqlDateTimeFormat.
                                        // 06/14/2006 Paul.  The Italian problem was that it was using the culture separator, but DataView only supports the en-US format.
                                        // 08/17/2006 Paul.  The time on the server and the time in the database are both considered ServerTime.
                                        DateTime dtDATE_MODIFIED_ServerTime = Sql.ToDateTime(row["DATE_MODIFIED"]);
                                        // 08/17/2006 Paul.  We need a special function to convert to UniversalTime because it might already be in UniversalTime, based on m_bGMTStorage flag.
                                        DateTime dtDATE_MODIFIED_UniversalTime = T10n.ToUniversalTimeFromServerTime(dtDATE_MODIFIED_ServerTime);
                                        results.ids[i].date_modified = dtDATE_MODIFIED_UniversalTime.ToString(CalendarControl.SqlDateTimeFormat, ciEnglish.DateTimeFormat);
                                        i++;
                                    }
                                }
                            }
                        }
                    }
                    catch(Exception ex)
                    {
                        SplendidError.SystemError(new StackTrace(true).GetFrame(0), ex);
                        throw(new Exception("SOAP: Failed get_relationships", ex));
                    }
                }
            }
            return results;
        }
        // 05/26/2007 Paul.  We need a way set the fields without creating the controls.
        public static void SetEditViewFields(System.Web.UI.UserControl Parent, string sEDIT_NAME, IDataReader rdr, L10N L10n, TimeZone T10n)
        {
            // 01/01/2008 Paul.  Pull config flag outside the loop.
            bool bEnableTeamManagement  = Crm.Config.enable_team_management();
            DataTable dtFields = SplendidCache.EditViewFields(sEDIT_NAME);
            DataView dvFields  = dtFields.DefaultView;
            foreach(DataRowView row in dvFields)
            {
                string sFIELD_TYPE        = Sql.ToString (row["FIELD_TYPE"       ]);
                string sDATA_LABEL        = Sql.ToString (row["DATA_LABEL"       ]);
                string sDATA_FIELD        = Sql.ToString (row["DATA_FIELD"       ]);
                string sDISPLAY_FIELD     = Sql.ToString (row["DISPLAY_FIELD"    ]);
                int    nFORMAT_ROWS       = Sql.ToInteger(row["FORMAT_ROWS"      ]);

                if ( sDATA_FIELD == "TEAM_ID" )
                {
                    if ( !bEnableTeamManagement )
                    {
                        sFIELD_TYPE = "Blank";
                    }
                }
                if ( String.Compare(sFIELD_TYPE, "Blank", true) == 0 )
                {
                }
                else if ( String.Compare(sFIELD_TYPE, "Label", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        Literal litField = Parent.FindControl(sDATA_FIELD) as Literal;
                        if ( litField != null )
                        {
                            try
                            {
                                if ( sDATA_FIELD.IndexOf(".") >= 0 )
                                    litField.Text = L10n.Term(sDATA_FIELD);
                                else
                                    litField.Text = Sql.ToString(rdr[sDATA_FIELD]);
                            }
                            catch(Exception ex)
                            {
                                SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                                litField.Text = ex.Message;
                            }
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "ListBox", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        try
                        {
                            if ( nFORMAT_ROWS > 0 )
                            {
                                // 12/02/2007 Paul.  If format rows > 0 then this is a list box and not a drop down list.
                                ListBox lstField = Parent.FindControl(sDATA_FIELD) as ListBox;
                                if ( lstField != null )
                                {
                                    lstField.SelectedValue = Sql.ToString(rdr[sDATA_FIELD]);
                                }
                            }
                            else
                            {
                                DropDownList lstField = Parent.FindControl(sDATA_FIELD) as DropDownList;
                                if ( lstField != null )
                                {
                                    lstField.SelectedValue = Sql.ToString(rdr[sDATA_FIELD]);
                                }
                            }
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "CheckBox", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        try
                        {
                            CheckBox chkField = Parent.FindControl(sDATA_FIELD) as CheckBox;
                            if ( chkField != null )
                                chkField.Checked = Sql.ToBoolean(rdr[sDATA_FIELD]);
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "ChangeButton", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        // 12/04/2005 Paul.  If the label is PARENT_TYPE, then change the label to a DropDownList.
                        if ( sDATA_LABEL == "PARENT_TYPE" )
                        {
                            DropDownList lstField = Parent.FindControl(sDATA_LABEL) as DropDownList;
                            if ( lstField != null )
                            {
                                try
                                {
                                    lstField.SelectedValue = Sql.ToString(rdr[sDATA_LABEL]);
                                }
                                catch(Exception ex)
                                {
                                    SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                                }
                            }
                        }
                        TextBox txtNAME = Parent.FindControl(sDISPLAY_FIELD) as TextBox;
                        if ( txtNAME != null )
                        {
                            try
                            {
                                if ( !Sql.IsEmptyString(sDISPLAY_FIELD) )
                                    txtNAME.Text = Sql.ToString(rdr[sDISPLAY_FIELD]);
                            }
                            catch(Exception ex)
                            {
                                SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                                txtNAME.Text = ex.Message;
                            }
                            HtmlInputHidden hidID = Parent.FindControl(sDATA_FIELD) as HtmlInputHidden;
                            if ( hidID != null )
                            {
                                try
                                {
                                    hidID.Value = Sql.ToString(rdr[sDATA_FIELD]);
                                }
                                catch(Exception ex)
                                {
                                    SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                                    txtNAME.Text = ex.Message;
                                }
                            }
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "TextBox", true) == 0 || String.Compare(sFIELD_TYPE, "Password", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        TextBox txtField = Parent.FindControl(sDATA_FIELD) as TextBox;
                        if ( txtField != null )
                        {
                            try
                            {
                                int    nOrdinal  = rdr.GetOrdinal(sDATA_FIELD);
                                string sTypeName = rdr.GetDataTypeName(nOrdinal);
                                if ( sTypeName == "money" || rdr[sDATA_FIELD].GetType() == typeof(System.Decimal) )
                                    txtField.Text = Sql.ToDecimal(rdr[sDATA_FIELD]).ToString("#,##0.00");
                                else
                                    txtField.Text = Sql.ToString(rdr[sDATA_FIELD]);
                            }
                            catch(Exception ex)
                            {
                                SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                                txtField.Text = ex.Message;
                            }
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "DatePicker", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        try
                        {
                        DatePicker ctlDate = Parent.FindControl(sDATA_FIELD) as DatePicker;
                            if ( ctlDate != null )
                                ctlDate.Value = T10n.FromServerTime(rdr[sDATA_FIELD]);
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "DateTimePicker", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        try
                        {
                            DateTimePicker ctlDate = Parent.FindControl(sDATA_FIELD) as DateTimePicker;
                            if ( ctlDate != null )
                                ctlDate.Value = T10n.FromServerTime(rdr[sDATA_FIELD]);
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "DateTimeEdit", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        try
                        {
                            DateTimeEdit ctlDate = Parent.FindControl(sDATA_FIELD) as DateTimeEdit;
                            if ( ctlDate != null )
                                ctlDate.Value = T10n.FromServerTime(rdr[sDATA_FIELD]);
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                        }
                    }
                }
                else if ( String.Compare(sFIELD_TYPE, "File", true) == 0 )
                {
                }
                else if ( String.Compare(sFIELD_TYPE, "Image", true) == 0 )
                {
                    if ( !Sql.IsEmptyString(sDATA_FIELD) )
                    {
                        try
                        {
                            HtmlInputHidden ctlHidden = Parent.FindControl(sDATA_FIELD) as HtmlInputHidden;
                            Image imgField = Parent.FindControl("img" + sDATA_FIELD) as Image;
                            if ( ctlHidden != null && imgField != null )
                            {
                                if ( !Sql.IsEmptyString(rdr[sDATA_FIELD]) )
                                {
                                    ctlHidden.Value = Sql.ToString(rdr[sDATA_FIELD]);
                                    imgField.ImageUrl = "~/Images/Image.aspx?ID=" + ctlHidden.Value;
                                }
                            }
                        }
                        catch(Exception ex)
                        {
                            SplendidError.SystemWarning(new StackTrace(true).GetFrame(0), ex);
                        }
                    }
                }
            }
        }