diff options
author | Stefano <l.stickell@yahoo.it> | 2013-07-21 12:58:42 +0200 |
---|---|---|
committer | Stefano <l.stickell@yahoo.it> | 2013-07-21 12:58:42 +0200 |
commit | 37d898f681e41fe9c9a8719a540eda59bfedd448 (patch) | |
tree | faecf5455aa91155ed7c762701221f171d14bb0d /module/web/templates/default | |
parent | Using the same translatable string (diff) | |
download | pyload-37d898f681e41fe9c9a8719a540eda59bfedd448.tar.xz |
Normalize line endings to avoid line endings merge conflicts
Diffstat (limited to 'module/web/templates/default')
-rw-r--r-- | module/web/templates/default/base.html | 360 | ||||
-rw-r--r-- | module/web/templates/default/captcha.html | 82 | ||||
-rw-r--r-- | module/web/templates/default/home.html | 530 | ||||
-rw-r--r-- | module/web/templates/default/queue.html | 206 | ||||
-rw-r--r-- | module/web/templates/default/window.html | 90 |
5 files changed, 634 insertions, 634 deletions
diff --git a/module/web/templates/default/base.html b/module/web/templates/default/base.html index 0b20ecdb0..147c08a37 100644 --- a/module/web/templates/default/base.html +++ b/module/web/templates/default/base.html @@ -1,180 +1,180 @@ -<?xml version="1.0" ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
-<link rel="stylesheet" type="text/css" href="/media/default/css/default.css"/>
-<link rel="stylesheet" type="text/css" href="/media/default/css/window.css"/>
-<link rel="stylesheet" type="text/css" href="/media/default/css/MooDialog.css"/>
-
-<script type="text/javascript" src="/media/js/mootools-core-1.4.1.js"></script>
-<script type="text/javascript" src="/media/js/mootools-more-1.4.0.1.js"></script>
-<script type="text/javascript" src="/media/js/MooDialog_static.js"></script>
-<script type="text/javascript" src="/media/js/purr_static.js"></script>
-
-
-<script type="text/javascript" src="/media/js/base.js"></script>
-
-<title>{% block title %}pyLoad {{_("Webinterface")}}{% endblock %}</title>
-
-{% block head %}
-{% endblock %}
-</head>
-<body>
-<a class="anchor" name="top" id="top"></a>
-
-<div id="head-panel">
-
-
- <div id="head-search-and-login">
- {% block headpanel %}
-
- {% if user.is_authenticated %}
-
-
-{% if update %}
-<span>
-<span style="font-weight: bold; margin: 0 2px 0 2px;">{{_("pyLoad Update available!")}}</span>
-</span>
-{% endif %}
-
-
-{% if plugins %}
-<span>
-<span style="font-weight: bold; margin: 0 2px 0 2px;">{{_("Plugins updated, please restart!")}}</span>
-</span>
-{% endif %}
-
-<span id="cap_info" style="display: {% if captcha %}inline{%else%}none{% endif %}">
-<img src="/media/default/img/images.png" alt="Captcha:" style="vertical-align:middle; margin:2px" />
-<span style="font-weight: bold; cursor: pointer; margin-right: 2px;">{{_("Captcha waiting")}}</span>
-</span>
-
- <img src="/media/default/img/head-login.png" alt="User:" style="vertical-align:middle; margin:2px" /><span style="padding-right: 2px;">{{user.name}}</span>
- <ul id="user-actions">
- <li><a href="/logout" class="action logout" rel="nofollow">{{_("Logout")}}</a></li>
- {% if user.is_admin %}
- <li><a href="/admin" class="action profile" rel="nofollow">{{_("Administrate")}}</a></li>
- {% endif %}
- <li><a href="/info" class="action info" rel="nofollow">{{_("Info")}}</a></li>
-
- </ul>
-{% else %}
- <span style="padding-right: 2px;">{{_("Please Login!")}}</span>
-{% endif %}
-
- {% endblock %}
- </div>
-
- <a href="/"><img id="head-logo" src="/media/default/img/pyload-logo-edited3.5-new-font-small.png" alt="pyLoad" /></a>
-
- <div id="head-menu">
- <ul>
-
- {% macro selected(name, right=False) -%}
- {% if name in url -%}class="{% if right -%}right {% endif %}selected"{%- endif %}
- {% if not name in url and right -%}class="right"{%- endif %}
- {%- endmacro %}
-
-
- {% block menu %}
- <li>
- <a href="/" title=""><img src="/media/default/img/head-menu-home.png" alt="" /> {{_("Home")}}</a>
- </li>
- <li {{ selected('queue') }}>
- <a href="/queue/" title=""><img src="/media/default/img/head-menu-queue.png" alt="" /> {{_("Queue")}}</a>
- </li>
- <li {{ selected('collector') }}>
- <a href="/collector/" title=""><img src="/media/default/img/head-menu-collector.png" alt="" /> {{_("Collector")}}</a>
- </li>
- <li {{ selected('downloads') }}>
- <a href="/downloads/" title=""><img src="/media/default/img/head-menu-development.png" alt="" /> {{_("Downloads")}}</a>
- </li>
-{# <li {{ selected('filemanager') }}>#}
-{# <a href="/filemanager/" title=""><img src="/media/default/img/head-menu-download.png" alt="" /> {{_("FileManager")}}</a>#}
-{# </li>#}
- <li {{ selected('logs', True) }}>
- <a href="/logs/" class="action index" accesskey="x" rel="nofollow"><img src="/media/default/img/head-menu-index.png" alt="" />{{_("Logs")}}</a>
- </li>
- <li {{ selected('settings', True) }}>
- <a href="/settings/" class="action index" accesskey="x" rel="nofollow"><img src="/media/default/img/head-menu-config.png" alt="" />{{_("Config")}}</a>
- </li>
- {% endblock %}
-
- </ul>
- </div>
-
- <div style="clear:both;"></div>
-</div>
-
-{% if perms.STATUS %}
-<ul id="page-actions2">
- <li id="action_play"><a href="#" class="action play" accesskey="o" rel="nofollow">{{_("Start")}}</a></li>
- <li id="action_stop"><a href="#" class="action stop" accesskey="o" rel="nofollow">{{_("Stop")}}</a></li>
- <li id="action_cancel"><a href="#" class="action cancel" accesskey="o" rel="nofollow">{{_("Cancel")}}</a></li>
- <li id="action_add"><a href="#" class="action add" accesskey="o" rel="nofollow" >{{_("Add")}}</a></li>
-</ul>
-{% endif %}
-
-{% if perms.LIST %}
-<ul id="page-actions">
- <li><span class="time">{{_("Download:")}}</span><a id="time" style=" background-color: {% if status.download %}#8ffc25{% else %} #fc6e26{% endif %}; padding-left: 0cm; padding-right: 0.1cm; "> {% if status.download %}{{_("on")}}{% else %}{{_("off")}}{% endif %}</a></li>
- <li><span class="reconnect">{{_("Reconnect:")}}</span><a id="reconnect" style=" background-color: {% if status.reconnect %}#8ffc25{% else %} #fc6e26{% endif %}; padding-left: 0cm; padding-right: 0.1cm; "> {% if status.reconnect %}{{_("on")}}{% else %}{{_("off")}}{% endif %}</a></li>
- <li><a class="action backlink">{{_("Speed:")}} <b id="speed">{{ status.speed }}</b></a></li>
- <li><a class="action cog">{{_("Active:")}} <b id="aktiv" title="{{_("Active")}}">{{ status.active }}</b> / <b id="aktiv_from" title="{{_("Queued")}}">{{ status.queue }}</b> / <b id="aktiv_total" title="{{_("Total")}}">{{ status.total }}</b></a></li>
- <li><a href="" class="action revisions" accesskey="o" rel="nofollow">{{_("Reload page")}}</a></li>
-</ul>
-{% endif %}
-
-{% block pageactions %}
-{% endblock %}
-<br/>
-
-<div id="body-wrapper" class="dokuwiki">
-
-<div id="content" lang="en" dir="ltr">
-
-<h1>{% block subtitle %}pyLoad - {{_("Webinterface")}}{% endblock %}</h1>
-
-{% block statusbar %}
-{% endblock %}
-
-
-<br/>
-
-<div class="level1" style="clear:both">
-</div>
-<noscript><h1>Enable JavaScript to use the webinterface.</h1></noscript>
-
-{% for message in messages %}
- <b><p>{{message}}</p></b>
-{% endfor %}
-
-<div id="load-indicator" style="opacity: 0; float: right; margin-top: -10px;">
- <img src="/media/default/img/ajax-loader.gif" alt="" style="padding-right: 5px"/>
- {{_("loading")}}
-</div>
-
-{% block content %}
-{% endblock content %}
-
- <hr style="clear: both;" />
-
-<div id="foot">© 2008-2011 pyLoad Team
-<a href="#top" class="action top" accesskey="x"><span>{{_("Back to top")}}</span></a><br />
-<!--<div class="breadcrumbs"></div>-->
-
-</div>
-</div>
-</div>
-
-<div style="display: none;">
- {% include "default/window.html" %}
- {% include "default/captcha.html" %}
- {% block hidden %}
- {% endblock %}
-</div>
-</body>
-</html>
+<?xml version="1.0" ?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> +<link rel="stylesheet" type="text/css" href="/media/default/css/default.css"/> +<link rel="stylesheet" type="text/css" href="/media/default/css/window.css"/> +<link rel="stylesheet" type="text/css" href="/media/default/css/MooDialog.css"/> + +<script type="text/javascript" src="/media/js/mootools-core-1.4.1.js"></script> +<script type="text/javascript" src="/media/js/mootools-more-1.4.0.1.js"></script> +<script type="text/javascript" src="/media/js/MooDialog_static.js"></script> +<script type="text/javascript" src="/media/js/purr_static.js"></script> + + +<script type="text/javascript" src="/media/js/base.js"></script> + +<title>{% block title %}pyLoad {{_("Webinterface")}}{% endblock %}</title> + +{% block head %} +{% endblock %} +</head> +<body> +<a class="anchor" name="top" id="top"></a> + +<div id="head-panel"> + + + <div id="head-search-and-login"> + {% block headpanel %} + + {% if user.is_authenticated %} + + +{% if update %} +<span> +<span style="font-weight: bold; margin: 0 2px 0 2px;">{{_("pyLoad Update available!")}}</span> +</span> +{% endif %} + + +{% if plugins %} +<span> +<span style="font-weight: bold; margin: 0 2px 0 2px;">{{_("Plugins updated, please restart!")}}</span> +</span> +{% endif %} + +<span id="cap_info" style="display: {% if captcha %}inline{%else%}none{% endif %}"> +<img src="/media/default/img/images.png" alt="Captcha:" style="vertical-align:middle; margin:2px" /> +<span style="font-weight: bold; cursor: pointer; margin-right: 2px;">{{_("Captcha waiting")}}</span> +</span> + + <img src="/media/default/img/head-login.png" alt="User:" style="vertical-align:middle; margin:2px" /><span style="padding-right: 2px;">{{user.name}}</span> + <ul id="user-actions"> + <li><a href="/logout" class="action logout" rel="nofollow">{{_("Logout")}}</a></li> + {% if user.is_admin %} + <li><a href="/admin" class="action profile" rel="nofollow">{{_("Administrate")}}</a></li> + {% endif %} + <li><a href="/info" class="action info" rel="nofollow">{{_("Info")}}</a></li> + + </ul> +{% else %} + <span style="padding-right: 2px;">{{_("Please Login!")}}</span> +{% endif %} + + {% endblock %} + </div> + + <a href="/"><img id="head-logo" src="/media/default/img/pyload-logo-edited3.5-new-font-small.png" alt="pyLoad" /></a> + + <div id="head-menu"> + <ul> + + {% macro selected(name, right=False) -%} + {% if name in url -%}class="{% if right -%}right {% endif %}selected"{%- endif %} + {% if not name in url and right -%}class="right"{%- endif %} + {%- endmacro %} + + + {% block menu %} + <li> + <a href="/" title=""><img src="/media/default/img/head-menu-home.png" alt="" /> {{_("Home")}}</a> + </li> + <li {{ selected('queue') }}> + <a href="/queue/" title=""><img src="/media/default/img/head-menu-queue.png" alt="" /> {{_("Queue")}}</a> + </li> + <li {{ selected('collector') }}> + <a href="/collector/" title=""><img src="/media/default/img/head-menu-collector.png" alt="" /> {{_("Collector")}}</a> + </li> + <li {{ selected('downloads') }}> + <a href="/downloads/" title=""><img src="/media/default/img/head-menu-development.png" alt="" /> {{_("Downloads")}}</a> + </li> +{# <li {{ selected('filemanager') }}>#} +{# <a href="/filemanager/" title=""><img src="/media/default/img/head-menu-download.png" alt="" /> {{_("FileManager")}}</a>#} +{# </li>#} + <li {{ selected('logs', True) }}> + <a href="/logs/" class="action index" accesskey="x" rel="nofollow"><img src="/media/default/img/head-menu-index.png" alt="" />{{_("Logs")}}</a> + </li> + <li {{ selected('settings', True) }}> + <a href="/settings/" class="action index" accesskey="x" rel="nofollow"><img src="/media/default/img/head-menu-config.png" alt="" />{{_("Config")}}</a> + </li> + {% endblock %} + + </ul> + </div> + + <div style="clear:both;"></div> +</div> + +{% if perms.STATUS %} +<ul id="page-actions2"> + <li id="action_play"><a href="#" class="action play" accesskey="o" rel="nofollow">{{_("Start")}}</a></li> + <li id="action_stop"><a href="#" class="action stop" accesskey="o" rel="nofollow">{{_("Stop")}}</a></li> + <li id="action_cancel"><a href="#" class="action cancel" accesskey="o" rel="nofollow">{{_("Cancel")}}</a></li> + <li id="action_add"><a href="#" class="action add" accesskey="o" rel="nofollow" >{{_("Add")}}</a></li> +</ul> +{% endif %} + +{% if perms.LIST %} +<ul id="page-actions"> + <li><span class="time">{{_("Download:")}}</span><a id="time" style=" background-color: {% if status.download %}#8ffc25{% else %} #fc6e26{% endif %}; padding-left: 0cm; padding-right: 0.1cm; "> {% if status.download %}{{_("on")}}{% else %}{{_("off")}}{% endif %}</a></li> + <li><span class="reconnect">{{_("Reconnect:")}}</span><a id="reconnect" style=" background-color: {% if status.reconnect %}#8ffc25{% else %} #fc6e26{% endif %}; padding-left: 0cm; padding-right: 0.1cm; "> {% if status.reconnect %}{{_("on")}}{% else %}{{_("off")}}{% endif %}</a></li> + <li><a class="action backlink">{{_("Speed:")}} <b id="speed">{{ status.speed }}</b></a></li> + <li><a class="action cog">{{_("Active:")}} <b id="aktiv" title="{{_("Active")}}">{{ status.active }}</b> / <b id="aktiv_from" title="{{_("Queued")}}">{{ status.queue }}</b> / <b id="aktiv_total" title="{{_("Total")}}">{{ status.total }}</b></a></li> + <li><a href="" class="action revisions" accesskey="o" rel="nofollow">{{_("Reload page")}}</a></li> +</ul> +{% endif %} + +{% block pageactions %} +{% endblock %} +<br/> + +<div id="body-wrapper" class="dokuwiki"> + +<div id="content" lang="en" dir="ltr"> + +<h1>{% block subtitle %}pyLoad - {{_("Webinterface")}}{% endblock %}</h1> + +{% block statusbar %} +{% endblock %} + + +<br/> + +<div class="level1" style="clear:both"> +</div> +<noscript><h1>Enable JavaScript to use the webinterface.</h1></noscript> + +{% for message in messages %} + <b><p>{{message}}</p></b> +{% endfor %} + +<div id="load-indicator" style="opacity: 0; float: right; margin-top: -10px;"> + <img src="/media/default/img/ajax-loader.gif" alt="" style="padding-right: 5px"/> + {{_("loading")}} +</div> + +{% block content %} +{% endblock content %} + + <hr style="clear: both;" /> + +<div id="foot">© 2008-2011 pyLoad Team +<a href="#top" class="action top" accesskey="x"><span>{{_("Back to top")}}</span></a><br /> +<!--<div class="breadcrumbs"></div>--> + +</div> +</div> +</div> + +<div style="display: none;"> + {% include "default/window.html" %} + {% include "default/captcha.html" %} + {% block hidden %} + {% endblock %} +</div> +</body> +</html> diff --git a/module/web/templates/default/captcha.html b/module/web/templates/default/captcha.html index 332a9c102..288375b76 100644 --- a/module/web/templates/default/captcha.html +++ b/module/web/templates/default/captcha.html @@ -1,42 +1,42 @@ -<!-- Captcha box -->
-<div id="cap_box" class="window_box">
-
- <form id="cap_form" action="/json/set_captcha" method="POST" enctype="multipart/form-data" onsubmit="return false;">
-
- <h1>{{_("Captcha reading")}}</h1>
- <p id="cap_title">{{_("Please read the text on the captcha.")}}</p>
-
- <div id="cap_textual">
-
- <input id="cap_id" name="cap_id" type="hidden" value="" />
-
- <label>{{_("Captcha")}}
- <span class="small">{{_("The captcha.")}}</span>
- </label>
- <span class="cont">
- <img id="cap_textual_img" src="">
- </span>
-
- <label>{{_("Text")}}
- <span class="small">{{_("Input the text on the captcha.")}}</span>
- </label>
- <input id="cap_result" name="cap_result" type="text" size="20" />
-
- </div>
-
- <div id="cap_positional" style="text-align: center">
- <img id="cap_positional_img" src="" style="margin: 10px; cursor:pointer">
- </div>
-
- <div id="button_bar" style="text-align: center">
- <span>
- <button id="cap_submit" type="submit" style="margin-left: 0">{{_("Submit")}}</button>
- <button id="cap_reset" type="reset" style="margin-left: 0">{{_("Close")}}</button>
- </span>
- </div>
-
- <div class="spacer"></div>
-
- </form>
-
+<!-- Captcha box --> +<div id="cap_box" class="window_box"> + + <form id="cap_form" action="/json/set_captcha" method="POST" enctype="multipart/form-data" onsubmit="return false;"> + + <h1>{{_("Captcha reading")}}</h1> + <p id="cap_title">{{_("Please read the text on the captcha.")}}</p> + + <div id="cap_textual"> + + <input id="cap_id" name="cap_id" type="hidden" value="" /> + + <label>{{_("Captcha")}} + <span class="small">{{_("The captcha.")}}</span> + </label> + <span class="cont"> + <img id="cap_textual_img" src=""> + </span> + + <label>{{_("Text")}} + <span class="small">{{_("Input the text on the captcha.")}}</span> + </label> + <input id="cap_result" name="cap_result" type="text" size="20" /> + + </div> + + <div id="cap_positional" style="text-align: center"> + <img id="cap_positional_img" src="" style="margin: 10px; cursor:pointer"> + </div> + + <div id="button_bar" style="text-align: center"> + <span> + <button id="cap_submit" type="submit" style="margin-left: 0">{{_("Submit")}}</button> + <button id="cap_reset" type="reset" style="margin-left: 0">{{_("Close")}}</button> + </span> + </div> + + <div class="spacer"></div> + + </form> + </div>
\ No newline at end of file diff --git a/module/web/templates/default/home.html b/module/web/templates/default/home.html index 0efb1bcf8..7359e326c 100644 --- a/module/web/templates/default/home.html +++ b/module/web/templates/default/home.html @@ -1,266 +1,266 @@ -{% extends 'default/base.html' %}
-{% block head %}
-
-<script type="text/javascript">
-
-var em;
-var operafix = (navigator.userAgent.toLowerCase().search("opera") >= 0);
-
-document.addEvent("domready", function(){
- em = new EntryManager();
-});
-
-var EntryManager = new Class({
- initialize: function(){
- this.json = new Request.JSON({
- url: "json/links",
- secure: false,
- async: true,
- onSuccess: this.update.bind(this),
- initialDelay: 0,
- delay: 2500,
- limit: 30000
- });
-
- this.ids = [{% for link in content %}
- {% if forloop.last %}
- {{ link.id }}
- {% else %}
- {{ link.id }},
- {% endif %}
- {% endfor %}];
-
- this.entries = [];
- this.container = $('LinksAktiv');
-
- this.parseFromContent();
-
- this.json.startTimer();
- },
- parseFromContent: function(){
- this.ids.each(function(id,index){
- var entry = new LinkEntry(id);
- entry.parse();
- this.entries.push(entry)
- }, this);
- },
- update: function(data){
-
- try{
- this.ids = this.entries.map(function(item){
- return item.fid
- });
-
- this.ids.filter(function(id){
- return !this.ids.contains(id)
- },data).each(function(id){
- var index = this.ids.indexOf(id);
- this.entries[index].remove();
- this.entries = this.entries.filter(function(item){return item.fid != this},id);
- this.ids = this.ids.erase(id)
- }, this);
-
- data.links.each(function(link, i){
- if (this.ids.contains(link.fid)){
-
- var index = this.ids.indexOf(link.fid);
- this.entries[index].update(link)
-
- }else{
- var entry = new LinkEntry(link.fid);
- entry.insert(link);
- this.entries.push(entry);
- this.ids.push(link.fid);
- this.container.adopt(entry.elements.tr,entry.elements.pgbTr);
- entry.fade.start('opacity', 1);
- entry.fadeBar.start('opacity', 1);
-
- }
- }, this)
- }catch(e){
- //alert(e)
- }
- }
-});
-
-
-var LinkEntry = new Class({
- initialize: function(id){
- this.fid = id;
- this.id = id;
- },
- parse: function(){
- this.elements = {
- tr: $("link_{id}".substitute({id: this.id})),
- name: $("link_{id}_name".substitute({id: this.id})),
- status: $("link_{id}_status".substitute({id: this.id})),
- info: $("link_{id}_info".substitute({id: this.id})),
- bleft: $("link_{id}_bleft".substitute({id: this.id})),
- percent: $("link_{id}_percent".substitute({id: this.id})),
- remove: $("link_{id}_remove".substitute({id: this.id})),
- pgbTr: $("link_{id}_pgb_tr".substitute({id: this.id})),
- pgb: $("link_{id}_pgb".substitute({id: this.id}))
- };
- this.initEffects();
- },
- insert: function(item){
- try{
-
- this.elements = {
- tr: new Element('tr', {
- 'html': '',
- 'styles':{
- 'opacity': 0
- }
- }),
- name: new Element('td', {
- 'html': item.name
- }),
- status: new Element('td', {
- 'html': item.statusmsg
- }),
- info: new Element('td', {
- 'html': item.info
- }),
- bleft: new Element('td', {
- 'html': humanFileSize(item.size)
- }),
- percent: new Element('span', {
- 'html': item.percent+ '% / '+ humanFileSize(item.size-item.bleft)
- }),
- remove: new Element('img',{
- 'src': 'media/default/img/control_cancel.png',
- 'styles':{
- 'vertical-align': 'middle',
- 'margin-right': '-20px',
- 'margin-left': '5px',
- 'margin-top': '-2px',
- 'cursor': 'pointer'
- }
- }),
- pgbTr: new Element('tr', {
- 'html':''
- }),
- pgb: new Element('div', {
- 'html': ' ',
- 'styles':{
- 'height': '4px',
- 'width': item.percent+'%',
- 'background-color': '#ddd'
- }
- })
- };
-
- this.elements.tr.adopt(this.elements.name,this.elements.status,this.elements.info,this.elements.bleft,new Element('td').adopt(this.elements.percent,this.elements.remove));
- this.elements.pgbTr.adopt(new Element('td',{'colspan':5}).adopt(this.elements.pgb));
- this.initEffects();
- }catch(e){
- alert(e)
- }
- },
- initEffects: function(){
- if(!operafix)
- this.bar = new Fx.Morph(this.elements.pgb, {unit: '%', duration: 5000, link: 'link', fps:30});
- this.fade = new Fx.Tween(this.elements.tr);
- this.fadeBar = new Fx.Tween(this.elements.pgbTr);
-
- this.elements.remove.addEvent('click', function(){
- new Request({method: 'get', url: '/json/abort_link/'+this.id}).send();
- }.bind(this));
-
- },
- update: function(item){
- this.elements.name.set('text', item.name);
- this.elements.status.set('text', item.statusmsg);
- this.elements.info.set('text', item.info);
- this.elements.bleft.set('text', item.format_size);
- this.elements.percent.set('text', item.percent+ '% / '+ humanFileSize(item.size-item.bleft));
- if(!operafix)
- {
- this.bar.start({
- 'width': item.percent,
- 'background-color': [Math.round(120/100*item.percent),100,100].hsbToRgb().rgbToHex()
- });
- }
- else
- {
- this.elements.pgb.set(
- 'styles', {
- 'height': '4px',
- 'width': item.percent+'%',
- 'background-color': [Math.round(120/100*item.percent),100,100].hsbToRgb().rgbToHex(),
- });
- }
- },
- remove: function(){
- this.fade.start('opacity',0).chain(function(){this.elements.tr.dispose();}.bind(this));
- this.fadeBar.start('opacity',0).chain(function(){this.elements.pgbTr.dispose();}.bind(this));
-
- }
- });
-</script>
-
-{% endblock %}
-
-{% block subtitle %}
-{{_("Active Downloads")}}
-{% endblock %}
-
-{% block menu %}
-<li class="selected">
- <a href="/" title=""><img src="/media/default/img/head-menu-home.png" alt="" /> {{_("Home")}}</a>
-</li>
-<li>
- <a href="/queue/" title=""><img src="/media/default/img/head-menu-queue.png" alt="" /> {{_("Queue")}}</a>
-</li>
-<li>
- <a href="/collector/" title=""><img src="/media/default/img/head-menu-collector.png" alt="" /> {{_("Collector")}}</a>
-</li>
-<li>
- <a href="/downloads/" title=""><img src="/media/default/img/head-menu-development.png" alt="" /> {{_("Downloads")}}</a>
-</li>
-{#<li>#}
-{# <a href="/filemanager/" title=""><img src="/media/default/img/head-menu-download.png" alt="" /> {{_("FileManager")}}</a>#}
-{#</li>#}
-<li class="right">
- <a href="/logs/" class="action index" accesskey="x" rel="nofollow"><img src="/media/default/img/head-menu-index.png" alt="" />{{_("Logs")}}</a>
-</li>
-<li class="right">
- <a href="/settings/" class="action index" accesskey="x" rel="nofollow"><img src="/media/default/img/head-menu-config.png" alt="" />{{_("Config")}}</a>
-</li>
-{% endblock %}
-
-{% block content %}
-<table width="100%" class="queue">
- <thead>
- <tr class="header">
- <th>{{_("Name")}}</th>
- <th>{{_("Status")}}</th>
- <th>{{_("Information")}}</th>
- <th>{{_("Size")}}</th>
- <th>{{_("Progress")}}</th>
- </tr>
- </thead>
- <tbody id="LinksAktiv">
-
- {% for link in content %}
- <tr id="link_{{ link.id }}">
- <td id="link_{{ link.id }}_name">{{ link.name }}</td>
- <td id="link_{{ link.id }}_status">{{ link.status }}</td>
- <td id="link_{{ link.id }}_info">{{ link.info }}</td>
- <td id="link_{{ link.id }}_bleft">{{ link.format_size }}</td>
- <td>
- <span id="link_{{ link.id }}_percent">{{ link.percent }}% /{{ link.bleft }}</span>
- <img id="link_{{ link.id }}_remove" style="vertical-align: middle; margin-right: -20px; margin-left: 5px; margin-top: -2px; cursor:pointer;" src="media/default/img/control_cancel.png"/>
- </td>
- </tr>
- <tr id="link_{{ link.id }}_pgb_tr">
- <td colspan="5">
- <div id="link_{{ link.id }}_pgb" class="progressBar" style="background-color: green; height:4px; width: {{ link.percent }}%;"> </div>
- </td>
- </tr>
- {% endfor %}
-
- </tbody>
-</table>
+{% extends 'default/base.html' %} +{% block head %} + +<script type="text/javascript"> + +var em; +var operafix = (navigator.userAgent.toLowerCase().search("opera") >= 0); + +document.addEvent("domready", function(){ + em = new EntryManager(); +}); + +var EntryManager = new Class({ + initialize: function(){ + this.json = new Request.JSON({ + url: "json/links", + secure: false, + async: true, + onSuccess: this.update.bind(this), + initialDelay: 0, + delay: 2500, + limit: 30000 + }); + + this.ids = [{% for link in content %} + {% if forloop.last %} + {{ link.id }} + {% else %} + {{ link.id }}, + {% endif %} + {% endfor %}]; + + this.entries = []; + this.container = $('LinksAktiv'); + + this.parseFromContent(); + + this.json.startTimer(); + }, + parseFromContent: function(){ + this.ids.each(function(id,index){ + var entry = new LinkEntry(id); + entry.parse(); + this.entries.push(entry) + }, this); + }, + update: function(data){ + + try{ + this.ids = this.entries.map(function(item){ + return item.fid + }); + + this.ids.filter(function(id){ + return !this.ids.contains(id) + },data).each(function(id){ + var index = this.ids.indexOf(id); + this.entries[index].remove(); + this.entries = this.entries.filter(function(item){return item.fid != this},id); + this.ids = this.ids.erase(id) + }, this); + + data.links.each(function(link, i){ + if (this.ids.contains(link.fid)){ + + var index = this.ids.indexOf(link.fid); + this.entries[index].update(link) + + }else{ + var entry = new LinkEntry(link.fid); + entry.insert(link); + this.entries.push(entry); + this.ids.push(link.fid); + this.container.adopt(entry.elements.tr,entry.elements.pgbTr); + entry.fade.start('opacity', 1); + entry.fadeBar.start('opacity', 1); + + } + }, this) + }catch(e){ + //alert(e) + } + } +}); + + +var LinkEntry = new Class({ + initialize: function(id){ + this.fid = id; + this.id = id; + }, + parse: function(){ + this.elements = { + tr: $("link_{id}".substitute({id: this.id})), + name: $("link_{id}_name".substitute({id: this.id})), + status: $("link_{id}_status".substitute({id: this.id})), + info: $("link_{id}_info".substitute({id: this.id})), + bleft: $("link_{id}_bleft".substitute({id: this.id})), + percent: $("link_{id}_percent".substitute({id: this.id})), + remove: $("link_{id}_remove".substitute({id: this.id})), + pgbTr: $("link_{id}_pgb_tr".substitute({id: this.id})), + pgb: $("link_{id}_pgb".substitute({id: this.id})) + }; + this.initEffects(); + }, + insert: function(item){ + try{ + + this.elements = { + tr: new Element('tr', { + 'html': '', + 'styles':{ + 'opacity': 0 + } + }), + name: new Element('td', { + 'html': item.name + }), + status: new Element('td', { + 'html': item.statusmsg + }), + info: new Element('td', { + 'html': item.info + }), + bleft: new Element('td', { + 'html': humanFileSize(item.size) + }), + percent: new Element('span', { + 'html': item.percent+ '% / '+ humanFileSize(item.size-item.bleft) + }), + remove: new Element('img',{ + 'src': 'media/default/img/control_cancel.png', + 'styles':{ + 'vertical-align': 'middle', + 'margin-right': '-20px', + 'margin-left': '5px', + 'margin-top': '-2px', + 'cursor': 'pointer' + } + }), + pgbTr: new Element('tr', { + 'html':'' + }), + pgb: new Element('div', { + 'html': ' ', + 'styles':{ + 'height': '4px', + 'width': item.percent+'%', + 'background-color': '#ddd' + } + }) + }; + + this.elements.tr.adopt(this.elements.name,this.elements.status,this.elements.info,this.elements.bleft,new Element('td').adopt(this.elements.percent,this.elements.remove)); + this.elements.pgbTr.adopt(new Element('td',{'colspan':5}).adopt(this.elements.pgb)); + this.initEffects(); + }catch(e){ + alert(e) + } + }, + initEffects: function(){ + if(!operafix) + this.bar = new Fx.Morph(this.elements.pgb, {unit: '%', duration: 5000, link: 'link', fps:30}); + this.fade = new Fx.Tween(this.elements.tr); + this.fadeBar = new Fx.Tween(this.elements.pgbTr); + + this.elements.remove.addEvent('click', function(){ + new Request({method: 'get', url: '/json/abort_link/'+this.id}).send(); + }.bind(this)); + + }, + update: function(item){ + this.elements.name.set('text', item.name); + this.elements.status.set('text', item.statusmsg); + this.elements.info.set('text', item.info); + this.elements.bleft.set('text', item.format_size); + this.elements.percent.set('text', item.percent+ '% / '+ humanFileSize(item.size-item.bleft)); + if(!operafix) + { + this.bar.start({ + 'width': item.percent, + 'background-color': [Math.round(120/100*item.percent),100,100].hsbToRgb().rgbToHex() + }); + } + else + { + this.elements.pgb.set( + 'styles', { + 'height': '4px', + 'width': item.percent+'%', + 'background-color': [Math.round(120/100*item.percent),100,100].hsbToRgb().rgbToHex(), + }); + } + }, + remove: function(){ + this.fade.start('opacity',0).chain(function(){this.elements.tr.dispose();}.bind(this)); + this.fadeBar.start('opacity',0).chain(function(){this.elements.pgbTr.dispose();}.bind(this)); + + } + }); +</script> + +{% endblock %} + +{% block subtitle %} +{{_("Active Downloads")}} +{% endblock %} + +{% block menu %} +<li class="selected"> + <a href="/" title=""><img src="/media/default/img/head-menu-home.png" alt="" /> {{_("Home")}}</a> +</li> +<li> + <a href="/queue/" title=""><img src="/media/default/img/head-menu-queue.png" alt="" /> {{_("Queue")}}</a> +</li> +<li> + <a href="/collector/" title=""><img src="/media/default/img/head-menu-collector.png" alt="" /> {{_("Collector")}}</a> +</li> +<li> + <a href="/downloads/" title=""><img src="/media/default/img/head-menu-development.png" alt="" /> {{_("Downloads")}}</a> +</li> +{#<li>#} +{# <a href="/filemanager/" title=""><img src="/media/default/img/head-menu-download.png" alt="" /> {{_("FileManager")}}</a>#} +{#</li>#} +<li class="right"> + <a href="/logs/" class="action index" accesskey="x" rel="nofollow"><img src="/media/default/img/head-menu-index.png" alt="" />{{_("Logs")}}</a> +</li> +<li class="right"> + <a href="/settings/" class="action index" accesskey="x" rel="nofollow"><img src="/media/default/img/head-menu-config.png" alt="" />{{_("Config")}}</a> +</li> +{% endblock %} + +{% block content %} +<table width="100%" class="queue"> + <thead> + <tr class="header"> + <th>{{_("Name")}}</th> + <th>{{_("Status")}}</th> + <th>{{_("Information")}}</th> + <th>{{_("Size")}}</th> + <th>{{_("Progress")}}</th> + </tr> + </thead> + <tbody id="LinksAktiv"> + + {% for link in content %} + <tr id="link_{{ link.id }}"> + <td id="link_{{ link.id }}_name">{{ link.name }}</td> + <td id="link_{{ link.id }}_status">{{ link.status }}</td> + <td id="link_{{ link.id }}_info">{{ link.info }}</td> + <td id="link_{{ link.id }}_bleft">{{ link.format_size }}</td> + <td> + <span id="link_{{ link.id }}_percent">{{ link.percent }}% /{{ link.bleft }}</span> + <img id="link_{{ link.id }}_remove" style="vertical-align: middle; margin-right: -20px; margin-left: 5px; margin-top: -2px; cursor:pointer;" src="media/default/img/control_cancel.png"/> + </td> + </tr> + <tr id="link_{{ link.id }}_pgb_tr"> + <td colspan="5"> + <div id="link_{{ link.id }}_pgb" class="progressBar" style="background-color: green; height:4px; width: {{ link.percent }}%;"> </div> + </td> + </tr> + {% endfor %} + + </tbody> +</table> {% endblock %}
\ No newline at end of file diff --git a/module/web/templates/default/queue.html b/module/web/templates/default/queue.html index c88fa3568..046abbe49 100644 --- a/module/web/templates/default/queue.html +++ b/module/web/templates/default/queue.html @@ -1,104 +1,104 @@ -{% extends 'default/base.html' %}
-{% block head %}
-
-<script type="text/javascript" src="/media/js/package_ui.js"></script>
-
-<script type="text/javascript">
-
-document.addEvent("domready", function(){
- var pUI = new PackageUI("url", {{ target }});
-});
-</script>
-{% endblock %}
-
-{% if target %}
- {% set name = _("Queue") %}
-{% else %}
- {% set name = _("Collector") %}
-{% endif %}
-
-{% block title %}{{name}} - {{super()}} {% endblock %}
-{% block subtitle %}{{name}}{% endblock %}
-
-{% block pageactions %}
-<ul id="page-actions-more">
- <li id="del_finished"><a style="padding: 0; font-weight: bold;" href="#">{{_("Delete Finished")}}</a></li>
- <li id="restart_failed"><a style="padding: 0; font-weight: bold;" href="#">{{_("Restart Failed")}}</a></li>
-</ul>
-{% endblock %}
-
-{% block content %}
-{% autoescape true %}
-
-<ul id="package-list" style="list-style: none; padding-left: 0; margin-top: -10px;">
-{% for package in content %}
- <li>
-<div id="package_{{package.pid}}" class="package">
- <div class="order" style="display: none;">{{ package.order }}</div>
-
- <div class="packagename" style="cursor: pointer">
- <img class="package_drag" src="/media/default/img/folder.png" style="cursor: move; margin-bottom: -2px">
- <span class="name">{{package.name}}</span>
-
- <span class="buttons" style="opacity:0">
- <img title="{{_("Delete Package")}}" style="cursor: pointer" width="12px" height="12px" src="/media/default/img/delete.png" />
-
- <img title="{{_("Restart Package")}}" style="margin-left: -10px; cursor: pointer" height="12px" src="/media/default/img/arrow_refresh.png" />
-
- <img title="{{_("Edit Package")}}" style="margin-left: -10px; cursor: pointer" height="12px" src="/media/default/img/pencil.png" />
-
- <img title="{{_("Move Package")}}" style="margin-left: -10px; cursor: pointer" height="12px" src="/media/default/img/package_go.png" />
- </span>
- </div>
- {% set progress = (package.linksdone * 100) / package.linkstotal %}
-
- <div id="progress" style="border-radius: 4px; border: 1px solid #AAAAAA; width: 50%; height: 1em">
- <div style="width: {{ progress }}%; height: 100%; background-color: #add8e6;"></div>
- <label style="font-size: 0.8em; font-weight: bold; padding-left: 5px; position: relative; top: -17px">
- {{ package.sizedone|formatsize }} / {{ package.sizetotal|formatsize }}</label>
- <label style="font-size: 0.8em; font-weight: bold; padding-right: 5px ;float: right; position: relative; top: -17px">
- {{ package.linksdone }} / {{ package.linkstotal }}</label>
- </div>
- <div style="clear: both; margin-bottom: -10px"></div>
-
- <div id="children_{{package.pid}}" style="display: none;" class="children">
- <span class="child_secrow">{{_("Folder:")}} <span class="folder">{{package.folder}}</span> | {{_("Password:")}} <span class="password">{{package.password}}</span></span>
- <ul id="sort_children_{{package.pid}}" style="list-style: none; padding-left: 0">
- </ul>
- </div>
-</div>
- </li>
-{% endfor %}
-</ul>
-{% endautoescape %}
-{% endblock %}
-
-{% block hidden %}
-<div id="pack_box" class="window_box" style="z-index: 2">
- <form id="pack_form" action="/json/edit_package" method="POST" enctype="multipart/form-data">
- <h1>{{_("Edit Package")}}</h1>
- <p>{{_("Edit the package detais below.")}}</p>
- <input name="pack_id" id="pack_id" type="hidden" value=""/>
- <label for="pack_name">{{_("Name")}}
- <span class="small">{{_("The name of the package.")}}</span>
- </label>
- <input id="pack_name" name="pack_name" type="text" size="20" />
-
- <label for="pack_folder">{{_("Folder")}}
- <span class="small">{{_("Name of subfolder for these downloads.")}}</span>
- </label>
- <input id="pack_folder" name="pack_folder" type="text" size="20" />
-
- <label for="pack_pws">{{_("Password")}}
- <span class="small">{{_("List of passwords used for unrar.")}}</span>
- </label>
- <textarea rows="3" name="pack_pws" id="pack_pws"></textarea>
-
- <button type="submit">{{_("Submit")}}</button>
- <button id="pack_reset" style="margin-left: 0" type="reset" >{{_("Reset")}}</button>
- <div class="spacer"></div>
-
- </form>
-
-</div>
+{% extends 'default/base.html' %} +{% block head %} + +<script type="text/javascript" src="/media/js/package_ui.js"></script> + +<script type="text/javascript"> + +document.addEvent("domready", function(){ + var pUI = new PackageUI("url", {{ target }}); +}); +</script> +{% endblock %} + +{% if target %} + {% set name = _("Queue") %} +{% else %} + {% set name = _("Collector") %} +{% endif %} + +{% block title %}{{name}} - {{super()}} {% endblock %} +{% block subtitle %}{{name}}{% endblock %} + +{% block pageactions %} +<ul id="page-actions-more"> + <li id="del_finished"><a style="padding: 0; font-weight: bold;" href="#">{{_("Delete Finished")}}</a></li> + <li id="restart_failed"><a style="padding: 0; font-weight: bold;" href="#">{{_("Restart Failed")}}</a></li> +</ul> +{% endblock %} + +{% block content %} +{% autoescape true %} + +<ul id="package-list" style="list-style: none; padding-left: 0; margin-top: -10px;"> +{% for package in content %} + <li> +<div id="package_{{package.pid}}" class="package"> + <div class="order" style="display: none;">{{ package.order }}</div> + + <div class="packagename" style="cursor: pointer"> + <img class="package_drag" src="/media/default/img/folder.png" style="cursor: move; margin-bottom: -2px"> + <span class="name">{{package.name}}</span> + + <span class="buttons" style="opacity:0"> + <img title="{{_("Delete Package")}}" style="cursor: pointer" width="12px" height="12px" src="/media/default/img/delete.png" /> + + <img title="{{_("Restart Package")}}" style="margin-left: -10px; cursor: pointer" height="12px" src="/media/default/img/arrow_refresh.png" /> + + <img title="{{_("Edit Package")}}" style="margin-left: -10px; cursor: pointer" height="12px" src="/media/default/img/pencil.png" /> + + <img title="{{_("Move Package")}}" style="margin-left: -10px; cursor: pointer" height="12px" src="/media/default/img/package_go.png" /> + </span> + </div> + {% set progress = (package.linksdone * 100) / package.linkstotal %} + + <div id="progress" style="border-radius: 4px; border: 1px solid #AAAAAA; width: 50%; height: 1em"> + <div style="width: {{ progress }}%; height: 100%; background-color: #add8e6;"></div> + <label style="font-size: 0.8em; font-weight: bold; padding-left: 5px; position: relative; top: -17px"> + {{ package.sizedone|formatsize }} / {{ package.sizetotal|formatsize }}</label> + <label style="font-size: 0.8em; font-weight: bold; padding-right: 5px ;float: right; position: relative; top: -17px"> + {{ package.linksdone }} / {{ package.linkstotal }}</label> + </div> + <div style="clear: both; margin-bottom: -10px"></div> + + <div id="children_{{package.pid}}" style="display: none;" class="children"> + <span class="child_secrow">{{_("Folder:")}} <span class="folder">{{package.folder}}</span> | {{_("Password:")}} <span class="password">{{package.password}}</span></span> + <ul id="sort_children_{{package.pid}}" style="list-style: none; padding-left: 0"> + </ul> + </div> +</div> + </li> +{% endfor %} +</ul> +{% endautoescape %} +{% endblock %} + +{% block hidden %} +<div id="pack_box" class="window_box" style="z-index: 2"> + <form id="pack_form" action="/json/edit_package" method="POST" enctype="multipart/form-data"> + <h1>{{_("Edit Package")}}</h1> + <p>{{_("Edit the package detais below.")}}</p> + <input name="pack_id" id="pack_id" type="hidden" value=""/> + <label for="pack_name">{{_("Name")}} + <span class="small">{{_("The name of the package.")}}</span> + </label> + <input id="pack_name" name="pack_name" type="text" size="20" /> + + <label for="pack_folder">{{_("Folder")}} + <span class="small">{{_("Name of subfolder for these downloads.")}}</span> + </label> + <input id="pack_folder" name="pack_folder" type="text" size="20" /> + + <label for="pack_pws">{{_("Password")}} + <span class="small">{{_("List of passwords used for unrar.")}}</span> + </label> + <textarea rows="3" name="pack_pws" id="pack_pws"></textarea> + + <button type="submit">{{_("Submit")}}</button> + <button id="pack_reset" style="margin-left: 0" type="reset" >{{_("Reset")}}</button> + <div class="spacer"></div> + + </form> + +</div> {% endblock %}
\ No newline at end of file diff --git a/module/web/templates/default/window.html b/module/web/templates/default/window.html index b61fa7149..a11323fe0 100644 --- a/module/web/templates/default/window.html +++ b/module/web/templates/default/window.html @@ -1,46 +1,46 @@ -<iframe id="upload_target" name="upload_target" src="" style="display: none; width:0;height:0"></iframe>
-
-<div id="add_box" class="window_box">
-<form id="add_form" action="/json/add_package" method="POST" enctype="multipart/form-data">
-<h1>{{_("Add Package")}}</h1>
-<p>{{_("Paste your links or upload a container.")}}</p>
-<label for="add_name">{{_("Name")}}
-<span class="small">{{_("The name of the new package.")}}</span>
-</label>
-<input id="add_name" name="add_name" type="text" size="20" />
-
-<label for="add_links">{{_("Links")}}
-<span class="small">{{_("Paste your links here or any text and press the filter button.")}}</span>
-<span class="small"> {{ _("Filter urls") }}
-<img alt="URIParsing" Title="Parse Uri" src="/media/default/img/parseUri.png" style="cursor:pointer; vertical-align: text-bottom;" onclick="parseUri()"/>
-</span>
-
-</label>
-<textarea rows="5" name="add_links" id="add_links"></textarea>
-
-<label for="add_password">{{_("Password")}}
- <span class="small">{{_("Password for RAR-Archive")}}</span>
-</label>
-<input id="add_password" name="add_password" type="text" size="20">
-
-<label>{{_("File")}}
-<span class="small">{{_("Upload a container.")}}</span>
-</label>
-<input type="file" name="add_file" id="add_file"/>
-
-<label for="add_dest">{{_("Destination")}}
-</label>
-<span class="cont">
- {{_("Queue")}}
- <input type="radio" name="add_dest" id="add_dest" value="1" checked="checked"/>
- {{_("Collector")}}
- <input type="radio" name="add_dest" id="add_dest2" value="0"/>
-</span>
-
-<button type="submit">{{_("Add Package")}}</button>
-<button id="add_reset" style="margin-left:0;" type="reset">{{_("Reset")}}</button>
-<div class="spacer"></div>
-
-</form>
-
+<iframe id="upload_target" name="upload_target" src="" style="display: none; width:0;height:0"></iframe> + +<div id="add_box" class="window_box"> +<form id="add_form" action="/json/add_package" method="POST" enctype="multipart/form-data"> +<h1>{{_("Add Package")}}</h1> +<p>{{_("Paste your links or upload a container.")}}</p> +<label for="add_name">{{_("Name")}} +<span class="small">{{_("The name of the new package.")}}</span> +</label> +<input id="add_name" name="add_name" type="text" size="20" /> + +<label for="add_links">{{_("Links")}} +<span class="small">{{_("Paste your links here or any text and press the filter button.")}}</span> +<span class="small"> {{ _("Filter urls") }} +<img alt="URIParsing" Title="Parse Uri" src="/media/default/img/parseUri.png" style="cursor:pointer; vertical-align: text-bottom;" onclick="parseUri()"/> +</span> + +</label> +<textarea rows="5" name="add_links" id="add_links"></textarea> + +<label for="add_password">{{_("Password")}} + <span class="small">{{_("Password for RAR-Archive")}}</span> +</label> +<input id="add_password" name="add_password" type="text" size="20"> + +<label>{{_("File")}} +<span class="small">{{_("Upload a container.")}}</span> +</label> +<input type="file" name="add_file" id="add_file"/> + +<label for="add_dest">{{_("Destination")}} +</label> +<span class="cont"> + {{_("Queue")}} + <input type="radio" name="add_dest" id="add_dest" value="1" checked="checked"/> + {{_("Collector")}} + <input type="radio" name="add_dest" id="add_dest2" value="0"/> +</span> + +<button type="submit">{{_("Add Package")}}</button> +<button id="add_reset" style="margin-left:0;" type="reset">{{_("Reset")}}</button> +<div class="spacer"></div> + +</form> + </div>
\ No newline at end of file |