コード例 #1
0
        protected void Page_Load(object sender, EventArgs e)
        {
            System.Text.StringBuilder json_content = new System.Text.StringBuilder();
            string postData = new System.IO.StreamReader(Request.InputStream).ReadToEnd();

            //json_content.AppendLine("{");
            //json_content.AppendLine("   \"api\":{");
            //json_content.AppendLine("       \"key\": \"78g878agda78sdgad98abd\"");
            //json_content.AppendLine("   },");
            //json_content.AppendLine("   \"property\":{");
            //json_content.AppendLine("       \"property_code\": 358712,");
            //json_content.AppendLine("       \"arrival_date\": \"20/09/2016\",");
            //json_content.AppendLine("       \"departure_date\": \"30/09/2016\"");
            //json_content.AppendLine("   }");
            //json_content.AppendLine("}");
            //postData = json_content.ToString();


            if (postData != "")
            {
                if (classes.api.ValidateJSON(postData))
                {
                    var json = JsonConvert.DeserializeObject <RootObject>(postData);

                    classes.api_key_info api_key_info = classes.api.GetKeyInfo(json.api.key);
                    string[]             errors       = new string[8];
                    int err = 0;
                    int i   = 0;

                    if (api_key_info.key == "")
                    {
                        errors[0] = "API Key does not exist";
                        err       = 1;
                    }
                    else
                    {
                        if (api_key_info.active == 0)
                        {
                            errors[0] = "API Key is no longer active";
                            err       = 1;
                        }
                    }

                    //if (json.property.arrival_date != "")
                    //{
                    //    if (!Regex.IsMatch(json.property.arrival_date, "(?n:^(?=\\d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(?(.0?2)(?=.{3,4}(1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|(16|[2468][048]|[3579][26])00))|0?[1-9]|1\\d|2[0-8])(?<sep>[/.-])(?<month>0?[1-9]|1[012])\\2(?<year>(1[6-9]|[2-9]\\d)\\d{2})(?:(?=\\x20\\d)\\x20|$))?(?<time>((0?[1-9]|1[012])(:[0-5]\\d){0,2}(?i:\\ [AP]M))|([01]\\d|2[0-3])(:[0-5]\\d){1,2})?$)"))
                    //    {
                    //        errors[1] = "arrival_date must be in this format DD/MM/YYYY";
                    //        err = 1;
                    //    }
                    //    else
                    //    {
                    //        if (classes.common.NullSafeDate(json.property.arrival_date) < classes.common.NullSafeDate(DateTime.Now.ToString("dd/MM/yyyy")))
                    //        {
                    //            errors[1] = "arrival_date cannot be in the past";
                    //            err = 1;
                    //        }
                    //    }
                    //}

                    //if (json.property.departure_date != "")
                    //{
                    //    if (!Regex.IsMatch(json.property.departure_date, "(?n:^(?=\\d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(?(.0?2)(?=.{3,4}(1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|(16|[2468][048]|[3579][26])00))|0?[1-9]|1\\d|2[0-8])(?<sep>[/.-])(?<month>0?[1-9]|1[012])\\2(?<year>(1[6-9]|[2-9]\\d)\\d{2})(?:(?=\\x20\\d)\\x20|$))?(?<time>((0?[1-9]|1[012])(:[0-5]\\d){0,2}(?i:\\ [AP]M))|([01]\\d|2[0-3])(:[0-5]\\d){1,2})?$)"))
                    //    {
                    //        errors[2] = "departure_date must be in this format DD/MM/YYYY";
                    //        err = 1;
                    //    }
                    //    else
                    //    {
                    //        if (classes.common.NullSafeDate(json.property.departure_date) < classes.common.NullSafeDate(json.property.arrival_date))
                    //        {
                    //            errors[2] = "departure_date cannot be less than arrival_date";
                    //            err = 1;
                    //        }
                    //    }
                    //}

                    //if (json.property.arrival_date != "" || json.property.departure_date != "")
                    //{
                    //    if (json.property.arrival_date == "")
                    //    {
                    //        errors[3] = "arrival_date cannot be empty if departure_date has data";
                    //        err = 1;
                    //    }

                    //    if (json.property.departure_date == "")
                    //    {
                    //        errors[4] = "departure_date cannot be empty if arrival_date has data";
                    //        err = 1;
                    //    }
                    //}


                    if (err == 1)
                    {
                        System.Text.StringBuilder error_text = new System.Text.StringBuilder();
                        for (i = 0; i < errors.Length; i++)
                        {
                            if (errors[i] != null)
                            {
                                error_text.Append("\"" + errors[i] + "\",");
                            }
                        }

                        json_content.Append("{");
                        json_content.Append("   \"api\":{");
                        json_content.Append("       \"success\": false,");
                        json_content.Append("       \"messages\": [");
                        json_content.Append(error_text.ToString().TrimEnd(','));
                        json_content.Append("       ]");
                        json_content.Append("   }");
                        json_content.Append("}");
                    }
                    else
                    {
                        System.Text.StringBuilder additional_message = new System.Text.StringBuilder();
                        bool is_supercontrol_down = classes.supercontrol.IsDown();
                        if (is_supercontrol_down == true)
                        {
                            additional_message.Append("\"Availability searches are currently offline, please try again later\",");
                            json.property.arrival_date   = "";
                            json.property.departure_date = "";
                        }

                        string price  = "";
                        int    nights = 0;
                        if (json.property.arrival_date != "" && json.property.departure_date != "")
                        {
                            DateTime date1 = Convert.ToDateTime(json.property.arrival_date);
                            DateTime date2 = Convert.ToDateTime(json.property.departure_date);

                            TimeSpan nights_calc = date2 - date1;
                            nights = classes.common.NullSafeInteger(nights_calc.Days);

                            if (is_supercontrol_down == false)
                            {
                                price = RunSuperControl(json.property.property_code, json.property.arrival_date, nights, json.property.is_details);
                            }
                        }

                        if (price == "")
                        {
                            classes.cottage_info cottage_info = classes.cottage.GetInfo(json.property.property_code, api_key_info.site_id);

                            // No longer used

                            /*if (cottage_info.price_override == "")
                             * {
                             *  if (cottage_info.min_price != 0.0M)
                             *  {
                             *      if (json.property.is_details == 0)
                             *      {
                             *          price = "From <strong>" + string.Format("{0:c}", cottage_info.min_price).Replace(".00", "") + "</strong>";
                             *      }
                             *      else
                             *      {
                             *          price = string.Format("{0:c}", cottage_info.min_price).Replace(".00", "");
                             *      }
                             *  }
                             * }
                             * else
                             * {
                             *  if (cottage_info.price_override == "noprice")
                             *  {
                             *      price = "Please enquire";
                             *  }
                             *  else
                             *  {
                             *      if (json.property.is_details == 0)
                             *      {
                             *          price = "From <strong>" + cottage_info.price_override + "</strong>";
                             *      }
                             *      else
                             *      {
                             *          price = cottage_info.price_override;
                             *      }
                             *  }
                             * }*/

                            if (cottage_info.property_2_night != 0 || cottage_info.property_3_night != 0 || cottage_info.property_4_night != 0)
                            {
                                if (cottage_info.property_2_night != 0)
                                {
                                    price = "Short breaks from <strong>" + string.Format("{0:c}", cottage_info.property_2_night).Replace(".00", "") + "</strong>";
                                }
                                else if (cottage_info.property_3_night != 0)
                                {
                                    price = "Short breaks from <strong>" + string.Format("{0:c}", cottage_info.property_3_night).Replace(".00", "") + "</strong>";
                                }
                                else
                                {
                                    price = "Short breaks from <strong>" + string.Format("{0:c}", cottage_info.property_4_night).Replace(".00", "") + "</strong>";
                                }
                            }
                            else
                            {
                                if (cottage_info.min_price == 0)
                                {
                                    price = "<strong>Pricing on Request</strong>";
                                }
                                else
                                {
                                    price = "Weeks from <strong>" + string.Format("{0:c}", cottage_info.min_price).Replace(".00", "") + "</strong>";
                                }
                            }
                        }

                        price = HttpUtility.HtmlEncode(price);

                        json_content.Append("{");
                        json_content.Append("   \"api\":{");
                        json_content.Append("       \"success\": true,");
                        json_content.Append("       \"authenticated\": true,");
                        json_content.Append("       \"messages\": [");
                        json_content.Append(additional_message.ToString().TrimEnd(','));
                        json_content.Append("       ]");
                        json_content.Append("   },");
                        json_content.Append("   \"property\": {");
                        json_content.Append("       \"price\": \"" + price + "\"");
                        json_content.Append("   }");
                        json_content.Append("}");
                    }
                }
                else
                {
                    json_content.Append("{");
                    json_content.Append("   \"api\":{");
                    json_content.Append("       \"success\": false,");
                    json_content.Append("       \"messages\": [");
                    json_content.Append("           \"JSON request is not valid\"");
                    json_content.Append("       ]");
                    json_content.Append("   }");
                    json_content.Append("}");
                }
            }
            else
            {
                json_content.Append("{");
                json_content.Append("   \"api\":{");
                json_content.Append("       \"success\": false,");
                json_content.Append("       \"messages\": [");
                json_content.Append("           \"JSON request is empty\"");
                json_content.Append("       ]");
                json_content.Append("   }");
                json_content.Append("}");
            }

            Response.Write(json_content.ToString());
        }
コード例 #2
0
        protected void Page_Load(object sender, EventArgs e)
        {
            //clean function finish correct program
            mulberry.api._classes.PropertyCalendar.GetPropertiesCalendar(4023277);



            System.Text.StringBuilder json_content = new System.Text.StringBuilder();
            string postData = new System.IO.StreamReader(Request.InputStream).ReadToEnd();

            //json_content.AppendLine("{");
            //json_content.AppendLine("   \"api\":{");
            //json_content.AppendLine("       \"key\": \"78g878agda78sdgad98abd\"");
            //json_content.AppendLine("   },");
            //json_content.AppendLine("   \"search\":{");
            //json_content.AppendLine("       \"mode\": \"\",");
            //json_content.AppendLine("       \"property\": \"\",");
            //json_content.AppendLine("       \"region\": \"c_1113\",");
            //json_content.AppendLine("       \"town\": 247,");
            //json_content.AppendLine("       \"arrival_date\": \"08/02/2017\",");
            //json_content.AppendLine("       \"departure_date\": \"14/02/2017\",");
            //json_content.AppendLine("       \"sleeps\": 3,");
            //json_content.AppendLine("       \"bedrooms\": 2,");
            //json_content.AppendLine("       \"min_price\": 0,");
            //json_content.AppendLine("       \"max_price\": 0,");
            //json_content.AppendLine("       \"flexibility\": 0,");
            //json_content.AppendLine("       \"features\": \"\",");
            //json_content.AppendLine("       \"order_by\": \"POPULARITY\",");
            //json_content.AppendLine("       \"properties_per_page\": 25,");
            //json_content.AppendLine("       \"page\": 1");
            //json_content.AppendLine("   }");
            //json_content.AppendLine("}");
            //postData = json_content.ToString();


            if (postData != "")
            {
                if (classes.api.ValidateJSON(postData))
                {
                    var json = JsonConvert.DeserializeObject <RootObject>(postData);

                    classes.api_key_info api_key_info = classes.api.GetKeyInfo(json.api.key);
                    string[]             errors       = new string[8];
                    int err = 0;
                    int i   = 0;

                    if (api_key_info.key == "")
                    {
                        errors[0] = "API Key does not exist";
                        err       = 1;
                    }
                    else
                    {
                        if (api_key_info.active == 0)
                        {
                            errors[0] = "API Key is no longer active";
                            err       = 1;
                        }
                    }

                    //if (json.search.arrival_date != "")
                    //{
                    //    if (!Regex.IsMatch(json.search.arrival_date, "(?n:^(?=\\d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(?(.0?2)(?=.{3,4}(1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|(16|[2468][048]|[3579][26])00))|0?[1-9]|1\\d|2[0-8])(?<sep>[/.-])(?<month>0?[1-9]|1[012])\\2(?<year>(1[6-9]|[2-9]\\d)\\d{2})(?:(?=\\x20\\d)\\x20|$))?(?<time>((0?[1-9]|1[012])(:[0-5]\\d){0,2}(?i:\\ [AP]M))|([01]\\d|2[0-3])(:[0-5]\\d){1,2})?$)"))
                    //    {
                    //        errors[1] = "arrival_date must be in this format DD/MM/YYYY";
                    //        err = 1;
                    //    }
                    //    else
                    //    {
                    //        if (classes.common.NullSafeString(json.search.mode) != "LASTMINUTE" && classes.common.NullSafeString(json.search.mode) != "LATEAVAILABILITY")
                    //        {
                    //            if (classes.common.NullSafeDate(json.search.arrival_date) < classes.common.NullSafeDate(DateTime.Now.ToString("dd/MM/yyyy")))
                    //            {
                    //                errors[1] = "arrival_date cannot be in the past";
                    //                err = 1;
                    //            }
                    //        }
                    //    }
                    //}

                    //if (json.search.departure_date != "")
                    //{
                    //    if (!Regex.IsMatch(json.search.departure_date, "(?n:^(?=\\d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(?(.0?2)(?=.{3,4}(1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|(16|[2468][048]|[3579][26])00))|0?[1-9]|1\\d|2[0-8])(?<sep>[/.-])(?<month>0?[1-9]|1[012])\\2(?<year>(1[6-9]|[2-9]\\d)\\d{2})(?:(?=\\x20\\d)\\x20|$))?(?<time>((0?[1-9]|1[012])(:[0-5]\\d){0,2}(?i:\\ [AP]M))|([01]\\d|2[0-3])(:[0-5]\\d){1,2})?$)"))
                    //    {
                    //        errors[2] = "departure_date must be in this format DD/MM/YYYY";
                    //        err = 1;
                    //    }
                    //    else
                    //    {
                    //        if (classes.common.NullSafeDate(json.search.departure_date) < classes.common.NullSafeDate(json.search.arrival_date))
                    //        {
                    //            errors[2] = "departure_date cannot be less than arrival_date";
                    //            err = 1;
                    //        }
                    //    }
                    //}

                    //if (classes.common.NullSafeString(json.search.mode) != "LASTMINUTE" && classes.common.NullSafeString(json.search.mode) != "LATEAVAILABILITY")
                    //{
                    //    if (json.search.arrival_date != "" || json.search.departure_date != "")
                    //    {
                    //        if (json.search.arrival_date == "")
                    //        {
                    //            errors[3] = "arrival_date cannot be empty if departure_date has data";
                    //            err = 1;
                    //        }

                    //        if (json.search.departure_date == "")
                    //        {
                    //            errors[4] = "departure_date cannot be empty if arrival_date has data";
                    //            err = 1;
                    //        }
                    //    }
                    //}

                    if (json.search.order_by == "")
                    {
                        errors[5] = "order_by must contain a value";
                        err       = 1;
                    }

                    if (json.search.properties_per_page <= 0)
                    {
                        errors[6] = "properties_per_page must contain a value larger than 0";
                        err       = 1;
                    }

                    if (json.search.page == 0)
                    {
                        errors[7] = "page must contain a value larger than 0 or -1 (All)";
                        err       = 1;
                    }


                    if (err == 1)
                    {
                        System.Text.StringBuilder error_text = new System.Text.StringBuilder();
                        for (i = 0; i < errors.Length; i++)
                        {
                            if (errors[i] != null)
                            {
                                error_text.Append("\"" + errors[i] + "\",");
                            }
                        }

                        json_content.Append("{");
                        json_content.Append("   \"api\":{");
                        json_content.Append("       \"success\": false,");
                        json_content.Append("       \"messages\": [");
                        json_content.Append(error_text.ToString().TrimEnd(','));
                        json_content.Append("       ]");
                        json_content.Append("   }");
                        json_content.Append("}");
                    }
                    else
                    {
                        if (json.search.page == -1)
                        {
                            json.search.page = 1;
                            json.search.properties_per_page = 9999;
                        }

                        try
                        {
                            System.Text.StringBuilder additional_message = new System.Text.StringBuilder();
                            bool is_supercontrol_down = classes.supercontrol.IsDown();
                            if (is_supercontrol_down == true)
                            {
                                additional_message.Append("\"Availability searches are currently offline, please try again later\",");
                                json.search.arrival_date   = "";
                                json.search.departure_date = "";
                            }

                            // If dates are not valid dates reset to non-date search
                            if (json.search.arrival_date != "" && json.search.departure_date != "")
                            {
                                if (!Regex.IsMatch(json.search.arrival_date, "(?n:^(?=\\d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(?(.0?2)(?=.{3,4}(1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|(16|[2468][048]|[3579][26])00))|0?[1-9]|1\\d|2[0-8])(?<sep>[/.-])(?<month>0?[1-9]|1[012])\\2(?<year>(1[6-9]|[2-9]\\d)\\d{2})(?:(?=\\x20\\d)\\x20|$))?(?<time>((0?[1-9]|1[012])(:[0-5]\\d){0,2}(?i:\\ [AP]M))|([01]\\d|2[0-3])(:[0-5]\\d){1,2})?$)") || !Regex.IsMatch(json.search.departure_date, "(?n:^(?=\\d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(?(.0?2)(?=.{3,4}(1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|(16|[2468][048]|[3579][26])00))|0?[1-9]|1\\d|2[0-8])(?<sep>[/.-])(?<month>0?[1-9]|1[012])\\2(?<year>(1[6-9]|[2-9]\\d)\\d{2})(?:(?=\\x20\\d)\\x20|$))?(?<time>((0?[1-9]|1[012])(:[0-5]\\d){0,2}(?i:\\ [AP]M))|([01]\\d|2[0-3])(:[0-5]\\d){1,2})?$)"))
                                {
                                    json.search.arrival_date   = "";
                                    json.search.departure_date = "";
                                }
                            }

                            int nights = 0;
                            if ((json.search.arrival_date != "" && json.search.departure_date != "") || (json.search.mode == "LASTMINUTE" || json.search.mode == "LATEAVAILABILITY"))
                            {
                                DateTime date1 = Convert.ToDateTime(json.search.arrival_date);
                                DateTime date2 = Convert.ToDateTime(json.search.departure_date);

                                TimeSpan nights_calc = date2 - date1;
                                nights = classes.common.NullSafeInteger(nights_calc.Days);
                            }

                            string[] str = classes.search_property.ResultsPropertyCodes(api_key_info.site_id, classes.common.NullSafeString(json.search.mode), is_supercontrol_down, classes.common.NullSafeString(json.search.region), classes.common.NullSafeLong(json.search.town), classes.common.NullSafeString(json.search.arrival_date), classes.common.NullSafeString(json.search.departure_date), classes.common.NullSafeString(json.search.sleeps), classes.common.NullSafeInteger(json.search.bedrooms), classes.common.NullSafeInteger(json.search.min_price), classes.common.NullSafeInteger(json.search.max_price), classes.common.NullSafeInteger(json.search.flexibility), classes.common.NullSafeString(json.search.features), classes.common.NullSafeString(json.search.variables), classes.common.NullSafeInteger(json.search.late_availability_days), classes.common.NullSafeInteger(json.search.late_availability_days_count), classes.common.NullSafeString(json.search.offer_cutoff), classes.common.NullSafeLong(json.search.offer_category_id), classes.common.NullSafeString(json.search.property));
                            string   results_property_codes = str[0];
                            string   property_codes         = str[1];
                            string   search_sql             = classes.search_property.Run(api_key_info.site_id, classes.common.NullSafeString(json.search.mode), is_supercontrol_down, classes.common.NullSafeString(json.search.region), classes.common.NullSafeLong(json.search.town), classes.common.NullSafeString(json.search.arrival_date), classes.common.NullSafeString(json.search.departure_date), classes.common.NullSafeString(json.search.sleeps), classes.common.NullSafeInteger(json.search.bedrooms), classes.common.NullSafeInteger(json.search.min_price), classes.common.NullSafeInteger(json.search.max_price), classes.common.NullSafeInteger(json.search.flexibility), classes.common.NullSafeString(json.search.features), classes.common.NullSafeString(json.search.variables), classes.common.NullSafeInteger(json.search.late_availability_days), classes.common.NullSafeInteger(json.search.late_availability_days_count), classes.common.NullSafeString(json.search.offer_cutoff), classes.common.NullSafeLong(json.search.offer_category_id), classes.common.NullSafeString(json.search.property), 0, results_property_codes, property_codes);
                            string   search_sql_count       = classes.search_property.Run(api_key_info.site_id, classes.common.NullSafeString(json.search.mode), is_supercontrol_down, classes.common.NullSafeString(json.search.region), classes.common.NullSafeLong(json.search.town), classes.common.NullSafeString(json.search.arrival_date), classes.common.NullSafeString(json.search.departure_date), classes.common.NullSafeString(json.search.sleeps), classes.common.NullSafeInteger(json.search.bedrooms), classes.common.NullSafeInteger(json.search.min_price), classes.common.NullSafeInteger(json.search.max_price), classes.common.NullSafeInteger(json.search.flexibility), classes.common.NullSafeString(json.search.features), classes.common.NullSafeString(json.search.variables), classes.common.NullSafeInteger(json.search.late_availability_days), classes.common.NullSafeInteger(json.search.late_availability_days_count), classes.common.NullSafeString(json.search.offer_cutoff), classes.common.NullSafeLong(json.search.offer_category_id), classes.common.NullSafeString(json.search.property), 1, results_property_codes, property_codes);

                            long   record_count = classes.search_property.Count(search_sql_count);
                            double pages_split  = (record_count / json.search.properties_per_page) + 0.5;
                            int    pages_needed = classes.common.NullSafeInteger(Math.Ceiling(pages_split));

                            string sql_order = "";
                            switch (json.search.order_by)
                            {
                            case "PRICE_ASC":
                                sql_order = "ORDER BY property_price_order ASC";
                                break;

                            case "PRICE_DESC":
                                sql_order = "ORDER BY property_price_order DESC";
                                break;

                            case "SLEEPS_ASC":
                                sql_order = "ORDER BY property_sleeps ASC";
                                break;

                            case "SLEEPS_DESC":
                                sql_order = "ORDER BY property_sleeps DESC";
                                break;

                            case "POPULARITY":
                                sql_order = "ORDER BY property_order DESC";
                                break;

                            default:
                                sql_order = "ORDER BY property_order DESC";
                                break;
                            }

                            System.Text.StringBuilder sql_query = new System.Text.StringBuilder();
                            sql_query.AppendLine("DECLARE @FirstRec int, @LastRec int");
                            sql_query.AppendLine("SELECT  @FirstRec = (" + json.search.page + "  - 1) * " + json.search.properties_per_page);
                            sql_query.AppendLine("SELECT  @LastRec  = (" + json.search.page + " * " + json.search.properties_per_page + ");");
                            sql_query.AppendLine("");
                            sql_query.AppendLine("");
                            sql_query.AppendLine("SELECT *");
                            sql_query.AppendLine("FROM (");
                            sql_query.AppendLine("SELECT ROW_NUMBER() OVER (" + sql_order + ") AS Row, property_code, property_order, property_name, property_town, property_postcode, property_sleeps, property_sleeps_text, property_bedrooms, property_bathrooms, property_search_description, property_minprice, property_availability_link, property_lat, property_long, property_1_night, property_2_night, property_3_night, property_4_night, property_5_night, property_6_night, property_deal_text, property_deal_date_start, property_deal_date_end, property_price_order, region_name, property_price, property_booking, thumb_image, is_new, featured, feefo_average, pet_friendly, offer_text");
                            sql_query.AppendLine("FROM (");
                            sql_query.AppendLine(search_sql.Replace("ORDER BY property_order DESC", ""));
                            sql_query.AppendLine(") AS SEARCH_RESULTS");
                            sql_query.AppendLine(") AS SEARCH_PAGING");
                            sql_query.AppendLine("WHERE Row > @FirstRec AND Row <= @LastRec");
                            sql_query.AppendLine(sql_order);

                            //Response.Write(sql_query.ToString());
                            //Response.End();

                            System.Text.StringBuilder results_builder = new System.Text.StringBuilder();
                            using (SqlConnection connection = new SqlConnection(classes.common.connectionString))
                            {
                                connection.Open();
                                SqlCommand command = new SqlCommand(sql_query.ToString(), connection);
                                command.CommandType = System.Data.CommandType.Text;

                                SqlDataReader reader = command.ExecuteReader();
                                while (reader.Read())
                                {
                                    long   property_code               = classes.common.NullSafeLong(reader["property_code"]);
                                    string property_name               = HttpUtility.HtmlEncode(classes.common.NullSafeString(reader["property_name"]));
                                    string property_town               = HttpUtility.HtmlEncode(classes.common.NullSafeString(reader["property_town"]));
                                    string property_postcode           = HttpUtility.HtmlEncode(classes.common.NullSafeString(reader["property_postcode"]));
                                    int    property_sleeps             = classes.common.NullSafeInteger(reader["property_sleeps"]);
                                    string property_sleeps_text        = HttpUtility.HtmlEncode(classes.common.NullSafeString(reader["property_sleeps_text"]));
                                    int    property_bedrooms           = classes.common.NullSafeInteger(reader["property_bedrooms"]);
                                    int    property_bathrooms          = classes.common.NullSafeInteger(reader["property_bathrooms"]);
                                    string property_search_description = HttpUtility.HtmlEncode(classes.common.NullSafeString(reader["property_search_description"]).Replace(Environment.NewLine, ""));
                                    int    property_minprice           = classes.common.NullSafeInteger(reader["property_minprice"]);
                                    string property_availability_link  = classes.common.NullSafeString(reader["property_availability_link"]);
                                    string property_lat             = HttpUtility.HtmlEncode(classes.common.NullSafeString(reader["property_lat"]));
                                    string property_long            = HttpUtility.HtmlEncode(classes.common.NullSafeString(reader["property_long"]));
                                    int    price_one_night          = classes.common.NullSafeInteger(reader["property_1_night"]);
                                    int    price_two_night          = classes.common.NullSafeInteger(reader["property_2_night"]);
                                    int    price_three_night        = classes.common.NullSafeInteger(reader["property_3_night"]);
                                    int    price_four_night         = classes.common.NullSafeInteger(reader["property_4_night"]);
                                    int    price_five_night         = classes.common.NullSafeInteger(reader["property_5_night"]);
                                    int    price_six_night          = classes.common.NullSafeInteger(reader["property_6_night"]);
                                    string price_overide            = HttpUtility.HtmlEncode(classes.common.NullSafeString(reader["property_price"]));
                                    int    property_booking         = classes.common.NullSafeInteger(reader["property_booking"]);
                                    string property_county          = HttpUtility.HtmlEncode(classes.common.NullSafeString(reader["region_name"]));
                                    string property_image           = classes.common.NullSafeString(reader["thumb_image"]);
                                    string property_deal_text       = HttpUtility.HtmlEncode(classes.common.NullSafeString(reader["property_deal_text"]));
                                    string property_deal_date_start = (classes.common.NullSafeString(reader["property_deal_date_start"]) != "" ? HttpUtility.HtmlEncode(classes.common.NullSafeDate(reader["property_deal_date_start"]).ToString("dd/MM/yyyy")) : "");
                                    string property_deal_date_end   = (classes.common.NullSafeString(reader["property_deal_date_end"]) != "" ? HttpUtility.HtmlEncode(classes.common.NullSafeDate(reader["property_deal_date_end"]).ToString("dd/MM/yyyy")) : "");
                                    int    is_new        = classes.common.NullSafeInteger(reader["is_new"]);
                                    int    is_featured   = classes.common.NullSafeInteger(reader["featured"]);
                                    int    feefo_average = classes.common.NullSafeInteger(reader["feefo_average"]);
                                    int    pet_friendly  = classes.common.NullSafeInteger(reader["pet_friendly"]);
                                    string offer_text    = classes.common.NullSafeString(reader["offer_text"]);


                                    results_builder.Append("{");
                                    results_builder.Append("  \"property_code\": \"" + property_code + "\",");
                                    results_builder.Append("  \"property_name\": \"" + property_name + "\",");
                                    results_builder.Append("  \"town\": \"" + property_town + "\",");
                                    results_builder.Append("  \"county\": \"" + property_county + "\",");
                                    results_builder.Append("  \"postcode\": \"" + property_postcode + "\",");
                                    results_builder.Append("  \"sleeps\": " + property_sleeps + ",");
                                    results_builder.Append("  \"sleeps_text\": \"" + property_sleeps_text + "\",");
                                    results_builder.Append("  \"bedrooms\": " + property_bedrooms + ",");
                                    results_builder.Append("  \"bathrooms\": " + property_bathrooms + ",");
                                    results_builder.Append("  \"description\": \"" + property_search_description + "\",");
                                    results_builder.Append("  \"min_price\": " + property_minprice + ",");
                                    results_builder.Append("  \"price_one_night\": " + price_one_night + ",");
                                    results_builder.Append("  \"price_two_night\": " + price_two_night + ",");
                                    results_builder.Append("  \"price_three_night\": " + price_three_night + ",");
                                    results_builder.Append("  \"price_four_night\": " + price_four_night + ",");
                                    results_builder.Append("  \"price_five_night\": " + price_five_night + ",");
                                    results_builder.Append("  \"price_six_night\": " + price_six_night + ",");
                                    results_builder.Append("  \"price_overide\": \"" + price_overide + "\",");
                                    results_builder.Append("  \"deal_text\": \"" + property_deal_text + "\",");
                                    results_builder.Append("  \"deal_date_end\": \"" + property_deal_date_end + "\",");

                                    if (offer_text != "")
                                    {
                                        if (json.search.arrival_date != "" && json.search.departure_date != "")
                                        {
                                            if (offer_text.Contains("%"))
                                            {
                                                if (offer_text.Contains(":"))
                                                {
                                                    results_builder.Append("  \"deal_alert\": \"" + offer_text + "\",");
                                                }
                                                else
                                                {
                                                    results_builder.Append("  \"deal_alert\": \"Save " + offer_text + "\",");
                                                }
                                            }
                                            else
                                            {
                                                results_builder.Append("  \"deal_alert\": \"" + offer_text + "\",");
                                            }
                                        }
                                        else
                                        {
                                            if (offer_text.Contains("%"))
                                            {
                                                if (offer_text.Contains(":"))
                                                {
                                                    results_builder.Append("  \"deal_alert\": \"" + offer_text + "\",");
                                                }
                                                else
                                                {
                                                    results_builder.Append("  \"deal_alert\": \"Save up to " + offer_text + "\",");
                                                }
                                            }
                                            else
                                            {
                                                results_builder.Append("  \"deal_alert\": \"" + offer_text + "\",");
                                            }
                                        }
                                    }
                                    else
                                    {
                                        results_builder.Append("  \"deal_alert\": \"\",");
                                    }

                                    results_builder.Append("  \"availability_link\": \"" + property_availability_link + "\",");
                                    results_builder.Append("  \"image\": \"" + property_image + "\",");
                                    results_builder.Append("  \"latitude\": \"" + property_lat + "\",");
                                    results_builder.Append("  \"longitude\": \"" + property_long + "\",");

                                    if (is_new == 1)
                                    {
                                        results_builder.Append("  \"is_new\": true,");
                                    }
                                    else
                                    {
                                        results_builder.Append("  \"is_new\": false,");
                                    }

                                    if (is_featured == 1)
                                    {
                                        results_builder.Append("  \"is_featured\": true,");
                                    }
                                    else
                                    {
                                        results_builder.Append("  \"is_featured\": false,");
                                    }

                                    if (property_booking == 0)
                                    {
                                        results_builder.Append("  \"is_booking_enabled\": true,");
                                    }
                                    else
                                    {
                                        results_builder.Append("  \"is_booking_enabled\": false,");
                                    }

                                    if (pet_friendly == 1)
                                    {
                                        results_builder.Append("  \"is_pet_friendly\": true,");
                                    }
                                    else
                                    {
                                        results_builder.Append("  \"is_pet_friendly\": false,");
                                    }

                                    results_builder.Append("  \"feefo_average\": " + feefo_average + ",");
                                    results_builder.Append("  \"features\": [");
                                    results_builder.Append(GetFeatures(property_code));
                                    results_builder.Append("  ]");
                                    results_builder.Append("},");
                                }
                            }

                            if (classes.common.NullSafeString(json.search.mode) != "LASTMINUTE" && classes.common.NullSafeString(json.search.mode) != "LATEAVAILABILITY")
                            {
                                if (classes.common.NullSafeInteger(json.search.page) < 2 && classes.common.NullSafeString(json.search.variables).Contains("2877") == false)
                                {
                                    int region = 0;
                                    int county = 0;

                                    if (json.search.region.Contains("r_"))
                                    {
                                        region = classes.common.NullSafeInteger(json.search.region.Replace("r_", ""));
                                    }

                                    if (json.search.region.Contains("c_"))
                                    {
                                        county = classes.common.NullSafeInteger(json.search.region.Replace("c_", ""));
                                    }

                                    classes.api.SaveSearch(region, county, json.search.town, json.search.sleeps, "", json.search.arrival_date, nights, json.search.features, "API");
                                }
                            }

                            json_content.Append("{");
                            json_content.Append("   \"api\":{");
                            json_content.Append("       \"success\": true,");
                            json_content.Append("       \"authenticated\": true,");
                            json_content.Append("       \"messages\": [");
                            json_content.Append(additional_message.ToString().TrimEnd(','));
                            json_content.Append("       ]");
                            json_content.Append("   },");
                            json_content.Append("   \"results\":{");
                            json_content.Append("       \"records\": " + record_count + ",");
                            json_content.Append("       \"pages\": " + pages_needed);
                            json_content.Append("   },");
                            json_content.Append("   \"properties\": [");
                            json_content.Append(results_builder.ToString().TrimEnd(','));
                            json_content.Append("   ]");
                            json_content.Append("}");
                        }
                        catch (Exception ex)
                        {
                            System.Text.StringBuilder error_builder = new System.Text.StringBuilder();
                            error_builder.AppendLine("Please debug and fix.");
                            error_builder.AppendLine("");
                            error_builder.AppendLine("Mode: " + classes.common.NullSafeString(json.search.mode));
                            error_builder.AppendLine("Property: " + classes.common.NullSafeString(json.search.property));
                            error_builder.AppendLine("Region: " + classes.common.NullSafeString(json.search.region));
                            error_builder.AppendLine("Town: " + classes.common.NullSafeString(json.search.town));
                            error_builder.AppendLine("Arrival Date: " + classes.common.NullSafeString(json.search.arrival_date));
                            error_builder.AppendLine("Departure Date: " + classes.common.NullSafeString(json.search.departure_date));
                            error_builder.AppendLine("Sleeps: " + classes.common.NullSafeString(json.search.sleeps));
                            error_builder.AppendLine("Bedrooms: " + classes.common.NullSafeString(json.search.bedrooms));
                            error_builder.AppendLine("Min Price: " + classes.common.NullSafeString(json.search.min_price));
                            error_builder.AppendLine("Max Price: " + classes.common.NullSafeString(json.search.max_price));
                            error_builder.AppendLine("Flexibility: " + classes.common.NullSafeString(json.search.flexibility));
                            error_builder.AppendLine("Features: " + classes.common.NullSafeString(json.search.features));
                            error_builder.AppendLine("Variables: " + classes.common.NullSafeString(json.search.variables));
                            error_builder.AppendLine("Late Availability Days: " + classes.common.NullSafeString(json.search.late_availability_days));
                            error_builder.AppendLine("Late Availability Count: " + classes.common.NullSafeString(json.search.late_availability_days_count));
                            error_builder.AppendLine("Offer CutOff: " + classes.common.NullSafeString(json.search.offer_cutoff));
                            error_builder.AppendLine("Offer Category ID: " + classes.common.NullSafeLong(json.search.offer_category_id));
                            error_builder.AppendLine("Order By: " + classes.common.NullSafeString(json.search.order_by));
                            error_builder.AppendLine("Properties Per Page: " + classes.common.NullSafeString(json.search.properties_per_page));
                            error_builder.AppendLine("Page: " + classes.common.NullSafeString(json.search.page));
                            error_builder.AppendLine("");
                            error_builder.AppendLine(ex.ToString());

                            classes.common.SendEmail("Search Failure", error_builder.ToString());
                        }
                    }
                }
                else
                {
                    json_content.Append("{");
                    json_content.Append("   \"api\":{");
                    json_content.Append("       \"success\": false,");
                    json_content.Append("       \"messages\": [");
                    json_content.Append("           \"JSON request is not valid\"");
                    json_content.Append("       ]");
                    json_content.Append("   }");
                    json_content.Append("}");
                }
            }
            else
            {
                json_content.Append("{");
                json_content.Append("   \"api\":{");
                json_content.Append("       \"success\": false,");
                json_content.Append("       \"messages\": [");
                json_content.Append("           \"JSON request is empty\"");
                json_content.Append("       ]");
                json_content.Append("   }");
                json_content.Append("}");
            }

            Response.Write(json_content.ToString());
        }