- Timestamp:
- 02/24/21 21:58:42 (4 years ago)
- Branches:
- master
- Children:
- ff9da8b
- Parents:
- 0c07a90
- Location:
- resources
- Files:
-
- 2 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
resources/js/main.js
r0c07a90 rf457265 1 1 var app = { 2 2 3 // Initialize 4 init: function() { 5 this.welcomeSlider(); 6 this.categoryNavbarPosition(); 7 this.categoryNavbarActiveLink(); 8 this.buildSimpleTooltip(); 9 this.scrollSmoothly(); 10 this.scrollToTop(); 11 this.likePost(); 12 this.unlikePost(); 13 this.comment(); 14 }, 15 16 welcomeSlider: function() { 17 var swiper = new Swiper('.swiper-container', { 18 pagination: { 19 el: '.swiper-pagination', 20 clickable: true, 21 renderBullet: function(index, className) { 22 return '<span class="' + className + '">' + (index + 1) + '</span>'; 23 }, 24 }, 25 navigation: { 26 nextEl: '.swiper-button-next', 27 prevEl: '.swiper-button-prev', 28 }, 29 loop: true, 30 centeredSlides: true, 31 autoplay: { 32 delay: 2500, 33 disableOnInteraction: false, 34 }, 35 }); 36 }, 37 38 categoryNavbarPosition: function() { 39 if ($(".categoryNavbar").length) { 40 var distance = $(".navbar").offset().top; 41 var $window = $(window); 42 var navbar = $(".navbar"); 43 44 $window.scroll(function() { 45 if ($window.scrollTop() >= distance) { 46 navbar.addClass("fixed-top"); 47 } else { 48 navbar.removeClass("fixed-top"); 49 } 50 }); 51 } 52 }, 53 54 categoryNavbarActiveLink: function() { 55 if ($(".categoryNavbar").length) { 56 $(".categoryNavbar a[href='http://technoblog.test/category/" + window.location.pathname + "']").addClass("active"); 57 } 58 }, 59 60 buildSimpleTooltip: function() { 61 if (!$("a.elemWithTooltip").length || !$("a.elemWithTooltip").data("tooltip-info")) { 62 return false; 63 } 64 65 var tooltipElem = $("a.elemWithTooltip"); 66 var placements = ["top", "right", "bottom", "left"]; 67 68 tooltipElem.each(function(i) { 69 70 var $this = $(this); 71 var tooltipData = $this.data("tooltip-info"); 72 var title = tooltipData.substring(tooltipData.indexOf("-") + 1); 73 var placement = tooltipData.substring(0, tooltipData.indexOf("-")); 74 75 if (tooltipData.indexOf("-") === -1 || tooltipData.charAt(0) === "-") { 76 $this.addClass("Error_SimpleTooltip"); 77 return false; 78 } 79 80 $.each(placements, function(j) { 81 if (placement === placements[j]) { 82 $this.not(".Error_SimpleTooltip").attr({ 83 "data-toggle": "tooltip", 84 "data-placement": placement, 85 "title": title 86 }).tooltip(); 87 } 88 }); 89 }); 90 91 }, 92 93 scrollSmoothly: function() { 94 var scroll = new SmoothScroll("a.scrollBtn", { 95 easing: "linear" 96 }); 97 }, 98 99 scrollToTop: function() { 100 if ($(".scrollUpArrow").length) { 101 var distance = 150; 102 var $window = $(window); 103 var scrollUp = $(".scrollUpArrow"); 104 105 scrollUp.hide(); 106 107 $window.scroll(function() { 108 if ($window.scrollTop() >= distance) { 109 scrollUp.fadeIn("slow"); 110 } else { 111 scrollUp.fadeOut("slow"); 112 } 113 }); 114 } 115 }, 116 117 likePost: function() { 118 119 $(".post-reaction").on("click", ".likePost", function() { 120 121 var data = $(this).data("post-id"); 122 var _token = $("meta[name='csrf-token']").attr("content"); 123 124 $.ajax({ 125 url: "/like", 126 type: "post", 127 data: { 128 post_id : data, 129 _token : _token, 130 }, 131 dataType: "json", 132 success: function(response) { 133 $(".post-reaction i").remove(); 134 $(".post-reaction").append("<i data-unlike-id=" + response.unlike_id + " class='text-danger fa fa-heart unlikePost' aria-hidden='true'></i>"); 135 $(".likeCounter").text(response.likeCounter); 136 }, 137 error: function(data) { 138 console.log(data); 139 } 140 }); 141 }) 142 }, 143 144 unlikePost: function() { 145 146 $(".post-reaction").on("click", ".unlikePost", function() { 147 148 var data = $(this).data("unlike-id"); 149 var _token = $("meta[name='csrf-token']").attr("content"); 150 151 $.ajax({ 152 url: "/unlike", 153 type: "post", 154 data: { 155 unlike_id : data, 156 _token : _token, 157 }, 158 dataType: "json", 159 success: function(response) { 160 $(".post-reaction i").remove(); 161 $(".post-reaction").append("<i data-post-id=" + response.post_id + " class='text-danger fa fa-heart-o likePost' aria-hidden='true'></i>"); 162 $(".likeCounter").text(response.likeCounter); 163 }, 164 error: function(data) { 165 console.log(data); 166 } 167 }); 168 }) 169 }, 170 171 comment: function() { 172 173 if($("comment-alert").length > 0) { 174 $(".comment-alert").hide(); 175 } 176 177 $(".commentForm").submit(function(e) { 178 179 e.preventDefault(); 180 181 $(this).find("input[type='submit']").prop("disabled", true); 182 $(this).find("input[type='submit']").val("Processing..."); 183 184 var name = $(this).find("input[name='name']").val(); 185 var email = $(this).find("input[name='email']").val(); 186 var comment = $(this).find("textarea[name='comment']").val(); 187 var post_id = $(this).find("input[name='post_id']").val(); 188 var _token = $("meta[name='csrf-token']").attr("content"); 189 190 $.ajax({ 191 url: "/comment", 192 type: "post", 193 data: { 194 name: name, 195 email: email, 196 comment: comment, 197 post_id: post_id, 198 _token : _token, 199 }, 200 dataType: "json", 201 success: function(response) { 202 203 $(".comment-alert").show(); 204 $(".comment-alert").addClass(response.type); 205 $(".comment-alert").find("strong").text(response.message); 206 207 $(".commentForm").find("input[type='submit']").prop("disabled", false); 208 $(".commentForm").find("input[type='submit']").val("Comment"); 209 $(".commentForm")[0].reset(); 210 }, 211 error: function(data) { 212 console.log(data); 213 } 214 }); 215 }); 216 } 3 // Initialize 4 init: function() { 5 this.showCompanyModal(); 6 this.welcomeSlider(); 7 this.categoryNavbarPosition(); 8 this.categoryNavbarActiveLink(); 9 this.buildSimpleTooltip(); 10 this.scrollSmoothly(); 11 this.scrollToTop(); 12 this.likePost(); 13 this.unlikePost(); 14 this.comment(); 15 }, 16 17 showCompanyModal: function() { 18 if($(".company-modal").length) { 19 setTimeout(function () { 20 $(".company-modal").modal("show"); 21 }, 2000); 22 } 23 }, 24 25 welcomeSlider: function() { 26 var swiper = new Swiper('.swiper-container', { 27 pagination: { 28 el: '.swiper-pagination', 29 clickable: true, 30 renderBullet: function(index, className) { 31 return '<span class="' + className + '">' + (index + 1) + '</span>'; 32 }, 33 }, 34 navigation: { 35 nextEl: '.swiper-button-next', 36 prevEl: '.swiper-button-prev', 37 }, 38 loop: true, 39 centeredSlides: true, 40 autoplay: { 41 delay: 2500, 42 disableOnInteraction: false, 43 }, 44 }); 45 }, 46 47 categoryNavbarPosition: function() { 48 if ($(".categoryNavbar").length) { 49 var distance = $(".navbar").offset().top; 50 var $window = $(window); 51 var navbar = $(".navbar"); 52 53 $window.scroll(function() { 54 if ($window.scrollTop() >= distance) { 55 navbar.addClass("fixed-top"); 56 } else { 57 navbar.removeClass("fixed-top"); 58 } 59 }); 60 } 61 }, 62 63 categoryNavbarActiveLink: function() { 64 if ($(".categoryNavbar").length) { 65 $(".categoryNavbar a[href='http://technoblog.test/category/" + window.location.pathname + "']").addClass("active"); 66 } 67 }, 68 69 buildSimpleTooltip: function() { 70 if (!$("a.elemWithTooltip").length || !$("a.elemWithTooltip").data("tooltip-info")) { 71 return false; 72 } 73 74 var tooltipElem = $("a.elemWithTooltip"); 75 var placements = ["top", "right", "bottom", "left"]; 76 77 tooltipElem.each(function(i) { 78 79 var $this = $(this); 80 var tooltipData = $this.data("tooltip-info"); 81 var title = tooltipData.substring(tooltipData.indexOf("-") + 1); 82 var placement = tooltipData.substring(0, tooltipData.indexOf("-")); 83 84 if (tooltipData.indexOf("-") === -1 || tooltipData.charAt(0) === "-") { 85 $this.addClass("Error_SimpleTooltip"); 86 return false; 87 } 88 89 $.each(placements, function(j) { 90 if (placement === placements[j]) { 91 $this.not(".Error_SimpleTooltip").attr({ 92 "data-toggle": "tooltip", 93 "data-placement": placement, 94 "title": title 95 }).tooltip(); 96 } 97 }); 98 }); 99 100 }, 101 102 scrollSmoothly: function() { 103 var scroll = new SmoothScroll("a.scrollBtn", { 104 easing: "linear" 105 }); 106 }, 107 108 scrollToTop: function() { 109 if ($(".scrollUpArrow").length) { 110 var distance = 150; 111 var $window = $(window); 112 var scrollUp = $(".scrollUpArrow"); 113 114 scrollUp.hide(); 115 116 $window.scroll(function() { 117 if ($window.scrollTop() >= distance) { 118 scrollUp.fadeIn("slow"); 119 } else { 120 scrollUp.fadeOut("slow"); 121 } 122 }); 123 } 124 }, 125 126 likePost: function() { 127 128 $(".post-reaction").on("click", ".likePost", function() { 129 130 var data = $(this).data("post-id"); 131 var _token = $("meta[name='csrf-token']").attr("content"); 132 133 $.ajax({ 134 url: "/like", 135 type: "post", 136 data: { 137 post_id : data, 138 _token : _token, 139 }, 140 dataType: "json", 141 success: function(response) { 142 $(".post-reaction i").remove(); 143 $(".post-reaction").append("<i data-unlike-id=" + response.unlike_id + " class='text-danger fa fa-heart unlikePost' aria-hidden='true'></i>"); 144 $(".likeCounter").text(response.likeCounter); 145 }, 146 error: function(data) { 147 console.log(data); 148 } 149 }); 150 }) 151 }, 152 153 unlikePost: function() { 154 155 $(".post-reaction").on("click", ".unlikePost", function() { 156 157 var data = $(this).data("unlike-id"); 158 var _token = $("meta[name='csrf-token']").attr("content"); 159 160 $.ajax({ 161 url: "/unlike", 162 type: "post", 163 data: { 164 unlike_id : data, 165 _token : _token, 166 }, 167 dataType: "json", 168 success: function(response) { 169 $(".post-reaction i").remove(); 170 $(".post-reaction").append("<i data-post-id=" + response.post_id + " class='text-danger fa fa-heart-o likePost' aria-hidden='true'></i>"); 171 $(".likeCounter").text(response.likeCounter); 172 }, 173 error: function(data) { 174 console.log(data); 175 } 176 }); 177 }) 178 }, 179 180 comment: function() { 181 182 if($("comment-alert").length > 0) { 183 $(".comment-alert").hide(); 184 } 185 186 $(".commentForm").submit(function(e) { 187 188 e.preventDefault(); 189 190 $(this).find("input[type='submit']").prop("disabled", true); 191 $(this).find("input[type='submit']").val("Processing..."); 192 193 var name = $(this).find("input[name='name']").val(); 194 var email = $(this).find("input[name='email']").val(); 195 var comment = $(this).find("textarea[name='comment']").val(); 196 var post_id = $(this).find("input[name='post_id']").val(); 197 var _token = $("meta[name='csrf-token']").attr("content"); 198 199 $.ajax({ 200 url: "/comment", 201 type: "post", 202 data: { 203 name: name, 204 email: email, 205 comment: comment, 206 post_id: post_id, 207 _token : _token, 208 }, 209 dataType: "json", 210 success: function(response) { 211 212 $(".comment-alert").show(); 213 $(".comment-alert").addClass(response.type); 214 $(".comment-alert").find("strong").text(response.message); 215 216 $(".commentForm").find("input[type='submit']").prop("disabled", false); 217 $(".commentForm").find("input[type='submit']").val("Comment"); 218 $(".commentForm")[0].reset(); 219 }, 220 error: function(data) { 221 console.log(data); 222 } 223 }); 224 }); 225 } 217 226 218 227 }; 219 228 220 229 $(function() { 221 230 app.init(); 222 231 }); -
resources/views/blog/index.blade.php
r0c07a90 rf457265 3 3 @section('blog_content') 4 4 5 <div style="height: 25px;"></div> 5 @if(!session()->has("offer_disabled")) 6 <!-- Modal --> 7 <div class="modal fade company-modal"> 8 <div class="modal-dialog"> 9 <div class="modal-content"> 10 <div class="modal-header"> 11 <h5 class="modal-title">TechnoWeek Offer!</h5> 12 <button type="button" class="close" data-dismiss="modal" aria-label="Close"> 13 <span aria-hidden="true">×</span> 14 </button> 15 </div> 16 <div class="modal-body"> 6 17 7 <!-- Main Content Wrapper --> 8 <div class="mainContent pb-5"> 18 <p>We have a good news for you! You can request to open a company page in TechnoBlog just for free in TecnhoWeek!</p> 9 19 10 <div class="container-fluid">20 <form action="{{ route("blog.company.store") }}" method="post" style="font-size: 14px;" class="mt-2"> 11 21 12 <div class="row"> 13 <!-- Welcome Slider --> 14 <div class="col-md-12"> 22 @csrf 15 23 16 <div class="welcomeSlider swiper-container"> 24 <label class="mt-2">Company Name</label> 25 <input type="text" class="form-control form-control-sm" name="name" required autocomplete="off"> 26 <label class="mt-3">Company Website</label> 27 <input type="text" class="form-control form-control-sm" name="website" required autocomplete="off"> 28 <label class="mt-3">E-mail</label> 29 <input type="text" class="form-control form-control-sm" name="email" required autocomplete="off"> 30 <p class="text-muted mt-1" style="font-size: 12px;">The invitation will be sent to this e-mail address.</p> 17 31 18 <div class="swiper-wrapper"> 32 <input type="submit" class="btn btn-primary btn-sm w-100 mt-2"> 33 </form> 19 34 20 @foreach ($latestPosts as $post) 35 </div> 36 </div> 37 </div> 38 </div> 39 @endif 21 40 22 <div class="swiper-slide"> 23 <div class="slider-post-wrapper"> 24 <p class="postCategory" style="background: {{ $post->category->color }};">{{ $post->category->name }}</p><img src="{{ asset("uploads/" . $post->image_link) }}"> 25 <div class="postOverlay"> 26 <p><a href="{{ route("blog.post", ["category" => strtolower($post->category->name), "slug" => $post->slug]) }}">{{ $post->title }} </a></p> 27 <span> 41 <div style="height: 25px;"></div> 42 43 <!-- Main Content Wrapper --> 44 <div class="mainContent pb-5"> 45 46 <div class="container-fluid"> 47 48 <div class="row"> 49 <!-- Welcome Slider --> 50 <div class="col-md-12"> 51 52 <div class="welcomeSlider swiper-container"> 53 54 <div class="swiper-wrapper"> 55 56 @foreach ($latestPosts as $post) 57 58 <div class="swiper-slide"> 59 <div class="slider-post-wrapper"> 60 <p class="postCategory" style="background: {{ $post->category->color }};">{{ $post->category->name }}</p><img src="{{ asset("uploads/" . $post->image_link) }}"> 61 <div class="postOverlay"> 62 <p><a href="{{ route("blog.post", ["category" => strtolower($post->category->name), "slug" => $post->slug]) }}">{{ $post->title }} </a></p> 63 <span> 28 64 <i class="fa fa-clock-o" aria-hidden="true"></i> {{ $post->ago() }} 29 65 … … 32 68 <i class="fa fa-comment-o" aria-hidden="true"></i> {{ $post->comment->count() }} comments 33 69 </span> 34 35 36 70 </div> 71 </div> 72 </div> 37 73 38 74 @endforeach 39 75 40 76 </div> 41 77 42 43 44 78 <div class="swiper-pagination"></div> 79 <div class="swiper-button-prev"></div> 80 <div class="swiper-button-next"></div> 45 81 46 82 </div> 47 83 48 84 </div> 49 85 50 51 86 <!-- Videos --> 87 @foreach ($blogCategories as $category) 52 88 53 54 55 56 57 58 59 60 89 <style> 90 .default_sectionTitle_{{ strtolower($category->name) }}:before, 91 .default_sectionTitle_{{ strtolower($category->name) }} span, 92 .default_sectionTitle_{{ strtolower($category->name) }} a { 93 background: {{ $category->color }}; 94 color: {{ $category->color }}; 95 } 96 </style> 61 97 62 63 64 65 98 <header class="default_sectionTitle default_sectionTitle_{{ strtolower($category->name) }}"> 99 <span>{{ $category->name }}</span> 100 <a class="elemWithTooltip" data-tooltip-info="right-Explore More" href="{{ route("blog.category", ["category" => strtolower($category->name)]) }}">More</a> 101 </header> 66 102 67 103 @foreach ($posts as $post) 68 104 69 105 @if($post->category->name == $category->name) 70 106 71 72 73 74 75 76 77 78 79 80 81 82 83 84 107 <div class="col-md-4 post-item"> 108 <div class="card"> 109 <div class="card-img-top-wrapper"> 110 <img class="card-img-top" src="{{ asset("uploads/" . $post->image_link) }}" alt="Card image cap"> 111 </div> 112 <div class="card-body"> 113 <h5 class="card-title"><a href="{{ route("blog.post", ["category" => strtolower($post->category->name), "slug" => $post->slug]) }}" class="blogSectionCardLink">{{ $post->title }}</a></h5> 114 <p class="card-text">{!! str_limit($post->content, 90) !!}</p> 115 </div> 116 <div class="card-footer"> 117 <small class="text-muted">{{ $post->ago() }}</small> 118 </div> 119 </div> 120 </div> 85 121 86 122 @endif 87 123 88 124 @endforeach 89 125 90 126 @endforeach 91 127 92 128 </div> 93 129 94 130 </div> 95 131 96 132 </div> 97 133 98 134 @endsection -
resources/views/fragments/dashboard/nav.blade.php
r0c07a90 rf457265 1 1 <div class="header py-4"> 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 2 <div class="container"> 3 <div class="d-flex"> 4 <a class="header-brand text-primary" href="#">TechnoBlog</a> 5 <div class="d-flex order-lg-2 ml-auto"> 6 <div class="dropdown dropdown-notifications-wrapper d-none d-md-flex"> 7 <a class="nav-link dropdown-notifications-unread icon" data-toggle="dropdown"> 8 <i class="fe fe-bell"></i> 9 <span class="nav-unread"></span> 10 </a> 11 <div class="dropdown-menu dropdown-notifications dropdown-menu-right dropdown-menu-arrow"> 12 <p class='text-center unreadNotificationsInfo'>No unread notifications</p> 13 <div class="dropdown-divider"></div> 14 <a href="{{ route("dashboard.notifications.index") }}" class="dropdown-item text-center text-muted-dark">See all</a> 15 </div> 16 </div> 17 <div class="dropdown"> 18 <a href="#" class="nav-link pr-0 leading-none" data-toggle="dropdown"> 19 19 20 21 22 23 24 20 @if(!empty(auth()->user()->userProfile->profile_photo_link)) 21 <span class="avatar" style="background-image: url(/uploads/users/{{ auth()->user()->userProfile->profile_photo_link }})"></span> 22 @else 23 <span class="avatar">{{ strtoupper(auth()->user()->name[0]) . strtoupper(auth()->user()->surname[0]) }}</span> 24 @endif 25 25 26 26 <span class="ml-2 d-none d-lg-block"> 27 27 <span class="text-default">{{ auth()->user()->getFullName() }}</span> 28 28 <small class="text-muted d-block mt-1">{{ ucfirst(auth()->user()->role->name) }}</small> 29 29 </span> 30 31 32 33 34 35 36 37 38 39 40 41 30 </a> 31 <div class="dropdown-menu dropdown-menu-right dropdown-menu-arrow"> 32 <a class="dropdown-item" href="{{ route("blog.user-profile", ["profileLink" => auth()->user()->userProfile->profile_link]) }}" target="_blank"> 33 <i class="dropdown-icon fe fe-user"></i> Public Profile 34 </a> 35 <a class="dropdown-item" href="{{ route("dashboard.settings.index") }}"> 36 <i class="dropdown-icon fe fe-settings"></i> Settings 37 </a> 38 <div class="dropdown-divider"></div> 39 <a class="dropdown-item" 40 href="javascript:void(0)" 41 onclick=" 42 42 event.preventDefault(); 43 43 document.getElementById('logout-form').submit(); 44 44 "> 45 46 47 48 49 50 51 52 53 54 55 56 57 45 <i class="dropdown-icon fe fe-log-out"></i> Logout 46 </a> 47 <form id="logout-form" action="{{ route("auth.logout") }}" method="post"> 48 @csrf 49 </form> 50 </div> 51 </div> 52 </div> 53 <a href="#" class="header-toggler d-lg-none ml-3 ml-lg-0" data-toggle="collapse" data-target="#headerMenuCollapse"> 54 <span class="header-toggler-icon"></span> 55 </a> 56 </div> 57 </div> 58 58 </div> 59 59 <div class="header collapse d-lg-flex p-0" id="headerMenuCollapse"> 60 61 62 63 60 <div class="container"> 61 <div class="row align-items-center"> 62 <div class="col-lg order-lg-first"> 63 <ul class="nav nav-tabs border-0 flex-column flex-lg-row"> 64 64 65 66 67 68 69 65 <li class="nav-item"> 66 <a href="{{ route("dashboard.index") }}" class="nav-link {{ request()->is('dashboard') ? 'active' : '' }}"> 67 <i class="fe fe-home"></i> Home 68 </a> 69 </li> 70 70 71 72 73 74 75 76 77 71 @if(auth()->user()->hasPermission("access_all_users")) 72 <li class="nav-item"> 73 <a href="{{ route("dashboard.users.index") }}" class="nav-link {{ request()->is(['dashboard/users', 'dashboard/users/*']) ? 'active' : '' }}"> 74 <i class="fe fe-users"></i> Users 75 </a> 76 </li> 77 @endif 78 78 79 80 81 82 83 79 <li class="nav-item"> 80 <a href="{{ route("dashboard.posts.index") }}" class="nav-link {{ request()->is(['dashboard/posts', 'dashboard/posts/*']) ? 'active' : '' }}"> 81 <i class="fe fe-database"></i> Posts 82 </a> 83 </li> 84 84 85 86 87 88 89 90 91 85 @if(auth()->user()->hasPermission("access_all_categories")) 86 <li class="nav-item"> 87 <a href="{{ route("dashboard.categories.index") }}" class="nav-link {{ request()->is(['dashboard/categories', 'dashboard/categories/*']) ? 'active' : '' }}"> 88 <i class="fe fe-layers"></i> Categories 89 </a> 90 </li> 91 @endif 92 92 93 94 95 96 97 93 <li class="nav-item"> 94 <a href="{{ route("dashboard.comments.index") }}" class="nav-link {{ request()->is(['dashboard/comments', 'dashboard/comments/*']) ? 'active' : '' }}"> 95 <i class="fe fe-message-circle"></i> Comments 96 </a> 97 </li> 98 98 99 100 101 102 103 99 <li class="nav-item"> 100 <a href="{{ route("dashboard.tags.index") }}" class="nav-link {{ request()->is(['dashboard/tags', 'dashboard/tags/*']) ? 'active' : '' }}"> 101 <i class="fe fe-tag"></i> Tags 102 </a> 103 </li> 104 104 105 </ul> 106 </div> 107 </div> 108 </div> 105 <li class="nav-item"> 106 <a href="{{ route("dashboard.companies.index") }}" class="nav-link {{ request()->is(['dashboard/companies', 'dashboard/companies/*']) ? 'active' : '' }}"> 107 <i class="fe fe-briefcase"></i> Companies 108 </a> 109 </li> 110 111 </ul> 112 </div> 113 </div> 114 </div> 109 115 </div>
Note:
See TracChangeset
for help on using the changeset viewer.