Trouble with html5 audio progress bar/tribbles - html

I'm adapting this progress bar:http://www.richardshepherd.com/tv/audio/ to work with my playlist code, but I can't work out why it's not working. I expect it's something ridiculous (I tried adding the (document).ready function, but that broke the rest of my code).
This is what I have:
function loadPlayer() {
var audioPlayer = new Audio();
audioPlayer.controls="controls";
audioPlayer.preload="auto";
audioPlayer.addEventListener('ended',nextSong,false);
audioPlayer.addEventListener('error',errorFallback,true);
document.getElementById("player").appendChild(audioPlayer);
nextSong();
}
function nextSong() {
if(urls[next]!=undefined) {
var audioPlayer = document.getElementsByTagName('audio')[0];
if(audioPlayer!=undefined) {
audioPlayer.src=urls[next];
audioPlayer.load();
audioPlayer.play();
next++;
} else {
loadPlayer();
}
} else {
alert('the end!');
}
}
function errorFallback() {
nextSong();
}
function playPause() {
var audioPlayer = document.getElementsByTagName('audio')[0];
if(audioPlayer!=undefined) {
if (audioPlayer.paused) {
audioPlayer.play();
} else {
audioPlayer.pause();
}
} else {
loadPlayer();
}
}
function stop() {
var audioPlayer = document.getElementsByTagName('audio')[0];
audioPlayer.pause();
audioPlayer.currentTime = 0;
}
function pickSong(num) {
next = num;
nextSong();
}
var urls = new Array();
urls[0] = '01_horses_mouth/mp3/01. Let The Dog See The Rabbit preface.mp3';
urls[1] = '01_horses_mouth/mp3/02. The Other Horse\'s Tale.mp3';
urls[2] = '01_horses_mouth/mp3/03. Caged Tango.mp3';
urls[3] = '01_horses_mouth/mp3/04. Crumbs.mp3';
urls[4] = '01_horses_mouth/mp3/05. Mood Elevator Reprise.mp3';
urls[5] = '01_horses_mouth/mp3/06. Mood Elevator.mp3';
var next = 0;
// Display our progress bar
audioPlayer.addEventListener('timeupdate', function(){
var length = audioPlayer.duration;
var secs = audioPlayer.currentTime;
var progress = (secs / length) * 100;
$('#progress').css({'width' : progress * 2});
var tcMins = parseInt(secs/60);
var tcSecs = parseInt(secs - (tcMins * 60));
if (tcSecs < 10) { tcSecs = '0' + tcSecs; }
$('#timecode').html(tcMins + ':' + tcSecs);
}, false);
I end up getting the default player which works fine, as do my own play/pause and stop buttons, but the progress bar does nothing.
Oh, and this is what I've stuck in my css:
#progressContainer {position: relative; display: block; height: 20px;
background-color: #fff; width: 200px;
-moz-box-shadow: 2px 2px 5px rgba(0,0,0,0.4);
-webkit-box-shadow: 2px 2px 5px rgba(0,0,0,0.4);
box-shadow: 2px 2px 5px rgba(0,0,0,0.4);
margin-top: 5px;}
#progress {
display: block;
height: 20px;
background-color: #99f;
width: 0;
position: absolute;
top: 0;
left: 0;}
and this is the html:
<div id="player" >
<span id="timecode"></span>
<span id="progressContainer">
<span id="timecode"></span>
<span id="progress"></span>
</div>
The page is here: http://lisadearaujo.com/clientaccess/wot-sound/indexiPhone.html
Please note that this is only working with the media query for iPhone portrait orientation, so if you look at it on a desktop, you'll need to squeeze your window up. :-)

I've now gone with a different solution (http://www.adobe.com/devnet/html5/articles/html5-multimedia-pt3.html) which explained how to acheive this a little better for me. I'm a copy/paster so have very little clue about the correct order in which things must go. What I've got now is this:
function loadPlayer() {
var audioPlayer = new Audio();
audioPlayer.controls="controls";
audioPlayer.preload="auto";
audioPlayer.addEventListener('ended',nextSong,false);
audioPlayer.addEventListener('error',errorFallback,true);
audioPlayer.addEventListener('timeupdate',updateProgress, false);
document.getElementById("player").appendChild(audioPlayer);
nextSong();
}
var urls = new Array();
urls[0] = '01_horses_mouth/mp3/01. Let The Dog See The Rabbit preface.mp3';
urls[1] = '01_horses_mouth/mp3/02. The Other Horse\'s Tale.mp3';
urls[2] = '01_horses_mouth/mp3/03. Caged Tango.mp3';
urls[3] = '01_horses_mouth/mp3/04. Crumbs.mp3';
urls[4] = '01_horses_mouth/mp3/05. Mood Elevator Reprise.mp3';
urls[5] = '01_horses_mouth/mp3/06. Mood Elevator.mp3';
var next = 0;
function updateProgress()
{
var audioPlayer = document.getElementsByTagName('audio')[0];
var value = 0;
if (audioPlayer.currentTime > 0) {
value = Math.floor((100 / audioPlayer.duration) * audioPlayer.currentTime);
}
progress.style.width = value + "%";
}
Hurray. It works. I am not entirely sure why, but that's OK for now...

Related

Create Custom Dialog Box to Find Hyperlink and Go to that position on google doc with AppsScript

I have a 200 pages long google document containing some complex data like tables, paragraph and hyperlinks.
I am trying to create a custom dialog box or button with two option "next" and "Previous".
So Whenever I click on "next" it should set my cursor on next hyperlink in google doc for example if I am on page 30 and there is hyper link on page 31 too I want to jump over next hyperlink or position.
So far I am able to get all hyperlink through out the document but I don't how to set my cursor over those word or jump over to next or previous hyperlink by clicking on button in dialog box.
code.gs
function highlightLink3() {
const doc = DocumentApp.getActiveDocument()
const body = doc.getBody()
const text = body.getText();
const words = [...new Set(text.split(/[\n ]/g).map(e => e.trim()).filter(String))];
words.forEach(t => {
let word = body.findText(t);
while (word) {
const e = word.getElement();
const start = word.getStartOffset();
if (e.getLinkUrl(start)) {
doc.setCursor(e.getLinkUrl(start))
}
word = body.findText(t, word);
}
});
}
So far I am able to get all hyperlink through out the document but I don't how to set my cursor over those word or jump over to next or previous hyperlink by clicking on button in dialog box.
Here is something I created a while back. If constructs a tree view of my document based on the Headers. I create a side bar and can navigate down the tree. When I click on an item it directs me to that header.
My Document was 93 pages so I developed this to navigate back and forth. Otherwise you would have to return to the table of contents every time to go to another section.
Code.gs
function onOpen() {
var thisMenu = DocumentApp.getUi().createMenu('Test');
thisMenu.addItem('Treeview in Code.gs', 'treeViewOnOpen').addToUi();
}
function treeViewOnOpen() {
try {
var html = HtmlService.createTemplateFromFile("HTML_TreeView");
html = html.evaluate();
DocumentApp.getUi().showSidebar(html);
}
catch(err) {
Logger.log("Error in treeViewOnOpen: "+err);
}
}
function include(filename) {
return HtmlService.createHtmlOutputFromFile(filename)
.getContent();
}
function TreeNode(level,name) {
this.parent = null;
this.level = level;
this.name = name;
this.children = [];
this.link = null
}
function ToCListItem(level,text) {
this.level = level;
this.text = text;
var time = new Date();
this.link = "h"+level.toString()+"_"+time.getTime().toString();
}
function getTreeView() {
try {
var doc = DocumentApp.getActiveDocument();
var bod = doc.getBody();
var pars = bod.getParagraphs();
var root = new TreeNode(0,"Root");
var parent = root;
var level = 1;
var last = null;
for( var i=0; i<pars.length; i++ ) {
var par = pars[i];
var head = getHeading(par);
if( par.getText().trim() === "" ) continue;
if( head > 0 ) {
var node = new TreeNode(head,par.getText());
var link = par.getLinkUrl();
if( !link ) {
var time = new Date();
node.link = "h"+head.toString()+"_"+time.getTime().toString();
par.setLinkUrl(node.link);
}
else {
node.link = link;
}
if( head > level ) {
parent = last;
level = head;
}
else if( head < level ) {
while( head <= level ) {
parent = parent.parent;
level = parent.level;
}
if( level === 0 ) level = 1;
}
node.parent = parent;
parent.children.push(node);
last = node;
}
}
var s = "";
for( var i=0; i<root.children.length; i++ ) {
s = s + stringify(root.children[i]);
}
return s;
}
catch(err) {
Logger.log("Error in getTreeView: "+err);
}
}
function stringify(tree) {
try {
var s = ""
if( tree.children.length > 0 ) {
s = "<li><input class='node' type='button' value='+'>"+tree.name+"\n";
s = s + "<ul>\n";
for( var i=0; i<tree.children.length; i++ ) {
s = s + stringify(tree.children[i]);
}
s = s + "</ul>\n</li>\n";
}
else {
var s = "<li class='link' id='"+tree.link+"'><input class='link' type='button' value=' '>"+tree.name+"</li>\n";
}
return s;
}
catch(err) {
Logger.log(err);
}
}
function getHeading(par) {
try {
var head = par.getHeading();
if( head == DocumentApp.ParagraphHeading.HEADING1 ) {
return 1;
}
else if( head == DocumentApp.ParagraphHeading.HEADING2 ) {
return 2;
}
else if( head == DocumentApp.ParagraphHeading.HEADING3 ) {
return 3;
}
else if( head == DocumentApp.ParagraphHeading.HEADING4 ) {
return 4;
}
else if( head == DocumentApp.ParagraphHeading.HEADING5 ) {
return 5;
}
else if( head == DocumentApp.ParagraphHeading.HEADING6 ) {
return 6;
}
return -1;
}
catch(err) {
Logger.log("Error in getHeading: "+err);
}
}
function linkClick(link) {
try {
var doc = DocumentApp.getActiveDocument();
var bod = doc.getBody();
var pars = bod.getParagraphs();
for( var i=0; i<pars.length; i++ ) {
var par = pars[i];
var head = getHeading(par);
if( head > 0 ) {
if( par.getLinkUrl() == link ) {
var pos = doc.newPosition(par.getChild(0),0);
doc.setCursor(pos);
return;
}
}
}
}
catch(err) {
Logger.log("Error in setCursor: "+err);
}
}
HTML_TreeView
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<?!= include('CSS_TreeView'); ?>
</head>
<body>
<ul class="tree">
<?!= getTreeView(); ?>
</ul>
<?!= include('JS_TreeView'); ?>
</body>
</html>
CSS_TreeView
<style>
body {
font-family: Arial;
font-size: small;
}
ul.tree li {
list-style-type: none;
position: relative;
}
ul.tree li ul {
display: none;
}
ul.tree li.open > ul {
display: block;
}
ul.tree li input {
color: black;
text-decoration: none;
margin-right: 10px;
width: 25px;
}
ul.tree li input:before {
height: 1em;
padding: 0 .1em;
font-size: .8em;
display: block;
position: absolute;
left: -1.3em;
top: .2em;
}
</style>
JS_TreeView
<script>
function expandClick(e) {
try {
var parent = e.target.parentElement;
var classList = parent.classList;
if(classList.contains("open")) {
classList.remove('open');
var opensubs = parent.querySelectorAll(':scope .open');
for(var i = 0; i < opensubs.length; i++){
opensubs[i].classList.remove('open');
}
e.target.value = "+";
}
else {
classList.add('open');
e.target.value = "-";
}
}
catch(err) {
alert(err);
}
}
function linkClick(e) {
try {
var id = e.target.id;
if( id === "" ) id = e.target.parentNode.id;
google.script.run.linkClick(id);
}
catch(err) {
alert(err);
}
}
(function () {
try {
var tree = document.querySelectorAll('ul.tree input.node');
for(var i = 0; i < tree.length; i++) {
tree[i].addEventListener('click', expandClick);
}
var tree = document.querySelectorAll('ul.tree li.link');
for(var i = 0; i < tree.length; i++) {
tree[i].addEventListener('click', linkClick);
}
}
catch(err) {
alert(err);
}
})();
</script>

Why are user thumbnails not showing up for other people using my script?

I have created a user directory web app concept that pulls user images, names, and email addresses within G-Suite. I'm generating a Google Sheet with the data and displaying that data through an HTML table. All the data pulls over into the table cells as intended, including the thumbnails on my end. However, when another admin uses the application, the thumbnails show up as the default "head and shoulders" image. I have all my permissions set so anyone in the domain can use it, so I'm pretty sure it's not an issue with permissions on the application or the sheet. If anyone has any incite as to why the user.thumbnailPhotoUrl is not giving the user's images it would be very much appreciated. It might also be worth noting that I added all the profile pictures myself through the admin panel. My supervisor updated his profile picture and was only able to see his own.
Here is the code I am using:
code.gs
function doGet(){
return HtmlService.createHtmlOutputFromFile("table3");
}
function getDomainUsersList() {
var users = [];
var options = {
domain: "my_domain", // Google Apps domain name
customer: "my_customer",
maxResults: 100,
projection: "basic", // Fetch basic details of users
viewType: "domain_public",
orderBy: "email" // Sort results by users
}
do {
var response = AdminDirectory.Users.list(options);
response.users.forEach(function(user) {
users.push([user.name.fullName, user.primaryEmail, user.thumbnailPhotoUrl]);
});
// For domains with many users, the results are paged
if (response.nextPageToken) {
options.pageToken = response.nextPageToken;
}
} while (response.nextPageToken);
// Insert data in a spreadsheet
var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/1nzRcC8ChbY2C0wjTY_hC0txkYMphMofvxyHws86syfM/edit#gid=0");
var sheet = ss.getSheetByName("Users") || ss.insertSheet("Users", 1);
sheet.getRange(1,1,users.length, users[0].length).setValues(users);
var data = sheet.getRange(1,1,sheet.getLastRow()-1,3).getValues();
return data;
}
/**function getData() {
var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/1nzRcC8ChbY2C0wjTY_hC0txkYMphMofvxyHws86syfM/edit#gid=0");
var sheet = ss.getSheetByName("Users") || ss.insertSheet("Users", 1);
var data = sheet.getRange(1,1,sheet.getLastRow()-1,3).getValues();
return data;
table3.html
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<style>
* {
box-sizing: border-box;
}
#myInput {
background-image: url('/css/searchicon.png');
background-position: 10px 10px;
background-repeat: no-repeat;
width: 100%;
font-size: 16px;
padding: 12px 20px 12px 40px;
border: 1px solid #ddd;
margin-bottom: 12px;
}
#myTable {
border-color: blue;
border-collapse: collapse;
width: 100%;
border: 1px solid #ddd;
font-size: 18px;
}
#myTable th, #myTable td {
text-align: left;
padding: 12px;
}
#myTable tr {
border-bottom: 1px solid #ddd;
}
#myTable tr.header, #myTable tr:hover {
background-color: #f1f1f1;
}
</style>
</head>
<body>
<h2>Employee Directory</h2>
<input type="text" id="myInput" onkeyup="myFunction()" placeholder="Search for names.." title="Type in a name">
<div style="overflow-x:auto;">
<table id="myTable">
<thead>
<tr>
<th id="header">Picture</th>
<th id="header" onclick="sortTable(1)">Name</th>
<th id="header" onclick="sortTable(2)">Email</th>
</tr>
</thead>
<tbody id="table-body">
</tbody>
</table>
</div>
<script>
function myFunction() {
var input, filter, table, tr, td, i, txtValue;
input = document.getElementById("myInput");
filter = input.value.toUpperCase();
table = document.getElementById("myTable");
tr = table.getElementsByTagName("tr");
for (i = 0; i < tr.length; i++) {
td = tr[i].getElementsByTagName("td")[1];
if (td) {
txtValue = td.textContent || td.innerText;
if (txtValue.toUpperCase().indexOf(filter) > -1) {
tr[i].style.display = "";
} else {
tr[i].style.display = "none";
}
}
}
}
</script>
<script>
document.addEventListener("DOMContentLoaded",function(){
google.script.run.withSuccessHandler(generateTable).getDomainUsersList();
});
function generateTable(dataArray) {
dataArray.forEach(function(r){
var tbody = document.getElementById("table-body");
var row = document.createElement("tr");
var col1 = document.createElement("td");
col1.textContent = r[0];
var col2 = document.createElement("td");
col2.textContent = r[1];
var col3 = document.createElement("td");
var image = document.createElement("img");
image.src = r[2];
col3.appendChild(image);
row.appendChild(col3);
row.appendChild(col1);
row.appendChild(col2);
tbody.appendChild(row);
});
}
</script>
<!--Sortable Headers -->
<script>
function sortTable(n) {
var table, rows, switching, i, x, y, shouldSwitch, dir, switchcount = 0;
table = document.getElementById("myTable");
switching = true;
//Set the sorting direction to ascending:
dir = "asc";
/*Make a loop that will continue until
no switching has been done:*/
while (switching) {
//start by saying: no switching is done:
switching = false;
rows = table.rows;
/*Loop through all table rows (except the
first, which contains table headers):*/
for (i = 1; i < (rows.length - 1); i++) {
//start by saying there should be no switching:
shouldSwitch = false;
/*Get the two elements you want to compare,
one from current row and one from the next:*/
x = rows[i].getElementsByTagName("TD")[n];
y = rows[i + 1].getElementsByTagName("TD")[n];
/*check if the two rows should switch place,
based on the direction, asc or desc:*/
if (dir == "asc") {
if (x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()) {
//if so, mark as a switch and break the loop:
shouldSwitch= true;
break;
}
} else if (dir == "desc") {
if (x.innerHTML.toLowerCase() < y.innerHTML.toLowerCase()) {
//if so, mark as a switch and break the loop:
shouldSwitch = true;
break;
}
}
}
if (shouldSwitch) {
/*If a switch has been marked, make the switch
and mark that a switch has been done:*/
rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
switching = true;
//Each time a switch is done, increase this count by 1:
switchcount ++;
} else {
/*If no switching has been done AND the direction is "asc",
set the direction to "desc" and run the while loop again.*/
if (switchcount == 0 && dir == "asc") {
dir = "desc";
switching = true;
}
}
}
}
</script>
</body>
</html>
Thanks in advance,
Isaac
#IMTheNachoMan reported the issue in Google's issue tracker. You can click on the star next to the issue number to receive updates and to give more priority to his report.

Chrome console table add colors

This is an example of how we can log in chrome dev tools with colors:
console.log('%c test1 ', 'background: black; color: green')
I was wondering whether we can log with table and colors and the same time ?
There's no styling capabilities on the console.table function, as per the Console API.
However, I was able to come up with a really hacky solution for styling a console.log statement as if it were a table. This is probably not going to be good enough, but it was pretty fun to make.
There were many limitations, like not being able to set the width and height properties. My workaround was to pad the text with spaces to match the longest property name/value.
(function() {
function getProperties(obj) {
var props = [];
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
props.push(prop);
}
}
return props;
}
function getLongestTextLength(objArray) {
var longest = 0;
for (var obj of objArray) {
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
var length = Math.max(prop.length, obj[prop].length);
if (length > longest) longest = length;
}
}
}
return longest;
}
console.fancyTable = function(objArray) {
var objProto = objArray[0];
var args = [];
var header = '';
var baseStyles = 'padding: 2px; line-height: 18px;';
var baseBorders = 'border-top: 1px solid black; border-bottom: 1px solid black; border-left: 1px solid black; '
var headerStyles = baseStyles + baseBorders + 'font-weight: bold; background: lightcoral;';
var lastHeaderStyles = baseStyles + 'font-weight: bold; border: 1px solid black; background: lightcoral;';
var rowStyles = baseStyles + baseBorders + 'background: lightblue;'
var lastRowStyles = baseStyles + 'border: 1px solid black; background: lightblue;'
var props = getProperties(objProto);
var longestTextLength = getLongestTextLength(objArray);
for (var i = 0; i < props.length; i++) {
var prop = props[i];
while (prop.length < longestTextLength) {
prop += ' ';
}
header += '%c' + prop + ' ';
if (i === props.length - 1) {
args.push(lastHeaderStyles);
} else {
args.push(headerStyles);
}
}
for (var i = 0; i < objArray.length; i++) {
var obj = objArray[i];
header += '\n';
for (var j = 0; j < props.length; j++) {
var val = obj[props[j]];
while (val.length < longestTextLength) {
val += ' ';
}
header += '%c' + val + ' ';
if (j === props.length - 1) {
args.push(lastRowStyles);
} else {
args.push(rowStyles);
}
}
}
args.unshift(header);
console.log.apply(this, args);
}
})();
function Person(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
// create some test objects
var john = new Person("John", "Smith");
var jane = new Person("Jane", "Doe");
var emily = new Person("Emily", "Jones");
var peopleToLog = [john, jane, emily];
console.fancyTable(peopleToLog);
I'll make some improvements if I can, and perhaps publish it for the giggles.

SSRS Report translation problems

I'm trying to translate an SSRS report. Using this example link. The general report is working perfectly(Inside the blue square in the picture below). But i have an issues with finding have to translate the red squares in the picture below. Is it not possible to translate that part(The text in the red square).
Unfortunately u can't translate parameters prompt and the 'view report' part as well. Those are not the part of the reports so we can't translate them.
Necromancing.
You can do this, even if the user uses another language.
The secret is passing a parameter for the desired language to the ssrs page.
Then, you can create a http-module, that gets the language from the URL/referrer (note: HTTP misspells referrer as referer)
Example code:
https://github.com/ststeiger/SSRS-Localizer/blob/master/libRequestLanguageChanger/RequestLanguageChanger.cs
(this code also sets the P3P-header, as this is necessary for the SSRS-cookies in IE if the page is iframed from a page on a different domain)
This sets SSRS into the correct localization mode if the browser language does not correspond to the user language.
If you want, you can, in addition to that, change ReportViewer, usually located in
C:\Program Files\Microsoft SQL Server\MSRS<whatever>\Reporting Services\ReportServer\Pages\ReportViewer.aspx
and translate the report's paramters's labels using JavaScript.
Note:
if you only change the culture in ReportViewer.aspx in method
protected override void InitializeCulture()
then the datepickers won't work.
Therefore, you need to run it as http-module (and if it loads resources, such as jquery-ui, you need to get the language from the refer[r]er).
Here an example ReportViewer.aspx, where language is passed in url-parameter in_sprache, with parameter labels set in the format Text_DE / Text_FR / Text_IT / Text_EN (/ is not necessarely the best separation character, use a character that you don't need)
<%# Register TagPrefix="RS" Namespace="Microsoft.ReportingServices.WebServer" Assembly="ReportingServicesWebServer" %>
<%# Page Language="C#" AutoEventWireup="true" Inherits="Microsoft.ReportingServices.WebServer.ReportViewerPage" EnableEventValidation="false" %>
<asp:literal runat="server" id="docType"></asp:literal>
<html>
<!-- Here InitializeCulture -->
<head id="headID" runat="server">
<asp:literal runat="server" id="httpEquiv"></asp:literal>
<title><%= GetPageTitle() %></title>
<style type="text/css" media="all">
html
{
scrollbar-arrow-color: #FFA500;
scrollbar-base-color: black;
scrollbar-dark-shadow-color: #aaaaaa;
scrollbar-track-color: black;
scrollbar-face-color: #3d3d3d;
scrollbar-shadow-color: gray;
scrollbar-highlight-color: silver;
scrollbar-3d-light-color: black;
}
::-webkit-scrollbar{width: 13px; height: 13px}
::-webkit-scrollbar:hover{height: 18px}
::-webkit-scrollbar-button:start:decrement,
::-webkit-scrollbar-button:end:increment
{
height: 15px;
width: 13px;
display: block;
background: #101211;
background-repeat: no-repeat;
}
::-webkit-scrollbar-button:horizontal:decrement
{
#background-image: url(Scrolling/black/horizontal-decrement-arrow.png);
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAIAAABLMMCEAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIhJREFUeNpiFBASZIABXj5WHQPB44deMUH4TEyMviGyU5dYXrnwHshlAWIDU6HsUk15JZ4F025//vQbJKpnJNQ8wYidnRnIuX3jE0Qr88cPDHu3PRMQYldU4X1498uVCx9AohycnF+//Dmy7+Wpo288A2TOnXz7/ftfRmQ3AIG6Nv/Nqx8BAgwAwakucAZmLk0AAAAASUVORK5CYII=');
background-position: 4px 3px;
}
::-webkit-scrollbar-button:horizontal:increment
{
#background-image: url(Scrolling/black/horizontal-increment-arrow.png);
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAIAAABLMMCEAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAH5JREFUeNpiFBASVNfmv3n1IwMSYALi929/dkw1AcrBRZk5ODm/fvkjJsFR1aYvLcd969pHIJcJInn7xicg6eQhOXetjY6BIAtEVFWDD0g+vPdleu+NKxfeg0R5+Vg9AmSA/I0rH/379x8owigkImRqJXLt0ofPn37DbQMIMAA2Li0My8uNagAAAABJRU5ErkJggg==');
background-position: 3px 3px;
}
::-webkit-scrollbar-button:vertical:decrement
{
#background-image: url(Scrolling/black/vertical-decrement-arrow.png);
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAIAAABLMMCEAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHFJREFUeNpiFBASZAADPSOhS+feQdhMEEpEjKN5gpGRuTCKaEqeGicXc2q+OhMTI1RUx0DQyUMSyFBW4/UOkgEyWICSCVkqS2bfvX/ns7wST3C0woFdLxiNLeQ+fvj95tUPiFHcPCxAaxnhbkAGAAEGAAxaGY5HzMiTAAAAAElFTkSuQmCC');
background-position: 3px 4px;
}
::-webkit-scrollbar-button:vertical:increment
{
#background-image: url(Scrolling/black/vertical-increment-arrow.png);
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAIAAABLMMCEAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAH9JREFUeNpiFBASZMAATJZ2Ytw8LHC+kDC7ogov888fzFMWWXJxs/Dwsto5i4clKK5Z/IDl86ffa5c+yK3QgqgtSjn1799/JiBr67ond299BjL27Xh+5cJ7kLlADJScN+XW929/50y6BdHBzMHJCaSePf527eKH+3c+Q0QBAgwAkHcvV72C85gAAAAASUVORK5CYII=');
background-position: 3px 4px;
}
::-webkit-scrollbar-button:horizontal:decrement:active
{
#background-image: url(Scrolling/black/horizontal-decrement-arrow-active.png);
}
::-webkit-scrollbar-button:horizontal:increment:active
{
#background-image: url(Scrolling/black/horizontal-increment-arrow-active.png);
}
::-webkit-scrollbar-button:vertical:decrement:active
{
#background-image: url(Scrolling/black/vertical-decrement-arrow-active.png);
}
::-webkit-scrollbar-button:vertical:increment:active
{
#background-image: url(Scrolling/black/vertical-increment-arrow-active.png);
}
::-webkit-scrollbar-track { -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3); border-radius: 10px; }
::-webkit-scrollbar-track-piece{background-color: #151716;}
::-webkit-scrollbar-thumb:vertical
{
height: 50px;
background: -webkit-gradient(linear, left top, right top, color-stop(0%, #4d4d4d), color-stop(100%, #333333));
border: 1px solid #0d0d0d;
border-top: 1px solid #666666;
border-left: 1px solid #666666;
border-radius: 10px;
-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.5);
}
::-webkit-scrollbar-thumb:horizontal
{
width: 50px;
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #4d4d4d), color-stop(100%, #333333));
border: 1px solid #1f1f1f;
border-top: 1px solid #666666;
border-left: 1px solid #666666;
border-radius: 10px;
-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.5);
}
::-webkit-scrollbar-corner{background-color: #3D3D3D;}
</style>
</head>
<body style="margin: 0px; overflow: auto">
<form style="width:100%;height:100%" runat="server" ID="ReportViewerForm">
<asp:ScriptManager ID="AjaxScriptManager" AsyncPostBackTimeout="0" runat="server" />
<table cellspacing="0" cellpadding="0" width="100%" height="100%"><tr height="100%"><td width="100%">
<RS:ReportViewerHost ID="ReportViewerControl" PageCountMode="Actual" runat="server" />
</td></tr></table>
</form>
<script language="javascript" type="text/javascript">
// =============================== COR-Code =================================
// Avoid `console` errors in browsers that lack a console.
(function () {
var method;
var noop = function () { };
var methods = [
'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error',
'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log',
'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd',
'timeStamp', 'trace', 'warn'
];
var length = methods.length;
var console = (window.console = window.console || {});
while (length--) {
method = methods[length];
// Only stub undefined methods.
if (!console[method]) {
console[method] = noop;
}
}
}());
// ============================== End-COR-Code ==============================
Sys.WebForms.PageRequestManager.prototype._destroyTree = function(element)
{
var allnodes = element.getElementsByTagName('*'), length = allnodes.length;
var nodes = new Array(length);
for (var k = 0; k < length; k++)
{
nodes[k] = allnodes[k];
} // Next k
for (var j = 0, l = nodes.length; j < l; j++)
{
var node = nodes[j];
if (node.nodeType === 1)
{
if (node.dispose && typeof (node.dispose) === "function")
{
node.dispose();
}
else if (node.control && typeof (node.control.dispose) === "function")
{
node.control.dispose();
}
var behaviors = node._behaviors;
if (behaviors)
{
behaviors = Array.apply(null, behaviors);
for (var k = behaviors.length - 1; k >= 0; k--)
{
behaviors[k].dispose();
}
} // End if (behaviors)
} // End if (node.nodeType === 1)
} // Next j
};
// ============================== COR-Code ==============================
Array.prototype.contains = function (obj) {
var i = this.length;
while (i--) {
if (this[i] === obj) {
return true;
}
}
return false;
}; // End Function contains
// Read a page's GET URL variables and return them as an associative array.
function getUrlVars(urlHref)
{
var vars = [], hash;
var hashes = urlHref.slice(urlHref.indexOf('?') + 1).split('&');
var i;
for (i = 0; i < hashes.length; i++)
{
hash = hashes[i].split('=');
vars.push(hash[0]);
vars[hash[0]] = hash[1];
} // Next i
return vars;
} // End Function getUrlVars
function initLanguage()
{
var language = null;
var StyleSheetSet = null;
var BrowserLanguage = <%= System.Web.HttpContext.Current.Request.UserLanguages != null ? "\"" + System.Convert.ToString(System.Web.HttpContext.Current.Request.UserLanguages[0]) + "\"" : "null" %>;
if(BrowserLanguage == null)
BrowserLanguage = window.navigator.userLanguage || window.navigator.language;
if(BrowserLanguage != null)
BrowserLanguage = BrowserLanguage.substr(0,2).toLowerCase();
var dictParameters = getUrlVars(this.location.href);
if (dictParameters != null && dictParameters.contains("rc:Stylesheet"))
StyleSheetSet = true;
if (dictParameters != null && dictParameters.contains("in_sprache"))
language = dictParameters["in_sprache"];
if(language == null)
language = BrowserLanguage;
if(language == null)
language = "de";
language = language.toLowerCase();
return language;
} // End function initLanguage
function TranslateParameterPrompts(iLanguageIndex)
{
var eles = document.getElementsByTagName("table");
var strParamTableId = "ParametersGridReportViewerControl";
var tblParameters = null;
var ParamLabels = null;
for(var j = 0; j < eles.length; ++j)
{
// console.log(eles[j]);
if(eles[j] != null && eles[j].id != null)
{
if(eles[j].id.slice(0, strParamTableId.length) == strParamTableId) // if startswith str
{
// console.log(eles[j].id);
tblParameters = eles[j];
break;
}
// else console.log(eles[j].id);
} // End if(eles[j] != null && eles[j].id != null)
} // Next j
if(tblParameters != null)
ParamLabels = tblParameters.getElementsByTagName("span");
// var ParamLabels = document.querySelectorAll("table[id^='ParametersGridReportViewerControl'] span");
if(ParamLabels != null)
{
for(var i = 0; i < ParamLabels.length; ++i)
{
var strText = ParamLabels[i].innerHTML;
if (strText != null && strText.indexOf('/') != -1 && strText.indexOf('<input') == -1 )
{
strText = strText.split('/');
if (iLanguageIndex < strText.length)
strText = strText[iLanguageIndex];
else
{
if(strText.length > 0)
strText = strText[0];
}
ParamLabels[i].innerHTML = strText;
} // End if (strText != null && strText.indexOf('/') != -1)
} // Next i
} // End if(ParamLabels != null)
}
function fixReportingServices(container)
{
var language = initLanguage();
switch (language)
{
case "fr":
iLanguageIndex = 1;
break;
case "it":
iLanguageIndex = 2;
break;
case "en":
iLanguageIndex = 3;
break;
default: // "DE"
iLanguageIndex = 0;
} // End Switch
TranslateParameterPrompts(iLanguageIndex);
}
// needed when AsyncEnabled=true.
Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(function () { fixReportingServices('rpt-container'); });
</script>
</body>
</html>
(Note: this is for SSRS 2016 - not necessarely backward or forward compatible, but you get the idea)

Convert as2 to as3

I found a script for searching and selecting a specific text from a dynamic text box
But the problem is it is AS2
I started Flash by only studying AS3 so i have no idea on how to convert AS2 to AS3
Pls someone help me :)
finder.onRelease = function() {
Selection.setFocus("_root.textInstance");
var inputterString:String = _root.inputter
var inputLength:Number = inputterString.length;
textStart = textVar.indexOf(inputter, 0);
if (inputLength>0) {
textEnd = textStart+inputLength;
} else {
textEnd = 0;
}
if (textStart>=0) {
Selection.setSelection(textStart, textEnd);
} else {
Selection.setSelection(0, 0);
}
_root.textEnd = textEnd;
};
findNext.onRelease = function() {
Selection.setFocus("_root.textInstance");
var inputterString:String = _root.inputter;
var inputLength:Number = inputterString.length;
textStart = textVar.indexOf(inputter, _root.textEnd);
if (inputLength>0) {
textEnd = textStart+inputLength;
} else {
textEnd = 0;
}
if (textStart>=0) {
Selection.setSelection(textStart, textEnd);
} else {
Selection.setSelection(0, 0);
}
_root.textEnd = textEnd;
}
It's not as bad as you might think, but what are finder and findNext - buttons? These are callbacks which can be created by
finder.addEventListener(MouseEvent.MOUSE_UP, finderCallback);
// somewhere else in the code
private function finderCallback(e:MouseEvent):void {
// code here
// anything like _root.<varName> references something on the main file,
// so this just has to be something you can access in the funciton
}
OK, this should be it. I made some assumptions about root.textInstance and the buttons.
import flash.events.MouseEvent;
function onFinderClicked(event:MouseEvent):void{
stage.focus = root.textInstance;
root.textInstance.selectable = true;
var inputterString:String = root.inputter
var inputLength:Number = inputterString.length;
textStart = textVar.indexOf(inputter, 0);
if (inputLength>0) {
textEnd = textStart+inputLength;
} else {
textEnd = 0;
}
if (textStart>=0) {
root.textInstance.setSelection(textStart, textEnd);
} else {
root.textInstance.setSelection(0, 0);
}
root.textEnd = textEnd;
};
function onFindNextClicked(event:MouseEvent):void{
stage.focus = root.textInstance;
root.textInstance.selectable = true;
var inputterString:String = root.inputter;
var inputLength:Number = inputterString.length;
textStart = textVar.indexOf(inputter, root.textEnd);
if (inputLength>0) {
textEnd = textStart+inputLength;
} else {
textEnd = 0;
}
if (textStart>=0) {
root.textInstance.setSelection(textStart, textEnd);
} else {
root.textInstance.setSelection(0, 0);
}
root.textEnd = textEnd;
}
finder.addEventListener(MouseEvent.CLICK, onFinderClicked);
findNext.addEventListener(MouseEvent.CLICK, onFindNextClicked);