Compatibilidad con tablets mejorada
|
@ -1 +0,0 @@
|
|||
/etc/hedera-web/config.php
|
|
@ -1,9 +0,0 @@
|
|||
Package: hedera-web
|
||||
Version: 1.0-4
|
||||
Architecture: all
|
||||
Maintainer: Juan Ferrer Toribio <juan@verdnatura.es>
|
||||
Depends: apache2, php5-mysql
|
||||
Section: misc
|
||||
Priority: optional
|
||||
Description: Verdnatura's web page
|
||||
Verdnatura's web page.
|
|
@ -1,4 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
service apache2 reload
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
service apache2 reload
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
Alias /hedera-web /usr/share/hedera-web/
|
||||
|
||||
<Directory /usr/share/hedera-web/>
|
||||
Options Indexes
|
||||
Options +FollowSymLinks
|
||||
AllowOverride None
|
||||
Order Allow,Deny
|
||||
Allow From All
|
||||
</Directory>
|
|
@ -1,66 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* Configuration file. Be careful to respect the PHP syntax.
|
||||
**/
|
||||
$conf = array (
|
||||
|
||||
/**
|
||||
* The default language.
|
||||
**/
|
||||
'defaultLang' => 'es'
|
||||
|
||||
/**
|
||||
* Compatible browsers.
|
||||
**/
|
||||
,'browser' => array
|
||||
(
|
||||
'Firefox' => 4.0
|
||||
,'Iceweasel' => 4.0
|
||||
,'IE' => 10.0
|
||||
,'Chrome' => 7.0
|
||||
,'Opera' => 11.6
|
||||
)
|
||||
|
||||
/**
|
||||
* Database parameters.
|
||||
**/
|
||||
,'db' => array
|
||||
(
|
||||
'host' => 'db.verdnatura.es'
|
||||
,'name' => 'hedera'
|
||||
,'user' => 'root'
|
||||
,'pass' => 'base64pass'
|
||||
)
|
||||
|
||||
/**
|
||||
* The guest user.
|
||||
**/
|
||||
,'guest' => array
|
||||
(
|
||||
'user' => 'visitor'
|
||||
,'pass' => 'base64pass'
|
||||
)
|
||||
|
||||
/**
|
||||
* Whether to force the use of https on the client.
|
||||
**/
|
||||
,'https' => FALSE
|
||||
|
||||
/**
|
||||
* The lifetime of the session cookie, in days.
|
||||
**/
|
||||
,'cookieLife' => 15
|
||||
|
||||
/**
|
||||
* The module to load if none is specified.
|
||||
**/
|
||||
,'defaultModule' => 'home'
|
||||
|
||||
/**
|
||||
* The directory where images are located.
|
||||
**/
|
||||
,'imageDir' => '/image/cache'
|
||||
|
||||
);
|
||||
|
||||
?>
|
|
@ -1,5 +1,5 @@
|
|||
Package: hedera-web
|
||||
Version: 1.0-24
|
||||
Version: 1.0-28
|
||||
Architecture: all
|
||||
Maintainer: Juan Ferrer Toribio <juan@verdnatura.es>
|
||||
Depends: apache2, php5-mysql, php-vn-web
|
||||
|
|
|
@ -6,12 +6,10 @@ $params = array
|
|||
(
|
||||
'name'
|
||||
,'surname'
|
||||
,'pc'
|
||||
,'phone'
|
||||
,'email'
|
||||
,'message'
|
||||
,'address'
|
||||
,'pc'
|
||||
,'city'
|
||||
,'phone'
|
||||
,'captcha'
|
||||
);
|
||||
|
||||
|
|
|
@ -61,6 +61,6 @@ div.form-group
|
|||
#captcha input
|
||||
{
|
||||
margin-left: 1em;
|
||||
max-width: 10em;
|
||||
max-width: 8em;
|
||||
}
|
||||
|
||||
|
|
|
@ -23,9 +23,9 @@
|
|||
|
||||
.new h2
|
||||
{
|
||||
font-size: 1.3em;
|
||||
font-size: 1.6em;
|
||||
color: black;
|
||||
font-weight: bold;
|
||||
font-weight: normal;
|
||||
}
|
||||
.new-info
|
||||
{
|
||||
|
|
|
@ -23,9 +23,9 @@
|
|||
|
||||
.new h2
|
||||
{
|
||||
font-size: 1.3em;
|
||||
font-size: 1.6em;
|
||||
color: black;
|
||||
font-weight: bold;
|
||||
font-weight: normal;
|
||||
}
|
||||
.new-info
|
||||
{
|
||||
|
|
|
@ -3,8 +3,15 @@ Vn.Catalog = new Class
|
|||
({
|
||||
Extends: Vn.Module
|
||||
|
||||
,realmColor: null
|
||||
|
||||
,activate: function ()
|
||||
{
|
||||
var model = this.get ('items');
|
||||
model.setTableInfo ('m', 'order_row_view');
|
||||
model.setFieldFlags ('id', Db.Conn.Flag.AI);
|
||||
model.setFieldFlags ('Id_Article', Db.Conn.Flag.PRI_KEY);
|
||||
|
||||
$('basket-button').addEventListener ('click', this.basketClicked.bind (this));
|
||||
$('catalog-menu-button').addEventListener ('click', this.showMenu.bind (this));
|
||||
$('catalog-menu').addEventListener ('click', this.onMenuClick.bind (this));
|
||||
|
@ -37,7 +44,10 @@ Vn.Catalog = new Class
|
|||
,onRealmsReload: function (model, status)
|
||||
{
|
||||
if (status == Db.Model.Status.READY)
|
||||
{
|
||||
this.onRealmChanged ();
|
||||
this.onTypeChanged ();
|
||||
}
|
||||
}
|
||||
|
||||
,onRealmChanged: function ()
|
||||
|
@ -47,11 +57,9 @@ Vn.Catalog = new Class
|
|||
var row = realms.search ('id', this.get ('realm').value);
|
||||
|
||||
if (row != -1)
|
||||
color = '#'+ realms.get (row, 'color');
|
||||
this.realmColor = '#'+ realms.get (row, 'color');
|
||||
else
|
||||
color = null;
|
||||
|
||||
$('realms-bar').style.backgroundColor = color;
|
||||
this.realmColor = null;
|
||||
}
|
||||
|
||||
,onTypesReload: function (model, status)
|
||||
|
@ -70,7 +78,7 @@ Vn.Catalog = new Class
|
|||
var color = null;
|
||||
|
||||
if (this.get ('type').value)
|
||||
color = $('realms-bar').style.backgroundColor;
|
||||
color = this.realmColor;
|
||||
|
||||
$('catalog-header').style.backgroundColor = color;
|
||||
|
||||
|
|
|
@ -97,7 +97,6 @@
|
|||
<vn-hash-link key="realm"/>
|
||||
</vn-param>
|
||||
</htk-realm>
|
||||
<div id="realms-bar"/>
|
||||
<div id="types-box">
|
||||
<htk-grid id="types-grid" empty-message="SelectFamily">
|
||||
<db-model id="types-model">
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
|
||||
#catalog-menu-button
|
||||
{
|
||||
display: block;
|
||||
}
|
||||
#catalog-menu
|
||||
{
|
||||
display: none;
|
||||
}
|
||||
#catalog-center
|
||||
{
|
||||
right: 0;
|
||||
}
|
|
@ -50,14 +50,13 @@
|
|||
float: left;
|
||||
display: block;
|
||||
background-color: white;
|
||||
height: 2em;
|
||||
height: 2.2em;
|
||||
padding: 0;
|
||||
}
|
||||
#search-entry
|
||||
{
|
||||
margin: 0;
|
||||
border: none;
|
||||
width: 11em;
|
||||
width: 10em;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
@ -67,7 +66,7 @@
|
|||
}
|
||||
#catalog-search > img
|
||||
{
|
||||
margin: 0.3em;
|
||||
margin: 0.4em;
|
||||
margin-top: 0;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
@ -87,13 +86,6 @@
|
|||
height: 1.8em;
|
||||
}
|
||||
|
||||
@media screen and (min-resolution: 100dpi)
|
||||
{
|
||||
#catalog-menu-button { display: block; }
|
||||
#catalog-menu { display: none; }
|
||||
#catalog-center { right: 0; }
|
||||
}
|
||||
|
||||
/* Menu */
|
||||
|
||||
#catalog-menu
|
||||
|
@ -115,14 +107,14 @@
|
|||
}
|
||||
#catalog .form-group
|
||||
{
|
||||
margin: 1em;
|
||||
margin: 2em;
|
||||
}
|
||||
#catalog .form-group select,
|
||||
#catalog .form-group button
|
||||
{
|
||||
display: block;
|
||||
margin: 0 auto;
|
||||
width: 70%;
|
||||
width: 12em;
|
||||
}
|
||||
|
||||
/* Realms */
|
||||
|
@ -144,18 +136,13 @@
|
|||
{
|
||||
/* height: 4em; */
|
||||
}
|
||||
#realms-bar
|
||||
{
|
||||
width: 100%;
|
||||
height: 0.5em;
|
||||
}
|
||||
|
||||
/* Types */
|
||||
|
||||
#types-box
|
||||
{
|
||||
position: absolute;
|
||||
top: 14.4em;
|
||||
top: 17em;
|
||||
bottom: 0em;
|
||||
right: 0em;
|
||||
left: 0em;
|
||||
|
@ -200,7 +187,7 @@
|
|||
#items-grid > thead > tr,
|
||||
#realms-bar
|
||||
{
|
||||
background-color: #666;
|
||||
background-color: #777;
|
||||
}
|
||||
#items-grid > thead th:hover
|
||||
{
|
||||
|
|
|
@ -19,8 +19,8 @@
|
|||
</db-model>
|
||||
<htk-column-button column="id" tip="EditNew" image="image/edit.svg" id="edit-new"/>
|
||||
<htk-column-image column="id" directory="news" subdir="30x30" show-full="true" editable="true"/>
|
||||
<htk-column-text title="Author" column="Cliente"/>
|
||||
<htk-column-text title="Title" column="title"/>
|
||||
<htk-column-text title="Author" column="Cliente"/>
|
||||
<htk-column-spin title="Priority" column="priority"/>
|
||||
</htk-grid>
|
||||
</div>
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
|
||||
/* Responsive */
|
||||
|
||||
@media screen and (max-device-width: 1200px) and (min-resolution: 100dpi) and (orientation: landscape)
|
||||
{
|
||||
* { font-size: 16pt; }
|
||||
}
|
||||
@media screen and (max-device-width: 800px) and (min-resolution: 100dpi)
|
||||
{
|
||||
* { font-size: 26pt; }
|
||||
}
|
||||
|
|
@ -9,14 +9,6 @@
|
|||
{
|
||||
* { font-size: 11pt; }
|
||||
}
|
||||
@media screen and (max-device-width: 1200px) and (min-resolution: 100dpi) and (orientation: landscape)
|
||||
{
|
||||
* { font-size: 16pt; }
|
||||
}
|
||||
@media screen and (max-device-width: 800px) and (min-resolution: 100dpi)
|
||||
{
|
||||
* { font-size: 26pt; }
|
||||
}
|
||||
|
||||
/* Global */
|
||||
|
||||
|
@ -112,16 +104,16 @@ select
|
|||
{
|
||||
background-color: white;
|
||||
}
|
||||
input[type=text],
|
||||
input[type=password]
|
||||
{
|
||||
height: 1.6em;
|
||||
}
|
||||
textarea
|
||||
{
|
||||
height: 3.5em;
|
||||
width: 20em;
|
||||
}
|
||||
input[type=submit],
|
||||
input[type=button]
|
||||
{
|
||||
background-color: #EEF;
|
||||
}
|
||||
input[type=text]:focus,
|
||||
input[type=password]:focus,
|
||||
textarea:focus
|
||||
|
@ -129,19 +121,18 @@ textarea:focus
|
|||
background-color: #EEF;
|
||||
border-color: #BBC;
|
||||
}
|
||||
input[type=submit]:hover,
|
||||
input[type=button]:hover
|
||||
{
|
||||
cursor: pointer;
|
||||
background-color: #DDE;
|
||||
}
|
||||
input[type=checkbox],
|
||||
input[type=radio]
|
||||
{
|
||||
width: 0.8em;
|
||||
height: 0.8em;
|
||||
}
|
||||
button
|
||||
|
||||
/* Buttons */
|
||||
|
||||
button,
|
||||
input[type=submit],
|
||||
input[type=button]
|
||||
{
|
||||
border: none;
|
||||
background-color: #009688;
|
||||
|
@ -149,6 +140,13 @@ button
|
|||
padding: 0.5em;
|
||||
cursor: pointer;
|
||||
}
|
||||
button:hover,
|
||||
input[type=submit]:hover,
|
||||
input[type=button]:hover
|
||||
{
|
||||
cursor: pointer;
|
||||
background-color: #076;
|
||||
}
|
||||
button.vn
|
||||
{
|
||||
border: none;
|
||||
|
@ -175,8 +173,9 @@ button.vn:hover
|
|||
background-color: white;
|
||||
color: black;
|
||||
text-align: left;
|
||||
min-width: 8em;
|
||||
min-width: 9em;
|
||||
min-height: 2.3em;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* Float */
|
||||
|
@ -205,8 +204,8 @@ div.box .header
|
|||
div.box .header h1
|
||||
{
|
||||
text-align: left;
|
||||
font-size: 1.5em;
|
||||
line-height: 1.7em;
|
||||
font-size: 1.6em;
|
||||
line-height: 2em;
|
||||
font-weight: normal;
|
||||
display: inline;
|
||||
}
|
||||
|
@ -391,6 +390,11 @@ button.cell-button img
|
|||
{
|
||||
border-top: none /* 1px solid #CCD */;
|
||||
}
|
||||
.calendar th.button:hover
|
||||
{
|
||||
cursor: pointer;
|
||||
background-color: #076;
|
||||
}
|
||||
.calendar col
|
||||
{
|
||||
width: 14.2%;
|
||||
|
@ -405,8 +409,7 @@ button.cell-button img
|
|||
padding-right: 0.5em;
|
||||
}
|
||||
.calendar td.highlight,
|
||||
.calendar td:hover,
|
||||
.button:hover
|
||||
.calendar td:hover
|
||||
{
|
||||
cursor: pointer;
|
||||
background-color: #DDE;
|
||||
|
@ -442,32 +445,62 @@ img.editable
|
|||
{
|
||||
cursor: pointer;
|
||||
}
|
||||
div.image-editor
|
||||
.htk-image-editor
|
||||
{
|
||||
width: 20em;
|
||||
background-color: white;
|
||||
border: 1px solid #999;
|
||||
margin: 0 auto;
|
||||
border-radius: 0.1em;
|
||||
padding: 1.2em;
|
||||
width: 35em;
|
||||
box-shadow: 0 0 0.4em #AAA;
|
||||
}
|
||||
div.image-editor h3
|
||||
.htk-image-editor h2
|
||||
{
|
||||
text-align: center;
|
||||
padding-bottom: 1em;
|
||||
color: white;
|
||||
background-color: #009688;
|
||||
text-align: left;
|
||||
font-size: 1.3em;
|
||||
line-height: 1.7em;
|
||||
font-weight: normal;
|
||||
padding: 0.6em 0.8em;
|
||||
margin: 0;
|
||||
}
|
||||
div.image-editor iframe
|
||||
.htk-image-editor iframe
|
||||
{
|
||||
display: none;
|
||||
}
|
||||
div.image-editor button
|
||||
.htk-image-editor form
|
||||
{
|
||||
margin-left: 0.5em;
|
||||
margin-right: 0.5em;
|
||||
padding: 1.5em;
|
||||
}
|
||||
div.image-editor img
|
||||
.htk-image-editor .form-group
|
||||
{
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
.htk-image-editor .form-group label
|
||||
{
|
||||
display: block;
|
||||
margin-bottom: 0.3em;
|
||||
}
|
||||
.htk-image-editor .form-group input
|
||||
{
|
||||
width: 95%;
|
||||
height: 1.8em;
|
||||
}
|
||||
.htk-image-editor .footer
|
||||
{
|
||||
margin-top: 1em;
|
||||
text-align: center;
|
||||
}
|
||||
.htk-image-editor .footer img
|
||||
{
|
||||
visibility: hidden;
|
||||
vertical-align: middle;
|
||||
padding-right: 1em;
|
||||
}
|
||||
.htk-image-editor .footer input
|
||||
{
|
||||
display: inline;
|
||||
margin-left: 0.5em;
|
||||
margin-right: 0.5em;
|
||||
}
|
||||
|
||||
|
|
|
@ -7,17 +7,19 @@ require_once ('vn/hedera/util.php');
|
|||
use Vn\Hedera\Web;
|
||||
use Vn\Lib\Locale;
|
||||
|
||||
Web::init ();
|
||||
|
||||
if ($conf['https'] && (!isset ($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != 'on'))
|
||||
try {
|
||||
Web::init ();
|
||||
}
|
||||
catch (Exception $e)
|
||||
{
|
||||
header ("Location: https://${_SERVER['SERVER_NAME']}${_SERVER['REQUEST_URI']}");
|
||||
header ('Location: unavailable.html');
|
||||
exit (0);
|
||||
}
|
||||
|
||||
if (!Web::$sysConn->isOpen ())
|
||||
if (!isset ($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != 'on')
|
||||
if (Web::$sysConn->getValue ('SELECT https FROM config'))
|
||||
{
|
||||
header ('Location: unavailable.html');
|
||||
header ("Location: https://${_SERVER['SERVER_NAME']}${_SERVER['REQUEST_URI']}");
|
||||
exit (0);
|
||||
}
|
||||
|
||||
|
@ -56,11 +58,14 @@ if (!isset ($_SESSION['skipBrowser']) && $page != 'update-browser')
|
|||
$_SESSION['skipBrowser'] = TRUE;
|
||||
}
|
||||
|
||||
// Setting the version
|
||||
|
||||
setcookie ('hedera_version', $_SESSION['version']);
|
||||
|
||||
// Loading the requested page
|
||||
|
||||
$basePath = 'pages/'. $page;
|
||||
|
||||
setcookie ('hedera_version', $_SESSION['version']);
|
||||
header ('Content-Type: text/html; charset=utf-8');
|
||||
|
||||
if (file_exists ($basePath))
|
||||
|
|
|
@ -189,7 +189,7 @@ Db.Conn.implement
|
|||
this.signalEmit ('loading-changed', false);
|
||||
|
||||
if (!success)
|
||||
error = new Vn.Error ('Conn', 'connError', _('ConnError'));
|
||||
error = new Vn.Error ('Http', 'connError', _('ConnError'));
|
||||
else
|
||||
try {
|
||||
var json = httpRequest.getJson ();
|
||||
|
@ -232,7 +232,7 @@ Db.Conn.implement
|
|||
}
|
||||
}
|
||||
catch (e) {
|
||||
error = new Vn.Error ('Conn', 'badReply', e.message /*_('BadServerReply')*/);
|
||||
error = new Vn.Error ('Http', 'badReply', e.message);
|
||||
}
|
||||
|
||||
if (callback)
|
||||
|
|
|
@ -624,7 +624,7 @@ Db.Model.implement
|
|||
|
||||
if (index)
|
||||
{
|
||||
if (index[value])
|
||||
if (index[value] !== undefined)
|
||||
return index[value];
|
||||
|
||||
return -1;
|
||||
|
|
|
@ -8,16 +8,11 @@ Htk.ImageEditor = new Class
|
|||
,initialize: function ()
|
||||
{
|
||||
this.createElement ('div');
|
||||
this.node.className = 'image-editor';
|
||||
this.node.className = 'htk-image-editor';
|
||||
|
||||
var h3 = document.createElement ('h3');
|
||||
h3.appendChild (document.createTextNode (_('UpdateImage')));
|
||||
this.node.appendChild (h3);
|
||||
|
||||
var iframe = document.createElement ('iframe');
|
||||
iframe.name = 'image-editor';
|
||||
iframe.addEventListener ('load', this.imageUploaded.bind (this, iframe));
|
||||
this.node.appendChild (iframe);
|
||||
var title = document.createElement ('h2');
|
||||
title.appendChild (document.createTextNode (_('UpdateImage')));
|
||||
this.node.appendChild (title);
|
||||
|
||||
var form = document.createElement ('form');
|
||||
form.method = 'post';
|
||||
|
@ -27,6 +22,52 @@ Htk.ImageEditor = new Class
|
|||
form.addEventListener ('submit', this.formSubmit.bind (this));
|
||||
this.node.appendChild (form);
|
||||
|
||||
var div = document.createElement ('div');
|
||||
div.className = 'form-group';
|
||||
form.appendChild (div);
|
||||
|
||||
var label = document.createElement ('label');
|
||||
label.appendChild (document.createTextNode (_('FileName') + ':'));
|
||||
div.appendChild (label);
|
||||
|
||||
var nameInput = document.createElement ('input');
|
||||
nameInput.type = 'text';
|
||||
nameInput.name = 'name';
|
||||
nameInput.addEventListener ('change', this.nameChanged.bind (this));
|
||||
div.appendChild (nameInput);
|
||||
|
||||
var div = document.createElement ('div');
|
||||
div.className = 'form-group';
|
||||
form.appendChild (div);
|
||||
|
||||
var label = document.createElement ('label');
|
||||
label.appendChild (document.createTextNode (_('File') + ':'));
|
||||
div.appendChild (label);
|
||||
|
||||
var fileInput = document.createElement ('input');
|
||||
fileInput.type = 'file';
|
||||
fileInput.name = 'image';
|
||||
div.appendChild (fileInput);
|
||||
|
||||
var div = document.createElement ('div');
|
||||
div.className = 'footer';
|
||||
form.appendChild (div);
|
||||
|
||||
var loader = document.createElement ('img');
|
||||
loader.alt = _('Loading');
|
||||
loader.src = 'image/loader-black.gif';
|
||||
div.appendChild (loader);
|
||||
|
||||
var submitButton = document.createElement ('input');
|
||||
submitButton.type = 'submit';
|
||||
submitButton.appendChild (document.createTextNode (_('UploadFile')));
|
||||
div.appendChild (submitButton);
|
||||
|
||||
var iframe = document.createElement ('iframe');
|
||||
iframe.name = 'image-editor';
|
||||
iframe.addEventListener ('load', this.imageUploaded.bind (this, iframe));
|
||||
this.node.appendChild (iframe);
|
||||
|
||||
var schemaInput = document.createElement ('input');
|
||||
schemaInput.type = 'hidden';
|
||||
schemaInput.name = 'schema';
|
||||
|
@ -38,64 +79,6 @@ Htk.ImageEditor = new Class
|
|||
input.value = this.maxFileSize;
|
||||
form.appendChild (input);
|
||||
|
||||
var table = document.createElement ('table');
|
||||
table.cellSpacing = 5;
|
||||
form.appendChild (table);
|
||||
|
||||
var tbody = document.createElement ('tbody');
|
||||
table.appendChild (tbody);
|
||||
|
||||
var tr = document.createElement ('tr');
|
||||
tbody.appendChild (tr);
|
||||
|
||||
var td = document.createElement ('td');
|
||||
td.style.textAlign = 'right';
|
||||
td.appendChild (document.createTextNode (_('FileName') + ':'));
|
||||
tr.appendChild (td);
|
||||
|
||||
var td = document.createElement ('td');
|
||||
tr.appendChild (td);
|
||||
|
||||
var nameInput = document.createElement ('input');
|
||||
nameInput.type = 'text';
|
||||
nameInput.name = 'name';
|
||||
nameInput.addEventListener ('change', this.nameChanged.bind (this));
|
||||
td.appendChild (nameInput);
|
||||
|
||||
var tr = document.createElement ('tr');
|
||||
tbody.appendChild (tr);
|
||||
|
||||
var td = document.createElement ('td');
|
||||
td.style.textAlign = 'right';
|
||||
td.appendChild (document.createTextNode (_('File') + ':'));
|
||||
tr.appendChild (td);
|
||||
|
||||
var td = document.createElement ('td');
|
||||
tr.appendChild (td);
|
||||
|
||||
var fileInput = document.createElement ('input');
|
||||
fileInput.type = 'file';
|
||||
fileInput.name = 'image';
|
||||
td.appendChild (fileInput);
|
||||
|
||||
var tr = document.createElement ('tr');
|
||||
tbody.appendChild (tr);
|
||||
|
||||
var td = document.createElement ('td');
|
||||
td.style.textAlign = 'center';
|
||||
td.colSpan = 2;
|
||||
tr.appendChild (td);
|
||||
|
||||
var loader = document.createElement ('img');
|
||||
loader.alt = _('Loading');
|
||||
loader.src = 'image/loader-black.gif';
|
||||
td.appendChild (loader);
|
||||
|
||||
var submitButton = document.createElement ('input');
|
||||
submitButton.type = 'submit';
|
||||
submitButton.appendChild (document.createTextNode (_('UploadFile')));
|
||||
td.appendChild (submitButton);
|
||||
|
||||
this.schemaInput = schemaInput;
|
||||
this.fileInput = fileInput;
|
||||
this.nameInput = nameInput;
|
||||
|
|
|
@ -28,16 +28,21 @@ Vn.Locale =
|
|||
{
|
||||
if (request.readyState != 4)
|
||||
return;
|
||||
|
||||
var success = false;
|
||||
|
||||
if (request.status == 200)
|
||||
try {
|
||||
this.add (eval ('('+ request.responseText +')'));
|
||||
}
|
||||
catch (e) {
|
||||
console.log (e);
|
||||
}
|
||||
|
||||
callback ();
|
||||
{
|
||||
try {
|
||||
this.add (eval ('('+ request.responseText +')'));
|
||||
success = true;
|
||||
}
|
||||
catch (e) {
|
||||
console.log ('Locale: %s', e);
|
||||
}
|
||||
}
|
||||
|
||||
callback (success);
|
||||
}
|
||||
|
||||
,add: function (strings)
|
||||
|
|
|
@ -90,7 +90,9 @@ var Vn =
|
|||
includeData.callbacks.push (callback);
|
||||
|
||||
script.onload =
|
||||
this.jsLoaded.bind (this, includeData);
|
||||
this.jsLoaded.bind (this, includeData, true);
|
||||
script.onerror =
|
||||
this.jsLoaded.bind (this, includeData, false);
|
||||
script.onreadystatechange =
|
||||
this.jsStateChanged.bind (this, includeData);
|
||||
|
||||
|
@ -109,17 +111,19 @@ var Vn =
|
|||
|
||||
,jsStateChanged: function (includeData)
|
||||
{
|
||||
console.log ('js: '+ includeData.script.readyState);
|
||||
|
||||
if (includeData.script.readyState == 'complete')
|
||||
this.jsLoaded (includeData);
|
||||
this.jsLoaded (includeData, true);
|
||||
}
|
||||
|
||||
,jsLoaded: function (includeData)
|
||||
,jsLoaded: function (includeData, success)
|
||||
{
|
||||
if (includeData.loaded)
|
||||
return;
|
||||
|
||||
for (var i = 0; i < includeData.callbacks.length; i++)
|
||||
includeData.callbacks[i] ();
|
||||
includeData.callbacks[i] (success);
|
||||
|
||||
includeData.loaded = true;
|
||||
includeData.callbacks = null;
|
||||
|
@ -133,14 +137,10 @@ var Vn =
|
|||
,isMobile: function ()
|
||||
{
|
||||
if (this.isMobileCached === null)
|
||||
this.isMobileCached =
|
||||
navigator.userAgent.match (/Android/i)
|
||||
|| navigator.userAgent.match (/webOS/i)
|
||||
|| navigator.userAgent.match (/iPhone/i)
|
||||
|| navigator.userAgent.match (/iPad/i)
|
||||
|| navigator.userAgent.match (/iPod/i)
|
||||
|| navigator.userAgent.match (/BlackBerry/i)
|
||||
|| navigator.userAgent.match (/Windows Phone/i);
|
||||
{
|
||||
var regExp = /(Android|webOS|iPhone|iPad|iPod|BlackBerry|Windows Phone)/i;
|
||||
this.isMobileCached = navigator.userAgent.match (regExp);
|
||||
}
|
||||
|
||||
return this.isMobileCached;
|
||||
}
|
||||
|
|
|
@ -3,6 +3,17 @@
|
|||
require_once ('global/metatags.php');
|
||||
require_once ('js/vn/main.php');
|
||||
|
||||
Vn\Hedera\Js::includeFile ('pages/login/login.js');
|
||||
use Vn\Hedera\Js;
|
||||
|
||||
Js::includeFile ('pages/login/login.js');
|
||||
|
||||
Js::includeCss ('global/style.css');
|
||||
Js::includeCss ('pages/login/style.css');
|
||||
|
||||
if (Js::isMobile ())
|
||||
{
|
||||
Js::includeCss ('global/mobile.css');
|
||||
Js::includeCss ('pages/login/mobile.css');
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
|
@ -3,17 +3,14 @@
|
|||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
||||
<meta name="viewport" content="user-scalable=no"/>
|
||||
<?php include ('pages/login/head.php') ?>
|
||||
|
||||
<link rel="shortcut icon" type="image/x-icon" href="image/favicon.ico"/>
|
||||
<link rel="stylesheet" type="text/css" href="global/style.css"/>
|
||||
<link rel="stylesheet" type="text/css" href="pages/login/style.css"/>
|
||||
<title>Login - Verdnatura</title>
|
||||
</head>
|
||||
<body>
|
||||
<?php include ('global/analytics.php') ?>
|
||||
<div id="header">
|
||||
<div>
|
||||
<a href="?page=web&guest=true#!form=cms/about"><?=s('IWantToKnowMore')?></a>
|
||||
|
@ -63,9 +60,9 @@
|
|||
<img alt="YouTube" src="image/youtube.svg" title="YouTube"/>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -51,8 +51,9 @@ a
|
|||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background-image: url("background.png");
|
||||
/* background-image: url("background.png");
|
||||
background-repeat: repeat;
|
||||
*/
|
||||
}
|
||||
#column
|
||||
{
|
||||
|
@ -129,6 +130,7 @@ input[type=submit]
|
|||
border: 1px solid #8B2;
|
||||
height: 2.4em;
|
||||
width: 8em;
|
||||
color: #250;
|
||||
}
|
||||
input[type=submit]:hover
|
||||
{
|
||||
|
|
|
@ -8,4 +8,13 @@ require_once ('js/htk/main.php');
|
|||
Js::includeFile ('pages/web/web.js');
|
||||
Js::includeFile ('pages/web/module.js');
|
||||
|
||||
Js::includeCss ('global/style.css');
|
||||
Js::includeCss ('pages/web/style.css');
|
||||
|
||||
if (Js::isMobile ())
|
||||
{
|
||||
Js::includeCss ('global/mobile.css');
|
||||
Js::includeCss ('pages/web/mobile.css');
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
|
@ -8,12 +8,9 @@
|
|||
<?php include ('pages/web/head.php') ?>
|
||||
|
||||
<link rel="shortcut icon" type="image/x-icon" href="image/favicon.ico"/>
|
||||
<link rel="stylesheet" type="text/css" href="global/style.css"/>
|
||||
<link rel="stylesheet" type="text/css" href="pages/web/style.css?1"/>
|
||||
<title>Verdnatura</title>
|
||||
</head>
|
||||
<body>
|
||||
<?php include ('global/analytics.php') ?>
|
||||
<div id="header">
|
||||
<div id="header-bar">
|
||||
<button id="menu-button">
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
|
||||
#menu-button
|
||||
{
|
||||
display: block;
|
||||
}
|
||||
#menu-box
|
||||
{
|
||||
display: none;
|
||||
}
|
||||
#form
|
||||
{
|
||||
left: 0;
|
||||
}
|
||||
ul.submenu
|
||||
{
|
||||
display: block;
|
||||
position: relative;
|
||||
border: none;
|
||||
border-radius: 0;
|
||||
background-color: white;
|
||||
box-shadow: none;
|
||||
}
|
|
@ -251,20 +251,3 @@ ul.submenu a
|
|||
overflow: auto;
|
||||
}
|
||||
|
||||
@media screen and (min-resolution: 100dpi)
|
||||
{
|
||||
#menu-button { display: block; }
|
||||
#menu-box { display: none; }
|
||||
#form { left: 0; }
|
||||
|
||||
ul.submenu
|
||||
{
|
||||
display: block;
|
||||
position: relative;
|
||||
border: none;
|
||||
border-radius: 0;
|
||||
background-color: white;
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -16,7 +16,6 @@ Vn.Web =
|
|||
{
|
||||
this.loadingCount = 0;
|
||||
this.loader = $('loader');
|
||||
|
||||
this.formHolder = $('form');
|
||||
|
||||
this.hash = new Vn.Hash ();
|
||||
|
@ -274,20 +273,16 @@ Vn.Web =
|
|||
,onFormChange: function ()
|
||||
{
|
||||
var formPath = this.hashLink.value;
|
||||
this.openForm (formPath ? formPath : Vn.Config['default_form']);
|
||||
this.openForm (formPath ? formPath : Vn.Config['default_form'], null);
|
||||
}
|
||||
|
||||
,openForm: function (formPath)
|
||||
,openForm: function (formPath, callback)
|
||||
{
|
||||
if (Vn.isMobile ())
|
||||
this.hideMenu ();
|
||||
|
||||
this.requestedForm = formPath;
|
||||
this.loadForm (formPath, null);
|
||||
}
|
||||
|
||||
,loadForm: function (formPath, callback)
|
||||
{
|
||||
|
||||
var formInfo = this.forms[formPath];
|
||||
var path = 'forms/'+ formPath;
|
||||
|
||||
|
@ -298,10 +293,19 @@ Vn.Web =
|
|||
}
|
||||
|
||||
if (this.activeCss)
|
||||
Vn.excludeCss (this.activeCss);
|
||||
{
|
||||
Vn.excludeCss (this.activeCss +'/style.css');
|
||||
|
||||
if (Vn.isMobile ())
|
||||
Vn.excludeCss (this.activeCss +'/mobile.css');
|
||||
}
|
||||
|
||||
this.activeCss = path +'/style.css';
|
||||
Vn.includeCss (this.activeCss);
|
||||
this.activeCss = path;
|
||||
|
||||
Vn.includeCss (this.activeCss +'/style.css');
|
||||
|
||||
if (Vn.isMobile ())
|
||||
Vn.includeCss (this.activeCss +'/mobile.css');
|
||||
|
||||
if (!formInfo)
|
||||
{
|
||||
|
@ -319,7 +323,9 @@ Vn.Web =
|
|||
,klass: klass
|
||||
,localeReady: false
|
||||
,jsReady: false
|
||||
,uiReady: false
|
||||
,xml: null
|
||||
,error: false
|
||||
,ready: false
|
||||
,callbacks: []
|
||||
};
|
||||
|
@ -353,47 +359,58 @@ Vn.Web =
|
|||
if (callback)
|
||||
formInfo.callbacks.push (callback);
|
||||
if (formInfo.ready)
|
||||
this.onFormDownload (formInfo);
|
||||
this.onFormReady (formInfo);
|
||||
}
|
||||
|
||||
,onFormLocaleReady: function (formInfo)
|
||||
,onFormLocaleReady: function (formInfo, success)
|
||||
{
|
||||
formInfo.localeReady = true;
|
||||
this.onFormDownload (formInfo);
|
||||
this.onFormReady (formInfo);
|
||||
}
|
||||
|
||||
,onFormJsReady: function (formInfo)
|
||||
,onFormJsReady: function (formInfo, success)
|
||||
{
|
||||
formInfo.jsReady = true;
|
||||
this.onFormDownload (formInfo);
|
||||
formInfo.error = !success;
|
||||
this.onFormReady (formInfo);
|
||||
}
|
||||
|
||||
,onFormUiReady: function (formInfo, request)
|
||||
{
|
||||
if (request.readyState != 4)
|
||||
return;
|
||||
|
||||
formInfo.uiReady = true;
|
||||
|
||||
if (request.status == 200)
|
||||
formInfo.xml = request;
|
||||
else
|
||||
formInfo.error = true;
|
||||
|
||||
this.onFormDownload (formInfo);
|
||||
this.onFormReady (formInfo);
|
||||
}
|
||||
|
||||
,onFormDownload: function (formInfo)
|
||||
,onFormReady: function (formInfo)
|
||||
{
|
||||
if (!(formInfo.localeReady && formInfo.jsReady && formInfo.xml))
|
||||
if (!(formInfo.localeReady && formInfo.jsReady && formInfo.uiReady))
|
||||
return;
|
||||
|
||||
formInfo.ready = true;
|
||||
|
||||
if (formInfo.path == this.requestedForm)
|
||||
try {
|
||||
var klass = eval (formInfo.klass);
|
||||
this.activeForm = new klass (this, formInfo);
|
||||
this.activeForm.activate ();
|
||||
}
|
||||
catch (e) {
|
||||
console.error (e);
|
||||
if (!formInfo.error)
|
||||
{
|
||||
if (formInfo.path == this.requestedForm)
|
||||
try {
|
||||
var klass = eval (formInfo.klass);
|
||||
this.activeForm = new klass (this, formInfo);
|
||||
this.activeForm.activate ();
|
||||
}
|
||||
catch (e) {
|
||||
console.error (e);
|
||||
}
|
||||
}
|
||||
else
|
||||
console.error (_('ErrorDownloadingForm'));
|
||||
|
||||
var callbacks = formInfo.callbacks;
|
||||
formInfo.callbacks = [];
|
||||
|
|
|
@ -8,9 +8,10 @@ use Vn\Rest;
|
|||
use Vn\Hedera\Web;
|
||||
|
||||
Rest\Service::init ();
|
||||
Web::init ();
|
||||
|
||||
try {
|
||||
Web::init ();
|
||||
|
||||
if (!Web::login ())
|
||||
throw new Rest\Exception ('Auth', 'sessionExpired', s('SessionExpired'));
|
||||
|
||||
|
@ -54,6 +55,8 @@ try {
|
|||
else
|
||||
throw new Rest\Exception ('Rest', 'invalidAction', s('InvalidAction'));
|
||||
}
|
||||
|
||||
Web::deinit ();
|
||||
}
|
||||
catch (Rest\Exception $e)
|
||||
{
|
||||
|
|
|
@ -23,10 +23,12 @@ class RestMod extends Rest\Module
|
|||
{
|
||||
$columns = $result->fetch_fields ();
|
||||
|
||||
$resultMap = [];
|
||||
$resultMap['data'] = [];
|
||||
$resultMap['field'] = [];
|
||||
|
||||
$resultMap =
|
||||
[
|
||||
'data' => [],
|
||||
'field' => []
|
||||
];
|
||||
|
||||
for ($i = 0; $i < $result->field_count; $i++)
|
||||
{
|
||||
$column = $columns[$i];
|
||||
|
@ -60,6 +62,8 @@ class RestMod extends Rest\Module
|
|||
default;
|
||||
$type = TYPE_STRING;
|
||||
}
|
||||
|
||||
$default = $this->castValue ($column->def, $type);
|
||||
|
||||
$resultMap['field'][] =
|
||||
[
|
||||
|
@ -67,54 +71,19 @@ class RestMod extends Rest\Module
|
|||
'orgname' => $column->orgname,
|
||||
'table' => $column->table,
|
||||
'orgtable' => $column->orgtable,
|
||||
'def' => $column->def,
|
||||
'def' => $default,
|
||||
'db' => $column->db,
|
||||
'flags' => $column->flags,
|
||||
'type' => $type
|
||||
];
|
||||
}
|
||||
|
||||
$columns = $resultMap['field'];
|
||||
|
||||
while ($row = $result->fetch_row ())
|
||||
{
|
||||
for ($j = 0; $j < $result->field_count; $j++)
|
||||
{
|
||||
$cell = &$row[$j];
|
||||
|
||||
if ($cell !== NULL)
|
||||
switch ($columns[$j]->type)
|
||||
{
|
||||
case MYSQLI_TYPE_DATE:
|
||||
case MYSQLI_TYPE_DATETIME:
|
||||
case MYSQLI_TYPE_TIMESTAMP:
|
||||
$cell = mktime
|
||||
(
|
||||
substr ($cell, 11 , 2)
|
||||
,substr ($cell, 14 , 2)
|
||||
,substr ($cell, 17 , 2)
|
||||
,substr ($cell, 5 , 2)
|
||||
,substr ($cell, 8 , 2)
|
||||
,substr ($cell, 0 , 4)
|
||||
);
|
||||
break;
|
||||
case MYSQLI_TYPE_BIT:
|
||||
$cell = (bool) $cell;
|
||||
break;
|
||||
case MYSQLI_TYPE_TINY:
|
||||
case MYSQLI_TYPE_SHORT:
|
||||
case MYSQLI_TYPE_LONG:
|
||||
case MYSQLI_TYPE_LONGLONG:
|
||||
case MYSQLI_TYPE_INT24:
|
||||
case MYSQLI_TYPE_YEAR:
|
||||
$cell = (int) $cell;
|
||||
break;
|
||||
case MYSQLI_TYPE_FLOAT:
|
||||
case MYSQLI_TYPE_DOUBLE:
|
||||
case MYSQLI_TYPE_DECIMAL:
|
||||
case MYSQLI_TYPE_NEWDECIMAL:
|
||||
$cell = (float) $cell;
|
||||
break;
|
||||
}
|
||||
}
|
||||
$this->castValue ($row[$j], $columns[$j]['type']);
|
||||
|
||||
$resultMap['data'][] = $row;
|
||||
}
|
||||
|
@ -134,6 +103,35 @@ class RestMod extends Rest\Module
|
|||
|
||||
return $results;
|
||||
}
|
||||
|
||||
function castValue (&$value, $type)
|
||||
{
|
||||
if ($value !== NULL)
|
||||
switch ($type)
|
||||
{
|
||||
case TYPE_BOOLEAN:
|
||||
$value = (bool) $value;
|
||||
break;
|
||||
case TYPE_INTEGER:
|
||||
$value = (int) $value;
|
||||
break;
|
||||
case TYPE_DOUBLE:
|
||||
$value = (float) $value;
|
||||
break;
|
||||
case TYPE_DATE:
|
||||
case TYPE_DATE_TIME:
|
||||
$value = mktime
|
||||
(
|
||||
substr ($value, 11 , 2)
|
||||
,substr ($value, 14 , 2)
|
||||
,substr ($value, 17 , 2)
|
||||
,substr ($value, 5 , 2)
|
||||
,substr ($value, 8 , 2)
|
||||
,substr ($value, 0 , 4)
|
||||
);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
|
@ -1,27 +1,28 @@
|
|||
<?php
|
||||
|
||||
require_once ('vn/web/auth.php');
|
||||
require_once ('vn/hedera/init.php');
|
||||
|
||||
use Vn\Web\Auth;
|
||||
|
||||
// Update the visit info using browscap
|
||||
|
||||
if (TRUE)
|
||||
exit ();
|
||||
|
||||
$db = new mysqli
|
||||
Auth::getCredentials ();
|
||||
$conn = new mysqli
|
||||
(
|
||||
$conf['db']['host']
|
||||
,$conf['db']['user']
|
||||
,base64_decode ($conf['db']['pass'])
|
||||
,Auth::getUser ()
|
||||
,Auth::getPassword ()
|
||||
,$conf['db']['schema']
|
||||
);
|
||||
|
||||
if ($db->connect_error)
|
||||
exit ($db->connect_error);
|
||||
if ($conn->connect_error)
|
||||
exit ($conn->connect_error);
|
||||
|
||||
$result = $db->query ("SELECT id, agent FROM visit_agent "
|
||||
$result = $conn->query ("SELECT id, agent FROM visit_agent "
|
||||
."WHERE version = '0.0' OR platform = 'unknown' OR cookies IS NULL ORDER BY id DESC");
|
||||
|
||||
$stmt = $db->prepare (
|
||||
$stmt = $conn->prepare (
|
||||
'UPDATE visit_agent SET platform = ?, browser = ?, version = ?, javascript = ?, cookies = ? WHERE id = ?');
|
||||
|
||||
if ($result && $stmt)
|
||||
|
@ -40,7 +41,7 @@ if ($result && $stmt)
|
|||
while ($row = $result->fetch_assoc ())
|
||||
{
|
||||
echo sprintf ("Processing row: %d\n", $row['id']);
|
||||
|
||||
|
||||
$info = get_browser ($row['agent']);
|
||||
$platform = $info->platform;
|
||||
$browser = $info->browser;
|
||||
|
@ -56,7 +57,10 @@ if ($stmt)
|
|||
$stmt->close ();
|
||||
if ($result)
|
||||
$result->free ();
|
||||
|
||||
if ($conn->errno)
|
||||
exit ($conn->error);
|
||||
|
||||
$db->close ();
|
||||
$conn->close ();
|
||||
|
||||
?>
|
||||
|
|
|
@ -4,6 +4,8 @@ namespace Vn\Hedera;
|
|||
|
||||
class Js
|
||||
{
|
||||
static $isMobile = NULL;
|
||||
|
||||
static function includeFile ($fileName)
|
||||
{
|
||||
echo '<script type="text/javascript" src="'.$fileName.'?'. $_SESSION['version'] .'"></script>'."\n\t";
|
||||
|
@ -21,6 +23,22 @@ class Js
|
|||
for ($i = 1; $i < count ($args); $i++)
|
||||
self::includeFile ('js/'.$libName.'/'.$args[$i].'.js');
|
||||
}
|
||||
|
||||
static function includeCss ($fileName)
|
||||
{
|
||||
echo '<link rel="stylesheet" type="text/css" href="'.$fileName.'?'. $_SESSION['version'] .'"/>'."\n\t";
|
||||
}
|
||||
|
||||
static function isMobile ()
|
||||
{
|
||||
if (self::$isMobile === NULL)
|
||||
{
|
||||
$re = '/(Android|webOS|iPhone|iPad|iPod|BlackBerry|Windows Phone)/i';
|
||||
self::$isMobile = preg_match ($re, $_SERVER['HTTP_USER_AGENT']);
|
||||
}
|
||||
|
||||
return self::$isMobile;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
|
@ -7,7 +7,7 @@ function checkToken ($token)
|
|||
return preg_match ('/^[\w\-]+$/', $token);
|
||||
}
|
||||
|
||||
function ifNull ($map, $key)
|
||||
function nullIf ($map, $key)
|
||||
{
|
||||
return isset ($map[$key]) ? $map[$key] : NULL;
|
||||
}
|
||||
|
|
|
@ -15,43 +15,31 @@ use Vn\Web\Auth;
|
|||
class Web
|
||||
{
|
||||
static $sysConn;
|
||||
static $conn;
|
||||
static $newAccess = FALSE;
|
||||
static $conn = NULL;
|
||||
|
||||
static function init ()
|
||||
{
|
||||
global $conf;
|
||||
|
||||
session_start ();
|
||||
|
||||
// Setting the locale
|
||||
|
||||
Locale::init ();
|
||||
|
||||
// Openning the main database connection
|
||||
|
||||
self::$sysConn = new Conn ();
|
||||
$sysConn = self::$sysConn;
|
||||
$sysConn->open (
|
||||
self::$sysConn->open (
|
||||
'p:'. $conf['db']['host']
|
||||
,$conf['db']['user']
|
||||
,base64_decode ($conf['db']['pass'])
|
||||
,$conf['db']['schema']
|
||||
);
|
||||
|
||||
self::$conn = new Conn ();
|
||||
|
||||
// Setting the locale
|
||||
|
||||
Locale::init ();
|
||||
|
||||
// Loading global configuration
|
||||
|
||||
if (!$sysConn->isOpen ())
|
||||
return;
|
||||
|
||||
$dbConf = $sysConn->getRow (
|
||||
'SELECT default_lang, https, cookie_life, guest_user, guest_pass FROM config'
|
||||
);
|
||||
$conf = array_merge ($conf, $dbConf);
|
||||
|
||||
// Setting the version
|
||||
|
||||
$_SESSION['version'] = $sysConn->getValue ('SELECT version FROM version LIMIT 1');
|
||||
|
||||
$_SESSION['version'] = Web::$sysConn->getValue ('SELECT version FROM version');
|
||||
|
||||
// Registering the visit
|
||||
|
||||
|
@ -72,18 +60,18 @@ class Web
|
|||
if (isset ($_SERVER['REMOTE_ADDR']))
|
||||
$ip = ip2long ($_SERVER['REMOTE_ADDR']);
|
||||
|
||||
$row = $sysConn->getRow (
|
||||
$row = self::$sysConn->getRow (
|
||||
'CALL visit_register (#, #, #, #, #, #, #, #, #)',
|
||||
[
|
||||
ifNull ($_COOKIE, 'hedera_visit')
|
||||
,ifNull ($browser, 'platform')
|
||||
,ifNull ($browser, 'browser')
|
||||
,ifNull ($browser, 'version')
|
||||
,ifNull ($browser, 'javascript')
|
||||
,ifNull ($browser, 'cookies')
|
||||
nullIf ($_COOKIE, 'hedera_visit')
|
||||
,nullIf ($browser, 'platform')
|
||||
,nullIf ($browser, 'browser')
|
||||
,nullIf ($browser, 'version')
|
||||
,nullIf ($browser, 'javascript')
|
||||
,nullIf ($browser, 'cookies')
|
||||
,isset ($agent) ? $agent : NULL
|
||||
,isset ($ip) && $ip ? $ip : NULL
|
||||
,ifNull ($_SERVER, 'HTTP_REFERER')
|
||||
,nullIf ($_SERVER, 'HTTP_REFERER')
|
||||
]
|
||||
);
|
||||
|
||||
|
@ -91,7 +79,6 @@ class Web
|
|||
{
|
||||
setcookie ('hedera_visit', $row['visit'], time () + 31536000); // 1 Year
|
||||
$_SESSION['access'] = $row['access'];
|
||||
self::$newAccess = TRUE;
|
||||
}
|
||||
else
|
||||
$_SESSION['skipVisit'] = TRUE;
|
||||
|
@ -128,23 +115,19 @@ class Web
|
|||
|
||||
try {
|
||||
Auth::getCredentials ();
|
||||
|
||||
self::$conn = new Conn ();
|
||||
self::$conn->open (
|
||||
$conf['db']['host']
|
||||
,Auth::getUser ()
|
||||
,Auth::getPassword ()
|
||||
,$conf['db']['schema']
|
||||
);
|
||||
Auth::login ($useCookies);
|
||||
|
||||
$row = self::$conn->getRow (
|
||||
'SELECT account.user_get_id () user, CONNECTION_ID() conn');
|
||||
|
||||
if (!$wasLoged)
|
||||
unset ($_SESSION['visitUser']);
|
||||
Auth::login ($useCookies);
|
||||
}
|
||||
catch (\Exception $e)
|
||||
{
|
||||
$row = NULL;
|
||||
$success = FALSE;
|
||||
}
|
||||
|
||||
|
@ -152,13 +135,24 @@ class Web
|
|||
|
||||
if (isset ($_SESSION['access']))
|
||||
{
|
||||
$row = NULL;
|
||||
|
||||
if ($success)
|
||||
{
|
||||
if (!$wasLoged)
|
||||
unset ($_SESSION['visitUser']);
|
||||
|
||||
$row = self::$conn->getRow (
|
||||
'SELECT account.user_get_id () user, CONNECTION_ID() conn');
|
||||
}
|
||||
|
||||
$_SESSION['visitUser'] = self::$sysConn->getValue (
|
||||
'CALL visit_user (#, #, #, #, #)',
|
||||
[
|
||||
$_SESSION['access']
|
||||
,ifNull ($_SESSION, 'visitUser')
|
||||
,ifNull ($row, 'user')
|
||||
,ifNull ($row, 'conn')
|
||||
$_SESSION['access']
|
||||
,nullIf ($_SESSION, 'visitUser')
|
||||
,nullIf ($row, 'user')
|
||||
,nullIf ($row, 'conn')
|
||||
,session_id ()
|
||||
]
|
||||
);
|
||||
|
@ -177,10 +171,14 @@ class Web
|
|||
,[session_id ()]
|
||||
);
|
||||
|
||||
$_SESSION['visitUser'] = ifNull ($_SESSION, 'visitUnknown');
|
||||
|
||||
self::$conn->close ();
|
||||
$_SESSION['visitUser'] = nullIf ($_SESSION, 'visitUnknown');
|
||||
Auth::logout ();
|
||||
|
||||
if (self::$conn)
|
||||
{
|
||||
self::$conn->close ();
|
||||
self::$conn = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,14 +0,0 @@
|
|||
<Files *.css>
|
||||
SetOutputFilter DEFLATE
|
||||
</Files>
|
||||
<Files *.js>
|
||||
SetOutputFilter DEFLATE
|
||||
</Files>
|
||||
<Files *.php>
|
||||
SetOutputFilter DEFLATE
|
||||
</Files>
|
||||
<FilesMatch "\.(ttf|otf|eot|woff)$">
|
||||
<IfModule mod_headers.c>
|
||||
Header set Access-Control-Allow-Origin "*"
|
||||
</IfModule>
|
||||
</FilesMatch>
|
|
@ -1,54 +0,0 @@
|
|||
<?php
|
||||
|
||||
require_once ('php/web/hedera.php');
|
||||
require_once ('php/web/json.php');
|
||||
|
||||
Hedera::init ();
|
||||
JsonLib::init ();
|
||||
|
||||
if (Hedera::login ())
|
||||
{
|
||||
// Checking the client version
|
||||
|
||||
if (isset ($_COOKIE['hedera_version']))
|
||||
{
|
||||
$clientVersion = $_COOKIE['hedera_version'];
|
||||
set_type ($clientVersion, TYPE_DOUBLE);
|
||||
|
||||
if ($clientVersion < $_SESSION['version'])
|
||||
{
|
||||
$row = Hedera::$sysConn->getRow ('SELECT critical, changelog FROM version LIMIT 1');
|
||||
|
||||
if (!$row || $row['critical'])
|
||||
Error::trigger ('Version', 'criticalVersion', $row['changelog']);
|
||||
else
|
||||
Error::trigger ('Version', 'newVersion', $row['changelog']);
|
||||
}
|
||||
}
|
||||
|
||||
// Getting the action
|
||||
|
||||
$action = NULL;
|
||||
|
||||
if (isset ($_REQUEST['action']))
|
||||
$action = $_REQUEST['action'];
|
||||
|
||||
if ($action && checkToken ($action))
|
||||
{
|
||||
$actionFile = 'ajax/'. $action .'.php';
|
||||
|
||||
if (file_exists ($actionFile))
|
||||
{
|
||||
Vn\Locale::loadFile ('ajax/'. $action);
|
||||
require_once ($actionFile);
|
||||
actionActivate (Hedera::$conn);
|
||||
}
|
||||
else
|
||||
Error::trigger ('Ajax', 'invalidAction', s('InvalidAction'));
|
||||
}
|
||||
}
|
||||
|
||||
JsonLib::sendReply ();
|
||||
Hedera::deinit ();
|
||||
|
||||
?>
|
|
@ -1,179 +0,0 @@
|
|||
<?php
|
||||
|
||||
const IMG_MAX_SIZE = 3;
|
||||
const IMG_URL_BASE = '/var/www/image/cache';
|
||||
const IMG_URL_FULL = 'full/';
|
||||
const IMG_URL_ICON = 'icon/';
|
||||
const IMG_FULL_HEIGHT = 650;
|
||||
const IMG_FULL_WIDTH = 750;
|
||||
const IMG_ICON_SIZE = 30;
|
||||
|
||||
function actionActivate ($conn)
|
||||
{
|
||||
$data = FALSE;
|
||||
|
||||
$query = "SELECT r.name = 'employee' "
|
||||
.'FROM role r JOIN user_role u ON r.id = u.role_id '
|
||||
.'WHERE u.user_id = account.user_get_id ()';
|
||||
|
||||
if (!$conn->getValue ($query))
|
||||
JsonLib::setError ('Image', 'permissionDenied', s('PermissionDenied'));
|
||||
else if (!isset ($_REQUEST['name']) || !isset ($_REQUEST['directory']))
|
||||
JsonLib::setError ('Image', 'comError', s('ComError'));
|
||||
else if (!(isset ($_FILES['image']['name']) && $_FILES['image']['name'] != ''))
|
||||
JsonLib::setError ('Image', 'fileNotChoosed', s('FileNotChoosed'));
|
||||
else if ($_FILES['image']['error'] != 0)
|
||||
JsonLib::setError ('Image', 'uploadError', s('FileUploadError'));
|
||||
else if ($_FILES['image']['size'] > IMG_MAX_SIZE * 1048576)
|
||||
JsonLib::setError ('Image', 'fileSizeError', sprintf (s('FileSizeError'), IMG_MAX_SIZE));
|
||||
else
|
||||
{
|
||||
$name = $_REQUEST['name'];
|
||||
$directory = $_REQUEST['directory'];
|
||||
$exp = '/[^a-z0-9_]/';
|
||||
|
||||
if (preg_match ($exp, $name) === 0 && preg_match ($exp, $directory) === 0)
|
||||
{
|
||||
$img = & $_FILES['image'];
|
||||
$data = TRUE;
|
||||
|
||||
switch ($img['type'])
|
||||
{
|
||||
case 'image/png':
|
||||
$image = imagecreatefrompng ($img['tmp_name']);
|
||||
break;
|
||||
case 'image/jpeg':
|
||||
$image = imagecreatefromjpeg ($img['tmp_name']);
|
||||
break;
|
||||
case 'image/gif':
|
||||
$image = imagecreatefromgif ($img['tmp_name']);
|
||||
break;
|
||||
default:
|
||||
JsonLib::setError ('Image', 'badFileFormat', s('BadFileFormat'));
|
||||
$data = FALSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
JsonLib::setError ('Image', 'badFileName', s('BadFileName'));
|
||||
|
||||
if ($data)
|
||||
{
|
||||
$data = FALSE;
|
||||
|
||||
if (!$image)
|
||||
JsonLib::setError ('Image', 'openError', s('ImageOpenError'));
|
||||
else
|
||||
{
|
||||
list ($width, $height) = getimagesize ($img['tmp_name']);
|
||||
|
||||
$n = -1;
|
||||
$max_height = array ();
|
||||
$max_width = array ();
|
||||
$url = array ();
|
||||
|
||||
++$n;
|
||||
$max_height[$n] = IMG_ICON_SIZE;
|
||||
$max_width[$n] = IMG_ICON_SIZE;
|
||||
$url[$n] = IMG_URL_ICON;
|
||||
|
||||
++$n;
|
||||
$max_height[$n] = IMG_FULL_HEIGHT;
|
||||
$max_width[$n] = IMG_FULL_WIDTH;
|
||||
$url[$n] = IMG_URL_FULL;
|
||||
|
||||
for ($n = 0; $n < count ($url); $n++)
|
||||
{
|
||||
$reduce = FALSE;
|
||||
$w = $width;
|
||||
$h = $height;
|
||||
|
||||
if ($h > $max_height[$n])
|
||||
{
|
||||
$reduce = $h / $max_height[$n];
|
||||
$h = $max_height[$n];
|
||||
$w = (int) ($w / $reduce);
|
||||
}
|
||||
|
||||
if ($w > $max_width[$n])
|
||||
{
|
||||
$reduce = $w / $max_width[$n];
|
||||
$w = $max_width[$n];
|
||||
$h = (int) ($h / $reduce);
|
||||
}
|
||||
|
||||
if ($reduce !== FALSE)
|
||||
{
|
||||
$image_new = imagecreatetruecolor ($w, $h);
|
||||
imagecopyresized ($image_new, $image, 0, 0, 0, 0, $w, $h, $width, $height);
|
||||
}
|
||||
else
|
||||
$image_new = $image;
|
||||
|
||||
imagealphablending ($image_new, FALSE);
|
||||
imagesavealpha ($image_new, TRUE);
|
||||
|
||||
$dest_url = IMG_URL_BASE .'/'. $directory . '/' . $url[$n] . $name . '.png';
|
||||
$data = imagepng ($image_new, $dest_url);
|
||||
|
||||
if (!$data)
|
||||
JsonLib::setError ('Image', 'saveError', sprintf (s('FileSaveError'), $dest_url));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unlink ($img['tmp_name']);
|
||||
}
|
||||
|
||||
JsonLib::$encoding = JsonLib::ENCODING_HTML;
|
||||
JsonLib::setData ($data);
|
||||
}
|
||||
|
||||
/*
|
||||
// Script to reduce and change format for all images
|
||||
|
||||
define ('IMG_DIR_BASE', '/var/www/test/image/');
|
||||
define ('IMG_DIR_OLD', IMG_DIR_BASE.'gallery/');
|
||||
define ('IMG_DIR_NEW', IMG_DIR_BASE.'icon/');
|
||||
define ('IMG_SIZE', 85);
|
||||
|
||||
if (TRUE)
|
||||
{
|
||||
$directorio = opendir (IMG_DIR_OLD);
|
||||
$n = 1;
|
||||
|
||||
while ($filename = readdir ($directorio))
|
||||
{
|
||||
switch (strtolower(substr ($filename, -3, 3)))
|
||||
{
|
||||
case 'jpg':
|
||||
$image = imagecreatefromjpeg (IMG_DIR_OLD.$filename);
|
||||
break;
|
||||
case 'png':
|
||||
$image = imagecreatefrompng (IMG_DIR_OLD.$filename);
|
||||
break;
|
||||
}
|
||||
|
||||
if (isset ($image))
|
||||
{
|
||||
$n++;
|
||||
|
||||
list ($width, $height) = getimagesize (IMG_DIR_OLD.$filename);
|
||||
|
||||
$siz_max = ($width > $height) ? $width : $height;
|
||||
|
||||
$percent = ($siz_max > IMG_SIZE) ? IMG_SIZE / $siz_max : 1;
|
||||
|
||||
$width_new = $width * $percent;
|
||||
$height_new = $height * $percent;
|
||||
|
||||
$image_new = imagecreatetruecolor ($width_new, $height_new);
|
||||
imagecopyresized ($image_new, $image, 0, 0, 0, 0, $width_new, $height_new, $width, $height);
|
||||
imagesavealpha ($image_new, TRUE);
|
||||
imagepng ($image_new, IMG_DIR_NEW.substr ($filename, 0, -4).'.png');
|
||||
}
|
||||
}
|
||||
|
||||
JsonLib::setError ('Image', 'imagesResized', s('ImagesResized'));
|
||||
}
|
||||
*/
|
||||
?>
|
|
@ -1,8 +0,0 @@
|
|||
<?php
|
||||
|
||||
function actionActivate ($conn)
|
||||
{
|
||||
JsonLib::setData (TRUE);
|
||||
}
|
||||
|
||||
?>
|
|
@ -1,9 +0,0 @@
|
|||
<?php
|
||||
|
||||
function actionActivate ($conn)
|
||||
{
|
||||
Auth::logout ($conn);
|
||||
JsonLib::setData (TRUE);
|
||||
}
|
||||
|
||||
?>
|
|
@ -1,88 +0,0 @@
|
|||
<?php
|
||||
|
||||
class JsonResult
|
||||
{
|
||||
var $field;
|
||||
var $data;
|
||||
}
|
||||
|
||||
function actionActivate ($conn)
|
||||
{
|
||||
if (isset ($_REQUEST['sql']) && $_REQUEST['sql'] != '')
|
||||
{
|
||||
$results = array ();
|
||||
|
||||
if ($conn->multiQuery ($_REQUEST['sql']))
|
||||
do {
|
||||
$result = $conn->storeResult ();
|
||||
|
||||
if ($result !== FALSE)
|
||||
{
|
||||
$jsonResult = new JsonResult ();
|
||||
|
||||
$columns = $result->fetch_fields ();
|
||||
$jsonResult->data = array ();
|
||||
$jsonResult->field = $columns;
|
||||
|
||||
for ($i = 0; $row = $result->fetch_row (); $i++)
|
||||
{
|
||||
for ($j = 0; $j < $result->field_count; $j++)
|
||||
{
|
||||
$cell = & $row[$j];
|
||||
|
||||
if ($cell != NULL)
|
||||
{
|
||||
switch ($columns[$j]->type)
|
||||
{
|
||||
case MYSQLI_TYPE_DATE:
|
||||
case MYSQLI_TYPE_DATETIME:
|
||||
case MYSQLI_TYPE_TIMESTAMP:
|
||||
$cell = mktime
|
||||
(
|
||||
substr ($cell, 11 , 2)
|
||||
,substr ($cell, 14 , 2)
|
||||
,substr ($cell, 17 , 2)
|
||||
,substr ($cell, 5 , 2)
|
||||
,substr ($cell, 8 , 2)
|
||||
,substr ($cell, 0 , 4)
|
||||
);
|
||||
break;
|
||||
case MYSQLI_TYPE_BIT:
|
||||
set_type ($cell, TYPE_BOOLEAN);
|
||||
break;
|
||||
case MYSQLI_TYPE_TINY:
|
||||
case MYSQLI_TYPE_SHORT:
|
||||
case MYSQLI_TYPE_LONG:
|
||||
case MYSQLI_TYPE_LONGLONG:
|
||||
case MYSQLI_TYPE_INT24:
|
||||
case MYSQLI_TYPE_YEAR:
|
||||
set_type ($cell, TYPE_INTEGER);
|
||||
break;
|
||||
case MYSQLI_TYPE_FLOAT:
|
||||
case MYSQLI_TYPE_DOUBLE:
|
||||
case MYSQLI_TYPE_DECIMAL:
|
||||
case MYSQLI_TYPE_NEWDECIMAL:
|
||||
set_type ($cell, TYPE_DOUBLE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$jsonResult->data[$i] = $row;
|
||||
}
|
||||
|
||||
$results[] = $jsonResult;
|
||||
$result->free ();
|
||||
}
|
||||
else
|
||||
$results[] = TRUE;
|
||||
}
|
||||
while ($conn->moreResults () && $conn->nextResult ());
|
||||
|
||||
JsonLib::setData ($results);
|
||||
}
|
||||
else
|
||||
JsonLib::setError ('Query', 'emptyQuery', s('EmptyQuery'));
|
||||
}
|
||||
|
||||
?>
|
|
@ -1,16 +0,0 @@
|
|||
Copyright (C) 2013 - Juan Ferrer Toribio
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this program; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA.
|
|
@ -1,9 +0,0 @@
|
|||
<script>
|
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||
|
||||
ga('create', 'UA-49049601-1', 'verdnatura.es');
|
||||
ga('send', 'pageview');
|
||||
</script>
|
|
@ -1,13 +0,0 @@
|
|||
<?php
|
||||
|
||||
if ($result = Hedera::$sysConn->query ('SELECT name, content FROM metatag'))
|
||||
{
|
||||
echo '<meta name="content-language" content="'.$_SESSION['lang'].'"/>'."\n\t";
|
||||
|
||||
while ($row = $result->fetch_assoc ())
|
||||
echo '<meta name="'.$row['name'].'" content="'.$row['content'].'"/>'."\n\t";
|
||||
|
||||
$result->free ();
|
||||
}
|
||||
|
||||
?>
|
|
@ -1,12 +0,0 @@
|
|||
|
||||
/* Global */
|
||||
|
||||
@font-face {
|
||||
font-family: 'Open Sans';
|
||||
src: url(opensans.ttf) format('truetype');
|
||||
}
|
||||
*
|
||||
{
|
||||
font-size: 13px;
|
||||
font-family: 'Open Sans', 'Verdana', 'Sans';
|
||||
}
|
|
@ -1,321 +0,0 @@
|
|||
|
||||
/* Global */
|
||||
|
||||
@font-face {
|
||||
font-family: 'Open Sans';
|
||||
src: url(opensans.ttf) format('truetype');
|
||||
}
|
||||
body
|
||||
{
|
||||
margin: 0px;
|
||||
}
|
||||
body,
|
||||
label,
|
||||
button,
|
||||
input,
|
||||
textarea
|
||||
{
|
||||
font-size: 13px;
|
||||
font-family: 'Open Sans', 'Verdana', 'Sans';
|
||||
}
|
||||
iframe
|
||||
{
|
||||
border: 0px;
|
||||
}
|
||||
fieldset,
|
||||
div
|
||||
{
|
||||
margin: 0px;
|
||||
}
|
||||
form
|
||||
{
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
table
|
||||
{
|
||||
width: 100%;
|
||||
}
|
||||
a:link,
|
||||
a:visited,
|
||||
a:active
|
||||
{
|
||||
color: #000;
|
||||
text-decoration: none;
|
||||
}
|
||||
a:hover
|
||||
{
|
||||
text-decoration: none;
|
||||
}
|
||||
a img
|
||||
{
|
||||
padding: 1px;
|
||||
border: 1px solid #EEE;
|
||||
border-color: transparent;
|
||||
}
|
||||
a img:hover
|
||||
{
|
||||
border-color: #999;
|
||||
}
|
||||
h1, h2, h3, h4, h5, h6
|
||||
{
|
||||
margin: 0px;
|
||||
padding: 2px;
|
||||
}
|
||||
h1
|
||||
{
|
||||
font-size: 22px;
|
||||
}
|
||||
h2
|
||||
{
|
||||
font-size: 20px;
|
||||
}
|
||||
p
|
||||
{
|
||||
margin: 0px;
|
||||
margin-top: 16px;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
/* Inputs */
|
||||
|
||||
input,
|
||||
textarea,
|
||||
button
|
||||
{
|
||||
border: 1px solid #CCD;
|
||||
margin: 2px;
|
||||
padding: 4px;
|
||||
border-radius: 2px;
|
||||
/* box-shadow: 0px 2px 2px #AAA; */
|
||||
}
|
||||
textarea
|
||||
{
|
||||
height: 40px;
|
||||
width: 200px;
|
||||
}
|
||||
input[type=submit],
|
||||
input[type=button],
|
||||
button
|
||||
{
|
||||
background-color: #EEF;
|
||||
margin: 6px;
|
||||
padding: 4px;
|
||||
}
|
||||
input[type=text]:focus,
|
||||
input[type=password]:focus,
|
||||
textarea:focus
|
||||
{
|
||||
background-color: #EEF;
|
||||
border-color: #BBC;
|
||||
}
|
||||
input[type=submit]:hover,
|
||||
input[type=button]:hover,
|
||||
button:hover
|
||||
{
|
||||
cursor: pointer;
|
||||
background-color: #DDE;
|
||||
}
|
||||
|
||||
/* Grid */
|
||||
|
||||
table.grid
|
||||
{
|
||||
width: 95%;
|
||||
margin: auto;
|
||||
border-collapse: collapse;
|
||||
text-align: center;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
table.grid thead tr,
|
||||
table.grid tfoot tr
|
||||
{
|
||||
/* background-color: #C0CCB3;
|
||||
background: url(image/gradient.png) repeat-x scroll 0;
|
||||
*/
|
||||
background-color: #EEF;
|
||||
border: 1px solid #CCD;
|
||||
color: black;
|
||||
font-weight: bold;
|
||||
vertical-align: middle;
|
||||
text-align: center;
|
||||
height: 30px;
|
||||
}
|
||||
table.grid thead th
|
||||
{
|
||||
cursor: pointer;
|
||||
}
|
||||
table.grid thead th:hover
|
||||
{
|
||||
background-color: #DDE;
|
||||
}
|
||||
table.grid tr
|
||||
{
|
||||
height: 35px;
|
||||
}
|
||||
table.grid tfoot a,
|
||||
table.grid thead a
|
||||
{
|
||||
color: black;
|
||||
}
|
||||
table.grid tr.pair-row
|
||||
{
|
||||
background-color: transparent;
|
||||
}
|
||||
td.grid-message
|
||||
{
|
||||
height: 80px;
|
||||
}
|
||||
td.grid-message img
|
||||
{
|
||||
vertical-align: middle;
|
||||
padding: 10px;
|
||||
}
|
||||
table.grid tbody td
|
||||
{
|
||||
padding-right: 8px;
|
||||
padding-left: 8px;
|
||||
}
|
||||
input.cell-spin
|
||||
{
|
||||
width: 25px;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
/* Calendar */
|
||||
|
||||
.calendar
|
||||
{
|
||||
width: 220px;
|
||||
background-color: white;
|
||||
border: 1px solid #CCD;
|
||||
border-radius: 2px;
|
||||
box-shadow: 0px 2px 2px #AAA;
|
||||
}
|
||||
.calendar table
|
||||
{
|
||||
border-collapse: collapse;
|
||||
}
|
||||
.calendar thead tr,
|
||||
.calendar tfoot tr
|
||||
{
|
||||
background-color: #EEF;
|
||||
color: black;
|
||||
font-weight: normal;
|
||||
vertical-align: middle;
|
||||
text-align: center;
|
||||
height: 30px;
|
||||
}
|
||||
.calendar thead tr
|
||||
{
|
||||
border-bottom: 1px solid #CCD;
|
||||
}
|
||||
.calendar tfoot tr
|
||||
{
|
||||
border-top: 1px solid #CCD;
|
||||
}
|
||||
.calendar col
|
||||
{
|
||||
width: 14.2%;
|
||||
}
|
||||
.calendar tr
|
||||
{
|
||||
height: 22px;
|
||||
}
|
||||
.calendar tbody td
|
||||
{
|
||||
text-align: right;
|
||||
padding-right: 6px;
|
||||
}
|
||||
.calendar td.highlight,
|
||||
.calendar td:hover,
|
||||
.button:hover
|
||||
{
|
||||
cursor: pointer;
|
||||
background-color: #DDE;
|
||||
}
|
||||
|
||||
/* Date chooser */
|
||||
|
||||
.date-chooser button
|
||||
{
|
||||
margin: 0px;
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
/* Full image */
|
||||
|
||||
div.full-image
|
||||
{
|
||||
position: fixed;
|
||||
background-color: #FFF;
|
||||
text-align: center;
|
||||
border: 1px solid #999;
|
||||
border-radius: 2px;
|
||||
z-index: 2;
|
||||
}
|
||||
div.image-loader
|
||||
{
|
||||
position: fixed;
|
||||
background-color: #FFF;
|
||||
border: 1px solid #999;
|
||||
border-radius: 2px;
|
||||
z-index: 3;
|
||||
}
|
||||
div.image-loader img
|
||||
{
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
/* Image editor */
|
||||
|
||||
img.editable
|
||||
{
|
||||
cursor: pointer;
|
||||
}
|
||||
div.image-editor
|
||||
{
|
||||
background-color: #FFF;
|
||||
border: 1px solid #999;
|
||||
border-radius: 2px;
|
||||
padding: 12px;
|
||||
width: 400px;
|
||||
}
|
||||
div.image-editor h3
|
||||
{
|
||||
text-align: center;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
div.image-editor iframe
|
||||
{
|
||||
display: none;
|
||||
}
|
||||
div.image-editor button
|
||||
{
|
||||
margin-left: 5px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
div.image-editor img
|
||||
{
|
||||
visibility: hidden;
|
||||
vertical-align: middle;
|
||||
padding-right: 10px;
|
||||
}
|
||||
|
||||
/* Form */
|
||||
|
||||
table.form
|
||||
{
|
||||
border-collapse: separate;
|
||||
border-spacing: 4px;
|
||||
}
|
||||
table.form td.label
|
||||
{
|
||||
text-align: right;
|
||||
}
|
||||
table.form tr
|
||||
{
|
||||
height: 35px;
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 597 B |
Before Width: | Height: | Size: 590 B |
Before Width: | Height: | Size: 825 B |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 708 B |
Before Width: | Height: | Size: 790 B |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 935 B |
Before Width: | Height: | Size: 397 B |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 5.3 KiB |
Before Width: | Height: | Size: 784 B |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 215 B |
Before Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 141 B |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 8.9 KiB |
Before Width: | Height: | Size: 9.2 KiB |
Before Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 6.5 KiB |
Before Width: | Height: | Size: 984 B |
Before Width: | Height: | Size: 965 B |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 795 B |
Before Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 1005 B |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 290 KiB |
Before Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 786 B |
Before Width: | Height: | Size: 62 KiB |
Before Width: | Height: | Size: 510 B |
|
@ -1,73 +0,0 @@
|
|||
<?php
|
||||
|
||||
require_once ('php/web/hedera.php');
|
||||
require_once ('php/web/js.php');
|
||||
|
||||
Hedera::init ();
|
||||
|
||||
if ($conf['https'] && (!isset ($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != 'on'))
|
||||
{
|
||||
header ('Location: https://'.$_SERVER['SERVER_NAME']);
|
||||
exit (0);
|
||||
}
|
||||
|
||||
if (!Hedera::$sysConn->isOpen ())
|
||||
{
|
||||
header ('Location: unavailable.html');
|
||||
exit (0);
|
||||
}
|
||||
|
||||
// Getting the section
|
||||
|
||||
if (isset ($_GET['section']) && checkToken ($_GET['section']))
|
||||
$section = $_GET['section'];
|
||||
else
|
||||
$section = 'login';
|
||||
|
||||
// Checking the browser version
|
||||
|
||||
if (!isset ($_SESSION['skipBrowser']) && $section != 'update-browser')
|
||||
{
|
||||
$updateBrowser = FALSE;
|
||||
|
||||
if (!isset ($_GET['skipBrowser'])
|
||||
&& ($browser = get_browser ($_SERVER['HTTP_USER_AGENT'])))
|
||||
{
|
||||
$browserVersion = $browser->version;
|
||||
set_type ($browserVersion, TYPE_DOUBLE);
|
||||
|
||||
$updateBrowser = isset ($conf['browser'][$browser->browser])
|
||||
&& $browserVersion < $conf['browser'][$browser->browser];
|
||||
}
|
||||
|
||||
if ($updateBrowser)
|
||||
{
|
||||
header ('Location: ?section=update-browser');
|
||||
exit (0);
|
||||
}
|
||||
else
|
||||
$_SESSION['skipBrowser'] = TRUE;
|
||||
}
|
||||
|
||||
// Loading the section
|
||||
|
||||
$basePath = 'sections/'. $section;
|
||||
|
||||
setcookie ('hedera_version', $_SESSION['version']);
|
||||
header ('Content-Type: text/html;charset=utf-8');
|
||||
|
||||
if (file_exists ($basePath))
|
||||
{
|
||||
Vn\Locale::loadFile ($basePath);
|
||||
|
||||
$phpFile = $basePath .'/'. $section .'.php';
|
||||
|
||||
if (file_exists ($phpFile))
|
||||
require ($phpFile);
|
||||
|
||||
require ($basePath .'/html.php');
|
||||
}
|
||||
|
||||
Hedera::deinit ();
|
||||
|
||||
?>
|
|
@ -1,59 +0,0 @@
|
|||
/**
|
||||
* Computes a sum of data in the model.
|
||||
**/
|
||||
Db.CalcSum = new Class
|
||||
({
|
||||
Extends: Db.Calc
|
||||
,Tag: 'db-calc-sum'
|
||||
|
||||
,getRowValue: function (row)
|
||||
{
|
||||
var value;
|
||||
|
||||
if (this._func)
|
||||
{
|
||||
this.form.row = row;
|
||||
value = this._func (this.form);
|
||||
}
|
||||
else
|
||||
value = this._model.getByIndex (row, this.columnIndex);
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
,before: function (row)
|
||||
{
|
||||
var value = this.getRowValue (row)
|
||||
|
||||
if (value !== null)
|
||||
{
|
||||
this.sum -= value;
|
||||
this.numbersCount--;
|
||||
}
|
||||
}
|
||||
|
||||
,after: function (row)
|
||||
{
|
||||
var value = this.getRowValue (row);
|
||||
|
||||
if (value !== null)
|
||||
{
|
||||
this.sum += value;
|
||||
this.numbersCount++;
|
||||
}
|
||||
}
|
||||
|
||||
,init: function ()
|
||||
{
|
||||
this.sum = 0;
|
||||
this.numbersCount = 0;
|
||||
}
|
||||
|
||||
,done: function ()
|
||||
{
|
||||
if (this.numbersCount > 0)
|
||||
this.value = this.sum;
|
||||
else
|
||||
this.value = null;
|
||||
}
|
||||
});
|
|
@ -1,149 +0,0 @@
|
|||
/**
|
||||
* Interface for handle foreach operations on the model.
|
||||
**/
|
||||
Db.Calc = new Class
|
||||
({
|
||||
Extends: Vn.Param
|
||||
,Tag: 'db-calc'
|
||||
,Properties:
|
||||
{
|
||||
model:
|
||||
{
|
||||
type: Db.Model
|
||||
,set: function (x)
|
||||
{
|
||||
this.link ({_model: x},
|
||||
{
|
||||
'status-changed': this.onModelChange
|
||||
,'row-deleted-before': this.onRowDeleteBefore
|
||||
,'row-updated': this.onRowUpdate
|
||||
,'row-updated-before': this.onRowUpdateBefore
|
||||
,'row-inserted': this.onRowInsert
|
||||
});
|
||||
|
||||
this.form = new Db.Form ({model: x});
|
||||
}
|
||||
,get: function ()
|
||||
{
|
||||
return this._model;
|
||||
}
|
||||
},
|
||||
columnIndex:
|
||||
{
|
||||
type: Number
|
||||
,set: function (x)
|
||||
{
|
||||
this.reset ();
|
||||
this._columnIndex = x;
|
||||
this.onModelChange ();
|
||||
}
|
||||
,get: function ()
|
||||
{
|
||||
return this._columnIndex;
|
||||
}
|
||||
},
|
||||
columnName:
|
||||
{
|
||||
type: String
|
||||
,set: function (x)
|
||||
{
|
||||
this.reset ();
|
||||
this._columnName = x;
|
||||
this.onModelChange ();
|
||||
}
|
||||
,get: function ()
|
||||
{
|
||||
return this._columnName;
|
||||
}
|
||||
},
|
||||
func:
|
||||
{
|
||||
type: Function
|
||||
,set: function (x)
|
||||
{
|
||||
this.reset ();
|
||||
this._func = x;
|
||||
this.onModelChange ();
|
||||
}
|
||||
,get: function ()
|
||||
{
|
||||
return this._func;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
,_model: null
|
||||
|
||||
,reset: function ()
|
||||
{
|
||||
delete this._columnIndex;
|
||||
delete this._columnName;
|
||||
delete this._func;
|
||||
}
|
||||
|
||||
,onModelChange: function ()
|
||||
{
|
||||
this.init ();
|
||||
|
||||
if (this._model)
|
||||
{
|
||||
if (this._model.ready && this._columnName)
|
||||
this._columnIndex = this._model.getColumnIndex (this._columnName);
|
||||
|
||||
var rows = this._model.numRows;
|
||||
|
||||
for (var i = 0; i < rows; i++)
|
||||
this.after (i);
|
||||
}
|
||||
|
||||
this.done ();
|
||||
}
|
||||
|
||||
,onRowInsert: function (model, row)
|
||||
{
|
||||
this.after (row);
|
||||
this.done ();
|
||||
}
|
||||
|
||||
,onRowUpdateBefore: function (model, row)
|
||||
{
|
||||
this.before (row);
|
||||
}
|
||||
|
||||
,onRowUpdate: function (model, row)
|
||||
{
|
||||
this.after (row);
|
||||
this.done ();
|
||||
}
|
||||
|
||||
,onRowDeleteBefore: function (model, row)
|
||||
{
|
||||
this.before (row);
|
||||
this.done ();
|
||||
}
|
||||
|
||||
/**
|
||||
* Called before each update or delete row operation.
|
||||
* You don't need to define it if model isn't updatable.
|
||||
*
|
||||
* @param {integer} row The row number
|
||||
**/
|
||||
,before: function (row) {}
|
||||
|
||||
/**
|
||||
* Called after each update or insert row operation.
|
||||
*
|
||||
* @param {integer} row The row number
|
||||
**/
|
||||
,after: function (row) {}
|
||||
|
||||
/**
|
||||
* Called before each model refresh.
|
||||
**/
|
||||
,init: function () {}
|
||||
|
||||
/**
|
||||
* Called when an operation in the model is complete.
|
||||
**/
|
||||
,done: function () {}
|
||||
});
|
|
@ -1,241 +0,0 @@
|
|||
/**
|
||||
* Simulates a connection to a database by making asynchronous http requests to
|
||||
* a remote PHP script that returns the results in JSON format.
|
||||
* Using this class can perform any operation that can be done with a database,
|
||||
* like open/close a connection or selecion/updating queries.
|
||||
**/
|
||||
Db.Conn = new Class ().extend
|
||||
({
|
||||
Flag:
|
||||
{
|
||||
NOT_NULL : 1
|
||||
,PRI_KEY : 2
|
||||
,AI : 512 | 2 | 1
|
||||
}
|
||||
|
||||
,Type:
|
||||
{
|
||||
TIMESTAMP : 7
|
||||
,DATE : 10
|
||||
,DATE_TIME : 12
|
||||
}
|
||||
});
|
||||
|
||||
Db.Conn.implement
|
||||
({
|
||||
Extends: Vn.Object
|
||||
|
||||
,connected: false
|
||||
,requestsCount: 0
|
||||
|
||||
/**
|
||||
* Initilizes the connection object.
|
||||
**/
|
||||
,initialize: function ()
|
||||
{
|
||||
this.parent ();
|
||||
}
|
||||
|
||||
/**
|
||||
* Opens the connection to the database.
|
||||
*
|
||||
* @param {string} user The user name
|
||||
* @param {String} password The user password
|
||||
* @param {Boolean} remember Specifies if the user should be remembered
|
||||
* @param {Function} openCallback The function to call when operation is done
|
||||
**/
|
||||
,open: function (user, pass, remember, openCallback)
|
||||
{
|
||||
this.signalEmit ('loading-changed', true);
|
||||
|
||||
var request = new Db.HttpRequest ();
|
||||
request.add ({'action': 'login'});
|
||||
|
||||
if (user != null)
|
||||
{
|
||||
request.add
|
||||
({
|
||||
'user': user
|
||||
,'password': pass
|
||||
,'remember': remember
|
||||
});
|
||||
}
|
||||
|
||||
request.send ('ajax.php',
|
||||
this.opened.bind (this, request, openCallback));
|
||||
}
|
||||
|
||||
/*
|
||||
* Called when open operation is done.
|
||||
*/
|
||||
,opened: function (request, openCallback, success)
|
||||
{
|
||||
var openSuccess = false;
|
||||
|
||||
if (success)
|
||||
try {
|
||||
var json = request.getJson ();
|
||||
openSuccess = true /* json.data */;
|
||||
}
|
||||
catch (e) {}
|
||||
|
||||
if (openSuccess)
|
||||
this.connected = true;
|
||||
|
||||
this.signalEmit ('loading-changed', false);
|
||||
|
||||
if (openCallback)
|
||||
openCallback (this, openSuccess);
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the connection to the database.
|
||||
*
|
||||
* @param {Function} closeCallback The function to call when operation is done
|
||||
**/
|
||||
,close: function (closeCallback)
|
||||
{
|
||||
this.signalEmit ('loading-changed', true);
|
||||
|
||||
var request = new Db.HttpRequest ();
|
||||
request.addValue ({'action': 'close'});
|
||||
request.send ('ajax.php',
|
||||
this.closed.bind (this, closeCallback));
|
||||
}
|
||||
|
||||
/*
|
||||
* Called when close operation is done.
|
||||
*/
|
||||
,closed: function (closeCallback)
|
||||
{
|
||||
this.connected = false;
|
||||
this.signalEmit ('closed');
|
||||
|
||||
this.signalEmit ('loading-changed', false);
|
||||
|
||||
if (closeCallback)
|
||||
closeCallback (this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs a SQL query on the database.
|
||||
*
|
||||
* @param {String} sql The SQL statement
|
||||
* @param {Function} callback The function to call when operation is done
|
||||
**/
|
||||
,execSql: function (sql, callback)
|
||||
{
|
||||
this.requestsCount++;
|
||||
|
||||
if (this.requestsCount == 1)
|
||||
this.signalEmit ('loading-changed', true);
|
||||
|
||||
var httpRequest = new Db.HttpRequest ()
|
||||
httpRequest.add
|
||||
({
|
||||
'action': 'query'
|
||||
,'sql': sql
|
||||
});
|
||||
httpRequest.send ('ajax.php',
|
||||
this.execDone.bind (this, httpRequest, callback));
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs a stmt on the database.
|
||||
*
|
||||
* @param {Sql.Stmt} stmt The statement
|
||||
* @param {Function} callback The function to call when operation is done
|
||||
* @param {Sql.Batch} batch The batch used to set the parameters
|
||||
**/
|
||||
,execStmt: function (stmt, callback, batch)
|
||||
{
|
||||
this.execSql (stmt.render (batch), callback);
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs a query on the database.
|
||||
*
|
||||
* @param {String} query The SQL statement
|
||||
* @param {Function} callback The function to call when operation is done
|
||||
* @param {Sql.Batch} batch The batch used to set the parameters
|
||||
**/
|
||||
,execQuery: function (query, callback, batch)
|
||||
{
|
||||
this.execStmt (new Sql.String ({query: query}), callback, batch);
|
||||
}
|
||||
|
||||
/*
|
||||
* Parses a value to date.
|
||||
*/
|
||||
,valueToDate: function (value)
|
||||
{
|
||||
return new Date (value * 1000);
|
||||
}
|
||||
|
||||
/*
|
||||
* Called when a query is executed.
|
||||
*/
|
||||
,execDone: function (httpRequest, callback, success)
|
||||
{
|
||||
var error = null;
|
||||
var results = null;
|
||||
|
||||
this.requestsCount--;
|
||||
|
||||
if (this.requestsCount == 0)
|
||||
this.signalEmit ('loading-changed', false);
|
||||
|
||||
if (!success)
|
||||
error = new Vn.Error ('Conn', 'connError', _('ConnError'));
|
||||
else
|
||||
try {
|
||||
var json = httpRequest.getJson ();
|
||||
results = json.data;
|
||||
|
||||
if (json.error !== null)
|
||||
error = new Vn.Error (json.error.domain,
|
||||
json.error.code, json.error.message);
|
||||
|
||||
if (results instanceof Array)
|
||||
for (var i = 0; i < results.length; i++)
|
||||
if (results[i] !== true)
|
||||
{
|
||||
var data = results[i].data;
|
||||
var columns = results[i].field;
|
||||
|
||||
for (var j = 0; j < columns.length; j++)
|
||||
{
|
||||
var castFunc = null;
|
||||
|
||||
switch (columns[j].type)
|
||||
{
|
||||
case Db.Conn.Type.DATE:
|
||||
case Db.Conn.Type.DATE_TIME:
|
||||
case Db.Conn.Type.TIMESTAMP:
|
||||
castFunc = this.valueToDate;
|
||||
break;
|
||||
}
|
||||
|
||||
if (castFunc !== null)
|
||||
{
|
||||
if (columns[j].def != null)
|
||||
columns[j].def = castFunc (columns[j].def);
|
||||
|
||||
for (var k = 0; k < data.length; k++)
|
||||
if (data[k][j] != null)
|
||||
data[k][j] = castFunc (data[k][j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (e) {
|
||||
error = new Vn.Error ('Conn', 'badReply', e.message /*_('BadServerReply')*/);
|
||||
}
|
||||
|
||||
if (callback)
|
||||
callback (new Db.ResultSet (results, error));
|
||||
if (error)
|
||||
this.signalEmit ('error', error);
|
||||
}
|
||||
});
|
||||
|
|
@ -1,212 +0,0 @@
|
|||
|
||||
Db.Form = new Class
|
||||
({
|
||||
Extends: Vn.Object
|
||||
,Tag: 'db-form'
|
||||
,Child: 'model'
|
||||
,Properties:
|
||||
{
|
||||
/**
|
||||
* The model associated to this form.
|
||||
**/
|
||||
model:
|
||||
{
|
||||
type: Db.Model
|
||||
,set: function (x)
|
||||
{
|
||||
this.link ({_model: x},
|
||||
{
|
||||
'status-changed': this.onModelChange
|
||||
,'row-updated': this.onRowUpdate
|
||||
});
|
||||
}
|
||||
,get: function ()
|
||||
{
|
||||
return this._model;
|
||||
}
|
||||
},
|
||||
/**
|
||||
* The row where the form positioned, has -1 if the row is unselected.
|
||||
**/
|
||||
row:
|
||||
{
|
||||
type: Number
|
||||
,set: function (x)
|
||||
{
|
||||
if (!this._model || this._model.numRows <= x || x < -1)
|
||||
x = -1;
|
||||
if (x == this._row)
|
||||
return;
|
||||
|
||||
this._row = x;
|
||||
this.iterChanged ();
|
||||
}
|
||||
,get: function ()
|
||||
{
|
||||
return this._row;
|
||||
}
|
||||
},
|
||||
/**
|
||||
* The number of rows in the form.
|
||||
**/
|
||||
numRows:
|
||||
{
|
||||
type: Number
|
||||
,get: function ()
|
||||
{
|
||||
if (this._model)
|
||||
return this._model.numRows;
|
||||
|
||||
return 0;
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Checks if the form data is ready.
|
||||
**/
|
||||
ready:
|
||||
{
|
||||
type: Boolean
|
||||
,get: function ()
|
||||
{
|
||||
return this._ready;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
,lastRow: 0
|
||||
,_model: null
|
||||
,_row: -1
|
||||
,_ready: false
|
||||
|
||||
,onModelChange: function ()
|
||||
{
|
||||
var ready = this._model && this._model.ready;
|
||||
|
||||
if (ready != this._ready)
|
||||
{
|
||||
if (this._row != -1)
|
||||
this.lastRow = this._row;
|
||||
|
||||
this._ready = ready;
|
||||
this.signalEmit ('status-changed');
|
||||
|
||||
if (this._row == -1)
|
||||
this.row = this.lastRow;
|
||||
}
|
||||
}
|
||||
|
||||
,onRowUpdate: function (model, row, column)
|
||||
{
|
||||
if (row == this._row)
|
||||
this.iterChanged ();
|
||||
}
|
||||
|
||||
,refresh: function ()
|
||||
{
|
||||
if (this._model)
|
||||
this._model.refresh ();
|
||||
}
|
||||
|
||||
/**
|
||||
* Emits the 'iter-changed' signal on the form.
|
||||
**/
|
||||
,iterChanged: function ()
|
||||
{
|
||||
this.signalEmit ('iter-changed');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the index of the column from its name.
|
||||
*
|
||||
* @param {String} columnName The column name
|
||||
* @return {integer} The column index or -1 if column not exists
|
||||
**/
|
||||
,getColumnIndex: function (columnName)
|
||||
{
|
||||
if (this._model)
|
||||
return this._model.getColumnIndex (columnName);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
,insertRow: function ()
|
||||
{
|
||||
if (this._model)
|
||||
this.row = this._model.insertRow ();
|
||||
}
|
||||
|
||||
,performOperations: function ()
|
||||
{
|
||||
if (this._model)
|
||||
this._model.performOperations ();
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the current row.
|
||||
**/
|
||||
,deleteRow: function ()
|
||||
{
|
||||
if (this._row >= 0)
|
||||
this._model.deleteRow (this._row);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a value from the form.
|
||||
*
|
||||
* @param {String} columnName The column name
|
||||
* @return {Object} The value
|
||||
**/
|
||||
,get: function (columnName)
|
||||
{
|
||||
return this._model.get (this._row, columnName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a value on the form.
|
||||
*
|
||||
* @param {String} columnName The column name
|
||||
* @param {Object} value The new value
|
||||
**/
|
||||
,set: function (columnName, value)
|
||||
{
|
||||
return this._model.set (this._row, columnName, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a value from the form using the column index.
|
||||
*
|
||||
* @param {String} columnName The column index
|
||||
* @return {Object} The value
|
||||
**/
|
||||
,getByIndex: function (column)
|
||||
{
|
||||
return this._model.getByIndex (this._row, column);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a value on the form using the column index.
|
||||
*
|
||||
* @param {String} columnName The column index
|
||||
* @param {Object} value The new value
|
||||
**/
|
||||
,setByIndex: function (column, value)
|
||||
{
|
||||
return this._model.setByIndex (this._row, column, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a param from the form.
|
||||
*
|
||||
* @param {String} columnName The column name
|
||||
* @return {Db.Param} The new parameter
|
||||
**/
|
||||
,getParam: function (columnName)
|
||||
{
|
||||
return new Db.Param
|
||||
({
|
||||
form: this
|
||||
,column: columnName
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
Db.HttpRequest = new Class
|
||||
({
|
||||
kvPairs: {}
|
||||
|
||||
,add: function (map)
|
||||
{
|
||||
for (var key in map)
|
||||
this.kvPairs[key] = map[key];
|
||||
}
|
||||
|
||||
,send: function (file, callback)
|
||||
{
|
||||
this.request = new XMLHttpRequest ();
|
||||
this.request.open ('post', file, true);
|
||||
this.request.setRequestHeader ('Content-Type', 'application/x-www-form-urlencoded');
|
||||
this.request.onreadystatechange = this.requestStateChanged.bind (this, callback);
|
||||
this.request.send (Vn.Url.makeUri (this.kvPairs));
|
||||
}
|
||||
|
||||
,requestStateChanged: function (callback)
|
||||
{
|
||||
if (this.request.readyState == 4)
|
||||
callback (this, this.request.status == 200);
|
||||
}
|
||||
|
||||
,getJson: function ()
|
||||
{
|
||||
return eval (this.request.responseText);
|
||||
}
|
||||
});
|