Skip to content

Instantly share code, notes, and snippets.

@osya
Last active August 29, 2015 14:18
Show Gist options
  • Save osya/6b8eea074efa24e48df1 to your computer and use it in GitHub Desktop.
Save osya/6b8eea074efa24e48df1 to your computer and use it in GitHub Desktop.
Working with JavaScript in SSRS #BI #SSRS #MIS #JavaScript
'''____________________________________________________________
''' Function #3/3 (Main): ver. 1.0
''' <summary>
''' Создает новую с сылку для открытия отчета в новом окне - тег A и JavaScript...open
''' </summary>
''' <param name="LinkName">Название ссылки</param>
''' <param name="ReportServerPath">URL сервера отчетов</param>
''' <param name="ReportFolder">Директория отчета</param>
''' <param name="ReportName">Название отчета</param>
''' <param name="ParamParameters">Все праметры отчета (передается как Parameters)</param>
''' <param name="ParamNames">Список параметров, которые необходимо передать</param>
''' <returns>Готовая ссылка</returns>
Public Function NewWindowLink( _
ByVal LinkName As String, _
ByVal ReportServerPath As String, _
ByVal ReportFolder As String, _
ByVal ReportName As String, _
ByVal ParamParameters As Parameters, _
ByVal ParamArray ParamNames() As String _
) As String
Const ieLinkLengt As Integer = 2083
NewWindowLink = "javascript:void(window.open('" _
& IIf(ReportServerPath.Contains("Pages/ReportViewer.aspx?"), ReportServerPath, ReportServerPath + "/Pages/ReportViewer.aspx?/") _
& WrapParameter(ReportFolder.Replace("/","")) & "/" _
& WrapParameter(ReportName)
Dim EndLink As String = "','_blank','resizable=yes,scrollbars=yes,top=70,left=70,height='+(window.screen.availHeight-140)+',width='+(window.screen.availWidth-140)))"
If ParamNames.Length > 0 Then
For i As Integer = 0 To UBound(ParamNames, 1)
If ParamNames(i).Contains("=") Then
NewWindowLink += ParamNames(i).Substring(0, ParamNames(i).IndexOf("=") + 1) + WrapParameter(ParamNames(i).Substring(ParamNames(i).IndexOf("=") + 1))
ElseIf ParamNames(i).Equals("-") Then
Continue For
Else
If Not TryPrepareParameter(ParamParameters(ParamNames(i)), ParamNames(i), ieLinkLengt - System.Uri.EscapeUriString(NewWindowLink & EndLink).Length, NewWindowLink) Then
Exit For
End If
End If
Next i
End If
If LinkName = "-" Then
NewWindowLink = String.Format("{0}{1}", NewWindowLink, EndLink)
Else
NewWindowLink = String.Format("<a href=""{0}{1}"">{2}</a>", NewWindowLink, EndLink, LinkName)
End If
End Function
'''^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
'''============================================================
''' <summary>
''' Функция подготавливает код javascript:void(windows.open с возможностью обернуть в тег A
''' </summary>
''' <param name="link">Ссылка в нормальном виде</param>
''' <param name="linkName">Название ссылки в теге A, если не указано, то ссылка не будет обернута в тег A</param>
''' <param name="extentedWindow">True - если необходимо отобразить меню, строку состояния и т.п. По умолчанию - False</param>
''' <returns>Строка с подготовленной ссылкой</returns>
''' <remarks></remarks>
Public Function GetJSLink(ByVal link As String, Optional ByVal linkName As String = "n\a", Optional extentedWindow As Boolean = True) As String
If IsNothing(link) Then Return "-"
Dim pattern As System.Text.StringBuilder
pattern = New System.Text.StringBuilder
pattern.Append("^(?<protocol>[\w\-]{1,5}:\/\/)?")
pattern.Append("(?<userpassword>([\wА-ЯЁа-яё\-]{1,}):([\wА-ЯЁа-яё\-]{1,})\@)?")
pattern.Append("(?<sdd>")
pattern.Append("(?<ip>[\d.]{8,})|")
pattern.Append("(?<domainRF>(www\.)?[А-ЯЁа-яё0-9_\-]{2,})")
pattern.Append("(?<domainendungRF>\.[А-ЯЁа-яё]{2,4})?|")
pattern.Append("(?<domain>([\w\-]{1,}(\.)?)+)?")
pattern.Append("(?<domainendung>[a-z]{2,6})?)")
pattern.Append("(?<port>:[0-9]{1,5})?")
pattern.Append("(?<encode>\/(%([a-f0-9]{2}[-_]?)){1,})?")
pattern.Append("(?<path>[\/\\]([~\wА-ЯЁа-яё \-]{1,}[\/\\])+)?")
pattern.Append("(?<file>(\/\\)?[^\x00-\x1f\\?*:\""|#]+)?")
pattern.Append("(?<param>(\/)?\?)?")
pattern.Append("(?<param1>\/[\wА-ЯЁа-яё\/\-\.,]{1,})?")
pattern.Append("(?<param2>(([\&\;])?[\wА-ЯЁа-яё\-]{1,}(\=[\@\wА-ЯЁа-яё \-:\.\/\%,+]{0,})?)+)?")
pattern.Append("(?<fragment>#[^\s]+)?")
Dim rgx As System.Text.RegularExpressions.Regex
rgx = New System.Text.RegularExpressions.Regex(pattern.ToString(), System.Text.RegularExpressions.RegexOptions.IgnoreCase)
Dim m As System.Text.RegularExpressions.Match
m = rgx.Match(link.Replace("\", "/"))
Dim result As System.Text.StringBuilder
result = New System.Text.StringBuilder
result.Append("javascript:void(window.open('")
Try
If m.Success Then
For Each groupName As String In rgx.GetGroupNames
If groupName.Length > 2 And m.Groups(groupName).Success Then
Select Case groupName
Case "protocol"
result.Append(m.Groups("protocol").ToString())
Case "userpassword"
result.Append(m.Groups("userpassword").ToString())
Case "ip" 'Do nothing
Case "domainRF" 'Do nothing
Case "domainendungRF" 'Do nothing
Case "subdomain" 'Do nothing
Case "domain" 'Do nothing
Case "domainendung" 'Do nothing
Case "sdd"
Dim idn As System.Globalization.IdnMapping
idn = New System.Globalization.IdnMapping
result.Append(idn.GetAscii(m.Groups("sdd").ToString()))
Case "port"
result.Append(m.Groups("port").ToString())
Case "encode"
result.Append("'+escape('" + m.Groups("encode").ToString() + "')+'")
Case "path"
result.Append("'+escape('" + m.Groups("path").ToString() + "')+'")
Case "file"
result.Append("'+escape('" + m.Groups("file").ToString() + "')+'")
Case "param"
result.Append("'+encodeURI('" + m.Groups("param").ToString() + "')+'")
Case "param1"
result.Append("'+encodeURI('" + m.Groups("param1").ToString() + "')+'")
Case "param2"
result.Append("'+encodeURI('" + m.Groups("param2").ToString() + "')+'")
Case "fragment"
result.Append("'+encodeURI('" + m.Groups("fragment").ToString() + "')+'")
Case Else
End Select
'Console.WriteLine(String.Format("{0} : {1}", groupName, res))
End If
Next
result.Append("','_blank','resizable=yes,scrollbars=yes")
If extentedWindow Then
result.Append(",location=yes,menubar=yes,toolbar=yes")
End If
result.Append(",top=70,left=70,height='+(window.screen.availHeight-170)+',width='+(window.screen.availWidth-170)))")
Else
result = New System.Text.StringBuilder(link)
End If
Catch
result = New System.Text.StringBuilder(link)
End Try
If linkName.Equals("n\a") Then
Return result.ToString().Replace("+''", "")
Else
Return String.Format("<a href=""{0}"">{1}</a>", result.ToString().Replace("+''", ""), linkName)
End If
End Function
'''^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment