<cfparam name="nStart" type="integer" default="1"/>

<cfparam name="ATTRIBUTES.recordCount" type="integer"/>
<cfparam name="ATTRIBUTES.recordsPerPage" type="integer"/>
<cfparam name="ATTRIBUTES.thisPage" type="string" default=""/>
<cfparam name="ATTRIBUTES.addtionalUrlParams" type="string" default=""/>
<cfparam name="ATTRIBUTES.self" type="string" default=""/>
<!---<cfparam name="ATTRIBUTES.fwx" type="string" default=""/>--->
<cfparam name="ATTRIBUTES.output" type="string" default="paginator"/>

<!--- Исключение: рассчитанный индекс страницы превышает количество существующих страниц - надо возвращаться на первую --->

<cfset nPages = Int((ATTRIBUTES.recordCount-1)/ATTRIBUTES.recordsPerPage)+1/>
<cfset nCurrentPage = Int((nStart-1)/ATTRIBUTES.recordsPerPage)+1/>
<cfif nStart GT ATTRIBUTES.recordCount>
	<cfset nStart=1/>
</cfif>

<cfset UrlSuffix=""/>
<cfif len(ATTRIBUTES.addtionalUrlParams) GT 0>
	<cfset UrlSuffix="&#ATTRIBUTES.addtionalUrlParams#"/>
</cfif>
<cfif len(ATTRIBUTES.self) GT 0>
	<cfset UrlSuffix="&track=#ATTRIBUTES.self#"/>
</cfif>

<cfset somePages=3/>

<cfsavecontent variable="pages">
	<cfif ATTRIBUTES.recordCount GT ATTRIBUTES.recordsPerPage>
		<cfset doMerge = false/>
		<cfloop index="i" from="1" to="#nPages#">
			<cfset nPageStartRecordNum=(i-1)*ATTRIBUTES.recordsPerPage+1>
			<!---
			схема, которая обеспечивает дихотомический поиск
			первые несколько страниц (не менее 2)
			если есть разрыв - многоточие
				посередине
			если есть разрыв - многоточие
			несколько страниц до текушей
			текущую без ссылки
			несколько страниц после текущей
			если есть разрыв - многоточие
				посередине
			если есть разрыв - многоточие
			последние несколько страниц
			--->
			<!---Можно сделать на многоточии ссылку на середину интервала!--->
			<!---Хочется добиться, чтобы при хождении вперед-назад значения повторялись--->
			<!---забавный эффект, когда остается разрыв в 1 страницу, а там все равно многоточие--->
			<cfoutput>
				<cfif i NEQ nCurrentPage>
					<cfif i GT somePages AND (nCurrentPage-i) GT somePages>
						<cfif NOT doMerge><!---*** неуклюже--->
							<cfset nMidPage = ceiling(nCurrentPage/2)/>
							<cfset nMidStartRecord = (nMidPage-1)*ATTRIBUTES.recordsPerPage+1/>
							<a href="#ATTRIBUTES.thisPage#?nStart=#nMidStartRecord##UrlSuffix#" title="#nMidPage#">...</a>&nbsp;<cfset doMerge=true/>
						</cfif>		
					<cfelseif (i-nCurrentPage) GT somePages AND (nPages-i) GT somePages>
						<cfif NOT doMerge>
							<cfset nMidPage = ceiling((nCurrentPage+nPages)/2)/>
							<cfset nMidStartRecord = (nMidPage-1)*ATTRIBUTES.recordsPerPage+1/>
							<a href="#ATTRIBUTES.thisPage#?nStart=#nMidStartRecord##UrlSuffix#" title="#nMidPage#">...</a>&nbsp;<cfset doMerge=true/>
						</cfif>	
					<cfelse>
						<a href="#ATTRIBUTES.thisPage#?nStart=#nPageStartRecordNum##UrlSuffix#">#i#</a>&nbsp;
						<cfset doMerge=false/>
					</cfif>
				<cfelse>
					<b>#i#</b>&nbsp;
				</cfif>
			</cfoutput>
		</cfloop>
	</cfif>
</cfsavecontent>

<cfset "CALLER.#ATTRIBUTES.output#.links"=#pages#/>
<cfset "CALLER.#ATTRIBUTES.output#.recordsPerPage"=#ATTRIBUTES.recordsPerPage#/>

<cfexit method="exittag"/>