Skip to content
This repository
Browse code

change domains

  • Loading branch information...
commit 68c217eaf83e35a005aeab66ef67cc8c774be144 1 parent e279a6f
Moritz Tolxdorff authored
1  TOS.txt
... ... @@ -0,0 +1 @@
  1 +coming soon
BIN  i/16x16_logo.png
BIN  i/16x16_logo_bw.png
BIN  i/32x32_logo.png
BIN  i/full_logo.png
BIN  i/hangout-overlay.png
BIN  i/hangouts-logo.png
BIN  i/templates/template_1.png
BIN  i/templates/template_2.png
BIN  i/templates/template_3.png
BIN  i/templates/template_4.png
491 lowerthird.js
... ... @@ -0,0 +1,491 @@
  1 +(function(){
  2 + /*
  3 + * Lower Third for Google+ Hangouts
  4 + * Copyright 2012 Moritz Tolxdorff
  5 + * Version: 1.0.0
  6 + * Release date: 20.04.2012
  7 + * Developers:
  8 + ** Moritz Tolxdorff
  9 + *
  10 + * Thanks:
  11 + ** Robert Pitt
  12 + */
  13 +
  14 +
  15 + /**
  16 + * @ApplicationController
  17 + * @constructor
  18 + */
  19 + function ApplicationController(){
  20 + if(!gapi){
  21 + throw "gapi not loaded!";
  22 + }
  23 +
  24 + /**
  25 + * @ApplicationController.DEBUGGING - defines if debugging is enabled
  26 + * @private
  27 + * @type {boolean}
  28 + */
  29 + this.DEBUGGING = true;
  30 +
  31 + /**
  32 + * @ApllicationController.maxHeight - defines the maximum window height
  33 + * @public
  34 + * @const
  35 + * @type {Number}
  36 + */
  37 + this.maxHeight = $(window).height();
  38 +
  39 + /**
  40 + * @ApllicationController.globalShow - defines the initial state of globalShow
  41 + * @private
  42 + * @type {boolean}
  43 + */
  44 + this.globalShow = false;
  45 +
  46 + /**
  47 + * @ApllicationController.canvasOverlays - defines the canvasOverlay container
  48 + * @private
  49 + * @type {Array}
  50 + */
  51 + this.canvasOverlays = [];
  52 +
  53 + /**
  54 + * @ApllicationController.backgroundOverlay - defines the overlay container
  55 + * @private
  56 + * @type {Array}
  57 + */
  58 + this.backgroundOverlay = [];
  59 +
  60 + /**
  61 + * @ApllicationController.logoOverlay - defines the overlay container
  62 + * @private
  63 + * @type {Array}
  64 + */
  65 + this.logoOverlay = [];
  66 +
  67 + /**
  68 + * @ApllicationController.name - defines the name variable used as an overlay on the canvas
  69 + * @protected
  70 + * @type {String}
  71 + */
  72 + this.name = "";
  73 +
  74 + /*
  75 + * Bind gapi events when API is ready
  76 + */
  77 + gapi.hangout.onApiReady.add(this.onApiReady.bind(this));
  78 +
  79 + /*
  80 + * Bind window events when window size has changed
  81 + */
  82 + $(window).resize(this.onWindowResize.bind(this));
  83 + }
  84 +
  85 + /**
  86 + * @onWindowResize - Fired when window resizes
  87 + * @private
  88 + * @param evt {jQueryEventObject}
  89 + */
  90 + ApplicationController.prototype.onWindowResize = function(evt){
  91 + this.log("Window resized");
  92 + this.maxHeight = $(window).height();
  93 + this.scale();
  94 + }
  95 +
  96 + /**
  97 + * @buildDOM - Building the DOM structure
  98 + * @private
  99 + */
  100 + ApplicationController.prototype.buildDOM = function(){
  101 + this.log("Building DOM");
  102 +
  103 + /*
  104 + *Create pane header
  105 + */
  106 + var header = this.createElement("div", {"id": "header"});
  107 +
  108 + /*
  109 + * Append icon and title to header
  110 + */
  111 + header.append(this.createElement("span", {"class": "icon_header"}));
  112 + header.append(this.createElement("span", {"class": "header_title"}).html("Lower Third Overlay v1.0.0-beta"));
  113 +
  114 + /*
  115 + * Creates an empty input element
  116 + */
  117 + var inputdiv = $("<div>").attr({"class":"inputdiv", "id":"input"});
  118 +
  119 + /*
  120 + * Creates an empty input element
  121 + */
  122 + var input = this.createElement("input", {"class": "input", "type": "text"});
  123 +
  124 + /*
  125 + * Creates an empty div element
  126 + */
  127 + var div = this.createElement("div");
  128 +
  129 + /*
  130 + * Creates an empty label element
  131 + */
  132 + var label = this.createElement("label");
  133 +
  134 + /*
  135 + * Creates input areas for the form
  136 + */
  137 + var inputURL = input.clone().attr({"id":"URL"});
  138 + var inputName = input.clone().attr({"id":"Name"});
  139 + var inputTag = input.clone().attr({"id":"Tag"});
  140 +
  141 + /*
  142 + * Creates the form element
  143 + */
  144 + var form = this.createElement("form", {"id": "inputForm", "class": "form"});
  145 +
  146 + /*
  147 + * Creates the shadow Div
  148 + */
  149 + var shadow = div.clone().attr({"class":"shadow"}).css({"opacity": "1"}).hide();
  150 +
  151 + /*
  152 + * Append the form elements to the form
  153 + */
  154 + form.append(div.clone().append(label.clone().text("Icon URL"))).append(inputURL);
  155 + form.append(div.clone().append(label.clone().text("Name"))).append(inputName);
  156 + form.append(div.clone().append(label.clone().text("Tagline"))).append(inputTag);
  157 +
  158 + /*
  159 + * Append the form to the input Div
  160 + */
  161 + inputdiv.append(form);
  162 +
  163 + /*
  164 + * Create the body Div
  165 + */
  166 + var body = div.clone().attr({"id": "body"}).css({"height": (this.maxHeight-162)+"px"});
  167 +
  168 + /*
  169 + * Create the template Div
  170 + */
  171 + var templatediv = div.clone().attr({"id": "templatediv"}).css({"height": (this.maxHeight-163)+"px"});
  172 +
  173 +
  174 + /*
  175 + * Create the ul element for the template list
  176 + */
  177 + var ul = this.createElement("ul").attr({"id": "templates"});
  178 +
  179 +
  180 + /*
  181 + * Create empty elements for the template list
  182 + */
  183 + var li = this.createElement("li", {"class":"listitem"});
  184 + var img = this.createElement("img", {"width": "275"}).css({"margin-top":"6px"});
  185 + var url = "//tolxdorff.appspot.com/a/lowerthird/i/templates/template_#.png";
  186 +
  187 + /*
  188 + * Fill the ul with compiled templates
  189 + */
  190 + for(var i = 1; i <= 4; i++){
  191 + ul.append(li.clone().attr({"id":"template_" + i}).append(img.clone().attr({"src":url.replace("#", i)})));
  192 + }
  193 +
  194 + /*
  195 + * Fill the ul with compiled templates
  196 + */
  197 + ul.append(li.clone().attr({"id":"custom"}).append(label.clone().text("Custom URL")).append(input.clone().attr({"id": "customURL"})));
  198 +
  199 + /*
  200 + * Bind click event to all li element
  201 + */
  202 + jQuery("li", ul).on("click", this.onSelectItem.bind(this));
  203 +
  204 + /*
  205 + * Append the ul to the templateDiv and the templateDiv to the body
  206 + */
  207 + templatediv.append(ul).appendTo(body);
  208 +
  209 + /*
  210 + * Create the footer Div
  211 + */
  212 + var footer = div.clone().attr({id: "footer"});
  213 +
  214 + /*
  215 + * Create On/Off Switch link
  216 + */
  217 + var button = this.createElement("a",{"id": "button", "class": "button"});
  218 +
  219 + /*
  220 + * Append button to footer
  221 + */
  222 + footer.append(button);
  223 +
  224 + /*
  225 + * Append footer note to footer
  226 + */
  227 + footer.append(this.createElement("span",{"class":"footer_note"}).html("&copy 2012").append(this.createElement("a",{"href": "https://plus.google.com/117596712775912423303", "target": "_blank"}).html("Moritz")));
  228 +
  229 + /*
  230 + * Bind click event to the On/Off switch
  231 + */
  232 + button.click(this.toggleShow.bind(this));
  233 + button.click(this.createOverlay.bind(this));
  234 + button.click(this.createCanvas.bind(this));
  235 +
  236 + /*
  237 + * Create canvas elements for the name and tagline
  238 + */
  239 + this.createElement("canvas", {"id":"canvasName"}).appendTo("body").height("50").width("640").hide();
  240 + this.createElement("canvas", {"id":"canvasTag"}).appendTo("body").height("30").width("640").hide();
  241 +
  242 + /*
  243 + * Append DOM structure to container
  244 + */
  245 + jQuery("#container").append(header, inputdiv, shadow, body, footer);
  246 +
  247 + /*
  248 + * Bind scroll event to toggle shadow
  249 + */
  250 + body.on("scroll", this.bodyOnScroll.bind(this));
  251 + }
  252 +
  253 + /**
  254 + * @scale - Scales the body for different resolutions
  255 + * @public
  256 + */
  257 + ApplicationController.prototype.scale = function(){
  258 + /*
  259 + * Set the maximum height of the body minus header, input div and footer
  260 + */
  261 + jQuery("#body").height(this.maxHeight-162);
  262 + }
  263 +
  264 + /**
  265 + * @onSelectItem - Fired when a lower third is selected
  266 + * @private
  267 + * @param evt {jQueryEventObject}
  268 + */
  269 + ApplicationController.prototype.onSelectItem = function(evt){
  270 + jQuery("li.selected", evt.currentTarget.parentNode).removeClass("selected");
  271 + jQuery(evt.currentTarget).addClass("selected");
  272 + }
  273 +
  274 + /**
  275 + * @bodyOnScroll - Fired when the #body is scrolled
  276 + * @private
  277 + * @param evt {jQueryEventObject}
  278 + */
  279 + ApplicationController.prototype.bodyOnScroll = function(evt){
  280 + /*
  281 + * Hide/Show shadow depending on scroll position
  282 + */
  283 + jQuery("#body").scrollTop() > 0 ? jQuery(".shadow", "#container").show() : jQuery(".shadow", "#container").hide();
  284 + }
  285 +
  286 + /**
  287 + * @toggleShow - Fired when #button is clicked
  288 + * @public
  289 + * @see ApplicationController.buildDOM
  290 + */
  291 + ApplicationController.prototype.toggleShow = function(){
  292 + if(this.globalShow === false){
  293 + jQuery("#button").removeClass("button").addClass("button_active");
  294 + this.globalShow = true;
  295 + return;
  296 + }
  297 +
  298 + jQuery("#button").removeClass("button_active").addClass("button");
  299 + this.globalShow = false;
  300 +
  301 + for(var index in this.backgroundOverlay){
  302 + this.backgroundOverlay[index].setVisible(false);
  303 + delete this.backgroundOverlay[index];
  304 + }
  305 + this.log(this.backgroundOverlay);
  306 +
  307 + for(var index in this.canvasOverlays){
  308 + this.canvasOverlays[index].setVisible(false);
  309 + delete this.canvasOverlays[index];
  310 + }
  311 + }
  312 +
  313 + /**
  314 + * @getInputValue - Get Input values from form
  315 + * @public
  316 + * @param id {string}
  317 + * @returns {String}
  318 + */
  319 + ApplicationController.prototype.getInputValue = function(id){
  320 + return jQuery("#" + id).val();
  321 + }
  322 +
  323 + /**
  324 + * @getCanvasName - Get canvasName from DOM
  325 + * @private
  326 + * @returns {HTMLCanvasElement}
  327 + */
  328 + ApplicationController.prototype.getCanvasName = function(){
  329 + return jQuery("#canvasName")[0];
  330 + }
  331 +
  332 + /**
  333 + * @getCanvasTag - Get canvasTag from DOM
  334 + * @private
  335 + * @returns {HTMLCanvasElement}
  336 + */
  337 + ApplicationController.prototype.getCanvasTag = function(){
  338 + return jQuery("#canvasTag")[0];
  339 + }
  340 +
  341 + /**
  342 + * @createImageResourceFromCanvas - Creates a image resource from a canvas element
  343 + * @private
  344 + * @param canvas {HTMLCanvasElement}
  345 + */
  346 + ApplicationController.prototype.createImageResourceFromCanvas = function(canvas){
  347 + return gapi.hangout.av.effects.createImageResource(canvas.toDataURL());
  348 + }
  349 +
  350 + /**
  351 + * @prepareCanvasContext - Prepares a canvas for manipulation
  352 + * @private
  353 + * @param canvas {HTMLCanvasElement}
  354 + */
  355 + ApplicationController.prototype.prepareCanvasContext = function(canvas){
  356 + canvas.clearRect(0, 0, canvas.canvas.width, canvas.canvas.height);
  357 + canvas.textAlign = "left";
  358 + }
  359 +
  360 + /**
  361 + * @createCanvas - Creates the canvas
  362 + * @private
  363 + */
  364 + ApplicationController.prototype.createCanvas = function(){
  365 + /*
  366 + * Get 2d context for canvas elements
  367 + */
  368 + var canvasNameContext = this.getCanvasName().getContext("2d");
  369 + var canvasTagContext = this.getCanvasTag().getContext("2d");
  370 +
  371 + /*
  372 + * Prepare canvas elements for manipulation
  373 + */
  374 + this.prepareCanvasContext(canvasNameContext);
  375 + this.prepareCanvasContext(canvasTagContext);
  376 +
  377 + /*
  378 + * Set font, sizes, and type for canvases
  379 + */
  380 + canvasNameContext.font = "38px Arial";
  381 + canvasTagContext.font = "16px Arial";
  382 +
  383 + /*
  384 + * Set Text values and positions for canvas elements
  385 + */
  386 + canvasNameContext.fillText(this.getInputValue("Name"), 50, 28);
  387 + canvasTagContext.fillText(this.getInputValue("Tag"), 50, 28);
  388 +
  389 + /*
  390 + * Convert canvas elements to image resources
  391 + */
  392 + var canvasNameImage = this.createImageResourceFromCanvas(canvasNameContext.canvas);
  393 + var canvasTagImage = this.createImageResourceFromCanvas(canvasTagContext.canvas);
  394 +
  395 + /*
  396 + * Create face tracking overlay from image resource
  397 + */
  398 + this.canvasOverlays['canvasNameOverlay'] = canvasNameImage.createFaceTrackingOverlay({
  399 + 'trackingFeature': gapi.hangout.av.effects.FaceTrackingFeature.NOSE_ROOT,
  400 + 'scale': 1.0
  401 + });
  402 + this.canvasOverlays['canvasTagOverlay'] = canvasTagImage.createFaceTrackingOverlay({
  403 + 'trackingFeature': gapi.hangout.av.effects.FaceTrackingFeature.NOSE_ROOT,
  404 + 'scale': 1.0
  405 + });
  406 +
  407 + /*
  408 + * Set face tracking overlay parameters and toggle between Show/Hide
  409 + */
  410 + this.canvasOverlays['canvasNameOverlay'].setOffset(0, 0.5);
  411 + if(this.globalShow === true){
  412 + this.canvasOverlays['canvasNameOverlay'].setVisible(true);
  413 + }else{
  414 + this.canvasOverlays['canvasNameOverlay'].setVisible(false);
  415 + delete this.canvasOverlays['canvasNameOverlay'];
  416 + }
  417 +
  418 + this.canvasOverlays['canvasTagOverlay'].setOffset(0, 0.5);
  419 + if(this.globalShow === true){
  420 + this.canvasOverlays['canvasTagOverlay'].setVisible(true);
  421 + }else{
  422 + this.canvasOverlays['canvasTagOverlay'].setVisible(false);
  423 + delete this.canvasOverlays['canvasTagOverlay'];
  424 + }
  425 + }
  426 +
  427 + /**
  428 + * @createOverlay - Creates the Overlays
  429 + * @private
  430 + * @param evt {jQueryEventObject}
  431 + */
  432 + ApplicationController.prototype.createOverlay = function(evt){
  433 + var id = $("#templates li.selected").eq(0).attr("id");
  434 + var image = gapi.hangout.av.effects.createImageResource("//tolxdorff.appspot.com/a/lowerthird/i/templates/" + id + ".png");
  435 +
  436 + this.backgroundOverlay['background'] = image.createFaceTrackingOverlay({
  437 + 'trackingFeature': gapi.hangout.av.effects.FaceTrackingFeature.NOSE_ROOT,
  438 + 'scale': 1.0
  439 + });
  440 + this.backgroundOverlay['background'].setOffset(0, 0.5);
  441 + if(this.globalShow === true){
  442 + this.backgroundOverlay['background'].setVisible(true);
  443 + }else{
  444 + this.backgroundOverlay['background'].setVisible(false);
  445 + delete this.backgroundOverlay['background'];
  446 + }
  447 + }
  448 +
  449 + /**
  450 + * @createElement - Creates a new element
  451 + * @public
  452 + * @param type {String}
  453 + * @param attr {Object}
  454 + */
  455 + ApplicationController.prototype.createElement = function(type, attr){
  456 + return jQuery("<" + type + ">").attr(attr || {});
  457 + }
  458 +
  459 + /**
  460 + * @log - Writes to console.log if DEBUGGING is enabled
  461 + * this.log(...)
  462 + * @private
  463 + * @param {Mixed}
  464 + */
  465 + ApplicationController.prototype.log = function(){
  466 + if(this.DEBUGGING === true){
  467 + console.log(Array.prototype.slice.call(arguments))
  468 + }
  469 + }
  470 +
  471 + /**
  472 + * @onApiReady - Fired by gapi when it's ready
  473 + * @private
  474 + * @param event {gapi.hangout.apiReadyEvent}
  475 + */
  476 + ApplicationController.prototype.onApiReady = function(event){
  477 + if(event.isApiReady){
  478 + try {
  479 + this.buildDOM();
  480 + this.scale();
  481 + console.log("Lower Third App loaded!");
  482 + }
  483 + catch(err) {
  484 + console.log(err);
  485 + }
  486 + }
  487 + }
  488 +
  489 + // Export instantiated ApplicationController to main window
  490 + window["appController"] = new ApplicationController();
  491 +})()
34 lowerthird.xml
... ... @@ -0,0 +1,34 @@
  1 +<?xml version="1.0" encoding="UTF-8" ?>
  2 +<Module>
  3 + <!--
  4 + * Lower Third for Google+ Hangouts
  5 + * Copyright 2012 Moritz Tolxdorff
  6 + * Version: 1.0.0
  7 + * Release date: 06.04.2012
  8 + * Developers:
  9 + ** Moritz Tolxdorff
  10 + ** Robert Pitt
  11 + *
  12 + * Thanks:
  13 + ** Robert Pitt
  14 + -->
  15 +
  16 +
  17 + <ModulePrefs title="LowerThird">
  18 + <Require feature="rpc"/>
  19 + <Require feature="views"/>
  20 + </ModulePrefs>
  21 + <Content type="html">
  22 + <![CDATA[
  23 + <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
  24 + <script src="//hangoutsapi.talkgadget.google.com/hangouts/api/hangout.js?v=1.0"></script>
  25 + <link rel="stylesheet" type="text/css" href="//tolxdorff.appspot.com/a/lowerthird/style.css" />
  26 + <!--[if lt IE 9]>
  27 + <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
  28 + <![endif]-->
  29 + <div id="container">
  30 + </div>
  31 + <script src="//tolxdorff.appspot.com/a/lowerthird/lowerthird.js"></script>
  32 + ]]>
  33 + </Content>
  34 +</Module>
1  privacy.txt
... ... @@ -0,0 +1 @@
  1 +coming soon
193 style.css
... ... @@ -0,0 +1,193 @@
  1 +#container #header {
  2 + background-color: #f3f3f3;
  3 + height: 28px;
  4 + border-bottom: 1px solid #d9d9d9;
  5 + padding: 0 10px;
  6 + line-height: 24px;
  7 + font-weight: bold;
  8 + font-size: 11px;
  9 + vertical-align: middle;
  10 +}
  11 +
  12 +#container #header .icon_header {
  13 + background-image: url(data:image/png;base64,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);
  14 + height: 16px;
  15 + width: 16px;
  16 + position: absolute;
  17 + top: 5px;
  18 + left: 5px;
  19 +}
  20 +
  21 +#container #header .header_title {
  22 + margin-left: 18px;
  23 + line-height: 28px;
  24 +}
  25 +
  26 +#container #body {
  27 + background-color: #fff;
  28 + overflow-y: auto;
  29 +}
  30 +
  31 +#container .form {
  32 + margin-top: 5px;
  33 +}
  34 +
  35 +#container .inputdiv {
  36 + width: 300px;
  37 + height: 85px;
  38 + border-bottom: 2px solid #d9d9d9;
  39 + background-color: #f3f3f3;
  40 + border-right: 1px solid #d9d9d9;
  41 +}
  42 +#container #body #templatediv {
  43 + width: 283px;
  44 + border-bottom: 1px solid #d9d9d9;
  45 +}
  46 +
  47 +#container #body #templatediv #templates{
  48 + padding:0px;
  49 + margin:0px;
  50 + width:288px;
  51 +}
  52 +
  53 +#container #body #templatediv #customURL{
  54 + width:180px;
  55 +}
  56 +
  57 +#container #body .listitem {
  58 + list-style: none;
  59 + width: 288px;
  60 + height: 43px;
  61 + line-height: 34px;
  62 + border-bottom: 1px solid #d9d9d9;
  63 + padding-left: 12px;
  64 + font-size: 12px;
  65 +}
  66 +
  67 +#container #body #custom {
  68 + padding-top:10px;
  69 +}
  70 +
  71 +#container #body #custom label{
  72 + width: 76px;
  73 + padding-top: 0px;
  74 +}
  75 +
  76 +#container #body .selected {
  77 + background-color: #63ABF7;
  78 + background-image: -webkit-linear-gradient(top,#63ABF7,#5E99CD);
  79 + background-image: -moz-linear-gradient(top,#63ABF7,#5E99CD);
  80 + background-image: -ms-linear-gradient(top,#63ABF7,#5E99CD);
  81 + background-image: -o-linear-gradient(top,#63ABF7,#5E99CD);
  82 + background-image: linear-gradient(top,#63ABF7,#5E99CD);
  83 +}
  84 +
  85 +#container label {
  86 + font-size:12px;
  87 + width: 60px;
  88 + font-family: verdana;
  89 + color:#2e2e2e;
  90 + margin-left: 5px;
  91 + margin-bottom: 5px;
  92 + padding-top: 5px;
  93 + float:left;
  94 +}
  95 +
  96 +#container .input {
  97 + width: 220px;
  98 + margin-left:10px;
  99 +}
  100 +
  101 +#container #footer {
  102 + background-color: #f3f3f3;
  103 + border-right: 1px solid #d9d9d9;
  104 + height: 40px;
  105 + border-top: 1px solid #d9d9d9;
  106 +}
  107 +
  108 +#container #footer .footer_note {
  109 + font-size:10px;
  110 + font-family:verdana;
  111 + color:#2e2e2e;
  112 + float:left;
  113 + position: relative;
  114 + left: 5px;
  115 + top: 15px;
  116 +}
  117 +
  118 +#container #footer a {
  119 + font-size:10px;
  120 + font-family:verdana;
  121 + color:#2e2e2e;
  122 + text-decoration:none;
  123 +}
  124 +#container #footer a:hover {
  125 + text-decoration:underline;
  126 + padding-bottom: 5px;
  127 + margin-bottom: 5px;
  128 +}
  129 +
  130 +#container #footer .button {
  131 + background: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAAQCAYAAACsu9d7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGODdGMTE3NDA3MjA2ODExQkYzQ0QzQ0M4RDRBNkUxQSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxOTZGMzE3NjIwMjgxMUUwODg4REJDOEE0QjE5QjMyRiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDMDMxNDUwMDIwMjYxMUUwODg4REJDOEE0QjE5QjMyRiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjZGQUE1NzE5MUIyMDY4MTFCMzRCRDQwNEIyRkZBMzA2IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkY4N0YxMTc0MDcyMDY4MTFCRjNDRDNDQzhENEE2RTFBIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+gv3BcwAAAtFJREFUeNrEVztrYlEQHp9EJSAIQaJ1IESQdIoSFbTxUWf/wlYG0tgp21vEJqBbbCe2YoIg7oKxyRZJpyB2ssEiUYmSID6yd4bM5eJrs2i8A8M99xzOMN/MN3POUTw/P0MymfyuUCi+AIAB1pC3tzeYTqcg2BJVRvkt6GU8Hv+hSCQSP61Wq+/k5ATMZvNaVtvtNlQqFdBoNHB0dAQqlUo2hN1uF2q1Gjw+PsbVwr/H7/fDy8sLNJvNtQzv7OwA2spms+B2u0Gn08kCcDQaUaD1ej0Ui8WvCFI5GAxgMpmsHXk0jraGwyHRVi5BgEajkfwRxKzmhU1TC+tzmdzd3UG1WoVOp0P/NpsNwuEwMaFer0Mul5vbc3p6Cg8PD3BzczO3FovFaK9UlEqlOCaQarV6a1G+v7+HfD4PwWAQvF4vvL6+QjqdJj07OxOdC4VC4PF4KFjc0LDmUaLRKFgsFnF+PB4TE5eJmtO7DUEAmAmh0REAdE6r1RLgTCZDGTYYDCITcJ1BSrs1/r9TUQS6SraaSaxVpOjBwQEBQEXH9/f3ab3X64kgr6+vSZnOSFeWVColjgOBALhcLnlAYoZQpcKZwC/2AGlmONPsSyQSAZ/PR2tIRfwylc/PzykwvIaZXNQDmKGfRtdFIPFIMZlM0Gg0aI1p1mq16Lu3tycCkdKTAyJdwzHTeFmTY1xKzuQmdVXHRXo9PT3B1dUVzSF9C4UCgXc6nXO3J86SFAjPL8ugrI0HHXI4HDQulUpQLpdpfHx8TPT8qNP/K59Wk4vurZwdBCrNmjQ7drsdLi4uxHqTCp6lHIxVR8YikBPhSqfa3d3dCLh+v0+1Jz2MZ8FwLc1eHDgITE9pVhn0qhqcFTyDBfmDnvzCVo0TWODrKNpAW4eHh/+szdm6WgR02b6PgMRg397e4vBSgRvwJSJEyMONaN2nFh8HMj+12u9PrW9/BRgATp+0qmBfQY4AAAAASUVORK5CYII=');
  132 + width: 41px;
  133 + border: none;
  134 + height: 8px;
  135 + cursor: pointer;
  136 + display: block;
  137 + padding:4px 8px;
  138 + text-decoration:none;
  139 + float: right;
  140 + position: relative;
  141 + right: 5px;
  142 + top: 15px;
  143 +}
  144 +
  145 +#container #footer .button_active{
  146 + background: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAAQCAYAAACsu9d7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGODdGMTE3NDA3MjA2ODExQkYzQ0QzQ0M4RDRBNkUxQSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxOTZGMzE3QTIwMjgxMUUwODg4REJDOEE0QjE5QjMyRiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxOTZGMzE3OTIwMjgxMUUwODg4REJDOEE0QjE5QjMyRiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjcyQUE1NzE5MUIyMDY4MTFCMzRCRDQwNEIyRkZBMzA2IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkY4N0YxMTc0MDcyMDY4MTFCRjNDRDNDQzhENEE2RTFBIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+1B4/XQAAAxRJREFUeNrEV0FrE0EU/nazW2MxqUUK0Z7cgnjzkLZgwabEnAUPqV4KHiRF/AGbU008JRV6FNpTjpIUvPSWotie1AaR3qQuFVooaBObpiltzK5vdifZBDQbTULe8mV2ZrJv3vfem7c7AhaAmBh7BOAJYRJ9EsMw6hBFEYIgdKryhHS9isfjj4VYLLawi914Vs9in66+iQ4EjADmrs9henoaPp+vI3UHBwfY2NjA3t7eW4lFcNVYRUkqAW7quVq5m1Ah/LKMgkhgGmQ+x8arXIfEn6nwOdlB9zkwcTaBUCiEcrmMnZ2djki63W5TVyqVCjBTfCUQwUG6E1p7GmeEsmWQKQI3fpATPuHzzFleTu6It0PODrxEV6lUQrVahcvl6ohkpVIxdTHLxLqxIm//BPAo0TPqlArjhWFh0TD7bJwRT4QSMJYMJIIJyxEU1a2nW8g/y1tOEhzAhRHsBmoi1u+cFiejl+8tQw2qmH09C2FJwHhq3OynH6bt6JJEpiIYFoctxwht6G9YR5KkrsIm2cbiikdB5HYEKx9XkPmaMVMv9yOH5GYS4VthKEOKlZYk2qEG9Y5qETf+jaQsy11FcyQdxH/NbxHIa7bhtT6bH/XXx5gjIpMUTddw03/bkV5E0vod4GhVdC409GtVtdqQjgN2Yckd5rC+uw71rtpcoJzWOEXdsG6KnbStihnN545ydsS2eSGidFQuKxaxnzn4r/JoEqHkpySy97MolAu8mjis4bLTtdsiNr0D/waWlmUNK9uUhhMRhG+EzdcFa9WAisyXDLRTzSbB9mueovltHcoVxV7JcF6nd+mqczjI/OY8tKKG9IN0fSy5lUT0fdQiKDekLpFKfqaidDNspavksIbeu0hKTVFsQ5jhDE3C92X0Q9RETdjeFF4KzZFso/D0guS+V/eOFvUi+irkgCJd7JPO4/F0ReXx8TFrqq6ZmZmLI8ZIUJM0nIvnfeUpV2V4v3sxNjZmfnuy08j/gjlrbW0NhULhjYDndNTSYwv8qOXrWyDpiKXr1sbs0lFLJ53v6KgV/C3AACrFLBdWBnXbAAAAAElFTkSuQmCC');
  147 + width: 41px;
  148 + border: none;
  149 + height: 8px;
  150 + cursor: pointer;
  151 + display: block;
  152 + padding:4px 8px;
  153 + text-decoration:none;
  154 + float: right;
  155 + position: relative;
  156 + right: 5px;
  157 + top: 15px;
  158 +}
  159 +
  160 +.shadow{
  161 +-webkit-mask-box-image: -webkit-linear-gradient(left,transparent 0%,rgba(0,0,0,.8) 50%,transparent 100%);
  162 +background-color: transparent;
  163 +background-image: -webkit-linear-gradient(top,rgba(0, 0, 0, .2),transparent);
  164 +background-image: -moz-linear-gradient(top,rgba(0, 0, 0, .2),transparent);
  165 +background-image: -ms-linear-gradient(top,rgba(0, 0, 0, .2),transparent);
  166 +background-image: -o-linear-gradient(top,rgba(0, 0, 0, .2),transparent);
  167 +background-image: linear-gradient(top,rgba(0, 0, 0, .2),transparent);
  168 +border-top: 1px solid rgba(0, 0, 0, 0.4);
  169 +height: 8px;
  170 +margin: -1px 0 -8px;
  171 +position: relative;
  172 +width: 100%;
  173 +z-index: 985;
  174 +}
  175 +
  176 +/*
  177 + * Scrollbars
  178 +*/
  179 +::-webkit-scrollbar {background: transparent;}
  180 +::-webkit-scrollbar-corner {background: transparent;}
  181 +
  182 +/* These rules are for scrollbar draggable panel */
  183 +::-webkit-scrollbar-thumb {background-color: rgba(0, 0, 0, 0.2);border: solid whiteSmoke 4px;}
  184 +::-webkit-scrollbar-thumb:hover {background-color: rgba(0, 0, 0, 0.3);}
  185 +/* These rules are for buttons */
  186 +/*
  187 +::-webkit-scrollbar-button:vertical:increment{
  188 + background:no-repeat url("https://ssl.gstatic.com/docs/spreadsheets/waffle_sprite22.png") -15px -62px;
  189 + height:16px;
  190 +}
  191 +::-webkit-scrollbar-button:vertical:decrement{
  192 + background:no-repeat url("https://ssl.gstatic.com/docs/spreadsheets/waffle_sprite22.png") -70px -40px
  193 +}*/
1  support.txt
... ... @@ -0,0 +1 @@
  1 +coming soon

0 comments on commit 68c217e

Please sign in to comment.
Something went wrong with that request. Please try again.