protected void Page_Load(object sender, EventArgs e)
    {
        XmlUtil x_util = new XmlUtil();
        Hashtable State = (Hashtable)HttpRuntime.Cache[Session.SessionID];
        if (State == null || State.Count <= 2) { Page.ClientScript.RegisterStartupScript(this.GetType(), Guid.NewGuid().ToString(), "timeOut('../Default.aspx');", true); return; }

        string device_type = x_util.GetAppDeviceType(State);
        if (device_type == null)
        {
            UploadMessage.Text = "Before you can add a custom background you first need to save the app.";
            return;
        }

        switch (device_type)
        {
            case Constants.ANDROID_PHONE:
                Width.Text = Constants.ANDROID_PHONE_DISPLAY_WIDTH_S;
                Height.Text = (Constants.ANDROID_PHONE_DISPLAY_HEIGHT - 20).ToString();
                break;
            case Constants.ANDROID_TABLET:
                Width.Text = Constants.ANDROID_TABLET_DISPLAY_WIDTH_S;
                Height.Text = (Constants.ANDROID_TABLET_DISPLAY_HEIGHT - 25).ToString();
                break;
            case Constants.IPAD:
                Width.Text = Constants.IPAD_DISPLAY_WIDTH_S;
                Height.Text = (Constants.IPAD_DISPLAY_HEIGHT - 25).ToString();
                break;
            case Constants.IPHONE:
            default:
                Width.Text = Constants.IPHONE_DISPLAY_WIDTH_S;
                Height.Text = (Constants.IPHONE_DISPLAY_HEIGHT - 20).ToString();
                break;
        }
    }
    protected void DesignedForDevice_SelectedIndexChanged(object o, RadComboBoxSelectedIndexChangedEventArgs e)
    {
        Util util = new Util();
        Hashtable State = (Hashtable)HttpRuntime.Cache[Session.SessionID];
        if (util.CheckSessionTimeout(State, Response, "Default.aspx")) return;

        try
        {
            ClearMessages();

            DesignedForDevice.Text = e.Text;
            string device_design = e.Value;
            DeviceType.Text = e.Text;
            XmlUtil x_util = new XmlUtil();
            string previous_device_design = x_util.GetAppDeviceType(State);

            //State["SelectedDeviceView"] = device_design;
            State["SelectedDeviceType"] = device_design;
            if (State["SelectedApp"] == null || State["SelectedApp"].ToString().Contains("->"))
            {
                util.SetDefaultBackgroundForView(State,device_design);
            }

            x_util.SetAppDeviceType(State, previous_device_design, device_design);

            Message.Text = "Main device for App has been set.";
        }
        catch (Exception ex)
        {
            util.LogError(State, ex);
            Message.Text = "Internal Error: " + ex.Message + ": " + ex.StackTrace;
        }
    }
 protected void Page_Load(object sender, EventArgs e)
 {
     if (!IsPostBack)
     {
         Util util = new Util();
         Hashtable State = (Hashtable)HttpRuntime.Cache[Session.SessionID];
         if (util.CheckSessionTimeout(State, Response, "Default.aspx")) return;
         XmlUtil x_util = new XmlUtil();
         State["SelectedDeviceType"] = x_util.GetAppDeviceType(State);
         DesignedForDevice.Items.Clear();
         DesignedForDevice.Items.Add(new RadComboBoxItem("Select ->", "->"));
         switch (State["SelectedDeviceType"].ToString())
         {
             case Constants.IPHONE:
                 DesignedForDevice.Items.Add(new RadComboBoxItem("iPad", Constants.IPAD));
                 DesignedForDevice.Items.Add(new RadComboBoxItem("Android Phone", Constants.ANDROID_PHONE));
                 DesignedForDevice.Items.Add(new RadComboBoxItem("Android Tablet", Constants.ANDROID_TABLET));
                 break;
             case Constants.IPAD:
                 DesignedForDevice.Items.Add(new RadComboBoxItem("iPhone", Constants.IPHONE));
                 DesignedForDevice.Items.Add(new RadComboBoxItem("Android Phone", Constants.ANDROID_PHONE));
                 DesignedForDevice.Items.Add(new RadComboBoxItem("Android Tablet", Constants.ANDROID_TABLET));
                break;
             case Constants.ANDROID_PHONE:
                 DesignedForDevice.Items.Add(new RadComboBoxItem("iPhone", Constants.IPHONE));
                  DesignedForDevice.Items.Add(new RadComboBoxItem("iPad", Constants.IPAD));
                 DesignedForDevice.Items.Add(new RadComboBoxItem("Android Tablet", Constants.ANDROID_TABLET));
                break;
              case Constants.ANDROID_TABLET:
                 DesignedForDevice.Items.Add(new RadComboBoxItem("iPhone", Constants.IPHONE));
                  DesignedForDevice.Items.Add(new RadComboBoxItem("iPad", Constants.IPAD));
                 DesignedForDevice.Items.Add(new RadComboBoxItem("Android Phone", Constants.ANDROID_PHONE));
                break;
        }
     }
 }
    public void InitCurrentApp(string app)
    {
        try
        {
            Hashtable State = (Hashtable)HttpRuntime.Cache[Session.SessionID];
            CurrentApp.SelectedValue = app;
            Util util = new Util();
            if (app.Contains("->"))
            {
                ResetAppStateVariables();
                DesignMessage.Text = "Select an App or Click the New App Icon";
                State["SelectedDeviceType"] = Constants.IPHONE;
                //State["SelectedDeviceView"] = Constants.IPHONE;
                SetViewForDevice();
                HideAppControls();
                AppName.Text = "";
                return;
            }
            State["SelectedApp"] = app;
            AppName.Text = app;
            State["SelectedAppType"] = util.GetAppType(State);
            switch (State["SelectedAppType"].ToString())
            {
                case Constants.NATIVE_APP_TYPE:
                    Response.Redirect("TabDesignNative.aspx", false);
                    break;
                case Constants.WEB_APP_TYPE:
                     break;
                case Constants.HYBRID_APP_TYPE:
                    Response.Redirect("TabDesignHybrid.aspx", false);
                    break;
            }
            XmlUtil x_util = new XmlUtil();
            util.GetStagingAppXml(State, app);
           // State["SelectedDeviceView"] =
            State["SelectedDeviceType"] = x_util.GetAppDeviceType(State);
            if (State["SelectedDeviceType"] == null)
            {
               // State["SelectedDeviceView"] =
                State["SelectedDeviceType"] = Constants.IPHONE;
            }
            if (State["SelectedDeviceType"].ToString() == Constants.IPAD ||
                State["SelectedDeviceType"].ToString() == Constants.ANDROID_TABLET)
            {
                State["BackgroundColor"] = x_util.GetBackgroundColor(State);
            }
            DeviceType.Text = State["SelectedDeviceType"].ToString();
            SetViewForDevice();

            InitAppPages();
             DesignMessage.Text = "";

            string html = x_util.GetFirstAppPage(State);
            State["PageHtml"] = html;

            DefaultButtonImage.Text = util.GetDefaultButton(State);

            AppPages.SelectedValue = State["SelectedAppPage"].ToString();

            ShowAppControls();
        }
        catch (Exception ex)
        {
            Util util = new Util();
            Hashtable State = (Hashtable)HttpRuntime.Cache[Session.SessionID];
            util.LogError(State, ex);
            Message.Text = "Internal Error: " + ex.Message + ": " + ex.StackTrace;
        }
    }
    public void ShowPage(string page_name)
    {
        PageName.Text = page_name;
        try
        {
            XmlUtil x_util = new XmlUtil();

            Hashtable State = (Hashtable)HttpRuntime.Cache[Session.SessionID];
            if (State["SelectedDeviceType"] == null /*|| State["SelectedDeviceView"] == null*/)
            {
                string device_type = x_util.GetAppDeviceType(State);
                 State["SelectedDeviceType"] = device_type;
                // State["SelectedDeviceView"] = device_type;
                DeviceType.Text =  State["SelectedDeviceType"].ToString();
            }

            if (page_name != null)
            {
                string html = x_util.GetAppPage(State, page_name);
                if (html.StartsWith("Error:"))
                {
                    Message.Text = html;
                    return;
                }

                 State["PageHtml"] = html;
                 Util util = new Util();
                 if (State["DoSavePage"] != null)
                 {
                     State["DoSavePage"] = null;
                     util.SavePageImage(State, page_name, html);
                 }
                DefaultButtonImage.Text = util.GetDefaultButton(State);
            }
            else
            {
                 State["PageHtml"] = "";
                DefaultButtonImage.Text = ConfigurationManager.AppSettings["DefaultWebAppButtonImage"];
            }
        }
        catch (Exception ex)
        {
            Util util = new Util();
            Hashtable State = (Hashtable)HttpRuntime.Cache[Session.SessionID];
            util.LogError(State, ex);
            Message.Text = "Internal Error: " + ex.Message + ": " + ex.StackTrace;
        }
    }
    private bool ApplicationInit(Hashtable State, RadComboBox AppsList, string AppID, string AppCGCustomerCode)
    {
        Util util = new Util();
        string app = AppsList.SelectedValue;

        if (app.Contains("->"))
            return false;

        State["SelectedApp"] = app;

        State["SelectedAppType"] = util.GetAppType(State);

        State["application_id"] = util.GetAppID(State);
        AppID = State["application_id"].ToString();

        BillingUtil billingutil = new BillingUtil();
        AppCGCustomerCode = billingutil.getAppPaidSKU(State);

        if (State["SelectedDeviceType"] == null)
        {
            State["SelectedDeviceView"] = State["SelectedDeviceType"] = Constants.IPHONE;
        }

        XmlUtil x_util = new XmlUtil();
        State["SelectedDeviceView"] = State["SelectedDeviceType"] = x_util.GetAppDeviceType(State);

        string username = State["Username"].ToString();
        State["customer_id"] = util.GetCustomerIDFromUsername(State, username);

        return true;
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        Util util = new Util();
        Hashtable State = (Hashtable)HttpRuntime.Cache[Session.SessionID];
        if (State == null || State.Count <= 2) { Page.ClientScript.RegisterStartupScript(this.GetType(), Guid.NewGuid().ToString(), "timeOut('../../Default.aspx');", true); return; }

        try
        {
            ClearMessages();

            State["ApplicationID"] = util.GetAppID(State);

            App.Text = "Test Web App Name: " +  State["SelectedApp"].ToString();

            if (util.IsAppStoreSubmissionPaid(State,  State["SelectedApp"].ToString()))
            {
                //SubmitForProvisioning.Visible = true;
                PurchaseButton.Visible = false;
             }
            else
            {
                //SubmitForProvisioning.Visible = false;
                PurchaseButton.Visible = true;
                //ProvisioningMessage.Text = "You can fill this form any time, but to submit your app for production, you need to first purchase one of the ViziApps services to submit the app to an app store.";
                PurchaseButton.Attributes.Add("onclick", PopupHelper.GeneratePopupScript(
        "http://stores.homestead.com/MobiFlexStore/StoreFront.bok", 700, 900, false, false, false, true));
            }

            if (!IsPostBack)
            {
                XmlUtil x_util = new XmlUtil();
                //State["SelectedDeviceView"] =
                State["SelectedDeviceType"] = x_util.GetAppDeviceType(State);
                if (State["SelectedDeviceType"] == null)
                {
                   // State["SelectedDeviceView"] =
                    State["SelectedDeviceType"] = Constants.IPHONE;
                }

                //check on device type
                switch(State["SelectedDeviceType"].ToString())
                {
                     case Constants.IPAD:
                        SplashUploadLabel.Text = "Splash Image ( 768 X 1004 pixels from .jpg file )";
                        ScreenSplashButton.Attributes.Add("onclick", PopupHelper.GeneratePopupScript(
                                "ScreenShot.aspx", 1004, 768, false, false, false, true));
                        break;
                     case Constants.ANDROID_TABLET:
                        SplashUploadLabel.Text = "Splash Image ( 800 X 1233 pixels from .jpg file )";
                        ScreenSplashButton.Attributes.Add("onclick", PopupHelper.GeneratePopupScript(
                                "ScreenShot.aspx", 1233, 800, false, false, false, true));
                        break;
                     case Constants.IPHONE:
                        SplashUploadLabel.Text = "Splash Image ( 320 X 460 pixels from .jpg file )";
                        ScreenSplashButton.Attributes.Add("onclick", PopupHelper.GeneratePopupScript(
                                "ScreenShot.aspx", 460, 320, false, false, false, true));
                       break;
                     case Constants.ANDROID_PHONE:
                        SplashUploadLabel.Text = "Splash Image ( 320 X 508 pixels from .jpg file )";
                         ScreenSplashButton.Attributes.Add("onclick", PopupHelper.GeneratePopupScript(
                                "ScreenShot.aspx", 508, 320, false, false, false, true));
                      break;
                }
                SelectedDeviceType.Text = State["SelectedDeviceType"].ToString();

                DB db = new DB();
                StringBuilder b_sql = new StringBuilder("SELECT * FROM applications ");
                b_sql.Append("WHERE application_name='" +  State["SelectedApp"].ToString() + "'");
                b_sql.Append(" AND customer_id='" +  State["CustomerID"].ToString() + "'");
                DataRow[] rows = db.ViziAppsExecuteSql(State, b_sql.ToString());
                DataRow row = rows[0];
                if (row["production_app_name"] != null)
                    ProductionAppName.Text = row["production_app_name"].ToString();

                if (row["production_app_xml"] != DBNull.Value)
                    ProductionDesignExists.Visible = true;
                else
                    ProductionDesignExists.Visible = false;

                 bool use_1_user_credential = false;
                if (row["use_1_user_credential"] != DBNull.Value)
                {
                    string use_1_cred =  row["use_1_user_credential"].ToString();
                    use_1_user_credential = (use_1_cred.ToLower() == "true") ? true : false;
                }
                bool has_unlimited_users = false;
                if (row["has_unlimited_users"] != DBNull.Value)
                {
                    string has_unlimited = row["has_unlimited_users"].ToString();
                    has_unlimited_users = (has_unlimited.ToLower() == "true") ? true : false;
                }

                b_sql = new StringBuilder("SELECT * FROM branding_images ");
                b_sql.Append("WHERE application_id='" +  State["ApplicationID"].ToString() + "'");
                rows = db.ViziAppsExecuteSql(State, b_sql.ToString());
                foreach (DataRow image_row in rows)
                {
                    if (image_row["type"].ToString() == "icon" && image_row["width"].ToString() == "512")
                    {
                        LargeIconButton.Visible = true;
                        DeleteIcon.Visible = true;
                    }
                    if (image_row["type"].ToString() == "splash")
                    {
                        ScreenSplashButton.Visible = true;
                        DeleteSplashImage.Visible = true;
                    }
                }
                db.CloseViziAppsDatabase(State);

            }

        }
        catch (Exception ex)
        {
            util.ProcessMainExceptions(State, Response, ex);
        }
    }
Esempio n. 8
0
    public string GetWebApp(Hashtable State,XmlDocument xmlDoc, double x_size_factor,double y_size_factor )
    {
        try
        {
            XmlUtil x_util = new XmlUtil();
            Util util = new Util();
            DataSources DS = new DataSources();
            HtmlDocument htmlDoc = new HtmlDocument();

            //Load App Foundation
            StringBuilder NewWebAppHtml = new StringBuilder( HttpRuntime.Cache["NewWebAppHtml"].ToString());
            if (State["IsProduction"] == null)
                State["IsProduction"] = false;
            if ((bool)State["IsProduction"]== true)
            {
                string production_app_name = util.GetProductionAppName(State);
                NewWebAppHtml.Replace("CUSTOM_TITLE", production_app_name);
            }
            else
            {
                NewWebAppHtml.Replace("CUSTOM_TITLE", State["SelectedApp"].ToString());
            }

            /*if(false)
            {
                 NewWebAppHtml.Replace("ADDON_VIZIAPPS_SCRIPTS",  HttpRuntime.Cache["ShareThisScripts"].ToString());
            }
            else*/
                NewWebAppHtml.Replace("ADDON_VIZIAPPS_SCRIPTS", "");

                        //add custom header html
            NewWebAppHtml.Replace("CUSTOM_ACCOUNT_HEADER",util.GetCustomHeaderHTML(State));

            htmlDoc.LoadHtml(NewWebAppHtml.ToString());
            HtmlNode root = htmlDoc.DocumentNode;

            //Load Custom App Init
            StringBuilder customInitScript = new StringBuilder();
            string application_id = util.GetAppID(State);
            customInitScript.Append("var app_id = '" + application_id + "';\n");

            string app_time_stamp = null;
            if ((bool)State["IsProduction"] == false)
                app_time_stamp = util.GetStagingAppTimeStamp(State, application_id);
            else
                app_time_stamp = util.GetProductionAppTimeStamp(State, application_id);

            if (State["SelectedDeviceType"] == null)
                State["SelectedDeviceType"] = Constants.IPHONE;

            customInitScript.Append("\tvar app_time_stamp = '" + app_time_stamp + "';\n");
            customInitScript.Append("\tvar customer_id = '" + State["CustomerID"].ToString() + "';\n");
            customInitScript.Append("\tvar customer = '" + State["Username"].ToString() + "';\n");
            customInitScript.Append("\tvar app_name = '" + State["SelectedApp"].ToString() + "';\n");
            customInitScript.Append("\tvar design_device_type = '" + State["SelectedDeviceType"].ToString().ToLower() + "';\n");
            string viziapps_transition_type = null;
            if(State["PageTransitionType"] != null)
                viziapps_transition_type = State["PageTransitionType"].ToString();
            else
                 viziapps_transition_type ="slide";
            customInitScript.Append("\tvar viziapps_transition_type = '" + viziapps_transition_type + "';\n");

            switch (State["SelectedDeviceType"].ToString())
            {
                case Constants.IPHONE:
                case Constants.ANDROID_PHONE:
                default:
                    customInitScript.Append("\tvar ios_landscape_width_factor = " + Constants.IPHONE_LANDSCAPE_WIDTH_FACTOR + ";\n");
                    customInitScript.Append("\tvar ios_landscape_height_factor = " + Constants.IPHONE_LANDSCAPE_HEIGHT_FACTOR + ";\n");
                    customInitScript.Append("\tvar android_landscape_width_factor = " + Constants.ANDROID_PHONE_LANDSCAPE_WIDTH_FACTOR + ";\n");
                    customInitScript.Append("\tvar android_landscape_height_factor = " + Constants.ANDROID_PHONE_LANDSCAPE_HEIGHT_FACTOR + ";\n");
                    break;
                case Constants.ANDROID_TABLET:
                case Constants.IPAD:
                    customInitScript.Append("\tvar ios_landscape_width_factor = " + Constants.IPAD_LANDSCAPE_WIDTH_FACTOR + ";\n");
                    customInitScript.Append("\tvar ios_landscape_height_factor = " + Constants.IPAD_LANDSCAPE_HEIGHT_FACTOR + ";\n");
                    customInitScript.Append("\tvar android_landscape_width_factor = " + Constants.ANDROID_TABLET_LANDSCAPE_WIDTH_FACTOR + ";\n");
                    customInitScript.Append("\tvar android_landscape_height_factor = " + Constants.ANDROID_TABLET_LANDSCAPE_HEIGHT_FACTOR + ";\n");
                    break;
                }

            if((bool)State["IsProduction"])
                 customInitScript.Append("\tvar is_production = true;\n");
            else
                customInitScript.Append("\tvar is_production = false;\n");

            string device_type = x_util.GetAppDeviceType(State);
            if (device_type == Constants.IPAD || device_type == Constants.ANDROID_TABLET)
                customInitScript.Append("\tvar does_background_image_exist = false;\n");
            else
                customInitScript.Append("\tvar does_background_image_exist = true;\n");

            if (DS.DoesAppUseGoogleSpreadsheets(State))
            {
                customInitScript.Append("\tvar doesAppUseGoogleSpreadsheets = true;\n");
                customInitScript.Append("\tvar isGoogleDataLoaded = false;\n");
                customInitScript.Append("google.load('gdata', '2.x');\n");
                customInitScript.Append("google.setOnLoadCallback(onGoogleDataLoad);\n");
                customInitScript.Append("function onGoogleDataLoad() {isGoogleDataLoaded=true;}\n");
            }
            else
            {
                customInitScript.Append("\tvar doesAppUseGoogleSpreadsheets = false;\n");
                customInitScript.Append("\tvar isGoogleDataLoaded = false;\n");
            }

            customInitScript.Append("\tvar latitude;\n");
            customInitScript.Append("\tvar longitude;\n");

            //get app icon
            HtmlNode head_node = root.SelectSingleNode("//head");
            HtmlNode icon_node = htmlDoc.CreateElement("link");
            icon_node.Attributes.Append(htmlDoc.CreateAttribute("rel", "apple-touch-icon"));
            if (device_type == Constants.IPAD || device_type == Constants.ANDROID_TABLET)
            {
                if ((bool)State["IsProduction"] == false)
                {
                    icon_node.Attributes.Append(htmlDoc.CreateAttribute("href", "http://viziapps.s3-website-us-east-1.amazonaws.com/apps/viziapps_icon_ipad.png"));
                }
                else
                {
                    icon_node.Attributes.Append(htmlDoc.CreateAttribute("href", util.GetApplicationIcon(State, application_id, "72")));
                }
            }
            else
            {
                if ((bool)State["IsProduction"] == false)
                {
                    icon_node.Attributes.Append(htmlDoc.CreateAttribute("href", "http://viziapps.s3-website-us-east-1.amazonaws.com/apps/viziapps_icon.jpg"));
                }
                else
                {
                    icon_node.Attributes.Append(htmlDoc.CreateAttribute("href", util.GetApplicationIcon(State, application_id, "57")));
                }
            }

            head_node.AppendChild(icon_node);

            if (device_type == Constants.IPAD || device_type == Constants.ANDROID_TABLET)
            {
                HtmlNode ipad_splash_node = htmlDoc.CreateElement("link");
                ipad_splash_node.Attributes.Append(htmlDoc.CreateAttribute("rel", "apple-touch-startup-image"));
                ipad_splash_node.Attributes.Append(htmlDoc.CreateAttribute("media", "screen and (min-device-width: 481px) and (max-device-width: 1024px) and (orientation:landscape)"));
                if ((bool)State["IsProduction"] == false)
                {
                    ipad_splash_node.Attributes.Append(htmlDoc.CreateAttribute("href", "http://viziapps.s3-website-us-east-1.amazonaws.com/apps/viziapps_splash_ipad_landscape.jpg"));
                }
                else
                {
                    ipad_splash_node.Attributes.Append(htmlDoc.CreateAttribute("href", util.GetApplicationSplashImage(State, application_id)));
                }
                head_node.AppendChild(ipad_splash_node);

                HtmlNode ipad_splash_node2 = htmlDoc.CreateElement("link");
                ipad_splash_node2.Attributes.Append(htmlDoc.CreateAttribute("rel", "apple-touch-startup-image"));
                ipad_splash_node2.Attributes.Append(htmlDoc.CreateAttribute("media", "screen and (min-device-width: 481px) and (max-device-width: 1024px) and (orientation:portrait)"));
                if ((bool)State["IsProduction"] == false)
                {
                    ipad_splash_node2.Attributes.Append(htmlDoc.CreateAttribute("href", "http://viziapps.s3-website-us-east-1.amazonaws.com/apps/viziapps_splash_ipad_portrait.jpg"));
                }
                else
                {
                    ipad_splash_node2.Attributes.Append(htmlDoc.CreateAttribute("href", util.GetApplicationSplashImage(State, application_id)));
                }
                head_node.AppendChild(ipad_splash_node2);
            }
            else  //<link rel="apple-touch-startup-image" href="/startup.png">
            {
                HtmlNode splash_node = htmlDoc.CreateElement("link");
                splash_node.Attributes.Append(htmlDoc.CreateAttribute("rel", "apple-touch-startup-image"));
                if ((bool)State["IsProduction"] == false)
                {
                    splash_node.Attributes.Append(htmlDoc.CreateAttribute("href", "http://viziapps.s3-website-us-east-1.amazonaws.com/apps/viziapps_splash.jpg"));
                }
                else
                {
                    splash_node.Attributes.Append(htmlDoc.CreateAttribute("href", util.GetApplicationSplashImage(State, application_id)));
                }
                head_node.AppendChild(splash_node);
            }

            string backgroundUrl = null;
            if (device_type != Constants.IPAD)
            {
                //get background image
                XmlNode configuration_node = xmlDoc.SelectSingleNode("//configuration");
                XmlNode background_node = configuration_node.SelectSingleNode("background");
                if (background_node == null)
                {
                    background_node = x_util.CreateNode(xmlDoc, configuration_node, "background");
                }
                XmlNode background_image_node = background_node.SelectSingleNode("image_source");
                if (background_image_node == null)
                {
                    background_image_node = x_util.CreateNode(xmlDoc, background_node, "image_source", "https://s3.amazonaws.com/MobiFlexImages/apps/images/backgrounds/standard_w_header_iphone.jpg");
                }
                string background_image = background_image_node.InnerText;
                if (background_image.Contains("s3.amazonaws.com"))
                {
                    if (State["SelectedDeviceType"].ToString() == Constants.ANDROID_PHONE)
                        background_image = background_image.Replace("_iphone.", "_android.");
                    backgroundUrl = background_image;
                }
                else
                {
                    background_image = background_image.Substring(background_image.LastIndexOf("/") + 1);
                    if (State["SelectedDeviceType"].ToString() == Constants.ANDROID_PHONE)
                        background_image = background_image.Replace("_iphone.", "_android.");

                    backgroundUrl = "https://s3.amazonaws.com/MobiFlexImages/apps/images/backgrounds/" + background_image;
                }
            }

            //Load App Pages
            XmlNodeList page_nodes = xmlDoc.SelectNodes("//pages/page");
            if (page_nodes == null)
                return "";

            //get first page
            XmlNode first_page_name_node = xmlDoc.SelectSingleNode("//pages/first_page_name");
            ArrayList page_node_list = new ArrayList();
            string first_page_name = "";
            if (first_page_name_node != null)
            {
                first_page_name = first_page_name_node.InnerText;
                foreach (XmlNode page_node in page_nodes)
                {
                    if (page_node.SelectSingleNode("name").InnerText == first_page_name)
                    {
                        page_node_list.Add(page_node);
                        break;
                    }
                }
            }

            foreach (XmlNode page_node in page_nodes)
            {
                if (page_node.SelectSingleNode("name").InnerText != first_page_name)
                {
                    page_node_list.Add(page_node);
                }
            }

            HtmlNode body_node = root.SelectSingleNode("//body");

            StringBuilder functions = new StringBuilder();

            if ((bool)State["IsProduction"] == false && State["SelectedAppType"].ToString() == Constants.HYBRID_APP_TYPE)
            {
                //add first function to go to login page
                StringBuilder settings_actions = new StringBuilder("$('#viziapps_login_button').bind('tap',function(event){\n");
                settings_actions.Append("\t\twindow.plugins.vsettings.login(null,null);\n");
                settings_actions.Append("\t\tevent.stopPropagation();\n");
                settings_actions.Append("\t});\n");
                functions.Append(settings_actions.ToString());
            }

            bool isFirstPage = true;
            foreach (XmlNode page_node in page_node_list)
            {
                ArrayList dialogs_in_page = new ArrayList();
                HtmlNode html_page_node = htmlDoc.CreateElement("div");
                html_page_node.Attributes.Append(htmlDoc.CreateAttribute("data-role", "page"));
                html_page_node.Attributes.Append(htmlDoc.CreateAttribute("id", page_node.SelectSingleNode("name").InnerText));
                if (device_type == Constants.IPAD || device_type == Constants.ANDROID_TABLET)
                    html_page_node.Attributes.Append(htmlDoc.CreateAttribute("style", "background-image: none; background-color:" + x_util.GetBackgroundColor(State)));

                HtmlNode content_node = htmlDoc.CreateElement("div");
                content_node.Attributes.Append(htmlDoc.CreateAttribute("data-role", "content"));
                content_node.Attributes.Append(htmlDoc.CreateAttribute("style", "background-image:none;background-color:transparent"));
                html_page_node.AppendChild(content_node);

                //create separate background image for phones
                if (device_type != Constants.IPAD)
                {
                    HtmlNode field_node = htmlDoc.CreateElement("div");
                    Size size = util.GetImageSize(backgroundUrl);
                    if (size != null)
                    {
                        double background_width = Convert.ToDouble(size.Width) * x_size_factor;
                        double background_height = Convert.ToDouble(size.Height) * y_size_factor;
                        field_node.Attributes.Append(htmlDoc.CreateAttribute("style", "z-index:1;position:absolute;left:0px;top:0px; width:" + background_width.ToString() + "px;height:" + background_height.ToString() + "px;"));
                    }

                    x_util.AddImageNode(htmlDoc, field_node, backgroundUrl);
                    content_node.AppendChild(field_node);
                }

                XmlNode fields_node = page_node.SelectSingleNode("fields");
                if (fields_node == null)
                    continue;

                XmlNodeList field_list = page_node.SelectSingleNode("fields").ChildNodes;
                foreach (XmlNode field in field_list)
                {
                    Hashtable field_map = x_util.ParseXmlToHtml(field);
                    HtmlNode field_node = null;
                    switch (field.Name)
                    {
                        case "text_field":
                        case "hidden_field":
                             field_node = htmlDoc.CreateElement("input");
                            break;
                        case "map":
                        case "photo":
                        case "gps":
                            continue;
                        case "alert":
                        case "button":
                        case "image_button":
                            field_node = htmlDoc.CreateElement("a");
                            break;
                        default:
                            field_node = htmlDoc.CreateElement("div");
                            break;
                    }

                   content_node.AppendChild(field_node);
                   field_node.Attributes.Append(htmlDoc.CreateAttribute("field_type", field.Name));
                   SetCommonHtmlAttributes(htmlDoc, field_node, field_map, x_size_factor, y_size_factor, field.Name);

                    switch (field.Name)
                    {
                        case "image":
                            string image_url = field_map["image_source"].ToString();
                            if (!field_map.ContainsKey("width")) //the xml does not have the width and height so use the width and height of the actual image
                            {
                                Size size = util.GetImageSize(image_url);
                                if (size != null)
                                {
                                    field_node.Attributes["style"].Value += "width:" + size.Width.ToString() + "px;height:" + size.Height.ToString() + "px;";
                                }
                            }
                            x_util.AddImageNode(htmlDoc, field_node, image_url);
                            break;
                        case "audio":
                            break;
                        case "label":
                            field_node.InnerHtml = field_map["text"].ToString();
                            field_node.Attributes["style"].Value += "text-shadow:none;";
                            break;
                        case "text_field":
                            field_node.Attributes["style"].Value += "background-color:#f0f0f0;text-shadow:none;padding:4px;margin:0px";
                            if (field_map["text"] != null)
                            {
                                HtmlAttribute text_field_value = htmlDoc.CreateAttribute("value");
                                text_field_value.Value = HttpUtility.HtmlAttributeEncode(field_map["text"].ToString());
                                field_node.Attributes.Append(text_field_value);
                            }
                            field_node.Attributes.Append(htmlDoc.CreateAttribute("type", field_map["type"].ToString()));
                            break;
                        case "text_area":
                            field_node.Attributes["style"].Value += "overflow-y: hidden;";
                            HtmlNode nav = htmlDoc.CreateElement("nav");
                            field_node.AppendChild(nav);
                            HtmlNode textarea = htmlDoc.CreateElement("textarea");
                            textarea.Attributes.Append(htmlDoc.CreateAttribute("data-role","none" ));
                            textarea.Attributes.Append(htmlDoc.CreateAttribute("style", "text-shadow:none;margin: 0px;padding: 7px 7px 7px 7px;border-color:#aaaaaa;"));
                            SetTextHtmlAttributes(textarea, field_map);
                            if (field_map["edit_type"] != null && field_map["edit_type"].ToString() == "non_editable")
                                textarea.Attributes.Append(htmlDoc.CreateAttribute("readonly", "readonly"));
                            textarea.InnerHtml = HttpUtility.HtmlEncode(field_map["text"].ToString().Replace("\\n", "\n"));
                            nav.AppendChild(textarea);
                             break;
                        case "image_button":
                            field_node.Attributes["style"].Value += "margin: 0 0 0 0;";
                             Hashtable imagebuttonAction = GetAction(field);
                            SetActions(page_node, field_map, imagebuttonAction, functions);
                            if (imagebuttonAction["next_page"] != null)
                                field_node.Attributes.Append(htmlDoc.CreateAttribute("href", "#" + imagebuttonAction["next_page"].ToString()));
                            else if (imagebuttonAction["previous_page"] != null)//do not use history function (commented code) because it does not work with embedded iframe. Use ChangePage instead
                            {
                                 field_node.Name = "div";
                            }
                            else
                                field_node.Attributes.Append(htmlDoc.CreateAttribute("href", "#"));

                            HtmlNode image_button_node = htmlDoc.CreateElement("img");
                            image_button_node.Attributes.Append(htmlDoc.CreateAttribute("src", field_map["image_source"].ToString()));
                            image_button_node.Attributes.Append(htmlDoc.CreateAttribute("width", "100%"));
                            image_button_node.Attributes.Append(htmlDoc.CreateAttribute("height", "100%"));
                            field_node.AppendChild(image_button_node);
                           break;
                        case "button":
                            field_node.Attributes["style"].Value += "margin: 0 0 0 0;";
                            Hashtable buttonAction = GetAction(field);
                            Boolean isActiveButton = true;
                            if (buttonAction["next_page"] != null)
                            {
                                field_node.Attributes.Append(htmlDoc.CreateAttribute("href", "#" + buttonAction["next_page"].ToString()));
                            }
                            else if (buttonAction["previous_page"] != null)//do not use history function (commented code) because it does not work with embedded iframe. Use ChangePage instead
                            {
                                field_node.Name = "div";
                            }
                            else
                            {
                                field_node.Name = "div";
                                isActiveButton = false;
                            }

                            if (isActiveButton)
                            {
                                field_node.Attributes.Append(htmlDoc.CreateAttribute("data-role", "button"));
                                field_node.Attributes.Append(htmlDoc.CreateAttribute("data-inline", "true"));
                                field_node.Attributes.Append(htmlDoc.CreateAttribute("data-transition", viziapps_transition_type));
                            }

                            //get the button theme
                            if (field_map["image_source"] != null)
                            {
                                string button_image_url = field_map["image_source"].ToString();
                                string theme = button_image_url.Substring(button_image_url.LastIndexOf("/") + 1);
                                if (theme == "a" || theme == "b" || theme == "c" || theme == "d" || theme == "e")
                                     field_node.Attributes.Append(htmlDoc.CreateAttribute("data-theme", theme));
                                else
                                    field_node.Attributes["style"].Value += "background-image:url(" + field_map["image_source"].ToString() + ");background-size:100% 100%;";
                            }
                            else
                            {
                                field_node.Attributes.Append(htmlDoc.CreateAttribute("data-theme", "b"));
                            }

                            SetActions(page_node, field_map, buttonAction, functions);
                            HtmlNode button_table_node = htmlDoc.CreateElement("table");
                            int height_start = field_node.Attributes["style"].Value.IndexOf("height:") + 7;
                            int height_end = field_node.Attributes["style"].Value.IndexOf("px", height_start);
                            button_table_node.Attributes.Append(htmlDoc.CreateAttribute("style", "width:100%;height:" +
                            field_node.Attributes["style"].Value.Substring(height_start, height_end - height_start) + "px"));
                            HtmlNode row_node = htmlDoc.CreateElement("tr");
                            HtmlNode column_node = htmlDoc.CreateElement("td");
                            column_node.InnerHtml = field_map["text"].ToString();
                            column_node.Attributes.Append(htmlDoc.CreateAttribute("style", "text-shadow:none;display:table-cell; vertical-align:middle;text-align:center"));
                            row_node.AppendChild(column_node);
                            button_table_node.AppendChild(row_node);
                            field_node.AppendChild(button_table_node);
                            break;
                        case "picker":
                            field_node.Attributes.Append(htmlDoc.CreateAttribute("data-role", "fieldcontain"));
                            field_node.Attributes["style"].Value += "height:25px;font-size:16px;margin: 0 0 0 0;padding: 0 0 0 0;";

                            HtmlNode select_node = htmlDoc.CreateElement("select");
                            select_node.Attributes.Append(htmlDoc.CreateAttribute("name", field_map["id"].ToString()));
                            select_node.Attributes.Append(htmlDoc.CreateAttribute("id", field_map["id"].ToString()));
                            select_node.Attributes.Append(htmlDoc.CreateAttribute("data-native-menu", "false"));
                            field_node.AppendChild(select_node);

                            string picker_type = field_map["picker_type"].ToString();
                            if (picker_type.Contains("section"))
                            {
                                XmlNodeList picker_fields = field.SelectNodes("picker_fields/picker_field");
                                StringBuilder option_list = new StringBuilder();
                                foreach (XmlNode picker_field in picker_fields) //this code does not process multiple fields yet
                                {
                                    XmlNode name_node = picker_field.SelectSingleNode("name");
                                    XmlNode options_node = picker_field.SelectSingleNode("options");
                                    if (options_node != null)
                                    {
                                        string option_string = options_node.InnerText;
                                        string[] picker_option_list = option_string.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                                        foreach (string option in picker_option_list)
                                        {
                                            HtmlNode option_node = htmlDoc.CreateElement("option");
                                            option_node.Attributes.Append(htmlDoc.CreateAttribute("value", option));
                                            option_node.InnerHtml = option;
                                            select_node.AppendChild(option_node);
                                        }
                                    }
                                }
                            }
                            break;
                        case "switch":
                            field_node.Attributes["style"].Value += "margin: 0 0 0 0;";
                            Hashtable switchAction = GetAction(field);
                            SetActions(page_node, field_map, switchAction, functions);
                            string default_switch_value = field_map["default_value"].ToString();

                            field_node.Attributes.Append(htmlDoc.CreateAttribute("data-role", "fieldcontain"));

                            HtmlNode switch_node = htmlDoc.CreateElement("select");
                            switch_node.Attributes.Append(htmlDoc.CreateAttribute("data-role", "slider"));
                            HtmlNode option_off = htmlDoc.CreateElement("option");
                            option_off.Attributes.Append(htmlDoc.CreateAttribute("value", "off"));
                            HtmlNode option_on = htmlDoc.CreateElement("option");
                            option_on.Attributes.Append(htmlDoc.CreateAttribute("value", "on"));
                            switch_node.AppendChild(option_off);
                            switch_node.AppendChild(option_on);

                            if (field_map["type"] == null)
                                field_map["type"] = "on_off";

                            switch (field_map["type"].ToString())
                            {
                                case "on_off":
                                    option_off.InnerHtml = "Off";
                                    option_on.InnerHtml = "On";
                                    if (default_switch_value == "on")
                                        option_on.Attributes.Append(htmlDoc.CreateAttribute("selected", "selected"));
                                    else
                                        option_off.Attributes.Append(htmlDoc.CreateAttribute("selected", "selected"));
                                    break;
                                case "true_false":
                                    option_off.InnerHtml = "False";
                                    option_on.InnerHtml = "True";
                                    if (default_switch_value == "true")
                                        option_on.Attributes.Append(htmlDoc.CreateAttribute("selected", "selected"));
                                    else
                                        option_off.Attributes.Append(htmlDoc.CreateAttribute("selected", "selected"));
                                    break;
                                case "yes_no":
                                    option_off.InnerHtml = "No";
                                    option_on.InnerHtml = "Yes";
                                    if (default_switch_value == "yes")
                                        option_on.Attributes.Append(htmlDoc.CreateAttribute("selected", "selected"));
                                    else
                                        option_off.Attributes.Append(htmlDoc.CreateAttribute("selected", "selected"));
                                    break;
                            }
                            field_node.AppendChild(switch_node);

                            break;
                        case "checkbox":
                            field_node.Attributes["style"].Value += "margin: 0 0 0 0;";
                            Hashtable checkboxAction = GetAction(field);
                            SetActions(page_node, field_map, checkboxAction, functions);
                            HtmlNode checkbox_node = htmlDoc.CreateElement("input");
                            checkbox_node.Attributes.Append(htmlDoc.CreateAttribute("type", "checkbox"));
                            checkbox_node.Attributes.Append(htmlDoc.CreateAttribute("class", "custom"));
                            checkbox_node.Attributes.Append(htmlDoc.CreateAttribute("name", field_map["id"].ToString() + "_0"));
                            checkbox_node.Attributes.Append(htmlDoc.CreateAttribute("id", field_map["id"].ToString() + "_0"));
                            string default_value = field_map["default_value"].ToString();
                            if (default_value == "checked")
                                checkbox_node.Attributes.Append(htmlDoc.CreateAttribute("checked", "checked"));
                            field_node.AppendChild(checkbox_node);
                            HtmlNode checkbox_label_node = htmlDoc.CreateElement("label");
                            checkbox_label_node.InnerHtml = "&nbsp;";
                            checkbox_label_node.Attributes.Append(htmlDoc.CreateAttribute("for", field_map["id"].ToString() + "_0"));
                            field_node.AppendChild(checkbox_label_node);
                            break;
                        case "slider":
                            HtmlNode slider_node = htmlDoc.CreateElement("input");
                            slider_node.Attributes.Append(htmlDoc.CreateAttribute("name", field_map["id"].ToString()));
                            slider_node.Attributes.Append(htmlDoc.CreateAttribute("type", "range"));
                            slider_node.Attributes.Append(htmlDoc.CreateAttribute("min", field_map["min_value"].ToString()));
                            slider_node.Attributes.Append(htmlDoc.CreateAttribute("max", field_map["max_value"].ToString()));
                            double slider_value = (Convert.ToDouble(field_map["min_value"].ToString()) + Convert.ToDouble(field_map["max_value"].ToString())) / 2.0;
                            slider_node.Attributes.Append(htmlDoc.CreateAttribute("value", slider_value.ToString()));
                            slider_node.Attributes.Append(htmlDoc.CreateAttribute("data-theme", "b"));
                            slider_node.Attributes.Append(htmlDoc.CreateAttribute("data-track-theme", "c"));
                            field_node.AppendChild(slider_node);
                            break;
                        case "table":
                            HtmlNode table_nav_node = htmlDoc.CreateElement("nav");
                            HtmlNode table_node = htmlDoc.CreateElement("ul");
                            table_nav_node.AppendChild(table_node);
                            field_node.AppendChild(table_nav_node);
                            Hashtable tableActions = GetAction(field);
                            table_node.Attributes.Append(htmlDoc.CreateAttribute("data-role", "listview"));
                            table_node.Attributes.Append(htmlDoc.CreateAttribute("data-inset", "true"));
                            table_node.Attributes.Append(htmlDoc.CreateAttribute("data-theme", "d"));
                            HtmlNode header = htmlDoc.CreateElement("li");
                            header.Attributes.Append(htmlDoc.CreateAttribute("data-role", "list-divider"));
                            if (field_map["display_name"] == null)
                                header.InnerHtml = field_map["id"].ToString();
                            else
                                header.InnerHtml = field_map["display_name"].ToString();
                            table_node.AppendChild(header);

                            XmlNodeList table_fields = field.SelectNodes("table_fields/table_field");
                            StringBuilder table_option_list = new StringBuilder();
                            ArrayList rows = new ArrayList();
                            int field_index = 0;
                            string[] field_types = new string[table_fields.Count];
                            string[] field_name_list = new string[table_fields.Count];
                            string[,] table = null;
                            int n_rows = 0;
                            int n_cols = 0;
                            string hidden_field_name = null;
                            foreach (XmlNode table_field in table_fields)
                            {
                                XmlNode field_name_node = table_field.SelectSingleNode("name");
                                field_name_list[field_index] = field_name_node.InnerText;
                                XmlNode type_node = table_field.SelectSingleNode("type");
                                field_types[field_index] = type_node.InnerText;
                                if (type_node.InnerText == "hidden")
                                    hidden_field_name = field_name_list[field_index];
                                XmlNode options_node = table_field.SelectSingleNode("options");
                                if (options_node != null)
                                {
                                    string option_string = options_node.InnerText;
                                    string[] option_list = option_string.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                                    int row_index = 0;

                                    foreach (string option in option_list)
                                    {
                                        if (table == null) //the first array of options sets the number of rows
                                        {
                                            n_rows = option_list.Length;
                                            n_cols = table_fields.Count;
                                            table = new string[n_rows, n_cols];
                                        }
                                        if (row_index >= n_rows)
                                            return "Error: Field " + field_name_list[field_index] + " has more than the " + n_rows.ToString() + " rows in field " + field_name_list[0];
                                        table[row_index, field_index] = option;
                                        row_index++;
                                    }
                                }
                                else //when there are no preloaded lists create 1 row as a template for the others to come
                                {
                                    if (table == null)
                                    {
                                        n_rows = 1;
                                        n_cols = table_fields.Count;
                                        table = new string[n_rows, n_cols];
                                    }
                                    table[0, field_index] = "";

                                }
                                field_index++;
                            }

                            SetTableRowActions(page_node, field_map["id"].ToString(), field_map, tableActions, functions);

                            //selected how row will appear
                            string row_html = null;
                            switch (field_map["table_type"].ToString())
                            {
                                case "1text":
                                    row_html = Constants.one_text;
                                    break;
                                case "1texthidden":
                                    row_html = Constants.one_text_hidden;
                                    break;
                                case "2texts":
                                    row_html = Constants.two_texts;
                                    break;
                                case "2textshidden":
                                    row_html = Constants.two_texts_hidden;
                                    break;
                                case "image1text":
                                    row_html = Constants.image_1text;
                                    break;
                                case "image1texthidden":
                                    row_html = Constants.image_1text_hidden;
                                    break;
                                case "image2texts":
                                    row_html = Constants.image_2texts;
                                    break;
                                case "image2textshidden":
                                    row_html = Constants.image_2texts_hidden;
                                    break;
                            }
                            for (int r = 0; r < n_rows; r++)
                            {
                                HtmlNode row = htmlDoc.CreateElement("li");
                                row.Attributes.Append(htmlDoc.CreateAttribute("data-icon", "arrow-r"));
                                string id = field_map["id"].ToString() + "_" + r.ToString();
                                row.Attributes.Append(htmlDoc.CreateAttribute("id", id));
                                HtmlNode a = htmlDoc.CreateElement("a");
                                a.Attributes.Append(htmlDoc.CreateAttribute("data-transition", viziapps_transition_type));
                                if (tableActions["next_page"] != null)
                                {
                                    a.Attributes.Append(htmlDoc.CreateAttribute("href", "#" + tableActions["next_page"].ToString()));
                                }
                                else
                                    a.Attributes.Append(htmlDoc.CreateAttribute("href", "#"));

                                a.Attributes.Append(htmlDoc.CreateAttribute("style", "padding:0;width:100%"));
                                a.InnerHtml = row_html;
                                HtmlNode a_table = a.SelectSingleNode("table");
                                a_table.Attributes["style"].Value = "width:" + (Convert.ToInt16(field_map["width"].ToString())).ToString() + "px";
                                field_index = 0;
                                for (int c = 0; c < n_cols; c++)
                                {
                                    if (table[r, c] != null)
                                    {
                                        switch (field_types[field_index])
                                        {
                                            case "image":
                                                HtmlNode td_img = a.SelectSingleNode("table/tr/td");
                                                td_img.Attributes["name"].Value = field_name_list[field_index];
                                                HtmlNode img = td_img.SelectSingleNode("img");
                                                img.Attributes["src"].Value =  table[r, c];
                                                break;
                                            case "text":
                                                HtmlNode td  = null;
                                                int td_width_adjust = 30;
                                                switch (field_map["table_type"].ToString())
                                                {
                                                    case "1texthidden":
                                                    case "1text":
                                                        td = a.SelectSingleNode("table/tr/td");
                                                        break;
                                                    case "2textshidden":
                                                    case "2texts":
                                                        if (c == 0)
                                                            td = a.SelectSingleNode("table/tr/td");
                                                        else
                                                        {
                                                            td = a.SelectSingleNode("table/tr").NextSibling;
                                                            td = td.SelectSingleNode("td");
                                                        }
                                                        break;
                                                    case "image1texthidden":
                                                    case "image1text":
                                                        td = a.SelectSingleNode("table/tr/td").NextSibling;
                                                        td_width_adjust = 120;
                                                        break;
                                                    case "image2textshidden":
                                                    case "image2texts":
                                                        td_width_adjust = 120;
                                                        if (c == 1)
                                                            td = a.SelectSingleNode("table/tr/td").NextSibling;
                                                        else
                                                        {
                                                            td = a.SelectSingleNode("table/tr").NextSibling;
                                                            td = td.SelectSingleNode("td");
                                                        }
                                                        break;
                                                }

                                                td.Attributes["name"].Value =  field_name_list[field_index];
                                                HtmlNode td_div = td.SelectSingleNode("div");
                                                td_div.Attributes.Append(htmlDoc.CreateAttribute("style", "width:" + (Convert.ToInt16(field_map["width"].ToString()) - td_width_adjust).ToString() + "px"));
                                                td_div.InnerHtml = table[r, c];
                                                break;
                                            case "hidden":
                                                HtmlNode hidden = a.SelectSingleNode("table").NextSibling;
                                                hidden.Attributes["name"].Value = field_name_list[field_index];
                                                hidden.Attributes["value"].Value = table[r, c];
                                                break;
                                        }
                                    }
                                    field_index++;
                                }
                                row.AppendChild(a);
                                table_node.AppendChild(row);
                            }

                            break;
                        case "alert":
                            //<a href="foo.html" data-rel="dialog">Open dialog</a>
                            field_node.Attributes.Append(htmlDoc.CreateAttribute("data-role", "button"));
                            field_node.Attributes.Append(htmlDoc.CreateAttribute("data-rel", "dialog"));
                            field_node.Attributes.Append(htmlDoc.CreateAttribute("data-transition", "pop"));
                            field_node.Attributes.Append(htmlDoc.CreateAttribute("href", "#"+field_map["id"].ToString() + "_page"));
                            field_node.Attributes["style"].Value += "display:none";

                            HtmlNode alert_page_node = htmlDoc.CreateElement("div");
                            alert_page_node.Attributes.Append(htmlDoc.CreateAttribute("data-role", "page"));
                            alert_page_node.Attributes.Append(htmlDoc.CreateAttribute("field_type", "alert"));
                            alert_page_node.Attributes.Append(htmlDoc.CreateAttribute("id", field_map["id"].ToString() + "_page"));

                            HtmlNode alert_header = htmlDoc.CreateElement("div");
                            alert_header.Attributes.Append(htmlDoc.CreateAttribute("data-role", "header"));
                            alert_header.Attributes.Append(htmlDoc.CreateAttribute("data-theme", "d"));

                            HtmlNode alert_title = htmlDoc.CreateElement("h1");
                            alert_title.Attributes.Append(htmlDoc.CreateAttribute("id", field_map["id"].ToString() + "_title"));
                            alert_title.InnerHtml = "Alert";
                            alert_header.AppendChild(alert_title);

                            alert_page_node.AppendChild(alert_header);

                            HtmlNode alert_content_node = htmlDoc.CreateElement("div");
                            alert_content_node.Attributes.Append(htmlDoc.CreateAttribute("data-role", "content"));
                            alert_content_node.Attributes.Append(htmlDoc.CreateAttribute("data-theme", "c"));

                            HtmlNode dialog_message = htmlDoc.CreateElement("p");
                            dialog_message.Attributes.Append(htmlDoc.CreateAttribute("id", field_map["id"].ToString() + "_message"));
                            dialog_message.InnerHtml = "Message";
                            alert_content_node.AppendChild(dialog_message);

                            alert_page_node.AppendChild(alert_content_node);

                            dialogs_in_page.Add(alert_page_node);
                            break;
                        case "hidden_field":
                            field_node.Attributes.Append(htmlDoc.CreateAttribute("type", "hidden"));
                            break;
                        case "html_panel":
                            field_node.Attributes.Append(htmlDoc.CreateAttribute("data-role", "none"));
                            field_node.Attributes["style"].Value += "margin: 0 0 0 0;overflow-x:auto;overflow-y:hidden;background-color:#ffffff;";
                            HtmlNode panel_nav = htmlDoc.CreateElement("nav");
                            field_node.AppendChild(panel_nav);
                            HtmlNode container_node = htmlDoc.CreateElement("div");
                            container_node.Attributes.Append(htmlDoc.CreateAttribute("style", "width:100%;height:100%;"));
                            container_node.InnerHtml = HttpUtility.HtmlDecode(field_map["html"].ToString());
                            panel_nav.AppendChild(container_node);
                            break;
                        case "web_view":
                            field_node.Attributes["style"].Value += "margin: 0 0 0 0;overflow-x:scroll;overflow-y:scroll";
                            HtmlNode iframe_node = htmlDoc.CreateElement("iframe");
                            field_node.AppendChild(iframe_node);
                            if(field_map["url"] == null)
                                iframe_node.Attributes.Append(htmlDoc.CreateAttribute("src",""));
                            else
                                 iframe_node.Attributes.Append(htmlDoc.CreateAttribute("src", field_map["url"].ToString()));
                            iframe_node.Attributes.Append(htmlDoc.CreateAttribute("width", "100%"));
                            iframe_node.Attributes.Append(htmlDoc.CreateAttribute("height", "100%"));
                            iframe_node.Attributes.Append(htmlDoc.CreateAttribute("style", "border-width:0;overflow-x:scroll;overflow-y:scroll"));
                            break;
                        case "gps":
                            break;
                        case "photo":
                            break;
                    }
                }

                if(isFirstPage){
                    isFirstPage = false;
                    if ((bool)State["IsProduction"] == false &&  State["SelectedAppType"].ToString() == Constants.HYBRID_APP_TYPE)
                    {
                        //add login button
                        HtmlNode login_button_node = htmlDoc.CreateElement("div");
                        int settings_button_left = 280;
                        int settings_button_top = 5;
                        int settings_button_height = 32;
                        if (x_size_factor != 1.0D)
                        {
                            settings_button_left = Convert.ToInt16(292.0D * x_size_factor);
                            settings_button_top = Convert.ToInt16(3.0D * y_size_factor);
                            settings_button_height = Convert.ToInt16(22.0D * y_size_factor);
                        }
                        login_button_node.Attributes.Append(htmlDoc.CreateAttribute("style", "position:absolute;height:" + settings_button_height.ToString() + "px;left:" + settings_button_left.ToString() + "px;top:" + settings_button_top.ToString() + "px;z-index:50000;width:" + settings_button_height.ToString() + "px;"));
                        login_button_node.Attributes.Append(htmlDoc.CreateAttribute("id", "viziapps_login_button"));
                        HtmlNode image_button_node = htmlDoc.CreateElement("img");
                        image_button_node.Attributes.Append(htmlDoc.CreateAttribute("src", "http://viziapps.s3-website-us-east-1.amazonaws.com/apps/viziapps_settings_button.png"));
                        image_button_node.Attributes.Append(htmlDoc.CreateAttribute("width", "100%"));
                        image_button_node.Attributes.Append(htmlDoc.CreateAttribute("height", "100%"));
                        login_button_node.AppendChild(image_button_node);
                        content_node.AppendChild(login_button_node);
                    }
                }
                body_node.AppendChild(html_page_node);
                if (dialogs_in_page.Count > 0)
                {
                    foreach (HtmlNode dialog_node in dialogs_in_page)
                    {
                        body_node.AppendChild(dialog_node);
                    }
                }

                //Set data source operations
                XmlNode data_sources = page_node.SelectSingleNode("data_sources");
                if (data_sources == null)
                    continue;

                XmlNodeList data_source_list = data_sources.SelectNodes("data_source");
                int data_source_index = 0;
                string page_name = page_node.SelectSingleNode("name").InnerText;
                foreach (XmlNode data_source in data_source_list)
                {
                    //get data source type
                    XmlNode data_source_id = data_source.SelectSingleNode("data_source_id");
                    XmlNode app_data_source_id = xmlDoc.SelectSingleNode("//application/data_sources/data_source/data_source_id[.='" + data_source_id.InnerText + "']");
                    if (app_data_source_id != null)
                    {
                        XmlNode data_source_type = app_data_source_id.ParentNode.SelectSingleNode("data_source_type");
                        string connection_string = app_data_source_id.ParentNode.SelectSingleNode("data_source_configuration/connection_string").InnerText;
                        if (data_source_type.InnerText == "google_spreadsheet")
                        {
                            XmlNode event_node = data_source.SelectSingleNode("event");
                            if (event_node == null)
                                continue;
                            XmlNode data_source_event_type = event_node.SelectSingleNode("data_source_event_type");
                            string sql_command_list_name = "data_source_operations_" + page_name + "_" + data_source_index.ToString();
                            if (data_source_event_type.InnerText == "page")
                            {
                                XmlNodeList sql_command_list = event_node.SelectNodes("data_source_operations/sql_commands/sql_command");
                                customInitScript.Append(SetDataSourceSqlCommands(xmlDoc, page_name, data_source_index, sql_command_list));

                                StringBuilder spreadsheet_actions = new StringBuilder();
                                if (page_name == first_page_name) //this binds to before the first page is shown
                                {
                                    spreadsheet_actions.Append("$(window).load(function() {\n");
                                    spreadsheet_actions.Append("\tdoGoogleDocsInterface(\"" + connection_string + "\"," + sql_command_list_name + ");\n");
                                    spreadsheet_actions.Append("});\n");
                                    functions.Append(spreadsheet_actions.ToString());
                                }

                                //this bind to before the page is shown after first time
                                else
                                {
                                    spreadsheet_actions.Append("$('#" + page_name + "').live('pagebeforeshow', function (event, ui) {\n");
                                    spreadsheet_actions.Append("\tdoGoogleDocsInterface(\"" + connection_string + "\"," + sql_command_list_name + ");\n");
                                    spreadsheet_actions.Append("});\n");
                                    functions.Append(spreadsheet_actions.ToString());
                                }
                            }
                            else if (data_source_event_type.InnerText == "field")
                            {
                                XmlNode data_source_event_field = event_node.SelectSingleNode("data_source_event_field");
                                XmlNodeList sql_command_list = event_node.SelectNodes("data_source_operations/sql_commands/sql_command");
                                customInitScript.Append(SetDataSourceSqlCommands(xmlDoc, page_name, data_source_index, sql_command_list));

                                StringBuilder spreadsheet_actions = new StringBuilder("\t$('#" + data_source_event_field.InnerText + "').bind('tap',function(event){\n");
                                spreadsheet_actions.Append("\tdoGoogleDocsInterface(\"" + connection_string + "\"," + sql_command_list_name + ");\n");
                                spreadsheet_actions.Append("\tevent.stopPropagation();\n");
                                spreadsheet_actions.Append("});\n");

                                functions.Append(spreadsheet_actions.ToString());
                            }
                        }
                    }
                    data_source_index++;
                }
            }

            //insert all custom scripts
            HtmlNodeCollection script_nodes = root.SelectNodes("//script");
            foreach (HtmlNode script_node in script_nodes)
            {
                if (script_node.InnerText.Contains("CUSTOM_VIZIAPPS_INIT"))
                {
                    script_node.InnerHtml = script_node.InnerHtml.Replace("CUSTOM_VIZIAPPS_INIT", customInitScript.ToString());
                }
                else if (script_node.InnerText.Contains("CUSTOM_VIZIAPPS_FUNCTIONS"))
                {
                    script_node.InnerHtml = script_node.InnerHtml.Replace("CUSTOM_VIZIAPPS_FUNCTIONS", functions.ToString());
                }
            }

            return htmlDoc.DocumentNode.WriteContentTo();
        }
        catch (Exception ex)
        {
            Util util = new Util();
            util.LogError(State, ex);
            throw new Exception(ex.Message + ": " + ex.StackTrace);
        }
    }
    private void page_refresh()
    {
        Util util = new Util();
        Hashtable State = (Hashtable)HttpRuntime.Cache[Session.SessionID];

        XmlUtil x_util = new XmlUtil();
        //State["SelectedDeviceView"] =
        State["SelectedDeviceType"] = x_util.GetAppDeviceType(State);
        if (State["SelectedDeviceType"] == null)
        {
            // State["SelectedDeviceView"] =
            State["SelectedDeviceType"] = Constants.IPHONE;
        }

        //check on device type
        switch (State["SelectedDeviceType"].ToString())
        {
            case Constants.IPAD:
                Web_SplashUploadLabel.Text = "Splash Image ( 768 X 1004 pixels from .jpg file )";
                Web_ScreenSplashButton.Attributes.Add("onclick", PopupHelper.GeneratePopupScript("../Dialogs/Publish/ScreenShot.aspx", 1004, 768, false, false, false, true));
                break;
            case Constants.ANDROID_TABLET:
                Web_SplashUploadLabel.Text = "Splash Image ( 800 X 1233 pixels from .jpg file )";
                Web_ScreenSplashButton.Attributes.Add("onclick", PopupHelper.GeneratePopupScript("../Dialogs/Publish/ScreenShot.aspx", 1233, 800, false, false, false, true));
                break;
            case Constants.IPHONE:
                Web_SplashUploadLabel.Text = "Splash Image ( 320 X 460 pixels from .jpg file )";
                Web_ScreenSplashButton.Attributes.Add("onclick", PopupHelper.GeneratePopupScript("../Dialogs/Publish/ScreenShot.aspx", 460, 320, false, false, false, true));
                break;
            case Constants.ANDROID_PHONE:
                Web_SplashUploadLabel.Text = "Splash Image ( 320 X 508 pixels from .jpg file )";
                Web_ScreenSplashButton.Attributes.Add("onclick", PopupHelper.GeneratePopupScript("../Dialogs/Publish/ScreenShot.aspx", 508, 320, false, false, false, true));
                break;
        }
        SelectedDeviceType.Text = State["SelectedDeviceType"].ToString();

        State["ApplicationID"] = util.GetAppID(State);

        if (State["SelectedAppType"].ToString().Contains("web"))
        {
            App.Text = "Test Web App Name: " + State["SelectedApp"].ToString();
            Web_SubmitPublishingForm.Visible = true;
            SubmitPublishingForm.Visible = false;
            SubmissionNotes.Visible = true;
            SubmissionNotesLabel.Visible = true;
        }

        else
        {
            App.Text = "Test Native/Hybrid App Name: " + State["SelectedApp"].ToString();
            SubmitPublishingForm.Visible = true;
            Web_SubmitPublishingForm.Visible = false;
            //Web_SubmissionNotes.Visible = true;
            //Web_SubmissionNotesLabel.Visible = true;
        }

        /*if (util.IsAppStoreSubmissionPaid(State, State["SelectedApp"].ToString()))
        {*/

            /*SubmissionNotes.Visible = true;
            SubmissionNotesLabel.Visible = true;*/
            //PurchaseButton.Visible = false;
        /*}
        else
        {
            SubmitForProvisioning.Visible = false;
            SubmissionNotes.Visible = false;
            SubmissionNotesLabel.Visible = false;
            //PurchaseButton.Visible = true;
            //ProvisioningMessage.Text = "You can fill this form any time, but to submit your app for production, you need to first purchase one of the ViziApps services to submit the app to an app store.";
            //PurchaseButton.Attributes.Add("onclick", PopupHelper.GeneratePopupScript("http://stores.homestead.com/MobiFlexStore/StoreFront.bok", 700, 900, false, false, false, true));

        }*/

        DB db = new DB();
        StringBuilder b_sql = new StringBuilder("SELECT * FROM applications ");
        b_sql.Append("WHERE application_name='" + State["SelectedApp"].ToString() + "'");
        b_sql.Append(" AND customer_id='" + State["CustomerID"].ToString() + "'");
        DataRow[] rows = db.ViziAppsExecuteSql(State, b_sql.ToString());
        if (rows.Length > 0)
        {
            DataRow row = rows[0];
            if (row["production_app_name"] != null)
                ProductionAppName.Text = row["production_app_name"].ToString();

            if (row["production_app_xml"] != DBNull.Value)
                ProductionDesignExists.Visible = true;
            else
                ProductionDesignExists.Visible = false;

            bool use_1_user_credential = false;
            if (row["use_1_user_credential"] != DBNull.Value)
            {
                string use_1_cred = row["use_1_user_credential"].ToString();
                use_1_user_credential = (use_1_cred.ToLower() == "true") ? true : false;
            }
            bool has_unlimited_users = false;
            if (row["has_unlimited_users"] != DBNull.Value)
            {
                string has_unlimited = row["has_unlimited_users"].ToString();
                has_unlimited_users = (has_unlimited.ToLower() == "true") ? true : false;
            }

            if (use_1_user_credential)
            {
                //NumberOfUsers.Style.Value = "";
                //NumberOfUsersLabel.Style.Value = "";

                //NumberOfUsers.SelectedIndex = 1;
                ArrayList credential = util.GetEndUserCredentials(State);
                if (credential != null && credential.Count > 0)
                {
                    string[] output = (string[])credential[0];
                    SingleUsername.Text = output[0];
                    SinglePassword.Text = output[1];
                }
                LimitedUsersPanel.Style.Value = "";
            }
            else if (has_unlimited_users)
            {
                //NumberOfUsers.Style.Value = "display:none";
                //NumberOfUsersLabel.Style.Value = "display:none";
                LimitedUsersPanel.Style.Value = "display:none";
            }
            else
            {
                long max_users = util.GetMaxUsers(State);
                if (max_users > 1000)
                {
                    //NumberOfUsers.Style.Value = "display:none";
                    //NumberOfUsersLabel.Style.Value = "display:none";
                    LimitedUsersPanel.Style.Value = "display:none";
                    util.SetUnlimitedUsers(State);
                }

            }
        }

        b_sql = new StringBuilder("SELECT * FROM branding_images ");
        b_sql.Append("WHERE application_id='" + State["ApplicationID"].ToString() + "'");
        rows = db.ViziAppsExecuteSql(State, b_sql.ToString());
        foreach (DataRow image_row in rows)
        {
            if (image_row["type"].ToString() == "icon" && image_row["width"].ToString() == "512")
            {
                LargeIconButton.Visible = true;
                DeleteIcon.Visible = true;
            }
            if (image_row["type"].ToString() == "splash")
            {
                ScreenSplashButton.Visible = true;
                DeleteSplashImage.Visible = true;
            }
        }
        db.CloseViziAppsDatabase(State);
    }
    public void InitCurrentApp(string app)
    {
        try
        {
            Hashtable State = (Hashtable)HttpRuntime.Cache[Session.SessionID];
            CurrentApp.SelectedValue = app;
            Util util = new Util();
            if (app.Contains("->"))
            {
                ResetAppStateVariables();
                StartMessage.Style.Value = "";
                State["SelectedDeviceType"] = Constants.IPHONE;
               // State["SelectedDeviceView"] = Constants.IPHONE;
                SetViewForDevice();
                AppSelectedForTest.Visible = false;
                HideAppControls();
                return;
            }
            State["SelectedApp"] = app;
            State["SelectedAppType"] = util.GetAppType(State);
            switch (State["SelectedAppType"].ToString())
            {
                case Constants.NATIVE_APP_TYPE:
                    break;
                case Constants.WEB_APP_TYPE:
                    Response.Redirect("TabDesignWeb.aspx", false);
                    break;
                case Constants.HYBRID_APP_TYPE:
                    Response.Redirect("TabDesignHybrid.aspx", false);
                    break;
            }

            if (util.IsAppSelectedForTest(State))
                AppSelectedForTest.Visible = true;
            else
                AppSelectedForTest.Visible = false;

            XmlUtil x_util = new XmlUtil();
            util.GetStagingAppXml(State, app);
           // State["SelectedDeviceView"] =
            State["SelectedDeviceType"] = x_util.GetAppDeviceType(State);
            if (State["SelectedDeviceType"] == null )
            {
                //State["SelectedDeviceView"] =
                State["SelectedDeviceType"] = Constants.IPHONE;
            }
            DeviceType.Text = State["SelectedDeviceType"].ToString();
            SetViewForDevice();
            InitAppPages();
            StartMessage.Style.Value = "display:none";

            string html = x_util.GetFirstAppPage(State);
            State["PageHtml"] = html;

            DefaultButtonImage.Text = util.GetDefaultButton(State);

            AppPages.SelectedValue = State["SelectedAppPage"].ToString();

            ShowAppControls();
        }
        catch (Exception ex)
        {
            Util util = new Util();
            Hashtable State = (Hashtable)HttpRuntime.Cache[Session.SessionID];
            util.LogError(State, ex);
            Message.Text = "Internal Error: " + ex.Message + ": " + ex.StackTrace;
        }
    }