public ActionResult _SignUp(FormCollection f)
        {
            var context = new IPTV2Entities();
            Dictionary<string, object> collection = new Dictionary<string, object>();
            if (String.IsNullOrEmpty(f["email"]))
            {
                collection.Add("errorCode", -1);
                collection.Add("errorMessage", "Please fill up your email address.");
                return Content(MyUtility.buildJson(collection), "application/json");
                // Do something
            }
            string email = f["email"];

            RegexUtilities util = new RegexUtilities();
            //if (!MyUtility.isEmail(email))
            if (!util.IsValidEmail(email))
            {
                collection.Add("errorCode", (int)ErrorCodes.IsNotValidEmail);
                collection.Add("errorMessage", "Invalid email format.");
                return Content(MyUtility.buildJson(collection), "application/json");
            }
            var tester = context.BetaTesters.FirstOrDefault(b => b.EMailAddress == email);
            if (tester == null) // New sign up
            {
                context.BetaTesters.Add(new BetaTester() { EMailAddress = email, DateSent = DateTime.Now, InvitationKey = System.Guid.NewGuid(), InvitedBy = System.Guid.Parse("9B4216E8-69BA-4548-9552-4CD065E58D3E") });
                int result = context.SaveChanges();
                if (result > 0)
                {
                    //Success
                    collection.Add("errorCode", 0);
                    collection.Add("errorMessage", "Thank you for signing up!");
                }
                else
                {
                    //Fail
                    collection.Add("errorCode", -2);
                    collection.Add("errorMessage", "The system encountered an unidentified error. Please try again.");
                }
            }
            else
            {
                // USer has signed up
                collection.Add("errorCode", -3);
                collection.Add("errorMessage", "You have already signed up.");
            }

            return Content(MyUtility.buildJson(collection), "application/json");
        }
        public JsonResult _RegisterAndSubscribe(FormCollection fc)
        {
            var ReturnCode = new TransactionReturnType()
            {
                StatusCode = (int)ErrorCodes.UnknownError,
                StatusMessage = String.Empty,
                info = "Registration",
                TransactionType = "Registration"
            };

            if (!Request.IsAjaxRequest())
            {
                ReturnCode.StatusMessage = "Invalid request";
                return this.Json(ReturnCode, JsonRequestBehavior.AllowGet);
            }

            bool isSourceAir = false;
            string url = Url.Action("Register", "User").ToString();
            var field_names = new string[] { "uid", "provider", "full_name", "pid", "cmd", "a1", "p1", "t1", "a3", "t3", "p3", "src", "item_name", "amount", "currency", "custom", "ip" };
            try
            {
                if (TempData["qs"] != null)
                {
                    var qs = (NameValueCollection)TempData["qs"];
                    ViewBag.qs = qs;
                    TempData["qs"] = qs;
                }

                DateTime registDt = DateTime.Now;
                Dictionary<string, string> tmpCollection = fc.AllKeys.ToDictionary(k => k, v => fc[v]);
                bool isMissingRequiredFields = false;

                foreach (var x in tmpCollection)
                {
                    if (!field_names.Contains(x.Key))
                        if (String.IsNullOrEmpty(x.Value))
                        {
                            isMissingRequiredFields = true;
                            break;
                        }
                }

                if (!isMissingRequiredFields) // process form
                {
                    var ip = Request.GetUserHostAddressFromCloudflare();
                    if (!String.IsNullOrEmpty(tmpCollection["ip"]))
                        ip = tmpCollection["ip"];

                    var location = MyUtility.GetLocationBasedOnIpAddress(ip);
                    string FirstName = tmpCollection["first_name"];
                    string LastName = tmpCollection["last_name"];

                    string EMail = tmpCollection["p_login_email"];
                    string ConfirmEmail = tmpCollection["p_login_email_c"];
                    string Password = tmpCollection["login_pass"];

                    //autodetect country, city, state
                    string CountryCode = location.countryCode;
                    string City = location.city;
                    string State = location.region;

                    string provider = String.IsNullOrEmpty(tmpCollection["provider"]) ? String.Empty : tmpCollection["provider"];
                    string uid = String.IsNullOrEmpty(tmpCollection["uid"]) ? String.Empty : tmpCollection["uid"];
                    System.Guid userId = System.Guid.NewGuid();
                    string browser = Request.UserAgent;

                    if (FirstName.Length > 32)
                        ReturnCode.StatusMessage = "First Name cannot exceed 32 characters.";
                    if (LastName.Length > 32)
                        ReturnCode.StatusMessage = "Last Name cannot exceed 32 characters.";
                    if (EMail.Length > 64)
                        ReturnCode.StatusMessage = "Email address cannot exceed 64 characters.";
                    if (State.Length > 30)
                        ReturnCode.StatusMessage = "State cannot exceed 30 characters.";
                    if (City.Length > 50)
                        ReturnCode.StatusMessage = "City cannot exceed 50 characters.";
                    if (String.Compare(EMail, ConfirmEmail, true) != 0)
                        ReturnCode.StatusMessage = "Email addresses do not match";

                    RegexUtilities util = new RegexUtilities();
                    //if (!MyUtility.isEmail(EMail))
                    if (!util.IsValidEmail(EMail))
                        ReturnCode.StatusMessage = "Email address is invalid.";

                    var context = new IPTV2Entities();
                    User user = context.Users.FirstOrDefault(u => String.Compare(u.EMail, EMail, true) == 0);
                    if (user != null)
                        ReturnCode.StatusMessage = "Email address is already taken.";

                    if (GlobalConfig.ExcludedCountriesFromRegistrationDropDown.Split(',').Contains(CountryCode)) // check if country is part of the exclusion list first
                        ReturnCode.StatusMessage = "Country does not exist.";
                    else if (context.Countries.Count(c => String.Compare(c.Code, CountryCode, true) == 0) <= 0) // then check if country is part of the list                    
                        ReturnCode.StatusMessage = "Country does not exist.";
                    if (context.States.Count(s => String.Compare(s.CountryCode, CountryCode, true) == 0) > 0)
                        if (context.States.Count(s => String.Compare(s.CountryCode, CountryCode, true) == 0 && (String.Compare(s.StateCode, State, true) == 0 || String.Compare(s.Name, State, true) == 0)) <= 0)
                            ReturnCode.StatusMessage = "State is invalid for this country.";

                    if (!String.IsNullOrEmpty(ReturnCode.StatusMessage))
                        return this.Json(ReturnCode, JsonRequestBehavior.AllowGet);

                    user = new User()
                    {
                        UserId = userId,
                        FirstName = FirstName,
                        LastName = LastName,
                        City = City,
                        State = State,
                        CountryCode = CountryCode,
                        EMail = EMail,
                        Password = MyUtility.GetSHA1(Password),
                        GigyaUID = userId.ToString(),
                        RegistrationDate = registDt,
                        LastUpdated = registDt,
                        RegistrationIp = ip,
                        StatusId = GlobalConfig.Visible,
                        ActivationKey = Guid.NewGuid(),
                        DateVerified = registDt
                    };

                    try
                    {
                        if (Request.Cookies.AllKeys.Contains("tuid"))
                            user.RegistrationCookie = Request.Cookies["tuid"].Value;
                        else if (Request.Cookies.AllKeys.Contains("regcook"))
                            user.RegistrationCookie = Request.Cookies["regcook"].Value;
                    }
                    catch (Exception) { }

                    ////check for cookie 
                    try
                    {
                        var dt = DateTime.Parse(Request.Cookies["rcDate"].Value);
                        if (registDt.Subtract(dt).Days < 45)
                        {
                            ReturnCode.StatusMessage = "We have detected that you have already registered using this machine.";
                            return this.Json(ReturnCode, JsonRequestBehavior.AllowGet);
                        }
                    }
                    catch (Exception) { }

                    string CurrencyCode = GlobalConfig.DefaultCurrency;
                    var country = context.Countries.FirstOrDefault(c => String.Compare(c.Code, CountryCode, true) == 0);
                    if (country != null)
                        CurrencyCode = country.CurrencyCode;
                    var wallet = user.UserWallets.FirstOrDefault(w => String.Compare(w.Currency, CurrencyCode, true) == 0);
                    if (wallet == null) // Wallet does not exist. Create new wallet for User.
                    {
                        wallet = ContextHelper.CreateWallet(0, CurrencyCode, registDt);
                        user.UserWallets.Add(wallet);
                    }

                    var transaction = new RegistrationTransaction()
                    {
                        RegisteredState = user.State,
                        RegisteredCity = user.City,
                        RegisteredCountryCode = user.CountryCode,
                        Amount = 0,
                        Currency = CurrencyCode,
                        Reference = isSourceAir ? "New Registration (air)" : "New Registration",
                        Date = registDt,
                        OfferingId = GlobalConfig.offeringId,
                        UserId = user.UserId,
                        StatusId = GlobalConfig.Visible
                    };
                    user.Transactions.Add(transaction);

                    context.Users.Add(user);
                    if (context.SaveChanges() > 0)
                    {
                        string verification_email = String.Format("{0}/User/Verify?key={1}", GlobalConfig.baseUrl, user.ActivationKey.ToString());
                        if (isSourceAir)
                        {
                            try
                            {
                                verification_email = String.Format("{0}&source=air", verification_email);
                                var template = MyUtility.GetUrlContent(GlobalConfig.ProjectAirEmailVerificationBodyTemplateUrl);
                                var htmlBody = String.Format(template, FirstName, EMail, verification_email);
                                if (!Request.IsLocal)
                                    try { MyUtility.SendEmailViaSendGrid(EMail, GlobalConfig.NoReplyEmail, "Activate your TFC.tv account", htmlBody, MailType.HtmlOnly, String.Empty); }
                                    catch (Exception e) { MyUtility.LogException(e, "Unable to send email via SendGrid"); }
                            }
                            catch (Exception)
                            {
                                string emailBody = String.Format(GlobalConfig.EmailVerificationBodyTextOnly, FirstName, EMail, verification_email);
                                if (!Request.IsLocal)
                                    try { MyUtility.SendEmailViaSendGrid(EMail, GlobalConfig.NoReplyEmail, "Activate your TFC.tv account", emailBody, MailType.TextOnly, emailBody); }
                                    catch (Exception e) { MyUtility.LogException(e, "Unable to send email via SendGrid"); }
                            }
                        }
                        else
                        {
                            string emailBody = String.Format(GlobalConfig.EmailVerificationBodyTextOnly, FirstName, EMail, verification_email);
                            if (!Request.IsLocal)
                                try { MyUtility.SendEmailViaSendGrid(EMail, GlobalConfig.NoReplyEmail, "Activate your TFC.tv account", emailBody, MailType.TextOnly, emailBody); }
                                catch (Exception e) { MyUtility.LogException(e, "Unable to send email via SendGrid"); }
                        }
                        GSResponse res = null;
                        if (!String.IsNullOrEmpty(uid) && !String.IsNullOrEmpty(provider))
                        {
                            Dictionary<string, object> collection = new Dictionary<string, object>();
                            collection.Add("siteUID", user.UserId);
                            collection.Add("uid", Uri.UnescapeDataString(uid));
                            collection.Add("cid", String.Format("{0} - New User", provider));
                            res = GigyaHelpers.createAndSendRequest("socialize.notifyRegistration", GigyaHelpers.buildParameter(collection));
                            if (res.GetErrorCode() == 0) //Successful link
                            {
                                if (user != null)
                                {
                                    var UserId = user.UserId.ToString();
                                    user.StatusId = GlobalConfig.Visible; //activate account
                                    user.DateVerified = DateTime.Now;
                                    SetAutheticationCookie(UserId);
                                    SetSession(UserId);
                                    if (!ContextHelper.SaveSessionInDatabase(context, user))
                                        context.SaveChanges();
                                }
                            }
                        }
                        else
                        {
                            var info = new GigyaUserInfo()
                            {
                                firstName = FirstName,
                                lastName = LastName,
                                email = EMail
                            };
                            var registrationInfo = new GigyaNotifyLoginInfo()
                            {
                                siteUID = user.UserId.ToString(),
                                cid = "TFCTV - Registration",
                                sessionExpiration = 0,
                                newUser = true,
                                userInfo = Newtonsoft.Json.JsonConvert.SerializeObject(info)
                            };
                            GSObject obj = new GSObject(Newtonsoft.Json.JsonConvert.SerializeObject(registrationInfo));
                            res = GigyaHelpers.createAndSendRequest("socialize.notifyLogin", obj);

                        }

                        if (user != null)
                        {
                            if (user.StatusId == GlobalConfig.Visible)
                            {
                                int freeTrialProductId = 0;
                                if (GlobalConfig.IsFreeTrialEnabled)
                                {
                                    freeTrialProductId = MyUtility.GetCorrespondingFreeTrialProductId();
                                    if (GlobalConfig.TfcTvFree2StartDate < registDt && GlobalConfig.TfcTvFree2EndDate > registDt)
                                    {
                                        string UserCountryCode = user.CountryCode;
                                        if (!GlobalConfig.isUAT)
                                            try { UserCountryCode = MyUtility.GetCountryCodeViaIpAddressWithoutProxy(); }
                                            catch (Exception) { }

                                        var countryList = GlobalConfig.TfcTvFree2CountryWhiteList.Split(',');
                                        if (countryList.Contains(UserCountryCode) && String.Compare(user.CountryCode, UserCountryCode, true) == 0)
                                            freeTrialProductId = GlobalConfig.TfcTvFree2ProductId;
                                    }
                                    PaymentHelper.PayViaWallet(context, userId, freeTrialProductId, SubscriptionProductType.Package, userId, null);
                                }

                                //authenticate user
                                SetAutheticationCookie(user.UserId.ToString());

                                SendToGigya(user);
                                SetSession(user.UserId.ToString());
                                ContextHelper.SaveSessionInDatabase(context, user);

                                //add uid cookie
                                HttpCookie uidCookie = new HttpCookie("uid");
                                uidCookie.Value = user.UserId.ToString();
                                uidCookie.Expires = DateTime.Now.AddDays(30);
                                Response.Cookies.Add(uidCookie);
                            }
                        }

                        GigyaHelpers.setCookie(res, this.ControllerContext);
                        GigyaUserData2 userData = new GigyaUserData2()
                        {
                            city = user.City,
                            country = user.CountryCode,
                            email = user.EMail,
                            firstName = user.FirstName,
                            lastName = user.LastName,
                            state = user.State
                        };

                        //GigyaUserDataInfo userDataInfo = new GigyaUserDataInfo()
                        //{
                        //    UID = user.UserId.ToString(),
                        //    data = Newtonsoft.Json.JsonConvert.SerializeObject(userData, Formatting.None)
                        //};

                        TFCTV.Helpers.UserData privacyData = new UserData() { IsExternalSharingEnabled = "true,false", IsInternalSharingEnabled = "true,false", IsProfilePrivate = "false" };

                        GigyaUserDataInfo2 userDataInfo = new GigyaUserDataInfo2()
                        {
                            UID = user.UserId.ToString(),
                            profile = Newtonsoft.Json.JsonConvert.SerializeObject(userData, Formatting.None),
                            data = Newtonsoft.Json.JsonConvert.SerializeObject(privacyData, Formatting.None)
                        };

                        GSObject userDataInfoObj = new GSObject(Newtonsoft.Json.JsonConvert.SerializeObject(userDataInfo));
                        //res = GigyaHelpers.createAndSendRequest("gcs.setUserData", userDataInfoObj);
                        res = GigyaHelpers.createAndSendRequest("ids.setAccountInfo", userDataInfoObj);
                        var returnCode = res.GetErrorCode();

                        //Publish to Activity Feed
                        List<ActionLink> actionlinks = new List<ActionLink>();
                        actionlinks.Add(new ActionLink() { text = SNSTemplates.register_actionlink_text, href = String.Format("{0}{1}", GlobalConfig.baseUrl, SNSTemplates.register_actionlink_href) });
                        //mediaItem
                        List<MediaItem> mediaItems = new List<MediaItem>();
                        mediaItems.Add(new MediaItem() { type = SNSTemplates.register_mediaitem_type, src = String.Format("{0}{1}", GlobalConfig.AssetsBaseUrl, SNSTemplates.register_mediaitem_src), href = String.Format("{0}{1}", GlobalConfig.baseUrl, SNSTemplates.register_mediaitem_href) });
                        UserAction action = new UserAction()
                        {
                            actorUID = userId.ToString(),
                            userMessage = SNSTemplates.register_usermessage,
                            title = SNSTemplates.register_title,
                            subtitle = String.Format("{0}{1}", GlobalConfig.baseUrl, SNSTemplates.register_subtitle),
                            linkBack = String.Format("{0}{1}", GlobalConfig.baseUrl, SNSTemplates.register_linkback),
                            description = String.Format(SNSTemplates.register_description, FirstName),
                            actionLinks = actionlinks,
                            mediaItems = mediaItems
                        };

                        GigyaMethods.PublishUserAction(action, userId, "external");
                        action.userMessage = String.Empty;
                        action.title = String.Empty;
                        action.mediaItems = null;
                        GigyaMethods.PublishUserAction(action, userId, "internal");

                        TempData["qs"] = null; // empty the TempData upon successful registration

                        ReturnCode.StatusCode = (int)ErrorCodes.Success;
                        ReturnCode.info7 = user.EMail;
                        if (user.StatusId == GlobalConfig.Visible)
                        {
                            ReturnCode.StatusHeader = "Your 7-Day Free Trial Starts Now!";
                            ReturnCode.StatusMessage = "Congratulations! You are now registered to TFC.tv.";
                            ReturnCode.StatusMessage2 = "Pwede ka nang manood ng mga piling Kapamilya shows at movies!";
                            ReturnCode.info3 = user.UserId.ToString();

                            //Change to social registration
                            ReturnCode.info = "SocialRegistration";
                            ReturnCode.TransactionType = "SocialRegistration";
                        }
                        else
                        {
                            ReturnCode.StatusHeader = "Email verification sent!";
                            ReturnCode.StatusMessage = "Congratulations! You are one step away from completing your registration.";
                            ReturnCode.StatusMessage2 = "An email has been sent to you.<br> Verify your email address to complete your registration.";
                        }
                        TempData["ErrorMessage"] = ReturnCode;
                        //if(xoom)
                        if (Request.Cookies.AllKeys.Contains("xoom"))
                        {
                            var userPromo = new UserPromo();
                            userPromo.UserId = user.UserId;
                            userPromo.PromoId = GlobalConfig.Xoom2PromoId;
                            userPromo.AuditTrail.CreatedOn = registDt;
                            context.UserPromos.Add(userPromo);
                            context.SaveChanges();
                        }

                        return this.Json(ReturnCode, JsonRequestBehavior.AllowGet); // successful registration
                    }
                }
                else
                    ReturnCode.StatusMessage = "Please fill in all required fields.";

                url = String.Format("{0}?{1}", Request.UrlReferrer.AbsolutePath, MyUtility.DictionaryToQueryString(tmpCollection));
            }
            catch (Exception e) { MyUtility.LogException(e); }
            return this.Json(ReturnCode, JsonRequestBehavior.AllowGet);
        }
        //[RequireHttps]
        public ActionResult MobileLogin(FormCollection fc)
        {
            var ReturnCode = new TransactionReturnType()
            {
                StatusCode = (int)ErrorCodes.UnknownError,
                StatusMessage = String.Empty
            };

            string url = Url.Action("Index", "Home").ToString();
            try
            {
                DateTime registDt = DateTime.Now;
                Dictionary<string, string> tmpCollection = fc.AllKeys.ToDictionary(k => k, v => fc[v]);
                bool isMissingRequiredFields = false;
                foreach (var x in tmpCollection)
                {
                    if (String.IsNullOrEmpty(x.Value))
                    {
                        isMissingRequiredFields = true;
                        break;
                    }
                }

                if (!isMissingRequiredFields)
                {
                    string EmailAddress = fc["login_email"];
                    string Password = fc["login_pass"];
                    if (!String.IsNullOrEmpty(Request.UrlReferrer.AbsolutePath))
                        url = Request.UrlReferrer.AbsolutePath;

                    RegexUtilities util = new RegexUtilities();
                    //if (!MyUtility.isEmail(EmailAddress))
                    if (!util.IsValidEmail(EmailAddress))
                    {
                        ReturnCode.StatusMessage = "Email address is invalid.";
                        TempData["LoginErrorMessage"] = ReturnCode.StatusMessage;
                        return Redirect(url);
                    }

                    using (var context = new IPTV2Entities())
                    {
                        User user = null;
                        if (User.Identity.IsAuthenticated)
                        {
                            var UserId = new Guid(User.Identity.Name);
                            user = context.Users.FirstOrDefault(u => u.UserId == UserId);
                        }
                        else
                        {
                            user = context.Users.FirstOrDefault(u => String.Compare(u.EMail, EmailAddress, true) == 0);
                            if (user == null)
                                ReturnCode.StatusMessage = "Email address does not exist.";
                            else
                            {
                                if (user.StatusId != GlobalConfig.Visible)
                                    ReturnCode.StatusMessage = "Email address is not verified.";
                                else
                                {
                                    Password = MyUtility.GetSHA1(Password);
                                    if (String.Compare(user.EMail, EmailAddress, true) == 0 && String.Compare(user.Password, Password, false) == 0)
                                    {
                                        SendToGigya(user);
                                        SetAutheticationCookie(user.UserId.ToString());
                                        SetSession(user.UserId.ToString());
                                        ContextHelper.SaveSessionInDatabase(context, user);

                                        //add uid cookie
                                        HttpCookie uidCookie = new HttpCookie("uid");
                                        uidCookie.Value = user.UserId.ToString();
                                        uidCookie.Expires = DateTime.Now.AddDays(30);
                                        Response.Cookies.Add(uidCookie);

                                        if (user.IsTVEverywhere == true)
                                            return Redirect("/TFCChannel");
                                        else if (MyUtility.isTVECookieValid())
                                        {
                                            MyUtility.RemoveTVECookie();
                                            return RedirectToAction("RegisterToTFCEverywhere", "User");
                                        }

                                        if (this.ControllerContext.HttpContext.Request.Cookies.AllKeys.Contains("redirect3178"))
                                        {
                                            HttpCookie pacMayCookie = new HttpCookie("redirect3178");
                                            pacMayCookie.Expires = DateTime.Now.AddDays(-1);
                                            Response.Cookies.Add(pacMayCookie);
                                            return RedirectToAction("Details", "Subscribe", new { id = "mayweather-vs-pacquiao-may-3" });
                                        }
                                        else if (this.ControllerContext.HttpContext.Request.Cookies.AllKeys.Contains("promo2014cok"))
                                        {
                                            HttpCookie tempCookie = new HttpCookie("promo2014cok");
                                            tempCookie.Expires = DateTime.Now.AddDays(-1);
                                            Response.Cookies.Add(tempCookie);
                                            return RedirectToAction("Details", "Subscribe", new { id = "Promo201410" });
                                        }
                                        else if (this.ControllerContext.HttpContext.Request.Cookies.AllKeys.Contains("redirectaintone"))
                                        {
                                            HttpCookie tempCookie = new HttpCookie("redirectaintone");
                                            tempCookie.Expires = DateTime.Now.AddDays(-1);
                                            Response.Cookies.Add(tempCookie);
                                            return RedirectToAction("Details", "Subscribe", new { id = "aintone" });
                                        }
                                        else if (this.ControllerContext.HttpContext.Request.Cookies.AllKeys.Contains("vntysicook"))
                                        {
                                            HttpCookie tempCookie = new HttpCookie("vntysicook");
                                            tempCookie.Expires = DateTime.Now.AddDays(-1);
                                            Response.Cookies.Add(tempCookie);
                                            return RedirectToAction("Index", "Events", new { id = tempCookie.Value });
                                        }
                                        return RedirectToAction("Index", "Home");
                                    }
                                    else
                                        ReturnCode.StatusMessage = "Email/Password do not match.";
                                }
                            }
                        }
                        if (!String.IsNullOrEmpty(ReturnCode.StatusMessage))
                            TempData["LoginErrorMessage"] = ReturnCode.StatusMessage;

                        if (user != null)
                        {
                            if (user.IsTVEverywhere == true)
                                return Redirect("/TFCChannel");
                            else
                                return Redirect(url);
                        }
                    }
                }
                else
                    ReturnCode.StatusMessage = "Please fill in all required fields.";

                if (!String.IsNullOrEmpty(ReturnCode.StatusMessage))
                    TempData["LoginErrorMessage"] = ReturnCode.StatusMessage;
                url = Request.UrlReferrer.AbsoluteUri;
            }
            catch (Exception e) { MyUtility.LogException(e); }
            return Redirect(url);
        }
        public ActionResult _Registration(FormCollection fc)
        {
            //fc["Email"] = "*****@*****.**";
            //fc["Password"] = "******";
            //fc["ConfirmPassword"] = "******";
            //fc["FirstName"] = "Albin";
            //fc["LastName"] = "Lim";
            //fc["CountryCode"] = "US";
            //fc["City"] = "CA";
            //fc["State"] = "CA";
            Dictionary<string, object> collection = new Dictionary<string, object>();
            ErrorCodes errorCode = ErrorCodes.UnknownError;
            string errorMessage = MyUtility.getErrorMessage(ErrorCodes.UnknownError);
            collection = MyUtility.setError(errorCode, errorMessage);
            if (!Request.IsAjaxRequest())
            {
                collection = MyUtility.setError(ErrorCodes.UnknownError, "Your request is invalid.");
                return Content(MyUtility.buildJson(collection), "application/json");
            }


            bool isConnectedToSocialNetworks = false;
            string href = "/User/RegisterVerify";

            if (MyUtility.isUserLoggedIn()) //User is logged in.
                return RedirectToAction("Index", "Home");
            if (String.IsNullOrEmpty(fc["Email"]))
            {
                collection = MyUtility.setError(ErrorCodes.IsEmailEmpty);
                return Content(MyUtility.buildJson(collection), "application/json");
            }
            if (String.Compare(fc["Password"], fc["ConfirmPassword"], false) != 0)
            {
                collection = MyUtility.setError(ErrorCodes.IsMismatchPassword);
                return Content(MyUtility.buildJson(collection), "application/json");
            }
            if (String.IsNullOrEmpty(fc["FirstName"]) || String.IsNullOrEmpty(fc["LastName"]) || String.IsNullOrEmpty(fc["CountryCode"]))
            {
                collection = MyUtility.setError(ErrorCodes.IsMissingRequiredFields);
                return Content(MyUtility.buildJson(collection), "application/json");
            }

            RegexUtilities util = new RegexUtilities();
            //if (!MyUtility.isEmail(fc["Email"]))
            if (!util.IsValidEmail(fc["Email"]))
            {
                collection = MyUtility.setError(ErrorCodes.IsNotValidEmail);
                return Content(MyUtility.buildJson(collection), "application/json");
            }

            try
            {
                string FirstName = fc["FirstName"];
                string LastName = fc["LastName"];
                string CountryCode = fc["CountryCode"];
                string EMail = fc["Email"];
                string Password = fc["Password"];
                string City = fc["City"];
                string State = String.IsNullOrEmpty(fc["State"]) ? fc["StateDD"] : fc["State"];
                System.Guid userId = System.Guid.NewGuid();
                string provider = "tfctv";

                if (FirstName.Length > 32)
                {
                    collection = MyUtility.setError(ErrorCodes.LimitReached, "First Name cannot exceed 32 characters.");
                    return Content(MyUtility.buildJson(collection), "application/json");
                }
                if (LastName.Length > 32)
                {
                    collection = MyUtility.setError(ErrorCodes.LimitReached, "Last Name cannot exceed 32 characters.");
                    return Content(MyUtility.buildJson(collection), "application/json");
                }
                if (EMail.Length > 64)
                {
                    collection = MyUtility.setError(ErrorCodes.LimitReached, "Email cannot exceed 64 characters.");
                    return Content(MyUtility.buildJson(collection), "application/json");
                }
                if (!String.IsNullOrEmpty(State))
                    if (State.Length > 30)
                    {
                        collection = MyUtility.setError(ErrorCodes.LimitReached, "State cannot exceed 30 characters.");
                        return Content(MyUtility.buildJson(collection), "application/json");
                    }
                if (!String.IsNullOrEmpty(City))
                    if (City.Length > 50)
                    {
                        collection = MyUtility.setError(ErrorCodes.LimitReached, "City cannot exceed 50 characters.");
                        return Content(MyUtility.buildJson(collection), "application/json");
                    }

                var context = new IPTV2Entities();
                User user = context.Users.FirstOrDefault(u => String.Compare(u.EMail, EMail, true) == 0);
                if (user != null)
                {
                    collection = MyUtility.setError(ErrorCodes.IsExistingEmail);
                    return Content(MyUtility.buildJson(collection), "application/json");
                }

                /***** CHECK FOR COUNTRY CODE ****/
                if (context.Countries.Count(c => String.Compare(c.Code, CountryCode, true) == 0) <= 0)
                {
                    collection = MyUtility.setError(ErrorCodes.IsMissingRequiredFields, "Country Code is invalid.");
                    return Content(MyUtility.buildJson(collection), "application/json");
                }
                else if (GlobalConfig.ExcludedCountriesFromRegistrationDropDown.Split(',').Contains(CountryCode))
                {
                    collection = MyUtility.setError(ErrorCodes.IsMissingRequiredFields, "Country Code is invalid.");
                    return Content(MyUtility.buildJson(collection), "application/json");
                }

                if (String.IsNullOrEmpty(State))
                {
                    collection = MyUtility.setError(ErrorCodes.IsMissingRequiredFields, "State is required.");
                    return Content(MyUtility.buildJson(collection), "application/json");
                }
                else
                {
                    if (context.States.Count(c => c.CountryCode == CountryCode.ToUpper()) > 0)
                    {
                        if (context.States.Count(s => s.CountryCode == CountryCode.ToUpper() && (s.StateCode == State || s.Name == State)) == 0)
                        {
                            collection = MyUtility.setError(ErrorCodes.IsMissingRequiredFields, "State is invalid.");
                            return Content(MyUtility.buildJson(collection), "application/json");
                        }
                    }
                }


                DateTime registDt = DateTime.Now;
                user = new User()
                {
                    UserId = userId,
                    FirstName = FirstName,
                    LastName = LastName,
                    City = City,
                    State = State,
                    CountryCode = CountryCode,
                    EMail = EMail,
                    Password = MyUtility.GetSHA1(Password),
                    GigyaUID = userId.ToString(),
                    RegistrationDate = registDt,
                    LastUpdated = registDt,
                    RegistrationIp = Request.GetUserHostAddressFromCloudflare(),
                    StatusId = 0,
                    ActivationKey = Guid.NewGuid()
                };


                //UPDATE: FEB 18, 2013
                if (MyUtility.isTVECookieValid())
                    user.IsTVERegistrant = true;

                string CurrencyCode = GlobalConfig.DefaultCurrency;
                Country country = context.Countries.FirstOrDefault(c => c.Code == CountryCode);
                if (country != null)
                {
                    Currency currency = context.Currencies.FirstOrDefault(c => c.Code == country.CurrencyCode);
                    if (currency != null) CurrencyCode = currency.Code;
                }
                UserWallet wallet = user.UserWallets.FirstOrDefault(w => w.Currency == CurrencyCode);
                if (wallet == null) // Wallet does not exist. Create new wallet for User.
                {
                    wallet = ContextHelper.CreateWallet(0, CurrencyCode, registDt);
                    user.UserWallets.Add(wallet);
                }

                var transaction = new RegistrationTransaction()
                {
                    RegisteredState = user.State,
                    RegisteredCity = user.City,
                    RegisteredCountryCode = user.CountryCode,
                    Amount = 0,
                    Currency = CurrencyCode,
                    Reference = "New Registration",
                    Date = registDt,
                    OfferingId = GlobalConfig.offeringId,
                    UserId = user.UserId,
                    StatusId = GlobalConfig.Visible
                };

                user.Transactions.Add(transaction);

                context.Users.Add(user);
                if (context.SaveChanges() > 0)
                {
                    if (TempData["qs"] != null)
                    {
                        NameValueCollection qs = (NameValueCollection)TempData["qs"];
                        Dictionary<string, object> GigyaCollection = new Dictionary<string, object>();
                        collection.Add("uid", qs["UID"]);
                        collection.Add("siteUID", userId);
                        collection.Add("cid", String.Format("{0} - New User", qs["provider"]));
                        GSResponse res = GigyaHelpers.createAndSendRequest("socialize.notifyRegistration", GigyaHelpers.buildParameter(collection));
                        provider = qs["provider"];
                        isConnectedToSocialNetworks = true;
                    }
                    else
                    {
                        Dictionary<string, object> userInfo = new Dictionary<string, object>();
                        userInfo.Add("firstName", user.FirstName);
                        userInfo.Add("lastName", user.LastName);
                        userInfo.Add("email", user.EMail);
                        Dictionary<string, object> gigyaCollection = new Dictionary<string, object>();
                        gigyaCollection.Add("siteUID", user.UserId);
                        gigyaCollection.Add("cid", "TFCTV - Registration");
                        gigyaCollection.Add("sessionExpiration", "0");
                        gigyaCollection.Add("newUser", true);
                        gigyaCollection.Add("userInfo", MyUtility.buildJson(userInfo));
                        GSResponse res = GigyaHelpers.createAndSendRequest("socialize.notifyLogin", GigyaHelpers.buildParameter(gigyaCollection));
                        GigyaHelpers.setCookie(res, this.ControllerContext);
                    }

                    //setUserData
                    User usr = context.Users.FirstOrDefault(u => u.EMail == EMail);
                    setUserData(usr.UserId.ToString(), usr);
                    var ActivationKey = usr.ActivationKey;

                    bool isTFCnowCustomer = false;

                    if (TempData["TFCnowCustomer"] != null)
                    {
                        Customer customer = (Customer)TempData["TFCnowCustomer"];
                        usr.StatusId = 1;
                        usr.DateVerified = registDt;
                        TempData["TFCnowCustomer"] = customer;
                        href = "/Migration/Migrate";
                        if (context.SaveChanges() > 0)
                        {
                            //SetAutheticationCookie(userId.ToString());
                            isTFCnowCustomer = true;
                        }
                    }

                    if (isConnectedToSocialNetworks)
                    {
                        usr.StatusId = 1;
                        usr.DateVerified = registDt;
                        context.SaveChanges();
                    }

                    //If FreeTrial is enabled, insert free trial.
                    //if (GlobalConfig.IsFreeTrialEnabled)
                    //{
                    //    context = new IPTV2Entities();
                    //    if (isConnectedToSocialNetworks)
                    //        PaymentHelper.PayViaWallet(context, userId, GlobalConfig.FreeTrial14ProductId, SubscriptionProductType.Package, userId, null);
                    //    else
                    //        PaymentHelper.PayViaWallet(context, userId, GlobalConfig.FreeTrial7ProductId, SubscriptionProductType.Package, userId, null);
                    //    context.SaveChanges();
                    //}

                    /***** DEC 31 2012 ****/
                    //UPDATED: FEB 18, 2013 - To include checking for TVE
                    if (usr.IsTVERegistrant == null || usr.IsTVERegistrant == false)
                    {
                        int freeTrialProductId = 0;
                        if (GlobalConfig.IsFreeTrialEnabled)
                        {
                            freeTrialProductId = MyUtility.GetCorrespondingFreeTrialProductId();
                            context = new IPTV2Entities();
                            if (GlobalConfig.TfcTvFree2StartDate < registDt && GlobalConfig.TfcTvFree2EndDate > registDt)
                            {
                                string UserCountryCode = user.CountryCode;
                                if (!GlobalConfig.isUAT)
                                    try { UserCountryCode = MyUtility.GetCountryCodeViaIpAddressWithoutProxy(); }
                                    catch (Exception) { }

                                var countryList = GlobalConfig.TfcTvFree2CountryWhiteList.Split(',');
                                if (countryList.Contains(UserCountryCode) && String.Compare(user.CountryCode, UserCountryCode, true) == 0)
                                    freeTrialProductId = GlobalConfig.TfcTvFree2ProductId;
                            }
                            if (Request.Cookies.AllKeys.Contains("vntycok"))
                            { freeTrialProductId = GlobalConfig.FreeTrial14ProductId; }
                            if (isConnectedToSocialNetworks)
                                PaymentHelper.PayViaWallet(context, userId, freeTrialProductId, SubscriptionProductType.Package, userId, null);
                        }
                    }


                    //Publish to Activity Feed
                    List<ActionLink> actionlinks = new List<ActionLink>();
                    actionlinks.Add(new ActionLink() { text = SNSTemplates.register_actionlink_text, href = String.Format("{0}{1}", GlobalConfig.baseUrl, SNSTemplates.register_actionlink_href) });
                    //mediaItem
                    List<MediaItem> mediaItems = new List<MediaItem>();
                    mediaItems.Add(new MediaItem() { type = SNSTemplates.register_mediaitem_type, src = String.Format("{0}{1}", GlobalConfig.AssetsBaseUrl, SNSTemplates.register_mediaitem_src), href = String.Format("{0}{1}", GlobalConfig.baseUrl, SNSTemplates.register_mediaitem_href) });
                    UserAction action = new UserAction()
                    {
                        actorUID = userId.ToString(),
                        userMessage = SNSTemplates.register_usermessage,
                        title = SNSTemplates.register_title,
                        subtitle = String.Format("{0}{1}", GlobalConfig.baseUrl, SNSTemplates.register_subtitle),
                        linkBack = String.Format("{0}{1}", GlobalConfig.baseUrl, SNSTemplates.register_linkback),
                        description = String.Format(SNSTemplates.register_description, FirstName),
                        actionLinks = actionlinks,
                        mediaItems = mediaItems
                    };

                    GigyaMethods.PublishUserAction(action, userId, "external");
                    action.userMessage = String.Empty;
                    action.title = String.Empty;
                    action.mediaItems = null;
                    GigyaMethods.PublishUserAction(action, userId, "internal");
                    var email_err = String.Empty;
                    //FormsAuthentication.SetAuthCookie(userId.ToString(), true);
                    if (isConnectedToSocialNetworks)
                    {
                        //SetAutheticationCookie(userId.ToString());
                        if (!Request.IsLocal)
                        {
                            try { MyUtility.SendConfirmationEmail(context, usr); }
                            catch (Exception) { }
                        }

                        href = GlobalConfig.RegistrationConfirmPage;
                        //UPDATED: FEB 18, 2013
                        if (usr.IsTVERegistrant != null)
                            if ((bool)usr.IsTVERegistrant)
                            {
                                href = GlobalConfig.TVERegistrationPage;
                                MyUtility.RemoveTVECookie();
                            }
                    }
                    else
                    {
                        if (!isTFCnowCustomer)
                        {
                            //string emailBody = String.Format("Copy and paste this url to activate your TFC.tv Account {0}/User/Verify?email={1}&key={2}", GlobalConfig.baseUrl, usr.EMail, ActivationKey.ToString());
                            string verification_email = String.Format("{0}/User/Verify?key={1}", GlobalConfig.baseUrl, usr.ActivationKey.ToString());
                            string emailBody = String.Format(GlobalConfig.EmailVerificationBodyTextOnly, usr.FirstName, usr.EMail, verification_email);
                            //MyUtility.SendEmailViaSendGrid(usr.EMail, GlobalConfig.NoReplyEmail, "Activate your TFC.tv account", emailBody);
                            if (!Request.IsLocal)
                                try
                                {
                                    //MyUtility.SendEmailViaSendGrid(usr.EMail, GlobalConfig.NoReplyEmail, "Activate your TFC.tv account", emailBody);
                                    MyUtility.SendEmailViaSendGrid(usr.EMail, GlobalConfig.NoReplyEmail, "Activate your TFC.tv account", emailBody, MailType.TextOnly, emailBody);
                                }
                                catch (Exception)
                                {
                                    email_err = " But we are not able to send the verification email.";
                                }
                        }
                    }

                    ////UPDATED: FEB 12, 2012
                    //if (!String.IsNullOrEmpty(fc["TVEverywhere"]))
                    //{
                    //    if (String.Compare(fc["TVEverywhere"], "0", true) == 0)
                    //    {
                    //        TempData["tempUserId"] = userId;
                    //        href = GlobalConfig.TVERegistrationPage;
                    //        TempData["isConnectedToSocialNetworks"] = isConnectedToSocialNetworks;
                    //    }
                    //}

                    if (usr.StatusId == GlobalConfig.Visible) //UPDATED: MARCH 1, 2013. Only set Authentication Cookie when user is verified.
                        SetAutheticationCookie(userId.ToString());
                    errorMessage = "Thank you! You are now registered to TFC.tv!" + email_err;
                    collection = MyUtility.setError(ErrorCodes.Success, errorMessage);
                    collection.Add("info", String.Format("{0}|{1}|{2}", user.EMail, Request.GetUserHostAddressFromCloudflare(), provider));
                    collection.Add("href", href);

                    FlagBetaKey(fc["iid"]);
                }
                else
                {
                    errorMessage = "The system encountered an unidentified error. Please try again.";
                    collection = MyUtility.setError(ErrorCodes.EntityUpdateError, errorMessage);
                }
            }
            catch (Exception e)
            {
                collection = MyUtility.setError(ErrorCodes.EntityUpdateError, e.InnerException.InnerException.Message + "<br/>" + e.InnerException.InnerException.StackTrace);
            }
            return Content(MyUtility.buildJson(collection), "application/json");
        }
        //[RequireHttps]
        public JsonResult _MobileForgotPassword(FormCollection fc)
        {
            var ReturnCode = new ServiceReturnType()
            {
                StatusCode = (int)ErrorCodes.UnknownError,
                StatusMessage = String.Empty
            };

            try
            {

                DateTime registDt = DateTime.Now;
                Dictionary<string, string> tmpCollection = fc.AllKeys.ToDictionary(k => k, v => fc[v]);
                bool isMissingRequiredFields = false;
                foreach (var x in tmpCollection)
                {
                    if (String.IsNullOrEmpty(x.Value))
                    {
                        isMissingRequiredFields = true;
                        break;
                    }
                }

                if (!isMissingRequiredFields)
                {
                    string EmailAddress = fc["login_email"];

                    RegexUtilities util = new RegexUtilities();
                    //if (!MyUtility.isEmail(EmailAddress))
                    if (!util.IsValidEmail(EmailAddress))
                    {
                        ReturnCode.StatusMessage = "Email address is invalid.";
                    }
                    else
                    {
                        var context = new IPTV2Entities();
                        User user = context.Users.FirstOrDefault(u => String.Compare(u.EMail, EmailAddress, true) == 0);
                        if (user != null)
                        {
                            if (user.StatusId != GlobalConfig.Visible)
                            {
                                ReturnCode.StatusMessage = "Email address is not verified.";
                                return this.Json(ReturnCode, JsonRequestBehavior.AllowGet);
                            }
                            user.LastUpdated = registDt;
                            if (context.SaveChanges() > 0)
                            {
                                string oid = MyUtility.GetSHA1(String.Format("{0}{1}", user.UserId, user.LastUpdated));
                                string reset_pwd_email = String.Format("{0}/User/ResetPassword?key={1}&oid={2}", GlobalConfig.baseUrl, user.ActivationKey, oid.ToLower());
                                string emailBody = String.Format(GlobalConfig.ResetPasswordBodyTextOnly, user.FirstName, registDt.ToString("MM/dd/yyyy hh:mm:ss tt"), reset_pwd_email);
                                try
                                {
                                    if (!Request.IsLocal)
                                        MyUtility.SendEmailViaSendGrid(user.EMail, GlobalConfig.NoReplyEmail, "Reset your TFC.tv Password", emailBody, MailType.TextOnly, emailBody);

                                    ReturnCode.StatusCode = (int)ErrorCodes.Success;
                                    ReturnCode.StatusMessage = "Instructions on how to reset your password have been sent to your email address.";
                                }
                                catch (Exception)
                                {
                                    ReturnCode.StatusCode = (int)ErrorCodes.UnknownError;
                                    ReturnCode.StatusMessage = "The system encountered an unspecified error. Please contact Customer Support.";
                                }
                            }
                            else
                                ReturnCode.StatusMessage = "The system encountered an unidentified error. Please try again.";
                        }
                        else
                        {
                            ReturnCode.StatusCode = (int)ErrorCodes.UserDoesNotExist;
                            ReturnCode.StatusMessage = "Email does not exist.";
                        }
                    }
                }
                else
                    ReturnCode.StatusMessage = "Please fill in all required fields.";
            }
            catch (Exception e) { ReturnCode.StatusMessage = e.Message; }
            return this.Json(ReturnCode, JsonRequestBehavior.AllowGet);
        }
        //[RequireHttps]
        public ActionResult _MobileLogin(FormCollection fc)
        {
            var ReturnCode = new AirLoginReturnObj()
            {
                StatusCode = (int)ErrorCodes.UnknownError,
                StatusMessage = String.Empty,
                IsSuccess = false,
                sessionSecret = String.Empty,
                sessionToken = String.Empty,
                firstName = String.Empty,
                lastName = String.Empty
            };
            try
            {
                DateTime registDt = DateTime.Now;
                Dictionary<string, string> tmpCollection = fc.AllKeys.ToDictionary(k => k, v => fc[v]);
                bool isMissingRequiredFields = false;
                foreach (var x in tmpCollection)
                {
                    if (String.IsNullOrEmpty(x.Value))
                    {
                        isMissingRequiredFields = true;
                        break;
                    }
                }

                if (!isMissingRequiredFields)
                {
                    string EmailAddress = fc["login_email"];
                    string Password = fc["login_pass"];

                    RegexUtilities util = new RegexUtilities();

                    //if (!MyUtility.isEmail(EmailAddress))
                    if (!util.IsValidEmail(EmailAddress))
                    {
                        ReturnCode.StatusMessage = "Email address is invalid.";
                    }
                    else
                    {
                        using (var context = new IPTV2Entities())
                        {
                            var user = context.Users.FirstOrDefault(u => String.Compare(u.EMail, EmailAddress, true) == 0);
                            if (user == null)
                                ReturnCode.StatusMessage = "Email address does not exist.";
                            else
                            {
                                if (user.StatusId != GlobalConfig.Visible)
                                    ReturnCode.StatusMessage = "Email address is not verified.";
                                else
                                {
                                    Password = MyUtility.GetSHA1(Password);
                                    if (String.Compare(user.EMail, EmailAddress, true) == 0 && String.Compare(user.Password, Password, false) == 0)
                                    {
                                        try
                                        {

                                            Dictionary<string, object> userInfo = new Dictionary<string, object>();
                                            userInfo.Add("firstName", user.FirstName);
                                            userInfo.Add("lastName", user.LastName);
                                            userInfo.Add("email", user.EMail);
                                            Dictionary<string, object> collection = new Dictionary<string, object>();
                                            collection.Add("siteUID", user.UserId);
                                            collection.Add("cid", "TFCTV - Login (Mobile)");
                                            //collection.Add("sessionExpiration", 2592000);
                                            collection.Add("sessionExpiration", 432000);
                                            collection.Add("targetEnv", "mobile");
                                            collection.Add("userInfo", MyUtility.buildJson(userInfo));
                                            GSResponse res = GigyaHelpers.createAndSendRequest("socialize.notifyLogin", GigyaHelpers.buildParameter(collection));
                                            if (res.GetErrorCode() == 0)
                                            {
                                                ReturnCode.sessionToken = res.GetString("sessionToken", String.Empty);
                                                ReturnCode.sessionSecret = res.GetString("sessionSecret", String.Empty);
                                                ReturnCode.StatusMessage = "OK";
                                                ReturnCode.IsSuccess = true;
                                                ReturnCode.StatusCode = (int)ErrorCodes.Success;
                                                ReturnCode.firstName = user.FirstName;
                                                ReturnCode.lastName = user.LastName;
                                            }
                                        }
                                        catch (Exception) { }
                                        ContextHelper.SaveSessionInDatabase(context, user);
                                    }
                                    else
                                        ReturnCode.StatusMessage = "Email/Password do not match.";
                                }
                            }
                        }
                    }
                }
                else
                    ReturnCode.StatusMessage = "Please fill in all required fields.";
            }
            catch (Exception e) { MyUtility.LogException(e); }
            return this.Json(ReturnCode, JsonRequestBehavior.AllowGet);
        }