/// <summary>
        /// Ajaxes the pager.
        /// </summary>
        /// <param name="html">The HTML.</param>
        /// <param name="options">The options.</param>
        /// <param name="options">The options.</param>
        /// <returns></returns>
        public static string AjaxPager(this HtmlHelper html, PagingOption pagingOptions, AjaxPaginationOption ajaxOptions)
        {
            var param = html.ViewContext.HttpContext.Request.Form;

            // merge data of ajax pagination option and request
            var data = new RouteValueDictionary(ajaxOptions.Data);

            if (ajaxOptions.AutoLoadParam == true)
            {
                foreach (var key in param.AllKeys)
                {
                    if (key != null && !data.ContainsKey(key))
                    {
                        data.Add(key, param[key]);
                    }
                }
            }

            int firstPage = 1;
            var before    = (int)Math.Ceiling((double)(pagingOptions.PageSize / 2));
            var after     = pagingOptions.PageSize - before;
            var startPage = Math.Max(1, pagingOptions.CurrentPage - before);
            int lastPage  = (int)Math.Ceiling((double)(pagingOptions.TotalRows) / (double)(pagingOptions.PageSize));
            var endPage   = Math.Min(lastPage, pagingOptions.CurrentPage + after);


            var dataObj = Json.Decode <Object>(Json.EncodeDictionary(data));

            // autload htmlID
            var HtmlID = ajaxOptions.HtmlID;

            if (ajaxOptions.AutoLoadHtmlID == true && param["HtmlID"] != null)
            {
                HtmlID = param["HtmlID"];
            }

            string hiddenRefresh = html.ButtonToRemote("", "cmdRefresh", new RemoteOption {
                URL = pagingOptions.UrlMaker(pagingOptions.CurrentPage), Update = HtmlID, Data = dataObj
            }, new { style = "display:none" });

            if (pagingOptions.TotalRows <= pagingOptions.PageSize)
            {
                return(hiddenRefresh);
            }


            var ret = new List <String>();


            //pager.LinkPattern = linkPagePattern;
            string currentLinkPattern = "<b>" + pagingOptions.CurrentPage + "</b>";

            // first page
            if (pagingOptions.CurrentPage != firstPage)
            {
                ret.Add(html.LinkToRemote("First", new RemoteOption {
                    URL = pagingOptions.UrlMaker(firstPage), Update = HtmlID, Data = dataObj
                }));
            }

            // previous page
            if (pagingOptions.CurrentPage > 1)
            {
                ret.Add(html.LinkToRemote("Previous", new RemoteOption {
                    URL = pagingOptions.UrlMaker(pagingOptions.CurrentPage - 1), Update = HtmlID, Data = dataObj
                }));
            }

            // pages
            for (int i = startPage; i <= endPage; i++)
            {
                if (i == pagingOptions.CurrentPage)
                {
                    ret.Add(currentLinkPattern);
                }
                else
                {
                    ret.Add(html.LinkToRemote(i.ToString(), new RemoteOption {
                        URL = pagingOptions.UrlMaker(i), Update = HtmlID, Data = dataObj
                    }));
                }
            }

            // next page
            if (pagingOptions.CurrentPage < endPage)
            {
                ret.Add(html.LinkToRemote("Next", new RemoteOption {
                    URL = pagingOptions.UrlMaker(pagingOptions.CurrentPage + 1), Update = HtmlID, Data = dataObj
                }));
            }

            // last page
            if (pagingOptions.CurrentPage != lastPage)
            {
                ret.Add(html.LinkToRemote("Last", new RemoteOption {
                    URL = pagingOptions.UrlMaker(lastPage), Update = HtmlID, Data = dataObj
                }));
            }
            ret.Add(hiddenRefresh);
            return(String.Join(" ", ret.ToArray()));
        }