"}return l+=""}function r(t){var o,r=this.parent();(o=t.target.getAttribute("data-mce-color"))&&(this.lastId&&document.getElementById(this.lastId).setAttribute("aria-selected",!1),t.target.setAttribute("aria-selected",!0),this.lastId=t.target.id,r.hidePanel(),o="#"+o,r.color(o),e.execCommand(r.settings.selectcmd,!1,o))}function l(){var t=this;t._color&&e.execCommand(t.settings.selectcmd,!1,t._color)}e.addButton("forecolor",{type:"colorbutton",tooltip:"Text color",selectcmd:"ForeColor",panel:{role:"application",ariaRemember:!0,html:o,onclick:r},onclick:l}),e.addButton("backcolor",{type:"colorbutton",tooltip:"Background color",selectcmd:"HiliteColor",panel:{role:"application",ariaRemember:!0,html:o,onclick:r},onclick:l})});tinymce.PluginManager.add("visualblocks",function(e,s){function o(){var s=this;s.active(a),e.on("VisualBlocks",function(){s.active(e.dom.hasClass(e.getBody(),"mce-visualblocks"))})}var l,t,a;window.NodeList&&(e.addCommand("mceVisualBlocks",function(){var o,c=e.dom;l||(l=c.uniqueId(),o=c.create("link",{id:l,rel:"stylesheet",href:s+"/css/visualblocks.css"}),e.getDoc().getElementsByTagName("head")[0].appendChild(o)),e.on("PreviewFormats AfterPreviewFormats",function(s){a&&c.toggleClass(e.getBody(),"mce-visualblocks","afterpreviewformats"==s.type)}),c.toggleClass(e.getBody(),"mce-visualblocks"),a=e.dom.hasClass(e.getBody(),"mce-visualblocks"),t&&t.active(c.hasClass(e.getBody(),"mce-visualblocks")),e.fire("VisualBlocks")}),e.addButton("visualblocks",{title:"Show blocks",cmd:"mceVisualBlocks",onPostRender:o}),e.addMenuItem("visualblocks",{text:"Show blocks",cmd:"mceVisualBlocks",onPostRender:o,selectable:!0,context:"view",prependToContext:!0}),e.on("init",function(){e.settings.visualblocks_default_state&&e.execCommand("mceVisualBlocks",!1,null,{skip_focus:!0})}),e.on("remove",function(){e.dom.removeClass(e.getBody(),"mce-visualblocks")}))});tinymce.PluginManager.add("visualchars",function(e){function a(a){var t,s,i,r,c,d,l=e.getBody(),m=e.selection;if(n=!n,o.state=n,e.fire("VisualChars",{state:n}),a&&(d=m.getBookmark()),n)for(s=[],tinymce.walk(l,function(e){3==e.nodeType&&e.nodeValue&&-1!=e.nodeValue.indexOf(" ")&&s.push(e)},"childNodes"),i=0;i$1'),c=e.dom.create("div",null,r);t=c.lastChild;)e.dom.insertAfter(t,s[i]);e.dom.remove(s[i])}else for(s=e.dom.select("span.mce-nbsp",l),i=s.length-1;i>=0;i--)e.dom.remove(s[i],1);m.moveToBookmark(d)}function t(){var a=this;e.on("VisualChars",function(e){a.active(e.state)})}var n,o=this;e.addCommand("mceVisualChars",a),e.addButton("visualchars",{title:"Show invisible characters",cmd:"mceVisualChars",onPostRender:t}),e.addMenuItem("visualchars",{text:"Show invisible characters",cmd:"mceVisualChars",onPostRender:t,selectable:!0,context:"view",prependToContext:!0}),e.on("beforegetcontent",function(e){n&&"raw"!=e.format&&!e.draft&&(n=!0,a(!1))})});tinymce.PluginManager.add("wordcount",function(e){function t(){e.theme.panel.find("#wordcount").text(["Words: {0}",a.getCount()])}var n,o,a=this;n=e.getParam("wordcount_countregex",/[\w\u2019\x27\-\u00C0-\u1FFF]+/g),o=e.getParam("wordcount_cleanregex",/[0-9.(),;:!?%#$?\x27\x22_+=\\\/\-]*/g),e.on("init",function(){var n=e.theme.panel&&e.theme.panel.find("#statusbar")[0];n&&window.setTimeout(function(){n.insert({type:"label",name:"wordcount",text:["Words: {0}",a.getCount()],classes:"wordcount",disabled:e.settings.readonly},0),e.on("setcontent beforeaddundo",t),e.on("keyup",function(e){32==e.keyCode&&t()})},0)}),a.getCount=function(){var t=e.getContent({format:"raw"}),a=0;if(t){t=t.replace(/\.\.\./g," "),t=t.replace(/<.[^<>]*?>/g," ").replace(/ | /gi," "),t=t.replace(/(\w+)(?[a-z0-9]+;)+(\w+)/i,"$1$3").replace(/&.+?;/g," "),t=t.replace(o,"");var r=t.match(n);r&&(a=r.length)}return a}});tinymce.ThemeManager.add("modern",function(e){function t(){function t(t){var i,o=[];if(t)return d(t.split(/[ ,]/),function(t){function n(){var n=e.selection;"bullist"==r&&n.selectorChanged("ul > li",function(e,n){for(var i,o=n.parents.length;o--&&(i=n.parents[o].nodeName,"OL"!=i&&"UL"!=i););t.active(e&&"UL"==i)}),"numlist"==r&&n.selectorChanged("ol > li",function(e,n){for(var i,o=n.parents.length;o--&&(i=n.parents[o].nodeName,"OL"!=i&&"UL"!=i););t.active(e&&"OL"==i)}),t.settings.stateSelector&&n.selectorChanged(t.settings.stateSelector,function(e){t.active(e)},!0),t.settings.disabledStateSelector&&n.selectorChanged(t.settings.disabledStateSelector,function(e){t.disabled(e)})}var r;"|"==t?i=null:c.has(t)?(t={type:t},u.toolbar_items_size&&(t.size=u.toolbar_items_size),o.push(t),i=null):(i||(i={type:"buttongroup",items:[]},o.push(i)),e.buttons[t]&&(r=t,t=e.buttons[r],"function"==typeof t&&(t=t()),t.type=t.type||"button",u.toolbar_items_size&&(t.size=u.toolbar_items_size),t=c.create(t),i.items.push(t),e.initialized?n():e.on("init",n)))}),n.push({type:"toolbar",layout:"flow",items:o}),!0}var n=[];if(tinymce.isArray(u.toolbar)){if(0===u.toolbar.length)return;tinymce.each(u.toolbar,function(e,t){u["toolbar"+(t+1)]=e}),delete u.toolbar}for(var i=1;10>i&&t(u["toolbar"+i]);i++);return n.length||u.toolbar===!1||t(u.toolbar||f),n.length?{type:"panel",layout:"stack",classes:"toolbar-grp",ariaRoot:!0,ariaRemember:!0,items:n}:void 0}function n(){function t(t){var n;return"|"==t?{text:"|"}:n=e.menuItems[t]}function n(n){var i,o,r,a,s;if(s=tinymce.makeMap((u.removed_menuitems||"").split(/[ ,]/)),u.menu?(o=u.menu[n],a=!0):o=h[n],o){i={text:o.title},r=[],d((o.items||"").split(/[ ,]/),function(e){var n=t(e);n&&!s[e]&&r.push(t(e))}),a||d(e.menuItems,function(e){e.context==n&&("before"==e.separator&&r.push({text:"|"}),e.prependToContext?r.unshift(e):r.push(e),"after"==e.separator&&r.push({text:"|"}))});for(var l=0;l 0)
+ sql += ', ';
+ sql += this.field[n].render (batch);
+ }
+
+ sql += ') VALUES (';
+
+ for (n = 0; n < this.field.length; n++)
+ {
+ if (n > 0)
+ sql += ', ';
+ sql += this.expr[n].render(batch);
+ }
+
+ sql += ')';
+
+ return sql;
+ }
+})
diff --git a/package/usr/share/hedera-web/js/sql/list.js b/package/usr/share/hedera-web/js/sql/list.js
new file mode 100755
index 00000000..be6e86a8
--- /dev/null
+++ b/package/usr/share/hedera-web/js/sql/list.js
@@ -0,0 +1,53 @@
+/**
+ * List of Sql.Object
+ **/
+Sql.List = new Class
+({
+ Extends: Sql.Object
+
+ ,objects: []
+
+ ,add: function (object)
+ {
+ this.objects.push (object);
+ object.on ('changed', this.onObjectChange, this);
+ this.onObjectChange ();
+ }
+
+ ,get: function (i)
+ {
+ return objects[i];
+ }
+
+ ,getArray: function ()
+ {
+ return this.objects;
+ }
+
+ ,remove: function (i)
+ {
+ var object = objects.splice (i, 1);
+ object.disconnect ('changed', this.onObjectChange, this);
+ this.onObjectChange ();
+ }
+
+ ,onObjectChange: function ()
+ {
+ this.signalEmit ('changed');
+ }
+
+ ,isReady: function ()
+ {
+ var o = this.objects;
+
+ if (o.length == 0)
+ return false;
+
+ for (var i = 0; i < o.length; i++)
+ if (!o[i].isReady ())
+ return false;
+
+ return true;
+ }
+});
+
diff --git a/package/usr/share/hedera-web/js/sql/main.js b/package/usr/share/hedera-web/js/sql/main.js
new file mode 100755
index 00000000..21358f87
--- /dev/null
+++ b/package/usr/share/hedera-web/js/sql/main.js
@@ -0,0 +1,5 @@
+/**
+ * The namespace.
+ **/
+var Sql = {};
+
diff --git a/package/usr/share/hedera-web/js/sql/main.php b/package/usr/share/hedera-web/js/sql/main.php
new file mode 100755
index 00000000..03f69755
--- /dev/null
+++ b/package/usr/share/hedera-web/js/sql/main.php
@@ -0,0 +1,31 @@
+
diff --git a/package/usr/share/hedera-web/js/sql/multi-stmt.js b/package/usr/share/hedera-web/js/sql/multi-stmt.js
new file mode 100755
index 00000000..0e7ac091
--- /dev/null
+++ b/package/usr/share/hedera-web/js/sql/multi-stmt.js
@@ -0,0 +1,42 @@
+/**
+ * The equivalent of a SQL multi statement.
+ **/
+Sql.MultiStmt = new Class
+({
+ Extends: Sql.Stmt
+
+ ,stmts: []
+
+ ,addStmt: function (stmt)
+ {
+ stmt.on ('changed', this.stmtChanged.bind (this));
+ return this.stmts.push (stmt);
+ }
+
+ ,stmtChanged: function ()
+ {
+ this.signalEmit ('changed');
+ }
+
+ ,isReady: function ()
+ {
+ if (this.stmts.length == 0)
+ return false;
+
+ for (var i = 0; i < this.stmts.length; i++)
+ if (!this.stmts[i].isReady ())
+ return false;
+
+ return true;
+ }
+
+ ,render: function (batch)
+ {
+ var sql = '';
+
+ for (var i = 0; i < this.stmts.length; i++)
+ sql += this.stmts[i].render (batch) + '; ';
+
+ return sql;
+ }
+});
diff --git a/package/usr/share/hedera-web/js/sql/object.js b/package/usr/share/hedera-web/js/sql/object.js
new file mode 100755
index 00000000..34fbd43d
--- /dev/null
+++ b/package/usr/share/hedera-web/js/sql/object.js
@@ -0,0 +1,32 @@
+/**
+ * Base class for all objects on this library.
+ **/
+Sql.Object = new Class
+({
+ Extends: Vn.Object
+
+ /**
+ * Renders the object as an SQL string.
+ *
+ * @param {Sql.Batch} batch The batch used to render the object
+ * @return {String} The SQL string
+ **/
+ ,render: function (batch) {}
+
+ /**
+ * Gets if the object is ready to be rendered.
+ *
+ * @return {boolean} %true if the object is ready, %false otherwise
+ **/
+ ,isReady: function ()
+ {
+ return true;
+ }
+
+ /**
+ * Through the query looking for containers and adds it to the batch.
+ *
+ * @return {Sql.Batch} batch The batch
+ **/
+ ,findHolders: function (batch) {}
+});
diff --git a/package/usr/share/hedera-web/js/sql/operation.js b/package/usr/share/hedera-web/js/sql/operation.js
new file mode 100755
index 00000000..10f7dfa6
--- /dev/null
+++ b/package/usr/share/hedera-web/js/sql/operation.js
@@ -0,0 +1,72 @@
+/**
+ * The equivalent of a SQL operation between exprs.
+ *
+ * @param {Array#Sql.Expr} expr Array with the exprs
+ * @param {Sql..Operation.Type} type The type of the operation
+ **/
+Sql.Operation = new Class ().extend
+({
+ Type:
+ {
+ EQUAL : 0
+ ,LIKE : 1
+ ,AND : 2
+ ,OR : 3
+ }
+ ,Operators:
+ [
+ '='
+ ,'LIKE'
+ ,'AND'
+ ,'OR'
+ ]
+});
+
+Sql.Operation.implement
+({
+ Extends: Sql.Expr
+ ,Tag: 'sql-operation'
+ ,Properties:
+ {
+ type:
+ {
+ enumType: Sql.Operation.Type
+ ,value: -1
+ }
+ }
+
+ ,initialize: function (props)
+ {
+ this.parent (props);
+ this.link ({exprs: new Sql.List ()}, {'changed': this.onListChange});
+ }
+
+ ,onListChange: function ()
+ {
+ this.signalEmit ('changed');
+ }
+
+ ,isReady: function ()
+ {
+ return this.exprs.isReady ();
+ }
+
+ ,render: function (batch)
+ {
+ var sql = '(';
+ var operator = ' '+ Sql.Operation.Operators[this.type] +' ';
+ var e = this.exprs.getArray ();
+
+ for (var i = 0; i < e.length; i++)
+ {
+ if (i > 0)
+ sql += operator;
+
+ sql += e[i].render (batch);
+ }
+
+ sql += ')';
+
+ return sql;
+ }
+});
diff --git a/package/usr/share/hedera-web/js/sql/search-tags.js b/package/usr/share/hedera-web/js/sql/search-tags.js
new file mode 100755
index 00000000..27f80b74
--- /dev/null
+++ b/package/usr/share/hedera-web/js/sql/search-tags.js
@@ -0,0 +1,19 @@
+/**
+ * The equivalent of a SQL value.
+ **/
+Sql.SearchTags = new Class
+({
+ Extends: Sql.Value
+ ,Tag: 'sql-search-tags'
+
+ ,render: function (batch)
+ {
+ if (typeof this._value == 'string')
+ {
+ var value = this._value.replace (/^| +|$/g, '%');
+ return "'" + value.replace (this.regexp, this.replaceFunc) + "'";
+ }
+ else
+ return this.parent ();
+ }
+});
diff --git a/package/usr/share/hedera-web/js/sql/select.js b/package/usr/share/hedera-web/js/sql/select.js
new file mode 100755
index 00000000..7d03fc1a
--- /dev/null
+++ b/package/usr/share/hedera-web/js/sql/select.js
@@ -0,0 +1,33 @@
+/**
+ * The equivalent of a SQL select.
+ **/
+Sql.Select = new Class
+({
+ Extends: Sql.Stmt
+
+ ,expr: []
+
+ ,addField: function (fieldName)
+ {
+ this.expr.push (new Sql.Field ({name: fieldName}));
+ }
+
+ ,render: function (batch)
+ {
+ var sql = 'SELECT '
+
+ for (var i = 0; i < this.expr.length; i++)
+ {
+ if (i > 0)
+ sql += ', ';
+ sql += this.expr[i].render(batch);
+ }
+
+ sql += ' FROM ' + this.renderTarget (batch);
+
+ if (this.where)
+ sql += ' WHERE ' + this.where.render (batch);
+
+ return sql;
+ }
+});
diff --git a/package/usr/share/hedera-web/js/sql/stmt.js b/package/usr/share/hedera-web/js/sql/stmt.js
new file mode 100755
index 00000000..b3c71b7c
--- /dev/null
+++ b/package/usr/share/hedera-web/js/sql/stmt.js
@@ -0,0 +1,43 @@
+/**
+ * The equivalent of a SQL statement.
+ **/
+Sql.Stmt = new Class
+({
+ Extends: Sql.Object
+ ,Properties:
+ {
+ where:
+ {
+ type: Sql.Expr
+ ,value: null
+ }
+ }
+
+ ,target: []
+
+ ,addTarget: function (target)
+ {
+ this.target.push (target);
+ }
+
+ ,renderTarget: function (batch)
+ {
+ var sql;
+ var len = this.target.length;
+
+ if (len > 0)
+ {
+ sql = ' ';
+
+ for (var n = 0; n < len; n++)
+ {
+ if (n > 0) sql += ', ';
+ sql += this.target[n].render (batch);
+ }
+ }
+ else
+ sql += 'DUAL';
+
+ return sql;
+ }
+});
diff --git a/package/usr/share/hedera-web/js/sql/string.js b/package/usr/share/hedera-web/js/sql/string.js
new file mode 100755
index 00000000..2a7ac8ce
--- /dev/null
+++ b/package/usr/share/hedera-web/js/sql/string.js
@@ -0,0 +1,40 @@
+/**
+ * Literal SQL string.
+ **/
+Sql.String = new Class
+({
+ Extends: Sql.Stmt
+ ,Properties:
+ {
+ query:
+ {
+ type: String
+ ,value: null
+ }
+ }
+
+ ,regexp: /#\w+/g
+
+ ,replaceFunc: function (batch, token)
+ {
+ var holder = new Sql.Holder ({id: token.substr (1)});
+ return holder.render (batch);
+ }
+
+ ,render: function (batch)
+ {
+ if (!this.query)
+ return null;
+
+ return this.query.replace (this.regexp, this.replaceFunc.bind (this, batch));
+ }
+
+ ,findHolders: function (batch)
+ {
+ var ids = this.query.match (this.regexp);
+
+ if (ids)
+ for (var i = 0; i < ids.length; i++)
+ batch.add (ids[i].substr (1));
+ }
+});
diff --git a/package/usr/share/hedera-web/js/sql/table.js b/package/usr/share/hedera-web/js/sql/table.js
new file mode 100755
index 00000000..e4d43207
--- /dev/null
+++ b/package/usr/share/hedera-web/js/sql/table.js
@@ -0,0 +1,28 @@
+/**
+ *
+ **/
+Sql.Table = new Class
+({
+ Extends: Sql.Target
+ ,Properties:
+ {
+ name:
+ {
+ type: String
+ ,value: null
+ },
+ schema:
+ {
+ type: String
+ ,value: null
+ }
+ }
+
+ ,render: function (batch)
+ {
+ var sql;
+ sql = this.schema ? '`' + this.schema + '`.' : '';
+ sql = sql + '`' + this.name + '`';
+ return sql;
+ }
+});
diff --git a/package/usr/share/hedera-web/js/sql/target.js b/package/usr/share/hedera-web/js/sql/target.js
new file mode 100755
index 00000000..3a1f793c
--- /dev/null
+++ b/package/usr/share/hedera-web/js/sql/target.js
@@ -0,0 +1,7 @@
+/**
+ * The equivalent of a SQL target.
+ **/
+Sql.Target = new Class
+({
+ Extends: Sql.Object
+});
diff --git a/package/usr/share/hedera-web/js/sql/update.js b/package/usr/share/hedera-web/js/sql/update.js
new file mode 100755
index 00000000..31d40dd9
--- /dev/null
+++ b/package/usr/share/hedera-web/js/sql/update.js
@@ -0,0 +1,29 @@
+/**
+ * The equivalent of a SQL update.
+ **/
+Sql.Update = new Class
+({
+ Extends: Sql.Dml
+
+ ,render: function (batch)
+ {
+ var sql;
+ var n;
+
+ sql = 'UPDATE ' + this.renderTarget (batch) + ' SET ';
+
+ for (n = 0; n < this.field.length; n++)
+ {
+ if (n > 0)
+ sql += ', ';
+ sql += this.field[n].render () + ' = ' + this.expr[n].render(batch);
+ }
+
+ if (this.where)
+ sql += ' WHERE ' + this.where.render (batch);
+
+ sql += ' LIMIT 1'; // Only for security.
+
+ return sql;
+ }
+});
diff --git a/package/usr/share/hedera-web/js/sql/value.js b/package/usr/share/hedera-web/js/sql/value.js
new file mode 100755
index 00000000..5be89871
--- /dev/null
+++ b/package/usr/share/hedera-web/js/sql/value.js
@@ -0,0 +1,112 @@
+/**
+ * The equivalent of a SQL value.
+ **/
+Sql.Value = new Class
+({
+ Extends: Sql.Expr
+ ,Tag: 'sql-value'
+
+ ,Properties:
+ {
+ /**
+ * The master param.
+ **/
+ param:
+ {
+ type: Vn.Param
+ ,set: function (x)
+ {
+ this.link ({_param: x}, {'changed': this.onParamChange});
+ this.onParamChange ();
+ }
+ ,get: function ()
+ {
+ return this._param;
+ }
+ },
+ /**
+ * The value.
+ **/
+ value:
+ {
+ type: Object
+ ,set: function (x)
+ {
+ if (Vn.Value.compare (x, this._value))
+ return;
+
+ if (x instanceof Date)
+ x = x.clone ();
+
+ this._value = x;
+
+ if (this._param && !this.paramLock)
+ {
+ this.paramLock = true;
+ this._param.value = x;
+ this.paramLock = false;
+ }
+
+ this.signalEmit ('changed');
+ }
+ ,get: function ()
+ {
+ return this._value;
+ }
+ }
+ }
+
+ ,_value: undefined
+ ,_param: null
+ ,regexp: new RegExp ('(\\\\)|\'', 'g')
+ ,paramLock: false
+
+ ,onParamChange: function ()
+ {
+ if (this.paramLock)
+ return;
+
+ this.paramLock = true;
+ this.value = this._param.value;
+ this.paramLock = false;
+ }
+
+ ,isReady: function ()
+ {
+ if (this._value !== undefined && this._value !== null)
+ return true;
+
+ return false;
+ }
+
+ ,replaceFunc: function (token)
+ {
+ switch (token)
+ {
+ case '\\': return '\\\\';
+ case '\'': return '\\\'';
+ }
+
+ return token;
+ }
+
+ ,render: function (batch)
+ {
+ var v = this._value;
+
+ switch (typeof v)
+ {
+ case 'number':
+ return v;
+ case 'boolean':
+ return (v) ? 'TRUE' : 'FALSE';
+ case 'string':
+ return "'" + v.replace (this.regexp, this.replaceFunc) + "'";
+ case 'object':
+ if (v instanceof Date)
+ return Vn.Date.strftime (v, '\'%Y-%m-%d\'');
+ default:
+ return 'NULL';
+ }
+ }
+});
diff --git a/package/usr/share/hedera-web/js/vn/builder.js b/package/usr/share/hedera-web/js/vn/builder.js
new file mode 100755
index 00000000..376055bf
--- /dev/null
+++ b/package/usr/share/hedera-web/js/vn/builder.js
@@ -0,0 +1,189 @@
+/**
+ * Loads a object from a XML specification.
+ **/
+Vn.Builder = new Class
+({
+ objectMap: {}
+ ,contexts: []
+ ,tags: {}
+ ,root: null
+
+ ,destroy: function ()
+ {
+ for (var key in this.objectMap)
+ {
+ var object = this.objectMap[key];
+
+ if (object.destroy instanceof Function)
+ this.objectMap[key].destroy ();
+ }
+ }
+
+ ,addFromXml: function (xmlDocument)
+ {
+ if (!xmlDocument)
+ return null;
+
+ this.root = xmlDocument.documentElement;
+ var html = this.loadNode (this.root, null, null, true);
+ this.resolveProperties ();
+ this.contexts = [];
+ return html;
+ }
+
+ ,loadNode: function (node, parent, htmlParent, firstCall)
+ {
+ var klass = null;
+ var tagName = null;
+ var htmlNode = null;
+ var context = null;
+
+ if (node.tagName)
+ {
+ tagName = node.tagName.toLowerCase ();
+ klass = Vn.customTags[tagName];
+ }
+
+ if (klass)
+ {
+ var object = new klass ();
+ var nodeId = node.getAttribute ('id');
+
+ if (htmlParent && object instanceof Htk.Widget)
+ {
+ if (nodeId)
+ object.node.id = nodeId;
+
+ htmlParent.appendChild (object.node);
+ }
+
+ if (nodeId)
+ this.objectMap[nodeId] = object;
+
+ if (!this.tags[tagName])
+ this.tags[tagName] = [];
+
+ this.tags[tagName].push (object);
+
+ context = {
+ node: node
+ ,parent: parent
+ ,object: object
+ ,klass: klass
+ };
+ this.contexts.push (context);
+ }
+ else if (htmlParent || firstCall)
+ {
+ if (tagName)
+ {
+ htmlNode = document.createElement (tagName);
+
+ var a = node.attributes;
+
+ for (var i = 0; i < a.length; i++)
+ htmlNode.setAttribute (a[i].nodeName, a[i].nodeValue);
+ }
+ else
+ htmlNode = document.importNode (node, false);
+
+ if (htmlParent)
+ htmlParent.appendChild (htmlNode);
+ }
+
+ if (node.tagName)
+ {
+ var childs = node.childNodes;
+
+ if (childs)
+ for (var i = 0; i < childs.length; i++)
+ this.loadNode (childs[i], context, htmlNode, false);
+ }
+
+ return htmlNode;
+ }
+
+ ,replaceFunc: function (token)
+ {
+ return token.charAt(1).toUpperCase ();
+ }
+
+ ,resolveProperties: function ()
+ {
+ for (var i = 0; i < this.contexts.length; i++)
+ {
+ var c = this.contexts[i];
+ var a = c.node.attributes;
+
+ for (var j = 0; j < a.length; j++)
+ {
+ var prop = a[j].nodeName.replace (/-./g, this.replaceFunc);
+ this.setProperty (c, prop, a[j].nodeValue);
+ }
+
+ if (c.parent)
+ {
+ var parentProperty = c.node.getAttribute ('property');
+
+ if (!parentProperty)
+ parentProperty = c.parent.klass.Child;
+
+ if (parentProperty)
+ this.setProperty (c.parent, parentProperty, c.object);
+
+ if (c.klass.Parent)
+ this.setProperty (c, c.klass.Parent, c.parent.object);
+ }
+
+ c.object.loadXml (this, c.node);
+ }
+ }
+
+ ,setProperty: function (c, propName, value)
+ {
+ var prop = c.klass.Properties[propName];
+
+ if (!prop || !value)
+ return;
+
+ switch (prop.type)
+ {
+ case Boolean:
+ value = (/^(true|1)$/i).test (value);
+ break;
+ case Number:
+ value = 0 + new Number (value);
+ break;
+ case String:
+ case Function:
+ break;
+ default:
+ if (prop.type instanceof Function)
+ {
+ if (typeof value == 'string')
+ value = this.get (value);
+ if (!(value instanceof prop.type))
+ return;
+ }
+ else if (prop.enumType)
+ value = prop.enumType[value];
+ }
+
+ if (value !== undefined)
+ c.object[propName] = value;
+ }
+
+ ,get: function (objectId)
+ {
+ return this.objectMap[objectId];
+ }
+
+ ,getObjects: function (tagName)
+ {
+ if (this.tags[tagName])
+ return this.tags[tagName];
+
+ return [];
+ }
+});
+
diff --git a/package/usr/share/hedera-web/js/vn/cookie.js b/package/usr/share/hedera-web/js/vn/cookie.js
new file mode 100755
index 00000000..9f971032
--- /dev/null
+++ b/package/usr/share/hedera-web/js/vn/cookie.js
@@ -0,0 +1,71 @@
+/**
+ * Brownser cookie handler.
+ **/
+Vn.Cookie =
+{
+ set: function (key, value, days)
+ {
+ var strCookie = key + '=' + value + ';';
+
+ if (days != undefined)
+ {
+ var date = new Date ();
+ date.setTime (date.getTime () + days * 86400000);
+ strCookie += 'expires=' + date.toGMTString ();
+ }
+
+ document.cookie = strCookie;
+ }
+
+ ,unset: function (key)
+ {
+ this.set (key, '', -1);
+ }
+
+ ,get: function (key)
+ {
+ var cookie = new String (document.cookie);
+ var start = cookie.indexOf (key + '=');
+
+ if (start != -1)
+ {
+ var end;
+
+ start += key.length + 1;
+ end = cookie.indexOf (';', start);
+
+ if (end > 0)
+ return cookie.substring (start, end);
+ else
+ return cookie.substring (start);
+ }
+
+ return null;
+ }
+
+ ,getInt: function (key)
+ {
+ var value = this.get (key);
+
+ if (value != null)
+ return parseInt (value);
+
+ return null;
+ }
+
+ ,getFloat: function (key)
+ {
+ var value = Cookie.get (key);
+
+ if (value != null)
+ return parseFloat (value);
+
+ return null;
+ }
+
+ ,check: function (key)
+ {
+ return this.get (key) != null;
+ }
+};
+
diff --git a/package/usr/share/hedera-web/js/vn/date.js b/package/usr/share/hedera-web/js/vn/date.js
new file mode 100755
index 00000000..07bf5e64
--- /dev/null
+++ b/package/usr/share/hedera-web/js/vn/date.js
@@ -0,0 +1,122 @@
+/**
+ * Date handling utilities.
+ **/
+
+Date.prototype.clone = function ()
+{
+ return new Date (this.getTime ());
+}
+
+Vn.Date =
+{
+ WDays:
+ [
+ _('Sunday')
+ ,_('Monday')
+ ,_('Tuesday')
+ ,_('Wednesday')
+ ,_('Thursday')
+ ,_('Friday')
+ ,_('Saturday')
+ ]
+ ,AbrWDays:
+ [
+ _('Su')
+ ,_('Mo')
+ ,_('Tu')
+ ,_('We')
+ ,_('Th')
+ ,_('Fr')
+ ,_('Sa')
+ ]
+ ,Months:
+ [
+ _('January')
+ ,_('February')
+ ,_('March')
+ ,_('April')
+ ,_('May')
+ ,_('June')
+ ,_('July')
+ ,_('August')
+ ,_('September')
+ ,_('October')
+ ,_('November')
+ ,_('December')
+ ]
+ ,AbrMonths:
+ [
+ _('Jan')
+ ,_('Feb')
+ ,_('Mar')
+ ,_('Apr')
+ ,_('May')
+ ,_('Jun')
+ ,_('Jul')
+ ,_('Ago')
+ ,_('Sep')
+ ,_('Oct')
+ ,_('Nov')
+ ,_('Dec')
+ ]
+
+ ,regexp: new RegExp ('%[a-zA-Z]', 'g')
+
+ ,pad: function (number)
+ {
+ if (number < 10)
+ return '0'+ number.toString ();
+
+ return number.toString ();
+ }
+
+ ,regexpFunc: function (d, token)
+ {
+ switch (token.charAt (1))
+ {
+ // Minutes with 2 digits
+ case 'M': return this.pad (d.getMinutes ());
+
+ // Hour with 2 digits in 24 hour format
+ case 'H': return this.pad (d.getHours ());
+
+ // Complete time
+ case 'T': return d.toLocaleTimeString ();
+
+ // Complete week day name
+ case 'A': return this.WDays[d.getDay ()];
+
+ // Abreviated week day name
+ case 'a': return this.AbrWDays[d.getDay ()];
+
+ // Day of month with 2 digits
+ case 'd': return this.pad (d.getDate ());
+
+ // Day of month
+ case 'e': return d.getDate ();
+
+ // Complete month name
+ case 'B': return this.Months[d.getMonth ()];
+
+ // Abreviated month name
+ case 'b': return this.AbrMonths[d.getMonth ()];
+
+ // Month number with 2 digits
+ case 'm': return this.pad (d.getMonth () + 1);
+
+ // Year with 4 digits
+ case 'Y': return d.getFullYear ();
+ }
+
+ return token;
+ }
+
+ ,strftime: function (date, format)
+ {
+ if (!date)
+ return '';
+
+ return format.replace (this.regexp, this.regexpFunc.bind (this, date));
+ }
+};
+
diff --git a/package/usr/share/hedera-web/js/vn/error.js b/package/usr/share/hedera-web/js/vn/error.js
new file mode 100755
index 00000000..9980d59e
--- /dev/null
+++ b/package/usr/share/hedera-web/js/vn/error.js
@@ -0,0 +1,17 @@
+/**
+ * This class stores the database errors.
+ **/
+Vn.Error = new Class
+({
+ domain: null
+ ,code: null
+ ,message: null
+
+ ,initialize: function (domain, code, message)
+ {
+ this.domain = domain;
+ this.code = code;
+ this.message = message;
+ }
+});
+
diff --git a/package/usr/share/hedera-web/js/vn/hash-link.js b/package/usr/share/hedera-web/js/vn/hash-link.js
new file mode 100755
index 00000000..477ea258
--- /dev/null
+++ b/package/usr/share/hedera-web/js/vn/hash-link.js
@@ -0,0 +1,88 @@
+
+Vn.HashLink = new Class
+({
+ Extends: Vn.Object
+ ,Tag: 'vn-hash-link'
+ ,Parent: 'param'
+ ,Properties:
+ {
+ param:
+ {
+ type: Vn.Param
+ ,set: function (x)
+ {
+ this.link ({_param: x}, {'changed': this.onParamChange});
+ this.onHashChange ();
+ }
+ ,get: function ()
+ {
+ return this._param;
+ }
+ },
+ hash:
+ {
+ type: Vn.Hash
+ ,set: function (x)
+ {
+ this.link ({_hash: x}, {'changed': this.onHashChange});
+ this.onHashChange ();
+ }
+ ,get: function ()
+ {
+ return this._hash;
+ }
+ },
+ key:
+ {
+ type: String
+ ,set: function (x)
+ {
+ this._key = x;
+ this.onHashChange ();
+ }
+ ,get: function ()
+ {
+ return this._key;
+ }
+ }
+ }
+
+ ,lock: false
+ ,value: null
+ ,_key: null
+
+ ,onHashChange: function ()
+ {
+ if (!this._key || !this._hash)
+ return;
+
+ var newValue = this._hash.get (this._key);
+
+ if (this.value != newValue)
+ {
+ this.value = newValue;
+ this.signalEmit ('changed');
+
+ if (this._param && !this.lock)
+ {
+ this.lock = true;
+ this._param.value = newValue;
+ this.lock = false;
+ }
+ }
+ }
+
+ ,onParamChange: function ()
+ {
+ if (this.lock)
+ return;
+
+ var map = {};
+ map[this.key] = this._param.value;
+
+ this.lock = true;
+ this._hash.add (map);
+ this.lock = false;
+ }
+});
+
diff --git a/package/usr/share/hedera-web/js/vn/hash.js b/package/usr/share/hedera-web/js/vn/hash.js
new file mode 100755
index 00000000..f5d7dfb0
--- /dev/null
+++ b/package/usr/share/hedera-web/js/vn/hash.js
@@ -0,0 +1,123 @@
+/**
+ * Class to handle the URL.
+ **/
+Vn.Hash = new Class
+({
+ Extends: Vn.Object
+
+ ,hash: null
+ ,hashMap: {}
+
+ ,initialize: function ()
+ {
+ this.hashChangedHandler = this.hashChanged.bind (this);
+ window.addEventListener ('hashchange', this.hashChangedHandler);
+ this.hashChanged ();
+ }
+
+ ,destroy: function ()
+ {
+ this.parent ();
+ window.removeEventListener ('hashchange', this.hashChangedHandler);
+ }
+
+ /**
+ * Gets the hash part of the URL.
+ *
+ * @param {string} key The variable name
+ **/
+ ,get: function (key)
+ {
+ return this.hashMap[key];
+ }
+
+ /**
+ * Sets the hash part of the URL, respecting the current hash variables.
+ *
+ * @param {Object} map A key-value map
+ **/
+ ,add: function (map)
+ {
+ var newMap = this.hashMap;
+
+ for (var key in map)
+ newMap[key] = map[key];
+
+ this.set (newMap);
+ }
+
+ /**
+ * Sets the hash part of the URL.
+ *
+ * @param {Object} map A key-value map
+ **/
+ ,set: function (map)
+ {
+ for (var key in map)
+ if (map[key] === null || map[key] === undefined)
+ delete map[key];
+
+ var newHash = this.make (map);
+
+ if (newHash !== this.hash)
+ {
+ this.hashMap = map;
+ this.putHash (newHash);
+ }
+ }
+
+ /**
+ * Creates a URL with the given hash data.
+ *
+ * @param {Object} map A key-value map
+ * @param {boolean} add %true to combine with the current map, %false otherwise
+ * @return {String} The URL
+ **/
+ ,make: function (map, add)
+ {
+ var hash = '#!';
+
+ if (add)
+ for (var key in this.hashMap)
+ if (!map[key])
+ map[key] = this.hashMap[key];
+
+ for (var key in map)
+ {
+ if (hash.length > 2)
+ hash += '&';
+
+ hash += key +'='+ map[key];
+ }
+
+ return hash;
+ }
+
+ ,putHash: function (newHash)
+ {
+ location.hash = newHash;
+ this.hash = location.hash;
+ this.signalEmit ('changed');
+ }
+
+ ,hashChanged: function ()
+ {
+ var newHash = location.hash;
+
+ if (newHash === this.hash)
+ return;
+
+ this.hashMap = {};
+ var kvPairs = newHash.substr(2).split ('&');
+
+ for (var i = 0; i < kvPairs.length; i++)
+ {
+ var kvPair = kvPairs[i].split ('=', 2);
+
+ if (kvPair[0])
+ this.hashMap[kvPair[0]] = kvPair[1];
+ }
+
+ this.putHash (newHash);
+ }
+});
diff --git a/package/usr/share/hedera-web/js/vn/locale.js b/package/usr/share/hedera-web/js/vn/locale.js
new file mode 100755
index 00000000..4a496491
--- /dev/null
+++ b/package/usr/share/hedera-web/js/vn/locale.js
@@ -0,0 +1,55 @@
+/**
+ * Class to manage the internationalization.
+ **/
+Vn.Locale =
+{
+ strings: {}
+
+ ,language: null
+
+ ,load: function (path, callback)
+ {
+ if (!this.language)
+ {
+ var language = navigator.language.substr (0, 2);
+ this.language = language ? language : 'en';
+ }
+
+ var file = 'locale/'+ this.language +'/'+ path +'.json'
+ +'?'+ Vn.Cookie.get ('hedera_version');
+
+ var request = new XMLHttpRequest ();
+ request.open ('get', file, true);
+ request.onreadystatechange = this.loadDone.bind (this, request, callback);
+ request.send ();
+ }
+
+ ,loadDone: function (request, callback)
+ {
+ if (request.readyState != 4)
+ return;
+
+ if (request.status == 200)
+ try {
+ this.add (eval ('('+ request.responseText +')'));
+ }
+ catch (e) {
+ console.log (e);
+ }
+
+ callback ();
+ }
+
+ ,add: function (strings)
+ {
+ for (var stringId in strings)
+ this.strings[stringId] = strings[stringId];
+ }
+}
+
+function _(stringId)
+{
+ var string = Vn.Locale.strings[stringId];
+ return (string) ? string : stringId;
+}
+
diff --git a/package/usr/share/hedera-web/js/vn/main.js b/package/usr/share/hedera-web/js/vn/main.js
new file mode 100755
index 00000000..c5ca855d
--- /dev/null
+++ b/package/usr/share/hedera-web/js/vn/main.js
@@ -0,0 +1,132 @@
+/**
+ * The main namespace.
+ **/
+var Vn =
+{
+ Config: {}
+ ,jsIncludes: {}
+ ,cssIncludes: {}
+ ,customTags: {}
+ ,head: document.getElementsByTagName ('head')[0]
+
+ /**
+ * Includes a new CSS stylesheet in the current document, if the stylesheet
+ * its already included, does nothing.
+ *
+ * @param {string} fileName The stylesheet file name
+ **/
+ ,includeCss: function (fileName)
+ {
+ var cssData = this.cssIncludes[fileName];
+
+ if (!cssData)
+ {
+ var link = document.createElement ('link');
+ link.rel = 'stylesheet';
+ link.type = 'text/css';
+ link.href = fileName +'?'+ Vn.Cookie.get ('hedera_version');
+ this.head.appendChild (link);
+
+ this.cssIncludes[fileName] =
+ {
+ included: true
+ ,link: link
+ };
+ }
+ else if (!cssData.included)
+ {
+ this.head.appendChild (cssData.link);
+ cssData.included = true;
+ }
+ }
+
+ /**
+ * Excludes a CSS stylesheet from the current document.
+ *
+ * @param {string} fileName The stylesheet file name
+ **/
+ ,excludeCss: function (fileName)
+ {
+ var cssData = this.cssIncludes[fileName];
+
+ if (cssData && cssData.included)
+ {
+ this.head.removeChild (cssData.link);
+ cssData.included = false;
+ }
+ }
+
+ /**
+ * Includes a new Javascript in the current document, if the script
+ * its already included, does nothing.
+ *
+ * @param {string} fileName The script file name
+ * @param {Function} callback The function to call when script is
+ * downloaded and included
+ **/
+ ,includeJs: function (fileName, callback, skipVersion)
+ {
+ var includeData = this.jsIncludes[fileName];
+
+ if (includeData === undefined)
+ {
+ var src = fileName;
+
+ if (!skipVersion)
+ src = src +'?'+ Vn.Cookie.get ('hedera_version');
+
+ var script = document.createElement ('script');
+ script.type = 'text/javascript';
+ script.src = src;
+
+ includeData = {
+ script: script
+ ,callbacks: []
+ ,loaded: false
+ };
+
+ if (callback)
+ includeData.callbacks.push (callback);
+
+ script.onload =
+ this.jsLoaded.bind (this, includeData);
+ script.onreadystatechange =
+ this.jsStateChanged.bind (this, includeData);
+
+ this.jsIncludes[fileName] = includeData;
+
+ this.head.appendChild (script);
+ }
+ else if (callback)
+ {
+ if (includeData.loaded)
+ callback ();
+ else
+ includeData.callbacks.push (callback);
+ }
+ }
+
+ ,jsStateChanged: function (includeData)
+ {
+ if (includeData.script.readyState == 'complete')
+ this.jsLoaded (includeData);
+ }
+
+ ,jsLoaded: function (includeData)
+ {
+ if (includeData.loaded)
+ return;
+
+ for (var i = 0; i < includeData.callbacks.length; i++)
+ includeData.callbacks[i] ();
+
+ includeData.loaded = true;
+ includeData.callbacks = null;
+ }
+
+ ,get: function (id)
+ {
+ return document.getElementById (id);
+ }
+};
+
diff --git a/package/usr/share/hedera-web/js/vn/main.php b/package/usr/share/hedera-web/js/vn/main.php
new file mode 100755
index 00000000..9d7c422e
--- /dev/null
+++ b/package/usr/share/hedera-web/js/vn/main.php
@@ -0,0 +1,25 @@
+
diff --git a/package/usr/share/hedera-web/js/vn/mutators.js b/package/usr/share/hedera-web/js/vn/mutators.js
new file mode 100755
index 00000000..bd42db9c
--- /dev/null
+++ b/package/usr/share/hedera-web/js/vn/mutators.js
@@ -0,0 +1,45 @@
+
+Class.Mutators.Tag = function (tagName)
+{
+ Vn.customTags[tagName] = this;
+
+ if (this.parent)
+ {
+ this.implement ({Parent: this.parent.Parent});
+ this.implement ({Child: this.parent.Child});
+ this.implement ({Properties: {}});
+ }
+
+ this.extend ({Tag: tagName});
+};
+
+Class.Mutators.Properties = function (props)
+{
+ var parentProps;
+
+ for (var propName in props)
+ {
+ var prop = props[propName];
+
+ if (!prop.get && !prop.set && prop.writable === undefined)
+ prop.writable = true;
+ }
+
+ if (this.parent && (parentProps = this.parent.Properties))
+ for (var propName in parentProps)
+ props[propName] = parentProps[propName];
+
+ this.extend ({Properties: props});
+ Object.defineProperties (this.prototype, props);
+};
+
+Class.Mutators.Parent = function (propName)
+{
+ this.extend ({Parent: propName});
+};
+
+Class.Mutators.Child = function (propName)
+{
+ this.extend ({Child: propName});
+};
+
diff --git a/package/usr/share/hedera-web/js/vn/node.js b/package/usr/share/hedera-web/js/vn/node.js
new file mode 100755
index 00000000..0273a9d8
--- /dev/null
+++ b/package/usr/share/hedera-web/js/vn/node.js
@@ -0,0 +1,23 @@
+Vn.Node =
+{
+ removeChilds: function (node)
+ {
+ var childs = node.childNodes;
+
+ while (childs.length > 0)
+ node.removeChild (childs[0]);
+ }
+
+ ,remove: function (node)
+ {
+ node.parentNode.removeChild (node);
+ }
+
+ ,setText: function (node, text)
+ {
+ Vn.Node.removeChilds (node);
+
+ if (text)
+ node.appendChild (document.createTextNode (text));
+ }
+};
diff --git a/package/usr/share/hedera-web/js/vn/object.js b/package/usr/share/hedera-web/js/vn/object.js
new file mode 100755
index 00000000..ea40b22e
--- /dev/null
+++ b/package/usr/share/hedera-web/js/vn/object.js
@@ -0,0 +1,133 @@
+/**
+ * The main base class. Manages the signal system.
+ *
+ * @param signals Map with all connected signal handlers
+ **/
+Vn.Object = new Class
+({
+ Tag: 'vn-object'
+ ,Properties: {}
+ ,signals: {}
+
+ ,initialize: function (props)
+ {
+ for (var prop in props)
+ this[prop] = props[prop];
+ }
+
+ ,loadXml: function (builder, node)
+ {
+ return null;
+ }
+
+ /**
+ * Conects a signal with a function.
+ *
+ * @param {String} id The signal identifier
+ * @param {Function} callback The callback
+ * @param {Object} instance The instance
+ **/
+ ,on: function (id, callback, instance)
+ {
+ if (!this.signals[id])
+ this.signals[id] = [];
+
+ this.signals[id].push
+ ({
+ blocked: false
+ ,callback: callback
+ ,instance: instance
+ });
+ }
+
+ /**
+ * Locks/Unlocks a signal emission to the specified object.
+ *
+ * @param {String} id The signal identifier
+ * @param {Function} callback The callback
+ * @param {Boolean} block %true for lock the signal, %false for unlock
+ **/
+ ,blockSignal: function (id, callback, block)
+ {
+ var callbacks = this.signals[id];
+
+ if (!callbacks)
+ return;
+
+ for (var i = 0; i < callbacks.length; i++)
+ if (callbacks[i].callback == callback)
+ callbacks[i].blocked = block;
+ }
+
+ /**
+ * Emits a signal in the current object.
+ *
+ * @param {String} id The signal identifier
+ **/
+ ,signalEmit: function (id)
+ {
+ var callbacks = this.signals[id];
+
+ if (!callbacks)
+ return;
+
+ var callbackArgs = [];
+ callbackArgs.push (this);
+
+ for (var i = 1; i < arguments.length; i++)
+ callbackArgs.push (arguments[i]);
+
+ for (var i = 0; i < callbacks.length; i++)
+ if (!callbacks[i].blocked)
+ callbacks[i].callback.apply (callbacks[i].instance, callbackArgs);
+ }
+
+ /**
+ * Disconnects a signal from current object.
+ *
+ * @param {String} id The signal identifier
+ * @param {Function} callback The connected callback
+ * @param {Object} instance The instance
+ **/
+ ,disconnect: function (id, callback, instance)
+ {
+ var callbacks = this.signals[id];
+
+ if (!callbacks)
+ return;
+
+ for (var i = 0; i < callbacks.length; i++)
+ if (callbacks[i].callback == callback
+ && callbacks[i].instance == instance)
+ callbacks.splice (i--, 1);
+ }
+
+ /**
+ * Destroys the object, this method should only be called before losing
+ * the last reference to the object.
+ **/
+ ,destroy: function ()
+ {
+ delete this.signals;
+ }
+
+ ,link: function (prop, handlers)
+ {
+ for (var key in prop)
+ {
+ var newObject = prop[key];
+ var oldObject = this[key];
+
+ if (oldObject)
+ for (var signal in handlers)
+ oldObject.disconnect (signal, handlers[signal], this);
+
+ this[key] = newObject;
+
+ if (newObject)
+ for (var signal in handlers)
+ newObject.on (signal, handlers[signal], this);
+ }
+ }
+});
+
diff --git a/package/usr/share/hedera-web/js/vn/param.js b/package/usr/share/hedera-web/js/vn/param.js
new file mode 100755
index 00000000..72cbf248
--- /dev/null
+++ b/package/usr/share/hedera-web/js/vn/param.js
@@ -0,0 +1,65 @@
+/**
+ * Simply a linkable value holder.
+ **/
+Vn.Param = new Class
+({
+ Extends: Vn.Object
+ ,Tag: 'vn-param'
+ ,Properties:
+ {
+ value:
+ {
+ type: Object
+ ,set: function (x)
+ {
+ if (Vn.Value.compare (x, this._value))
+ return;
+
+ if (x instanceof Date)
+ x = x.clone ();
+
+ this._value = x;
+
+ if (this._master && !this.masterLock)
+ {
+ this.masterLock = true;
+ this._master.value = x;
+ this.masterLock = false;
+ }
+
+ this.signalEmit ('changed');
+ }
+ ,get: function ()
+ {
+ return this._value;
+ }
+ },
+ master:
+ {
+ type: Vn.Param
+ ,set: function (x)
+ {
+ this.link ({_master: x}, {'changed': this.onMasterChange});
+ this.onMasterChange ();
+ }
+ ,get: function ()
+ {
+ return this._master;
+ }
+ }
+ }
+
+ ,_value: undefined
+ ,_master: null
+ ,masterLock: false
+
+ ,onMasterChange: function ()
+ {
+ if (this.masterLock)
+ return;
+
+ this.masterLock = true;
+ this.value = this._master.value;
+ this.masterLock = false;
+ }
+})
diff --git a/package/usr/share/hedera-web/js/vn/url.js b/package/usr/share/hedera-web/js/vn/url.js
new file mode 100755
index 00000000..5371b8bd
--- /dev/null
+++ b/package/usr/share/hedera-web/js/vn/url.js
@@ -0,0 +1,74 @@
+/**
+ * Class to handle the URL.
+ **/
+Vn.Url =
+{
+ /**
+ * Gets the value of a URL variable.
+ *
+ * @param {string} key The variable name
+ **/
+ getQuery: function (key)
+ {
+ var regExp = new RegExp ('[\?\&]'+ key +'=([^\&]*)(\&?)', 'i');
+ var value = location.search.match (regExp);
+
+ return value ? value[1] : value;
+ }
+
+ /**
+ * Sets the value of a URL variable.
+ *
+ * @param {string} key The variable name
+ * @param {string} value The new value
+ **/
+ ,setQuery: function (key, value)
+ {
+ var changed = true;
+ var found = false;
+ var newPair = key +'='+ value;
+ var kvPairs = location.search.substr(1).split ('?');
+
+ for (var i = 0; i < kvPairs.length; i++)
+ {
+ var kvPair = kvPairs[i].split ('=', 1);
+
+ if (kvPair[0] == key)
+ {
+ if (kvPair[1] != value)
+ kvPairs.splice (i, 1, newPair);
+ else
+ changed = false;
+
+ found = true;
+ break;
+ }
+ }
+
+ if (!found)
+ kvPairs.push (newPair);
+
+ if (changed)
+ document.location.hash = '?'+ kvPairs.join ('&');
+ }
+
+ ,makeUri: function (map)
+ {
+ var post = '';
+
+ for (var key in map)
+ {
+ var value = map[key];
+
+ if (post.length > 2)
+ post += '&';
+
+ if (typeof value == 'boolean')
+ value = new Number (value);
+
+ post += key +'='+ encodeURIComponent (value);
+ }
+
+ return post;
+ }
+};
diff --git a/package/usr/share/hedera-web/js/vn/value.js b/package/usr/share/hedera-web/js/vn/value.js
new file mode 100755
index 00000000..541eb73a
--- /dev/null
+++ b/package/usr/share/hedera-web/js/vn/value.js
@@ -0,0 +1,48 @@
+
+Vn.Value =
+{
+ regexpNumber: /%\.([0-9]+)d/g
+ ,regexpString: /%s/g
+
+ ,compare: function (a, b)
+ {
+ if (a === b)
+ return true;
+ if (typeof a === typeof b && a instanceof Date)
+ return a.getTime () === b.getTime ();
+
+ return false;
+ }
+
+ ,format: function (value, format)
+ {
+ if (value === null || value === undefined)
+ return '';
+
+ if (format)
+ switch (typeof value)
+ {
+ case 'number':
+ return format.replace (this.regexpNumber,
+ this.replaceNumber.bind (null, value));
+ case 'string':
+ return format.replace (this.regexpString,
+ this.replaceString.bind (null, value));
+ case 'object':
+ if (value instanceof Date)
+ return Vn.Date.strftime (value, format);
+ }
+
+ return value;
+ }
+
+ ,replaceNumber: function (value, token, digits)
+ {
+ return new Number (value).toFixed (parseInt (digits));
+ }
+
+ ,replaceString: function (value)
+ {
+ return value;
+ }
+};
diff --git a/package/usr/share/hedera-web/locale/ca/ajax/image.json b/package/usr/share/hedera-web/locale/ca/ajax/image.json
new file mode 100755
index 00000000..21f09f26
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/ca/ajax/image.json
@@ -0,0 +1,11 @@
+{
+ "BadFileFormat": "Format d'arxiu no reconegut"
+ ,"FileNotChoosed": "No ha seleccionat cap arxiu"
+ ,"PermissionDenied": "No disposa de permisos per a putjar el fitxer"
+ ,"FileUploadError": "Error al putjar el fitxer, comprovi que el seu tamany no sigui massa gran"
+ ,"FileSaveError": "Error al guardar el fitxer: %s"
+ ,"FileSizeError": "El fitxer no deu ocupar més de %.2f MB"
+ ,"BadFileName": "Solament és possible utilitzar lletres minúscules, digits o el caracter '_' al nom de l'arxiu"
+ ,"ComError": "Error en la comunicació amb el servidor"
+ ,"ImageOpenError": "Error al obrir l'arxiu d'imatge"
+}
diff --git a/package/usr/share/hedera-web/locale/ca/ajax/query.json b/package/usr/share/hedera-web/locale/ca/ajax/query.json
new file mode 100755
index 00000000..3bc546a6
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/ca/ajax/query.json
@@ -0,0 +1,5 @@
+{
+ "InvalidAction": "Acció invàlida"
+
+ ,"EmptyQuery": "Consulta buida"
+}
diff --git a/package/usr/share/hedera-web/locale/ca/js/db.js b/package/usr/share/hedera-web/locale/ca/js/db.js
new file mode 100755
index 00000000..1542f2c2
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/ca/js/db.js
@@ -0,0 +1,9 @@
+Vn.Locale.add
+({
+ "ConnError": "Error en la conexió"
+ ,"InternalError": "S'ha produït un error intern"
+ ,"BadServerReply": "Resposta del servidor incorrecta"
+ ,"ModelNotUpdatable": "Aquest model no és actualitzable"
+ ,"RowNotExists": "El registre no existeix o ha sigut esborrat"
+ ,"ColNotExists": "La columna no existeix"
+});
diff --git a/package/usr/share/hedera-web/locale/ca/js/htk.js b/package/usr/share/hedera-web/locale/ca/js/htk.js
new file mode 100755
index 00000000..1d9366b7
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/ca/js/htk.js
@@ -0,0 +1,24 @@
+Vn.Locale.add
+({
+ "True": "Sí"
+ ,"False": "No"
+ ,"Null": "Nul"
+ ,"ChangeDate": "Cambiar Data"
+ ,"Sort": "Ordenar"
+ ,"At": "a les"
+ ,"Of": "de"
+ ,"OfThe": "del"
+ ,"Remove": "Esborrar"
+ ,"Loading": "Carregant"
+ ,"ReallyDelete": "¿Realment dessitja esborrar la linia?"
+ ,"EmptyList": "Llistat buit"
+ ,"NoData": "Sense dades"
+ ,"ErrorLoadingData": "Error"
+ ,"Error": "Error"
+ ,"Image": "Imatge"
+ ,"File": "Arxiu"
+ ,"FileName": "Nom"
+ ,"UpdateImage": "Afegir / Actualitzar Imatge"
+ ,"UploadFile": "Putjar arxiu"
+ ,"Close": "Tancar"
+});
diff --git a/package/usr/share/hedera-web/locale/ca/js/vn.js b/package/usr/share/hedera-web/locale/ca/js/vn.js
new file mode 100755
index 00000000..fa55e123
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/ca/js/vn.js
@@ -0,0 +1,75 @@
+Vn.Locale.add
+({
+ "Sunday": "Diumenge"
+ ,"Monday": "Dilluns"
+ ,"Tuesday": "Dimarts"
+ ,"Wednesday": "Dimecres"
+ ,"Thursday": "Dijous"
+ ,"Friday": "Divendres"
+ ,"Saturday": "Dissabte"
+
+ ,"Su": "Dg"
+ ,"Mo": "Dl"
+ ,"Tu": "Dt"
+ ,"We": "Dc"
+ ,"Th": "Dj"
+ ,"Fr": "Dv"
+ ,"Sa": "Ds"
+
+ ,"January": "Gener"
+ ,"February": "Febrer"
+ ,"March": "Març"
+ ,"April": "Abril"
+ ,"May": "Maig"
+ ,"June": "Juny"
+ ,"July": "Juliol"
+ ,"August": "Agost"
+ ,"September": "Setembre"
+ ,"October": "Octubre"
+ ,"November": "Novembre"
+ ,"December": "Decembre"
+
+ ,"Jan": "Gen"
+ ,"Feb": "Febr"
+ ,"Mar": "Març"
+ ,"Apr": "Abr"
+ ,"May": "Maig"
+ ,"Jun": "Juny"
+ ,"Jul": "Jul"
+ ,"Ago": "Ag"
+ ,"Sep": "Set"
+ ,"Oct": "Oct"
+ ,"Nov": "Nov"
+ ,"Dec": "Des"
+
+ ,"AppName": "Verdnatura"
+ ,"Beta": "Beta"
+ ,"User": "Usuari"
+ ,"Password": "Contrasenya"
+ ,"Remember": "Recordar"
+ ,"Enter": "Entrar"
+ ,"Exit": "Sortir"
+ ,"Menu": "Menú"
+ ,"ErrorLoadingMod": "Error al carregar mòdul"
+ ,"YoureVisitor": "Solament esteu de visita?"
+ ,"NewVersionAvailable": "Existeix una nova versió del lloc web, ¿Desitgeu actualitzar?"
+ ,"ChangeLog": "Canvis recentes"
+ ,"CookiesNotification": "En utilitzar aquest lloc web acceptes l'ús de cookies per a la personalització de continguts i anàlisi."
+
+ ,"Home": "Inici"
+ ,"Orders": "Encàrrecs"
+ ,"Catalog": "Catàleg"
+ ,"Configuration": "Configuració"
+ ,"About": "Coneix-nos"
+ ,"Why": "Per què?"
+ ,"Location": "Localització"
+ ,"Administration": "Administració"
+ ,"Users": "Usuaris"
+ ,"Visits": "Visites"
+ ,"Agencies": "Agències"
+ ,"News": "Noticies"
+ ,"Contact": "Vull ser client"
+
+ ,"SessionExpired": "Ha estat massa temps inactiu i la sessió ha expirat."
+ ,"InvalidLogin": "Usuari o contrasenya incorrectes. Recorde que s'hi distingeix entre majúscula i minúscula."
+});
diff --git a/package/usr/share/hedera-web/locale/ca/modules/about.json b/package/usr/share/hedera-web/locale/ca/modules/about.json
new file mode 100755
index 00000000..e3553626
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/ca/modules/about.json
@@ -0,0 +1,47 @@
+{
+ "QualityAndVariety": "Calidad, variedad y servicio"
+
+ ,"MaximumFreshness": "Verdnatura te ofrece un producto con la máxima frescura garantizada, gracias a sus recepciones diarias de flor y planta procedentes de Holanda, Sudamérica, o desde el mismo productor."
+ ,"SquareMeters": "Más de 13.000m de instalaciones"
+ ,"AboutRealms": "Con flor cortada, verdes, artificial y complementos"
+ ,"AboutLocation": "Asentados en Valencia, Madrid, Barcelona, Holanda y Francia, ofrecemos venta directa en nuestras instalaciones y reparto a toda España mediante servicio propio o agencia."
+ ,"PurchaseThroughWeb": "Compra a través de nuestra web y recibe tu pedido cómodamente en tu floristería. ¡En menos de 24 horas!"
+
+ ,"WhatMakeUsDifferent": "¿Que nos hace diferentes?"
+
+ ,"DesignVariety": "La variedad en el diseño, la calidad de los materiales utilizados y nuestro servicio de reparto, te garantizan un muestrario de género dinámico, siempre fresco y atractivo."
+ ,"AdaptToYourNeeds": "Verdnatura se adapta a las necesidades de cada cliente ofreciéndole un amplio abanico de productos, garantizado siempre."
+ ,"TheBestQuality": "La mejor calidad al mejor precio. Sin olvidar nunca el diseño."
+
+ ,"AtYourService": "Estamos a tu servicio"
+
+ ,"BuyersAndTraders": "9 compradores especializados y nuestros 20 comerciales te asesorarán en todo lo que necesites."
+
+ ,"Training": "Verdnatura formación"
+
+ ,"GoodTraining": "En Verdnatura sabemos que una buena formación es imprescindible para el desarrollo óptimo de cualquier actividad, y cómo no, también la de florista."
+ ,"SpecialTrainingPrices": "Para que el presupuesto de una escuela no repercuta en la calidad de su formación, colaboramos con una política de precios especiales para todas aquellas escuelas que lo soliciten realizar cursos en nuestras instalaciones de Verdnatura Silla."
+ ,"YoutubeChannel": "Y no te pierdas los vídeos de Canal Verdnatura en Youtube. Donde encontrarás un montón de consejos muy interesantes sobre el manejo de la flor."
+
+ ,"HowWeWork": "¿Cómo trabajamos?"
+
+ ,"FirstQualityControl": "1º control de calidad"
+ ,"SecondQualityControl": "2º control de calidad"
+ ,"ThirdQualityControl": "3º control de calidad"
+ ,"FourthQualityControl": "4º control de calidad"
+
+ ,"AalsmeerAuction": "Alas 5:00h, nuestros responsables de compras adquieren, en la subasta de Aalsmeer y Noaldwijk, el género que el productor ha cosechado el día anterior."
+ ,"BeforeAuction": "Tras su compra, este género entra rápidamente en Verdnatura Holland BV, nuestra empresa de Flora Holland, en Aalsmeer."
+ ,"DirectlyFromProviders": "Además de comprar a través de la subasta Holandesa, también compramos directamente a productores de Colombia, Ecuador, Thailandia, Malasia, África y Australia. Estos productos son supervisados directamente por nuestros delegados de compra ubicados en cada zona. Esta mercancía viajará a Amsterdam, sometida a un proceso de Vaacum y en menos de dos horas desde su aterrizaje, estará en nuestras instalaciones de Aalsmeer."
+ ,"GoodsDischarge": "A las 7:00h nuestros compañeros de Aalsmeer empiezan a recibir la mercancía comprada, pasando un primer control de calidad, y dándola de alta en nuestro stock. Ya está disponible para nuestros clientes en la web."
+ ,"GoodsTravel": "La mercancía viaja durante día y medio en camiones con compartimentos estancos a temperaturas diferentes, de manera que no se rompa la cadena de frío y viaje en las mejores condiciones."
+ ,"GoodsReception": "A la recepción de la mercancía el responsable de su compra revisa el estado en el que llega, aceptándola o rechazándola según el caso, se descarga en frío y rápidamente entra en nuestra cámara."
+ ,"CustomerOrders": "Nuestros clientes pueden hacer sus pedidos a través de la web, por teléfono o viniendo directamente a nuestras instalaciones. Tenemos un equipo de comerciales especializados que te asesorará en tu compra y que te informará de las novedades y artículos que puedan ser de tu interés, de forma que tu compra se ajuste a tus necesidades y quedes totalmente satisfecho."
+ ,"AfterOrder": "Una vez realizado el pedido, pasa al departamento de producción. Durante la preparación de este se realiza un nuevo control de calidad (el tercero) en el que se desechará la mercancía deficiente."
+ ,"BuyerControl": "En cuanto se finaliza la preparación, se realiza un nuevo control (el cuarto) donde un especialista cuenta y revisa el estado de los productos. En caso de que estos no cumplan con los estándares de calidad exigidos los rechaza y los sustituye por los adecuados."
+ ,"EmbeddedSection": "Seguidamente se lleva a la sección de encajado, donde el pedido es acondicionado para su correcta entrega. Cada tipo de entrega requiere un método de encajado adecuado para que el género viaje protegido y llegue al cliente en perfectas condiciones."
+ ,"AfterEmbedAgency": "En cuanto el producto ha sido encajado se almacena de nuevo en la cámara hasta su salida por agencia o por reparto propio, recibiéndolo el cliente, en 24h en el caso de la agencia o el mismo día en el caso del reparto, cómodamente en su domicilio."
+ ,"FreshnessGuaranteed": "Esta forma de trabajo garantiza la mayor frescura por la rapidez los procesos y por el mantenimiento de la cadena de frío desde compra hasta su recepción por nuestro cliente."
+
+ ,"AboutSummary": "75 personas repartidas por casi todo el mundo para que nuestro cliente tenga el más amplio catálogo del sector, la flor más fresca, la planta más novedosa, los complementos más actuales, y el servicio más rápido posible."
+}
diff --git a/package/usr/share/hedera-web/locale/ca/modules/access.json b/package/usr/share/hedera-web/locale/ca/modules/access.json
new file mode 100644
index 00000000..811c8490
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/ca/modules/access.json
@@ -0,0 +1,15 @@
+{
+ "AccessLog": "Registre d'accessos"
+
+ ,"UserNumber:": "N d'usuari:"
+ ,"User:": "Usuari:"
+ ,"Phone:": "Telèfon:"
+ ,"Mobile:": "Mòbil:"
+
+ ,"Access": "Accés"
+ ,"OS": "SO"
+ ,"Browser": "Navegador"
+ ,"Version": "Versió"
+ ,"Javascript": "Javascript"
+ ,"Cookies": "Cookies"
+}
diff --git a/package/usr/share/hedera-web/locale/ca/modules/account.json b/package/usr/share/hedera-web/locale/ca/modules/account.json
new file mode 100755
index 00000000..fee51e3e
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/ca/modules/account.json
@@ -0,0 +1,11 @@
+{
+ "PasswordsChanged": "Contrasenya modificada!"
+ ,"PasswordsDoesntMatch": "Les contrasenyes no coincideixen!"
+ ,"Configuration": "Configuració"
+ ,"UserNumber": "N d'usuari:"
+ ,"UserName": "Nom d'usuari:"
+ ,"Password": "Contrasenya:"
+ ,"Email": "Correu electrònic:"
+ ,"Billing": "Facturació"
+ ,"BillingByEmail": "Enviar factures per correu electrònic"
+}
diff --git a/package/usr/share/hedera-web/locale/ca/modules/agencies.json b/package/usr/share/hedera-web/locale/ca/modules/agencies.json
new file mode 100755
index 00000000..5733fe9b
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/ca/modules/agencies.json
@@ -0,0 +1,16 @@
+{
+ "ListByAgency": "Llistat de paquets per agència"
+
+ ,"ShowByProvince": "Mostrar desglose per província"
+ ,"Agency": "Agència"
+ ,"Exps": "Exps"
+ ,"Bundles": "Paquets"
+ ,"Prevision": "Previsió"
+
+ ,"ByProvince": "Desglose per província"
+
+ ,"SelectAgency": "Seleccione una agència al llistat de l'esquerra"
+ ,"Province": "Província"
+ ,"Expeditions": "Expedicions"
+ ,"Left": "Falten"
+}
diff --git a/package/usr/share/hedera-web/locale/ca/modules/catalog.json b/package/usr/share/hedera-web/locale/ca/modules/catalog.json
new file mode 100755
index 00000000..39222fc1
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/ca/modules/catalog.json
@@ -0,0 +1,28 @@
+{
+ "SelectFamily": "Seleccione família"
+ ,"SelectSubtype": "Per favor, seleccione el subtipus al menú de la dreta"
+ ,"ArticleNotFound": "Artcle no trobat"
+ ,"ArticleNotAvailable": "Article no disponible"
+
+ ,"StartOrder": "Començar encàrrec"
+ ,"ShoppingBasket": "Veure la cistella de la compra"
+
+ ,"Realm": "Família"
+ ,"Subtype": "Subtipus"
+ ,"Search:": "Cercar:"
+ ,"Date:": "Data:"
+ ,"Warehouse:": "Magatzem:"
+
+ ,"Amount": "Quant"
+ ,"Aval": "Disp"
+ ,"Name": "Nom"
+ ,"S1": "Mes"
+ ,"S2": "S2"
+ ,"Stems": "Tiges"
+ ,"Cat": "Cat"
+ ,"Pack": "Pack"
+ ,"Origin": "Origen"
+ ,"AstPrice": "* Preu"
+
+ ,"FixedPrices": "* Els preus resaltats en verd són fixes, la resta són orientatius."
+}
diff --git a/package/usr/share/hedera-web/locale/ca/modules/contact.json b/package/usr/share/hedera-web/locale/ca/modules/contact.json
new file mode 100755
index 00000000..7a9d405b
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/ca/modules/contact.json
@@ -0,0 +1,20 @@
+{
+ "IWantCustomer": "Vull ser client!"
+
+ ,"FillFormData": "Ompliu el formulari amb les seves dades i en breu ens posarem en contacte amb vostè."
+ ,"OrCallUs": "O si ho prefereix truqui al 963 242 100."
+ ,"AllFieldsMandatory": "* Tots els camps són obligatoris."
+
+ ,"Name:": "Nom:"
+ ,"Surname:": "Cognoms:"
+ ,"EMail:": "Correu electrònic:"
+ ,"Message:": "Missatge:"
+ ,"Address:": "Adreça:"
+ ,"PC:": "Codi postal:"
+ ,"City:": "Ciutat:"
+ ,"Phone:": "Telèfon:"
+ ,"Send": "Enviar dades"
+
+ ,"DataSentSuccess": "Les seves dades han estat enviades correctament. En breu ens posarem en contacte amb vostè."
+ ,"ErrorSendingData": "Un error en enviar les seves dades. Si us plau, comprovi que ha omplert tots els camps i que ha introduït el codi antispam correctament."
+}
diff --git a/package/usr/share/hedera-web/locale/ca/modules/home.json b/package/usr/share/hedera-web/locale/ca/modules/home.json
new file mode 100755
index 00000000..0355e621
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/ca/modules/home.json
@@ -0,0 +1,13 @@
+{
+ "Sent": "Enviat"
+ ,"Author": "Autor"
+ ,"votes": "vots"
+ ,"NoAnswerSelected": "No ha seleccionat cap resposta"
+ ,"ThanksForVote": "Gràcias por el seu vot!"
+ ,"Vote": "Votar"
+ ,"Total": "Total"
+ ,"BrownserRecommend":
+ "Verdnatura li recomana utilitzar el navegador web Mozilla Firefox per a obtindre tota la funcionalitat del nostre lloc web."
+ ,"PressHere": "Polse ací per a descarregar Firefox"
+}
+
diff --git a/package/usr/share/hedera-web/locale/ca/modules/links.json b/package/usr/share/hedera-web/locale/ca/modules/links.json
new file mode 100755
index 00000000..251fbba7
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/ca/modules/links.json
@@ -0,0 +1,4 @@
+{
+ "Module": "Mòdul"
+ ,"Description": "Descripció"
+}
diff --git a/package/usr/share/hedera-web/locale/ca/modules/location.json b/package/usr/share/hedera-web/locale/ca/modules/location.json
new file mode 100755
index 00000000..eb6899d5
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/ca/modules/location.json
@@ -0,0 +1,3 @@
+{
+ "ShowMap": "Mostrar Mapa"
+}
diff --git a/package/usr/share/hedera-web/locale/ca/modules/new.json b/package/usr/share/hedera-web/locale/ca/modules/new.json
new file mode 100755
index 00000000..10be568f
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/ca/modules/new.json
@@ -0,0 +1,9 @@
+{
+ "AddNew": "Afegir/Editar notícia"
+
+ ,"Title:": "Títol:"
+ ,"NewBody:": "Cos:"
+
+ ,"Cancel": "Cancel"
+ ,"Accept": "Acceptar"
+}
diff --git a/package/usr/share/hedera-web/locale/ca/modules/news.json b/package/usr/share/hedera-web/locale/ca/modules/news.json
new file mode 100755
index 00000000..00f6b71a
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/ca/modules/news.json
@@ -0,0 +1,12 @@
+{
+ "NewsManagement": "Gestió de noticies"
+
+ ,"AddNew": "Afegir noticia"
+ ,"EditNew": "Edita notícia"
+
+ ,"NewNum": "N notícia"
+ ,"Date": "Data"
+ ,"Author": "Autor"
+ ,"Title": "Títol"
+ ,"Priority": "Prioritat"
+}
diff --git a/package/usr/share/hedera-web/locale/ca/modules/order.json b/package/usr/share/hedera-web/locale/ca/modules/order.json
new file mode 100755
index 00000000..7202fdb1
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/ca/modules/order.json
@@ -0,0 +1,61 @@
+{
+ "Delete": "Borrar encàrrec"
+ ,"GoToCatalog": "Accedir al catàleg"
+ ,"Checkout": "Tramitar encàrrec"
+
+ ,"OrderNumber:": "N encàrec:"
+ ,"DateExit:": "Data d'eixida:"
+ ,"Warehouse:": "Magatzem:"
+ ,"OrderTotal:": "Total encàrrec:"
+ ,"VATNotIncluded": "(IVA i transport no inclosos)"
+
+ ,"Amount": "Quant"
+ ,"Pack": "Pack"
+ ,"Stems": "Tijes"
+ ,"Avail": "Disp"
+ ,"Item": "Artícle"
+ ,"Cat": "Cat"
+ ,"S1": "Mes"
+ ,"Color": "Color"
+ ,"Origin": "Orige"
+ ,"Price": "Preu"
+ ,"Disc": "Desc"
+ ,"Subtotal": "Subtotal"
+
+ ,"GoBasket": "Tornar a la cistella"
+ ,"Confirm": "Confirmar"
+
+ ,"PayCash": "Contrareemborsament/Contat"
+ ,"PayMethod:": "Forma de pagament:"
+ ,"Notes:": "Notes:"
+ ,"SendMethod:": "Forma d'enviament:"
+ ,"Insurance": "Assegurar mercaderia: 5% de l'import de l'encàrrec (Sols per a enviament per agència)"
+
+ ,"Consignee": "Consignatari"
+ ,"Province": "Provincia"
+ ,"PC": "Codi postal"
+ ,"City": "Ciutat"
+ ,"Address": "Domicili"
+
+ ,"SureDelOrder": "Està seguro d'eliminar l'encàrrec?"
+ ,"SureConfirmOrder": "¿Dessotja confirmar el seu encàrrec?"
+ ,"OrderConfirmed": "El seu encàrrec ha sigut procesat i confirmat correctament"
+
+ ,"ClientAcceptCash": "El cliente accepta pagar Contrareemborsament/Contat"
+ ,"InetOrder": "Encàrrec realitzat per Internet"
+ ,"NoOrderFound": "No s'ha trobat cap encàrrec"
+ ,"NoArticleAdded": "No ha afegit cap article al seu encàrrec"
+ ,"OrderExceeded": "Ha excedit el nombre màxim d'encarrecs per confirmar, per favor elimine o confirme els encarrecs iniciats"
+ ,"HighQuantity": "Alguns articles ja no estan disponibles o hi ha més quantitat de la disponible, revisi els recuadres en roig"
+ ,"NoArticleAdded": "No ha seleccionat cap artícle"
+ ,"IsertOrderType": "Introduïsca el tipus d'encàrrec que dessitja"
+ ,"QuantityIntroduced": "La quantitat introduïda de"
+ ,"IsHigherThan": "és major que la quantiat disponible, per tant s'afegirà el màxim disponible"
+ ,"RoundedTo": "ha sigut arredonit, degut a que aquest artícle es ven per caixes"
+ ,"NoOrderAfterHour": "No és possible realitzar encarrecs per a hui després de les" ,"NoOrderOnHolidays": "No és possible realitzar encarrecs per a Diumenges o festius"
+ ,"DateLow": "La data d'enviament ha de ser igual o superior al dia d'avui"
+ ,"DateHigh": "La data introduïda és massa gran"
+ ,"DateUpdatedTo": "El dia d'enviament ha sigut actualitzat al"
+ ,"CreditExceeded": "Ha excedit el seu crèdit màxim permés,si dessitja confirmar l'encàrrec igualment, marqui la casella Pagament Contrareemborsament/Contat o reduïsca l'import del seu encàrrec en "
+ ,"InsuranceQuestion": "Les agencies de transport dispose d'un menor nombre de treballadors a l'estiu, per les vacances, motiu el qual pot ocasionar retards en el lliurament. A més a més, unït al calor, ha causat, en algunes ocasions, que la mercaderia no arribi en òptimes condicions. Ja que els nostres ports habituals no inclouen cap tipus d'assegurança, li oferim la possibilitat d'assegurar aquest enviament. El cost seria del 5% del valor de la mercaderia. Dessitja contracta-ho?"
+}
diff --git a/package/usr/share/hedera-web/locale/ca/modules/orders.json b/package/usr/share/hedera-web/locale/ca/modules/orders.json
new file mode 100755
index 00000000..36c949a6
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/ca/modules/orders.json
@@ -0,0 +1,34 @@
+{
+ "StartedOrdersDesc":
+ "Encarrecs pendents de confirmació."
+
+ ,"StartOrder": "Començar encàrrec"
+ ,"ContinueOrder": "Continuar encàrrec"
+ ,"OrderNumber": "N encàrrec"
+ ,"DateMake": "Data de creació"
+ ,"DateExit": "Data d'eixida"
+ ,"SendMethod": "Forma d'enviament"
+
+ ,"ConfirmedOrdersDesc":
+ "Encarrecs confirmats més recents."
+
+ ,"PendingBalance:": "Saldo pendent:"
+ ,"PaymentInfo": "Per realitzar una entrega a compte feu clic al botó de la dreta i feu el pagament a l'empresa corresponent. La quantitat que apareix és el saldo pendent a dia d'avui, no té en compte comandes del futur. Pot realitzar un lliurament a compte de la quantitat que desitgi. Si voleu pagar una comanda en concret pot prémer directament el botó de pagament de la comanda."
+ ,"MakePayment": "Realitzar pagament"
+ ,"Company": "Empresa"
+ ,"Pending": "Pendent"
+ ,"Pay": "Pagar"
+
+ ,"SeeOrder": "Mostrar detall de l'encàrrec"
+ ,"TicketNumber": "N ticket"
+ ,"SentAddress": "Adreça d'enviament"
+ ,"Consignee": "Consignatari"
+ ,"Boxes": "Caixes"
+ ,"TotalWithVAT": "Total amb IVA"
+ ,"Pending": "Pendent"
+ ,"PayOrder": "Pagar encàrrec"
+
+ ,"AmountToPay:": "Quantitat a pagar (€):"
+ ,"AmountError": "La quantitat ha de ser un nombre positiu i inferior o igual a l'import pendent"
+ ,"PayError": "Error al realitzar el pagament"
+}
diff --git a/package/usr/share/hedera-web/locale/ca/modules/ticket.json b/package/usr/share/hedera-web/locale/ca/modules/ticket.json
new file mode 100755
index 00000000..a19a5fbf
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/ca/modules/ticket.json
@@ -0,0 +1,28 @@
+{
+ "Print": "Imprimir albarà"
+
+ ,"TicketNumber:": "N ticket:"
+ ,"DateExit:": "Data d'enviament:"
+ ,"SendMethod:": "Forma d'enviament:"
+ ,"Notes:": "Notes:"
+ ,"TicketTotal:": "Total encàrrec:"
+ ,"(VATIncluded)": "(IVA inclós)"
+
+ ,"PC": "Codi postal"
+ ,"City": "Ciutat"
+ ,"Province": "Província"
+ ,"Address": "Domicili"
+ ,"Consignee": "Consignatari"
+
+ ,"ItemNumber": "N article"
+ ,"Amount": "Quant"
+ ,"Item": "Article"
+ ,"Category": "Categoria"
+ ,"S1": "Mes"
+ ,"Stems": "Tijes"
+ ,"Color": "Color"
+ ,"Origin": "Orige"
+ ,"Price": "Preu"
+ ,"Disc": "Desc"
+ ,"Subtotal": "Subtotal"
+}
diff --git a/package/usr/share/hedera-web/locale/ca/modules/users.json b/package/usr/share/hedera-web/locale/ca/modules/users.json
new file mode 100755
index 00000000..e43e4bfe
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/ca/modules/users.json
@@ -0,0 +1,12 @@
+{
+ "UserManagement": "Gestió d'usuaris"
+
+ ,"UserName:": "Nom d'usuari:"
+
+ ,"UserNumber": "N usuari"
+ ,"UserName": "Nom d'usuari"
+ ,"Alias": "Alias"
+
+ ,"AccessAsUser": "Suplantar usuari"
+ ,"AccessLog": "Registre d'accessos"
+}
diff --git a/package/usr/share/hedera-web/locale/ca/modules/visits.json b/package/usr/share/hedera-web/locale/ca/modules/visits.json
new file mode 100755
index 00000000..4a18c6ca
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/ca/modules/visits.json
@@ -0,0 +1,31 @@
+{
+ "Visits": "Visites"
+ ,"VisitsManagement": "Gestió de visites"
+
+ ,"ActiveSessions": "Usuaris conectats"
+ ,"VisitsQuery": "Consulta de visites"
+ ,"Refresh": "Actualitzar"
+
+ ,"ActiveSessions:": "Usuaris conectats:"
+ ,"NewVisitsTotal:": "Noves visites:"
+
+ ,"SessionNumber": "N sessió"
+ ,"User": "Usuari"
+ ,"Login": "Hora d'accés"
+ ,"LastActivity": "Última activitat"
+ ,"SO": "Sistema Operatiu"
+ ,"Version": "Versió"
+ ,"NewVisit": "Nova visita"
+
+ ,"SelectDateInterval": "Seleccione un intèrval de dates"
+ ,"FromDate:": "Des de el dia:"
+ ,"ToDate:": "Fins el dia:"
+ ,"VisitsTotal:": "Total visites:"
+
+ ,"Browser": "Navegador"
+ ,"MinVersion": "Versió mínima"
+ ,"MaxVersion": "Versió màxima"
+ ,"LastVisit": "Última visita"
+ ,"NewVisits": "Noves visites"
+ ,"%a, %e %b %Y at %T": "%a, %e %b %Y a las %T"
+}
diff --git a/package/usr/share/hedera-web/locale/ca/modules/why.json b/package/usr/share/hedera-web/locale/ca/modules/why.json
new file mode 100755
index 00000000..44ac3a44
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/ca/modules/why.json
@@ -0,0 +1,18 @@
+{
+ "AboutCompany": "Per què Verdnatura?"
+ ,"StorePhoto": "Foto Magatzem"
+ ,"AboutWhy":
+ "
Perquè tenim el catàleg més gran del sector, renovat diariament.
Per aquest lloc web, amb stock en temps real sempre a la seua disposició.
Per el nostre departament de compres, amb 9 compradors especialitzats.
Perquè és molt fàcil realitzar el seu encàrrec mitjançant la web, per telèfon o venint.
Per les nostres instal·lacions, vingui y vistens. Li encantaran.
Pel nostre departament comercial, amb professionals que sempre ofereixen amb una solució adaptada a les seues necessitats.
Perquè tenim un taller de confecció per a ajudar-li.
Perquè tenim el que necessita quan ho necessita...
"
+
+ ,"AboutDesc":
+ "Som una empresa dedicada a la venta a l'engrós i distribució d'una amplia gama de complements, verds i flors naturals a frloristeries o altres majoristes."
+
+ ,"AboutService":
+ "Disposem de servei de repartiment a domicili amb els nostres vehícles per tota la provincia de València i arees limitades de Castelló, Alacant, Murcia, Albacete i Madrid. A la resta de la península enviem mitjançan agències de transport amb servei 24/48 hores (Zeleris, Viaexpress). També realitzaem venda directa a floristes en qualsevol de les nostres instal·lacions."
+
+ ,"AboutDisp":
+ "La nostra empresa disposa de més de 50 treballadors i diferents sucursals. La principal es troba a València i disposa de més de 8000 m2. També disposem d'un magatzem situat a Mercaflor - Mercavalencia (València) en el qual solament realitzem venda directa."
+
+ ,"AboutOrder":
+ "Pot realitzar els seus encarrecs i reserves telefonant al 96 324 21 00, per Internet mitjançant el nostre lloc web o bé directament a les nostres instal·lacions."
+}
diff --git a/package/usr/share/hedera-web/locale/ca/pages/login.json b/package/usr/share/hedera-web/locale/ca/pages/login.json
new file mode 100755
index 00000000..9535b91f
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/ca/pages/login.json
@@ -0,0 +1,9 @@
+{
+ "User": "Usuari"
+ ,"Password": "Contrasenya"
+ ,"NotCloseSession": "No tancar sessió"
+ ,"IWantToKnowMore": "Vuic saber-ne més!"
+ ,"Enter": "Entrar"
+ ,"LoginMail": "clientes@verdnatura.es"
+ ,"LoginPhone": "+34 607 562 391"
+}
diff --git a/package/usr/share/hedera-web/locale/ca/pages/tpv.json b/package/usr/share/hedera-web/locale/ca/pages/tpv.json
new file mode 100755
index 00000000..9bdecf58
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/ca/pages/tpv.json
@@ -0,0 +1,4 @@
+{
+ "PaymentComplete": "Pagament acabat, ja pot tornar a la nostra pàgina web."
+ ,"ReturnToWeb": "Tornar a Verdnatura"
+}
diff --git a/package/usr/share/hedera-web/locale/ca/pages/update-browser.json b/package/usr/share/hedera-web/locale/ca/pages/update-browser.json
new file mode 100755
index 00000000..6aa59eeb
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/ca/pages/update-browser.json
@@ -0,0 +1,4 @@
+{
+ "UpdateYourBrowser": "Actualitzi el seu navegador"
+ ,"ContinueAnyway": "Continuar igualment"
+}
diff --git a/package/usr/share/hedera-web/locale/ca/pages/web.json b/package/usr/share/hedera-web/locale/ca/pages/web.json
new file mode 100755
index 00000000..42bc0f69
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/ca/pages/web.json
@@ -0,0 +1,4 @@
+{
+ "Welcome": "Benvingut/da"
+ ,"Exit": "Eixir"
+}
diff --git a/package/usr/share/hedera-web/locale/es/ajax/image.json b/package/usr/share/hedera-web/locale/es/ajax/image.json
new file mode 100755
index 00000000..7d518242
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/es/ajax/image.json
@@ -0,0 +1,11 @@
+{
+ "BadFileFormat": "Formato de archivo no reconocido"
+ ,"FileNotChoosed": "No ha seleccionado ningún archivo"
+ ,"PermissionDenied": "No tiene permiso para subir el fichero"
+ ,"FileUploadError": "Error al subir el fichero, compruebe que su tamaño no sea demasiado grande"
+ ,"FileSaveError": "Error al guardar el fichero: %s"
+ ,"FileSizeError": "El fichero no debe ocupar mas de %.2f MB"
+ ,"BadFileName": "Solo es posible utilizar letras minúsculas, dígitos o el caráter '_' en el nombre del archivo"
+ ,"ComError": "Error en la comunicación con el servidor"
+ ,"ImageOpenError": "Error al abrir el archivo de imagen"
+}
diff --git a/package/usr/share/hedera-web/locale/es/ajax/query.json b/package/usr/share/hedera-web/locale/es/ajax/query.json
new file mode 100755
index 00000000..445312b5
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/es/ajax/query.json
@@ -0,0 +1,5 @@
+{
+ "InvalidAction": "Acción inválida"
+
+ ,"EmptyQuery": "Consulta vacia"
+}
diff --git a/package/usr/share/hedera-web/locale/es/js/db.js b/package/usr/share/hedera-web/locale/es/js/db.js
new file mode 100755
index 00000000..55637078
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/es/js/db.js
@@ -0,0 +1,9 @@
+Vn.Locale.add
+({
+ "ConnError": "Error en la conexión"
+ ,"InternalError": "Se ha producido un error interno"
+ ,"BadServerReply": "Respuesta del servidor incorrecta"
+ ,"ModelNotUpdatable": "Este modelo no es actualizable"
+ ,"RowNotExists": "El registro no existe o a sido borrado"
+ ,"ColNotExists": "La columna no existe"
+});
diff --git a/package/usr/share/hedera-web/locale/es/js/htk.js b/package/usr/share/hedera-web/locale/es/js/htk.js
new file mode 100755
index 00000000..e4874615
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/es/js/htk.js
@@ -0,0 +1,24 @@
+Vn.Locale.add
+({
+ "True": "Si"
+ ,"False": "No"
+ ,"Null": "Nulo"
+ ,"ChangeDate": "Cambiar Fecha"
+ ,"Sort": "Ordenar"
+ ,"At": "a las"
+ ,"Of": "de"
+ ,"OfThe": "del"
+ ,"Remove": "Borrar"
+ ,"Loading": "Cargando"
+ ,"ReallyDelete": "¿Realmente desea borrar la línea?"
+ ,"EmptyList": "Lista vacía"
+ ,"NoData": "Sin datos"
+ ,"ErrorLoadingData": "Error"
+ ,"Error": "Error"
+ ,"Image": "Imagen"
+ ,"File": "Archivo"
+ ,"FileName": "Nombre"
+ ,"UpdateImage": "Añadir / Actualizar Imagen"
+ ,"UploadFile": "Subir archivo"
+ ,"Close": "Cerrar"
+});
diff --git a/package/usr/share/hedera-web/locale/es/js/vn.js b/package/usr/share/hedera-web/locale/es/js/vn.js
new file mode 100755
index 00000000..0dab2617
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/es/js/vn.js
@@ -0,0 +1,75 @@
+Vn.Locale.add
+({
+ "Sunday": "Domingo"
+ ,"Monday": "Lunes"
+ ,"Tuesday": "Martes"
+ ,"Wednesday": "Miercoles"
+ ,"Thursday": "Jueves"
+ ,"Friday": "Viernes"
+ ,"Saturday": "Sábado"
+
+ ,"Su": "Do"
+ ,"Mo": "Lu"
+ ,"Tu": "Ma"
+ ,"We": "Mi"
+ ,"Th": "Ju"
+ ,"Fr": "Vi"
+ ,"Sa": "Sa"
+
+ ,"January": "Enero"
+ ,"February": "Febrero"
+ ,"March": "Marzo"
+ ,"April": "Abril"
+ ,"May": "Mayo"
+ ,"June": "Junio"
+ ,"July": "Julio"
+ ,"August": "Agosto"
+ ,"September": "Septiembre"
+ ,"October": "Octubre"
+ ,"November": "Noviembre"
+ ,"December": "Diciembre"
+
+ ,"Jan": "Ene"
+ ,"Feb": "Feb"
+ ,"Mar": "Mar"
+ ,"Apr": "Abr"
+ ,"May": "May"
+ ,"Jun": "Jun"
+ ,"Jul": "Jul"
+ ,"Ago": "Ago"
+ ,"Sep": "Sep"
+ ,"Oct": "Oct"
+ ,"Nov": "Nov"
+ ,"Dec": "Dic"
+
+ ,"AppName": "Verdnatura"
+ ,"Beta": "Beta"
+ ,"User": "Usuario"
+ ,"Password": "Contraseña"
+ ,"Remember": "Recordar"
+ ,"Enter": "Entrar"
+ ,"Exit": "Salir"
+ ,"Menu": "Menú"
+ ,"ErrorLoadingMod": "Error al cargar módulo"
+ ,"YoureVisitor": "¿Solo estás de visita?"
+ ,"NewVersionAvailable": "Existe una nueva versión de la página web, ¿Desea actualizar?"
+ ,"ChangeLog": "Cambios recientes"
+ ,"CookiesNotification": "Al utilizar este sitio web aceptas el uso de cookies para la personalización de contenidos y análisis."
+
+ ,"Home": "Inicio"
+ ,"Orders": "Pedidos"
+ ,"Catalog": "Catálogo"
+ ,"Configuration": "Configuración"
+ ,"About": "Conócenos"
+ ,"Why": "¿Por qué?"
+ ,"Location": "Localización"
+ ,"Administration": "Administración"
+ ,"Users": "Usuarios"
+ ,"Visits": "Visitas"
+ ,"Agencies": "Agencias"
+ ,"News": "Noticias"
+ ,"Contact": "Quiero ser cliente"
+
+ ,"SessionExpired": "Ha estado demasiado tiempo inactivo y su sesión ha expirado."
+ ,"InvalidLogin": "Usuario o contraseña incorrectos. Recuerde que se hace distinción entre mayúsculas y minúsculas."
+});
diff --git a/package/usr/share/hedera-web/locale/es/modules/about.json b/package/usr/share/hedera-web/locale/es/modules/about.json
new file mode 100755
index 00000000..e3553626
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/es/modules/about.json
@@ -0,0 +1,47 @@
+{
+ "QualityAndVariety": "Calidad, variedad y servicio"
+
+ ,"MaximumFreshness": "Verdnatura te ofrece un producto con la máxima frescura garantizada, gracias a sus recepciones diarias de flor y planta procedentes de Holanda, Sudamérica, o desde el mismo productor."
+ ,"SquareMeters": "Más de 13.000m de instalaciones"
+ ,"AboutRealms": "Con flor cortada, verdes, artificial y complementos"
+ ,"AboutLocation": "Asentados en Valencia, Madrid, Barcelona, Holanda y Francia, ofrecemos venta directa en nuestras instalaciones y reparto a toda España mediante servicio propio o agencia."
+ ,"PurchaseThroughWeb": "Compra a través de nuestra web y recibe tu pedido cómodamente en tu floristería. ¡En menos de 24 horas!"
+
+ ,"WhatMakeUsDifferent": "¿Que nos hace diferentes?"
+
+ ,"DesignVariety": "La variedad en el diseño, la calidad de los materiales utilizados y nuestro servicio de reparto, te garantizan un muestrario de género dinámico, siempre fresco y atractivo."
+ ,"AdaptToYourNeeds": "Verdnatura se adapta a las necesidades de cada cliente ofreciéndole un amplio abanico de productos, garantizado siempre."
+ ,"TheBestQuality": "La mejor calidad al mejor precio. Sin olvidar nunca el diseño."
+
+ ,"AtYourService": "Estamos a tu servicio"
+
+ ,"BuyersAndTraders": "9 compradores especializados y nuestros 20 comerciales te asesorarán en todo lo que necesites."
+
+ ,"Training": "Verdnatura formación"
+
+ ,"GoodTraining": "En Verdnatura sabemos que una buena formación es imprescindible para el desarrollo óptimo de cualquier actividad, y cómo no, también la de florista."
+ ,"SpecialTrainingPrices": "Para que el presupuesto de una escuela no repercuta en la calidad de su formación, colaboramos con una política de precios especiales para todas aquellas escuelas que lo soliciten realizar cursos en nuestras instalaciones de Verdnatura Silla."
+ ,"YoutubeChannel": "Y no te pierdas los vídeos de Canal Verdnatura en Youtube. Donde encontrarás un montón de consejos muy interesantes sobre el manejo de la flor."
+
+ ,"HowWeWork": "¿Cómo trabajamos?"
+
+ ,"FirstQualityControl": "1º control de calidad"
+ ,"SecondQualityControl": "2º control de calidad"
+ ,"ThirdQualityControl": "3º control de calidad"
+ ,"FourthQualityControl": "4º control de calidad"
+
+ ,"AalsmeerAuction": "Alas 5:00h, nuestros responsables de compras adquieren, en la subasta de Aalsmeer y Noaldwijk, el género que el productor ha cosechado el día anterior."
+ ,"BeforeAuction": "Tras su compra, este género entra rápidamente en Verdnatura Holland BV, nuestra empresa de Flora Holland, en Aalsmeer."
+ ,"DirectlyFromProviders": "Además de comprar a través de la subasta Holandesa, también compramos directamente a productores de Colombia, Ecuador, Thailandia, Malasia, África y Australia. Estos productos son supervisados directamente por nuestros delegados de compra ubicados en cada zona. Esta mercancía viajará a Amsterdam, sometida a un proceso de Vaacum y en menos de dos horas desde su aterrizaje, estará en nuestras instalaciones de Aalsmeer."
+ ,"GoodsDischarge": "A las 7:00h nuestros compañeros de Aalsmeer empiezan a recibir la mercancía comprada, pasando un primer control de calidad, y dándola de alta en nuestro stock. Ya está disponible para nuestros clientes en la web."
+ ,"GoodsTravel": "La mercancía viaja durante día y medio en camiones con compartimentos estancos a temperaturas diferentes, de manera que no se rompa la cadena de frío y viaje en las mejores condiciones."
+ ,"GoodsReception": "A la recepción de la mercancía el responsable de su compra revisa el estado en el que llega, aceptándola o rechazándola según el caso, se descarga en frío y rápidamente entra en nuestra cámara."
+ ,"CustomerOrders": "Nuestros clientes pueden hacer sus pedidos a través de la web, por teléfono o viniendo directamente a nuestras instalaciones. Tenemos un equipo de comerciales especializados que te asesorará en tu compra y que te informará de las novedades y artículos que puedan ser de tu interés, de forma que tu compra se ajuste a tus necesidades y quedes totalmente satisfecho."
+ ,"AfterOrder": "Una vez realizado el pedido, pasa al departamento de producción. Durante la preparación de este se realiza un nuevo control de calidad (el tercero) en el que se desechará la mercancía deficiente."
+ ,"BuyerControl": "En cuanto se finaliza la preparación, se realiza un nuevo control (el cuarto) donde un especialista cuenta y revisa el estado de los productos. En caso de que estos no cumplan con los estándares de calidad exigidos los rechaza y los sustituye por los adecuados."
+ ,"EmbeddedSection": "Seguidamente se lleva a la sección de encajado, donde el pedido es acondicionado para su correcta entrega. Cada tipo de entrega requiere un método de encajado adecuado para que el género viaje protegido y llegue al cliente en perfectas condiciones."
+ ,"AfterEmbedAgency": "En cuanto el producto ha sido encajado se almacena de nuevo en la cámara hasta su salida por agencia o por reparto propio, recibiéndolo el cliente, en 24h en el caso de la agencia o el mismo día en el caso del reparto, cómodamente en su domicilio."
+ ,"FreshnessGuaranteed": "Esta forma de trabajo garantiza la mayor frescura por la rapidez los procesos y por el mantenimiento de la cadena de frío desde compra hasta su recepción por nuestro cliente."
+
+ ,"AboutSummary": "75 personas repartidas por casi todo el mundo para que nuestro cliente tenga el más amplio catálogo del sector, la flor más fresca, la planta más novedosa, los complementos más actuales, y el servicio más rápido posible."
+}
diff --git a/package/usr/share/hedera-web/locale/es/modules/access.json b/package/usr/share/hedera-web/locale/es/modules/access.json
new file mode 100644
index 00000000..49042a77
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/es/modules/access.json
@@ -0,0 +1,15 @@
+{
+ "AccessLog": "Registro de accesos"
+
+ ,"UserNumber:": "Nº usuario:"
+ ,"User:": "Usuario:"
+ ,"Phone:": "Teléfono:"
+ ,"Mobile:": "Móvil:"
+
+ ,"Access": "Acceso"
+ ,"OS": "SO"
+ ,"Browser": "Navegador"
+ ,"Version": "Versión"
+ ,"Javascript": "Javascript"
+ ,"Cookies": "Cookies"
+}
diff --git a/package/usr/share/hedera-web/locale/es/modules/account.json b/package/usr/share/hedera-web/locale/es/modules/account.json
new file mode 100755
index 00000000..ac69558b
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/es/modules/account.json
@@ -0,0 +1,11 @@
+{
+ "PasswordsChanged": "¡Contraseña modificada!"
+ ,"PasswordsDoesntMatch": "¡Las contraseñas no coinciden!"
+ ,"Configuration": "Configuración"
+ ,"UserNumber": "Nº usuario:"
+ ,"UserName": "Nombre de usuario:"
+ ,"Password": "Contraseña:"
+ ,"Email": "Correo electrónico:"
+ ,"Billing": "Facturación"
+ ,"BillingByEmail": "Enviar facturas por correo electrónico"
+}
diff --git a/package/usr/share/hedera-web/locale/es/modules/agencies.json b/package/usr/share/hedera-web/locale/es/modules/agencies.json
new file mode 100755
index 00000000..5394818a
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/es/modules/agencies.json
@@ -0,0 +1,16 @@
+{
+ "ListByAgency": "Listado de bultos por agencia"
+
+ ,"ShowByProvince": "Mostrar desglose por provincia"
+ ,"Agency": "Agencia"
+ ,"Exps": "Exps"
+ ,"Bundles": "Bultos"
+ ,"Prevision": "Previsión"
+
+ ,"ByProvince": "Desglose por provincia"
+
+ ,"SelectAgency": "Seleccione una agencia en el listado de la izquierda"
+ ,"Province": "Provincia"
+ ,"Expeditions": "Expediciones"
+ ,"Left": "Faltan"
+}
diff --git a/package/usr/share/hedera-web/locale/es/modules/catalog.json b/package/usr/share/hedera-web/locale/es/modules/catalog.json
new file mode 100755
index 00000000..6f807368
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/es/modules/catalog.json
@@ -0,0 +1,29 @@
+{
+ "SelectFamily": "Seleccione familia"
+ ,"SelectSubtype": "Por favor, seleccione el subtipo en el menú de la derecha"
+ ,"ArticleNotFound": "Artículo no encontrado"
+ ,"ArticleNotAvailable": "Artículo no disponible"
+
+ ,"StartOrder": "Empezar pedido"
+ ,"ShoppingBasket": "Ver cesta de la compra"
+
+ ,"Realm": "Familia"
+ ,"Subtype": "Subtipo"
+ ,"Date:": "Fecha:"
+ ,"Warehouse:": "Almacén:"
+ ,"Search:": "Buscar:"
+ ,"GeneralSearch": "Búsqueda general"
+
+ ,"Amount": "Cant"
+ ,"Aval": "Disp"
+ ,"Name": "Nombre"
+ ,"S1": "Med"
+ ,"S2": "S2"
+ ,"Stems": "Tallos"
+ ,"Cat": "Cat"
+ ,"Pack": "Pack"
+ ,"Origin": "Origen"
+ ,"AstPrice": "* Precio"
+
+ ,"FixedPrices": "* Los precios resaltados en verde son fijos, el resto son orientativos."
+}
diff --git a/package/usr/share/hedera-web/locale/es/modules/contact.json b/package/usr/share/hedera-web/locale/es/modules/contact.json
new file mode 100755
index 00000000..fff7de6a
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/es/modules/contact.json
@@ -0,0 +1,20 @@
+{
+ "IWantCustomer": "¡Quiero ser cliente!"
+
+ ,"FillFormData": "Rellene el formulario con sus datos y en breve nos pondremos en contacto con usted."
+ ,"OrCallUs": "O si lo prefiere llámenos al 963 242 100."
+ ,"AllFieldsMandatory": "* Todos los campos son obligatorios."
+
+ ,"Name:": "Nombre:"
+ ,"Surname:": "Apellidos:"
+ ,"EMail:": "Correo electrónico:"
+ ,"Message:": "Mensaje:"
+ ,"Address:": "Dirección:"
+ ,"PC:": "Código postal:"
+ ,"City:": "Ciudad:"
+ ,"Phone:": "Teléfono:"
+ ,"Send": "Enviar datos"
+
+ ,"DataSentSuccess": "Sus datos han sido enviados correctamente. En breve nos pondremos en contacto con usted."
+ ,"ErrorSendingData": "Error al enviar sus datos. Por favor, compruebe que ha rellenado todos los campos y que ha introducido el código anti-spam correctamente."
+}
diff --git a/package/usr/share/hedera-web/locale/es/modules/home.json b/package/usr/share/hedera-web/locale/es/modules/home.json
new file mode 100755
index 00000000..fd06f8e2
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/es/modules/home.json
@@ -0,0 +1,13 @@
+{
+ "Sent": "Enviado"
+ ,"Author": "Autor"
+ ,"votes": "votos"
+ ,"NoAnswerSelected": "No ha seleccionado ninguna respuesta"
+ ,"ThanksForVote": "¡Gracias por su voto!"
+ ,"Vote": "Votar"
+ ,"Total": "Total"
+ ,"BrownserRecommend":
+ "Verdnatura le recomienda utilizar el navegador web Mozilla Firefox para obtener toda la funcionalidad de nuestra página web."
+ ,"PressHere": "Pulse aquí para descargar Firefox"
+}
+
diff --git a/package/usr/share/hedera-web/locale/es/modules/links.json b/package/usr/share/hedera-web/locale/es/modules/links.json
new file mode 100755
index 00000000..8ca8aea0
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/es/modules/links.json
@@ -0,0 +1,4 @@
+{
+ "Module": "Módulo"
+ ,"Description": "Descripción"
+}
diff --git a/package/usr/share/hedera-web/locale/es/modules/location.json b/package/usr/share/hedera-web/locale/es/modules/location.json
new file mode 100755
index 00000000..eb6899d5
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/es/modules/location.json
@@ -0,0 +1,3 @@
+{
+ "ShowMap": "Mostrar Mapa"
+}
diff --git a/package/usr/share/hedera-web/locale/es/modules/new.json b/package/usr/share/hedera-web/locale/es/modules/new.json
new file mode 100755
index 00000000..c8148af3
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/es/modules/new.json
@@ -0,0 +1,9 @@
+{
+ "AddNew": "Añadir/Editar noticia"
+
+ ,"Title:": "Título:"
+ ,"NewBody:": "Cuerpo:"
+
+ ,"Cancel": "Cancelar"
+ ,"Accept": "Aceptar"
+}
diff --git a/package/usr/share/hedera-web/locale/es/modules/news.json b/package/usr/share/hedera-web/locale/es/modules/news.json
new file mode 100755
index 00000000..89bb2d28
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/es/modules/news.json
@@ -0,0 +1,12 @@
+{
+ "NewsManagement": "Gestión de noticias"
+
+ ,"AddNew": "Añadir noticia"
+ ,"EditNew": "Editar noticia"
+
+ ,"NewNum": "Nº noticia"
+ ,"Date": "Fecha"
+ ,"Author": "Autor"
+ ,"Title": "Título"
+ ,"Priority": "Prioridad"
+}
diff --git a/package/usr/share/hedera-web/locale/es/modules/order.json b/package/usr/share/hedera-web/locale/es/modules/order.json
new file mode 100755
index 00000000..3abb50dd
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/es/modules/order.json
@@ -0,0 +1,62 @@
+{
+ "Delete": "Borrar pedido"
+ ,"GoToCatalog": "Acceder al catálogo"
+ ,"Checkout": "Tramitar pedido"
+
+ ,"OrderNumber:": "Nº pedido:"
+ ,"DateExit:": "Fecha de salida:"
+ ,"Warehouse:": "Almacén:"
+ ,"OrderTotal:": "Total pedido:"
+ ,"VATNotIncluded": "(IVA y transporte no incluídos)"
+
+ ,"Amount": "Cant"
+ ,"Pack": "Pack"
+ ,"Stems": "Tallos"
+ ,"Avail": "Disp"
+ ,"Item": "Artículo"
+ ,"Cat": "Cat"
+ ,"S1": "Med"
+ ,"Color": "Color"
+ ,"Origin": "Origen"
+ ,"Price": "Precio"
+ ,"Disc": "Desc"
+ ,"Subtotal": "Subtotal"
+
+ ,"GoBasket": "Volver a la cesta"
+ ,"Confirm": "Confirmar"
+
+ ,"PayCash": "Contrareembolso/Contado"
+ ,"PayMethod:": "Forma de pago:"
+ ,"Notes:": "Notas:"
+ ,"SendMethod:": "Forma de envío:"
+ ,"Insurance": "Asegurar mercancía: 5% del importe del pedido (Solo para envíos por agencia)"
+
+ ,"Consignee": "Consignatario"
+ ,"Province": "Provincia"
+ ,"PC": "Código postal"
+ ,"City": "Ciudad"
+ ,"Address": "Domicilio"
+
+ ,"SureDelOrder": "¿Está seguro de eliminar el pedido?"
+ ,"SureConfirmOrder": "¿Desea confirmar su pedido?"
+ ,"OrderConfirmed": "Su pedido ha sido procesado y confirmado correctamente"
+
+ ,"ClientAcceptCash": "El cliente accepta pagar Contrareembolso/Contado"
+ ,"InetOrder": "Pedido realizado por Internet"
+ ,"NoOrderFound": "No se ha encontrado ningún pedido"
+ ,"NoArticleAdded": "No ha agregado ningún artículo a su pedido"
+ ,"OrderExceeded": "Ha excedido el numero maximo de pedidos por confirmar, por favor elimine o confirme los pedidos iniciados"
+ ,"HighQuantity": "Algunos artículos ya no están disponibles o hay mas cantidad de la disponible, revise los recuadros en rojo"
+ ,"NoArticleAdded": "No ha seleccionado ningun artículo"
+ ,"IsertOrderType": "Introduzca el tipo de pedido que desea"
+ ,"QuantityIntroduced": "La cantidad introducida de"
+ ,"IsHigherThan": "es mayor que la cantidad disponible, por lo tanto se agregará el máximo disponible"
+ ,"RoundedTo": "ha sido redondeada debido a que este artículo se vende por cajas"
+ ,"NoOrderAfterHour": "No es posible realizar pedidos para hoy despues de las"
+ ,"NoOrderOnHolidays": "No es posible realizar pedidos para Domingos o festivos"
+ ,"DateLow": "La fecha de envío debe de ser igual o superior al día de hoy"
+ ,"DateHigh": "La fecha introducida es demasiado grande"
+ ,"DateUpdatedTo": "El día de envío ha sido actualizado a el"
+ ,"CreditExceeded": "Ha excedido su crédito máximo permitido, si desea confimar el pedido de todas formas marque la casilla Pago Contrareembolso/Contado o reduzca el importe de su pedido en "
+ ,"InsuranceQuestion": "Las agencias de transporte disponen de un menor número de trabajadores en verano, por las vacaciones, lo que puede ocasionar retrasos en la entrega. Esto, unido al calor, ha causado, en algunas ocasiones, que la mercancía no llegara en óptimas condiciones. Ya que nuestros portes habituales no incluyen ningún tipo de seguro, le ofrecemos la posibilidad de asegurar este envio. El coste sería de el 5% del valor de la mercancía. ¿Desea contratarlo?"
+}
diff --git a/package/usr/share/hedera-web/locale/es/modules/orders.json b/package/usr/share/hedera-web/locale/es/modules/orders.json
new file mode 100755
index 00000000..678de8b4
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/es/modules/orders.json
@@ -0,0 +1,34 @@
+{
+ "StartedOrdersDesc":
+ "Pedidos pendientes de confirmar."
+
+ ,"StartOrder": "Empezar pedido"
+ ,"ContinueOrder": "Continuar pedido"
+ ,"OrderNumber": "Nº pedido"
+ ,"DateMake": "Fecha de creación"
+ ,"DateExit": "Fecha de salida"
+ ,"SendMethod": "Forma de envío"
+
+ ,"ConfirmedOrdersDesc":
+ "Pedidos confirmados más recientes."
+
+ ,"PendingBalance:": "Saldo pendiente:"
+ ,"PaymentInfo": "Para realizar una entrega a cuenta pulse en el botón de la derecha y haga el pago en la empresa correspondiente. La cantidad que aparece es el saldo pendiente a día de hoy, no tiene en cuenta pedidos del futuro. Puede realizar una entrega a cuenta de la cantidad que desee. Si desea pagar un pedido en concreto puede pulsar directamente en el botón de pago del pedido."
+ ,"MakePayment": "Realizar pago"
+ ,"Company": "Empresa"
+ ,"Pending": "Pendiente"
+ ,"Pay": "Pagar"
+
+ ,"SeeOrder": "Mostrar detalle del pedido"
+ ,"TicketNumber": "Nº ticket"
+ ,"SentAddress": "Dirección de envío"
+ ,"Consignee": "Consignatario"
+ ,"Boxes": "Bultos"
+ ,"TotalWithVAT": "Total con IVA"
+ ,"Pending": "Pendiente"
+ ,"PayOrder": "Pagar pedido"
+
+ ,"AmountToPay:": "Cantidad a pagar (€):"
+ ,"AmountError": "La cantidad debe ser un número positivo e inferior o igual al importe pendiente"
+ ,"PayError": "Error al realizar el pago"
+}
diff --git a/package/usr/share/hedera-web/locale/es/modules/ticket.json b/package/usr/share/hedera-web/locale/es/modules/ticket.json
new file mode 100755
index 00000000..10b9df77
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/es/modules/ticket.json
@@ -0,0 +1,28 @@
+{
+ "Print": "Imprimir albarán"
+
+ ,"TicketNumber:": "Nº ticket:"
+ ,"DateExit:": "Fecha de envío:"
+ ,"SendMethod:": "Forma de envío:"
+ ,"Notes:": "Notas:"
+ ,"TicketTotal:": "Total pedido:"
+ ,"(VATIncluded)": "(IVA incluído)"
+
+ ,"PC": "Código postal"
+ ,"City": "Ciudad"
+ ,"Province": "Provincia"
+ ,"Address": "Domicilio"
+ ,"Consignee": "Consignatario"
+
+ ,"ItemNumber": "Nº artículo"
+ ,"Amount": "Cant"
+ ,"Item": "Artículo"
+ ,"Category": "Categoría"
+ ,"S1": "Med"
+ ,"Stems": "Tallos"
+ ,"Color": "Color"
+ ,"Origin": "Origen"
+ ,"Price": "Precio"
+ ,"Disc": "Desc"
+ ,"Subtotal": "Subtotal"
+}
diff --git a/package/usr/share/hedera-web/locale/es/modules/users.json b/package/usr/share/hedera-web/locale/es/modules/users.json
new file mode 100755
index 00000000..b7d55eda
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/es/modules/users.json
@@ -0,0 +1,12 @@
+{
+ "UserManagement": "Gestión de usuarios"
+
+ ,"UserName:": "Nombre de usuario:"
+
+ ,"UserNumber": "Nº usuario"
+ ,"UserName": "Nombre de usuario"
+ ,"Alias": "Alias"
+
+ ,"AccessAsUser": "Suplantar usuario"
+ ,"AccessLog": "Registro de accesos"
+}
diff --git a/package/usr/share/hedera-web/locale/es/modules/visits.json b/package/usr/share/hedera-web/locale/es/modules/visits.json
new file mode 100755
index 00000000..8a4f3649
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/es/modules/visits.json
@@ -0,0 +1,31 @@
+{
+ "Visits": "Visitas"
+ ,"VisitsManagement": "Gestión de visitas"
+
+ ,"ActiveSessions": "Usuarios conectados"
+ ,"VisitsQuery": "Consulta de visitas"
+ ,"Refresh": "Actualizar"
+
+ ,"ActiveSessions:": "Usuarios conectados:"
+ ,"NewVisitsTotal:": "Nuevas visitas:"
+
+ ,"SessionNumber": "Nº sesión"
+ ,"User": "Usuario"
+ ,"Login": "Hora de acceso"
+ ,"LastActivity": "Última actividad"
+ ,"SO": "Sistema Operativo"
+ ,"Version": "Versión"
+ ,"NewVisit": "Nueva visita"
+
+ ,"SelectDateInterval": "Seleccione un intérvalo de fechas"
+ ,"FromDate:": "Desde el día:"
+ ,"ToDate:": "Hasta el día:"
+ ,"VisitsTotal:": "Total visitas:"
+
+ ,"Browser": "Navegador"
+ ,"MinVersion": "Versión mínima"
+ ,"MaxVersion": "Versión máxima"
+ ,"LastVisit": "Última visita"
+ ,"NewVisits": "Nuevas visitas"
+ ,"%a, %e %b %Y at %T": "%a, %e %b %Y a las %T"
+}
diff --git a/package/usr/share/hedera-web/locale/es/modules/why.json b/package/usr/share/hedera-web/locale/es/modules/why.json
new file mode 100755
index 00000000..49172ca3
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/es/modules/why.json
@@ -0,0 +1,18 @@
+{
+ "AboutCompany": "¿Por qué Verdnatura?"
+ ,"StorePhoto": "Foto Almacén"
+ ,"AboutWhy":
+ "
Porque tenemos el catálogo más grande del sector, renovado diariamente.
Por esta página web, con stock en tiempo real siempre a tu disposición.
Por nuestro departamento de compras con 9 compradores especializados.
Porque es muy fácil hacer tu pedido por web, por teléfono o viniendo.
Por nuestras instalaciones, ven y visítanos. Te encantarán.
Por nuestro departamento comercial, con profesionales que siempre encontrarán una solución a tus necesidades.
Porque tenemos un taller de confección para ayudarte.
Porque tenemos lo que necesitas cuando lo necesitas...
"
+
+ ,"AboutDesc":
+ "Somos una empresa dedicada a la venta mayorista y distribución de una amplia gama de complementos, verdes y flores naturales a floristerías u otros mayoristas."
+
+ ,"AboutService":
+ "Disponemos de servicio de reparto a domicilio con nuestros vehículos por toda la provincia de Valencia y áreas limitadas de Castellón, Alicante, Murcia, Albacete y Madrid enviamos al resto de la península mediante agencias de transporte con servicio 24/48 horas (Zeleris, Viaexpress). También realizamos venta directa a floristas en cualquiera de nuestras instalaciones."
+
+ ,"AboutDisp":
+ "Nuestra empresa dispone de más de 50 trabajadores y varias sucursales. La principal se encuentra situada en Valencia y cuenta con más de 8000 m2. También disponemos de un almacén situado en Mercaflor - Mercavalencia (Valencia) en el que únicamente realizamos venta directa."
+
+ ,"AboutOrder":
+ "Puede realizar sus pedidos y reservas por teléfono llamando al 96 324 21 00, por Internet a través de nuestra página web o bien directamente en nuestras instalaciones."
+}
diff --git a/package/usr/share/hedera-web/locale/es/pages/login.json b/package/usr/share/hedera-web/locale/es/pages/login.json
new file mode 100755
index 00000000..aee401e2
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/es/pages/login.json
@@ -0,0 +1,9 @@
+{
+ "User": "Usuario"
+ ,"Password": "Contraseña"
+ ,"NotCloseSession": "No cerrar sesión"
+ ,"IWantToKnowMore": "¡Quiero saber más!"
+ ,"Enter": "Entrar"
+ ,"LoginMail": "clientes@verdnatura.es"
+ ,"LoginPhone": "+34 963 242 100"
+}
diff --git a/package/usr/share/hedera-web/locale/es/pages/tpv.json b/package/usr/share/hedera-web/locale/es/pages/tpv.json
new file mode 100755
index 00000000..9117f5f0
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/es/pages/tpv.json
@@ -0,0 +1,4 @@
+{
+ "PaymentComplete": "Pago terminado, ya puede volver a nuestra página web."
+ ,"ReturnToWeb": "Volver a Verdnatura"
+}
diff --git a/package/usr/share/hedera-web/locale/es/pages/update-browser.json b/package/usr/share/hedera-web/locale/es/pages/update-browser.json
new file mode 100755
index 00000000..85ce3b73
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/es/pages/update-browser.json
@@ -0,0 +1,4 @@
+{
+ "UpdateYourBrowser": "Actualice su navegador"
+ ,"ContinueAnyway": "Continuar de todos modos"
+}
diff --git a/package/usr/share/hedera-web/locale/es/pages/web.json b/package/usr/share/hedera-web/locale/es/pages/web.json
new file mode 100755
index 00000000..443b7269
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/es/pages/web.json
@@ -0,0 +1,4 @@
+{
+ "Welcome": "Bienvenido/a"
+ ,"Exit": "Salir"
+}
diff --git a/package/usr/share/hedera-web/locale/fr/ajax/image.json b/package/usr/share/hedera-web/locale/fr/ajax/image.json
new file mode 100755
index 00000000..7d518242
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/fr/ajax/image.json
@@ -0,0 +1,11 @@
+{
+ "BadFileFormat": "Formato de archivo no reconocido"
+ ,"FileNotChoosed": "No ha seleccionado ningún archivo"
+ ,"PermissionDenied": "No tiene permiso para subir el fichero"
+ ,"FileUploadError": "Error al subir el fichero, compruebe que su tamaño no sea demasiado grande"
+ ,"FileSaveError": "Error al guardar el fichero: %s"
+ ,"FileSizeError": "El fichero no debe ocupar mas de %.2f MB"
+ ,"BadFileName": "Solo es posible utilizar letras minúsculas, dígitos o el caráter '_' en el nombre del archivo"
+ ,"ComError": "Error en la comunicación con el servidor"
+ ,"ImageOpenError": "Error al abrir el archivo de imagen"
+}
diff --git a/package/usr/share/hedera-web/locale/fr/ajax/query.json b/package/usr/share/hedera-web/locale/fr/ajax/query.json
new file mode 100755
index 00000000..445312b5
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/fr/ajax/query.json
@@ -0,0 +1,5 @@
+{
+ "InvalidAction": "Acción inválida"
+
+ ,"EmptyQuery": "Consulta vacia"
+}
diff --git a/package/usr/share/hedera-web/locale/fr/js/db.js b/package/usr/share/hedera-web/locale/fr/js/db.js
new file mode 100755
index 00000000..40fd84b5
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/fr/js/db.js
@@ -0,0 +1,9 @@
+Vn.Locale.add
+({
+ "ConnError": "Échec de la connexion"
+ ,"InternalError": "Il y avait une erreur interne"
+ ,"BadServerReply": "Réponse du serveur incorrecte"
+ ,"ModelNotUpdatable": "Ce modèle n'est pas modifiable"
+ ,"RowNotExists": "Le dossier n'existe pas ou a été supprimée"
+ ,"ColNotExists": "N'existe pas la colonne"
+});
diff --git a/package/usr/share/hedera-web/locale/fr/js/htk.js b/package/usr/share/hedera-web/locale/fr/js/htk.js
new file mode 100755
index 00000000..c5a89539
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/fr/js/htk.js
@@ -0,0 +1,24 @@
+Vn.Locale.add
+({
+ "True": "Si"
+ ,"False": "Aucun"
+ ,"Null": "Nul"
+ ,"ChangeDate": "Modification de la date"
+ ,"Sort": "Ordre"
+ ,"At": "à"
+ ,"Of": "de"
+ ,"OfThe": "de"
+ ,"Remove": "Effacer"
+ ,"Loading": "Chargement"
+ ,"ReallyDelete": "Voulez-vous vraiment supprimer la ligne?"
+ ,"EmptyList": "Vider la liste"
+ ,"NoData": "Aucune donnée"
+ ,"ErrorLoadingData": "Erreur"
+ ,"Error": "Erreur"
+ ,"Image": "Image"
+ ,"File": "Archives"
+ ,"FileName": "Nom"
+ ,"UpdateImage": "Ajouter / Mettre à jour l'image"
+ ,"UploadFile": "Télécharger le fichier"
+ ,"Close": "Croche"
+});
diff --git a/package/usr/share/hedera-web/locale/fr/js/vn.js b/package/usr/share/hedera-web/locale/fr/js/vn.js
new file mode 100755
index 00000000..37b85202
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/fr/js/vn.js
@@ -0,0 +1,75 @@
+Vn.Locale.add
+({
+ "Sunday": "Dimanche"
+ ,"Monday": "Lundi"
+ ,"Tuesday": "Mardi"
+ ,"Wednesday": "Mercredi"
+ ,"Thursday": "Jeudi"
+ ,"Friday": "Vendredi"
+ ,"Saturday": "Samedi"
+
+ ,"Su": "Do"
+ ,"Mo": "Lu"
+ ,"Tu": "Ma"
+ ,"We": "Me"
+ ,"Th": "Je"
+ ,"Fr": "Ve"
+ ,"Sa": "Sa"
+
+ ,"January": "Janvier"
+ ,"February": "Février"
+ ,"March": "Mars"
+ ,"April": "Avril"
+ ,"May": "Mai"
+ ,"June": "Juin"
+ ,"July": "Juillet"
+ ,"August": "Août"
+ ,"September": "Septembre"
+ ,"October": "Octobre"
+ ,"November": "Novembre"
+ ,"December": "Décembre"
+
+ ,"Jan": "Jan"
+ ,"Feb": "Fév"
+ ,"Mar": "Mars"
+ ,"Apr": "Avr"
+ ,"May": "Mai"
+ ,"Jun": "Juin"
+ ,"Jul": "Juil"
+ ,"Ago": "Août"
+ ,"Sep": "Sep"
+ ,"Oct": "Oct"
+ ,"Nov": "Nov"
+ ,"Dec": "Déc"
+
+ ,"AppName": "Verdnatura"
+ ,"Beta": "Beta"
+ ,"User": "Utilisateur"
+ ,"Password": "Mot de passe"
+ ,"Remember": "Rappeler"
+ ,"Enter": "entrer"
+ ,"Exit": "Laisser"
+ ,"Menu": "Menu"
+ ,"ErrorLoadingMod": "Module erreur de chargement"
+ ,"YoureVisitor": "¿Solo estás de visita?"
+ ,"NewVersionAvailable": "Une nouvelle version du site, Vous voulez mettre à niveau?"
+ ,"ChangeLog": "Modifications récentes"
+ ,"CookiesNotification": "En utilisant ce site, vous acceptez l'utilisation de cookies pour personnaliser le contenu et l'analyse."
+
+ ,"Home": "Accueil"
+ ,"Orders": "Commandes"
+ ,"Catalog": "Catalogue"
+ ,"Configuration": "Configuration"
+ ,"About": "Nous"
+ ,"Why": "Pourquoi?"
+ ,"Location": "Emplacement"
+ ,"Administration": "Administration"
+ ,"Users": "Utilisateurs"
+ ,"Visits": "Visites"
+ ,"Agencies": "Agences"
+ ,"News": "Nouvelles"
+ ,"Contact": "Je veux être client"
+
+ ,"SessionExpired": "Il a eu le temps de trop paresseux et votre session a expiré."
+ ,"InvalidLogin": "Utilisateur ou mot de passe incorrect. N'oubliez pas de distinction entre majuscules et minuscules."
+});
diff --git a/package/usr/share/hedera-web/locale/fr/modules/about.json b/package/usr/share/hedera-web/locale/fr/modules/about.json
new file mode 100755
index 00000000..e3553626
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/fr/modules/about.json
@@ -0,0 +1,47 @@
+{
+ "QualityAndVariety": "Calidad, variedad y servicio"
+
+ ,"MaximumFreshness": "Verdnatura te ofrece un producto con la máxima frescura garantizada, gracias a sus recepciones diarias de flor y planta procedentes de Holanda, Sudamérica, o desde el mismo productor."
+ ,"SquareMeters": "Más de 13.000m de instalaciones"
+ ,"AboutRealms": "Con flor cortada, verdes, artificial y complementos"
+ ,"AboutLocation": "Asentados en Valencia, Madrid, Barcelona, Holanda y Francia, ofrecemos venta directa en nuestras instalaciones y reparto a toda España mediante servicio propio o agencia."
+ ,"PurchaseThroughWeb": "Compra a través de nuestra web y recibe tu pedido cómodamente en tu floristería. ¡En menos de 24 horas!"
+
+ ,"WhatMakeUsDifferent": "¿Que nos hace diferentes?"
+
+ ,"DesignVariety": "La variedad en el diseño, la calidad de los materiales utilizados y nuestro servicio de reparto, te garantizan un muestrario de género dinámico, siempre fresco y atractivo."
+ ,"AdaptToYourNeeds": "Verdnatura se adapta a las necesidades de cada cliente ofreciéndole un amplio abanico de productos, garantizado siempre."
+ ,"TheBestQuality": "La mejor calidad al mejor precio. Sin olvidar nunca el diseño."
+
+ ,"AtYourService": "Estamos a tu servicio"
+
+ ,"BuyersAndTraders": "9 compradores especializados y nuestros 20 comerciales te asesorarán en todo lo que necesites."
+
+ ,"Training": "Verdnatura formación"
+
+ ,"GoodTraining": "En Verdnatura sabemos que una buena formación es imprescindible para el desarrollo óptimo de cualquier actividad, y cómo no, también la de florista."
+ ,"SpecialTrainingPrices": "Para que el presupuesto de una escuela no repercuta en la calidad de su formación, colaboramos con una política de precios especiales para todas aquellas escuelas que lo soliciten realizar cursos en nuestras instalaciones de Verdnatura Silla."
+ ,"YoutubeChannel": "Y no te pierdas los vídeos de Canal Verdnatura en Youtube. Donde encontrarás un montón de consejos muy interesantes sobre el manejo de la flor."
+
+ ,"HowWeWork": "¿Cómo trabajamos?"
+
+ ,"FirstQualityControl": "1º control de calidad"
+ ,"SecondQualityControl": "2º control de calidad"
+ ,"ThirdQualityControl": "3º control de calidad"
+ ,"FourthQualityControl": "4º control de calidad"
+
+ ,"AalsmeerAuction": "Alas 5:00h, nuestros responsables de compras adquieren, en la subasta de Aalsmeer y Noaldwijk, el género que el productor ha cosechado el día anterior."
+ ,"BeforeAuction": "Tras su compra, este género entra rápidamente en Verdnatura Holland BV, nuestra empresa de Flora Holland, en Aalsmeer."
+ ,"DirectlyFromProviders": "Además de comprar a través de la subasta Holandesa, también compramos directamente a productores de Colombia, Ecuador, Thailandia, Malasia, África y Australia. Estos productos son supervisados directamente por nuestros delegados de compra ubicados en cada zona. Esta mercancía viajará a Amsterdam, sometida a un proceso de Vaacum y en menos de dos horas desde su aterrizaje, estará en nuestras instalaciones de Aalsmeer."
+ ,"GoodsDischarge": "A las 7:00h nuestros compañeros de Aalsmeer empiezan a recibir la mercancía comprada, pasando un primer control de calidad, y dándola de alta en nuestro stock. Ya está disponible para nuestros clientes en la web."
+ ,"GoodsTravel": "La mercancía viaja durante día y medio en camiones con compartimentos estancos a temperaturas diferentes, de manera que no se rompa la cadena de frío y viaje en las mejores condiciones."
+ ,"GoodsReception": "A la recepción de la mercancía el responsable de su compra revisa el estado en el que llega, aceptándola o rechazándola según el caso, se descarga en frío y rápidamente entra en nuestra cámara."
+ ,"CustomerOrders": "Nuestros clientes pueden hacer sus pedidos a través de la web, por teléfono o viniendo directamente a nuestras instalaciones. Tenemos un equipo de comerciales especializados que te asesorará en tu compra y que te informará de las novedades y artículos que puedan ser de tu interés, de forma que tu compra se ajuste a tus necesidades y quedes totalmente satisfecho."
+ ,"AfterOrder": "Una vez realizado el pedido, pasa al departamento de producción. Durante la preparación de este se realiza un nuevo control de calidad (el tercero) en el que se desechará la mercancía deficiente."
+ ,"BuyerControl": "En cuanto se finaliza la preparación, se realiza un nuevo control (el cuarto) donde un especialista cuenta y revisa el estado de los productos. En caso de que estos no cumplan con los estándares de calidad exigidos los rechaza y los sustituye por los adecuados."
+ ,"EmbeddedSection": "Seguidamente se lleva a la sección de encajado, donde el pedido es acondicionado para su correcta entrega. Cada tipo de entrega requiere un método de encajado adecuado para que el género viaje protegido y llegue al cliente en perfectas condiciones."
+ ,"AfterEmbedAgency": "En cuanto el producto ha sido encajado se almacena de nuevo en la cámara hasta su salida por agencia o por reparto propio, recibiéndolo el cliente, en 24h en el caso de la agencia o el mismo día en el caso del reparto, cómodamente en su domicilio."
+ ,"FreshnessGuaranteed": "Esta forma de trabajo garantiza la mayor frescura por la rapidez los procesos y por el mantenimiento de la cadena de frío desde compra hasta su recepción por nuestro cliente."
+
+ ,"AboutSummary": "75 personas repartidas por casi todo el mundo para que nuestro cliente tenga el más amplio catálogo del sector, la flor más fresca, la planta más novedosa, los complementos más actuales, y el servicio más rápido posible."
+}
diff --git a/package/usr/share/hedera-web/locale/fr/modules/access.json b/package/usr/share/hedera-web/locale/fr/modules/access.json
new file mode 100644
index 00000000..01921439
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/fr/modules/access.json
@@ -0,0 +1,15 @@
+{
+ "AccessLog": "Fiche d'accès"
+
+ ,"UserNumber:": "Numéro utilisateur:"
+ ,"User:": "Utilisateur:"
+ ,"Phone:": "Téléphone:"
+ ,"Mobile:": "Mobile:"
+
+ ,"Access": "Accès"
+ ,"OS": "OS"
+ ,"Browser": "Navigateur"
+ ,"Version": "Version"
+ ,"Javascript": "Javascript"
+ ,"Cookies": "Cookies"
+}
diff --git a/package/usr/share/hedera-web/locale/fr/modules/account.json b/package/usr/share/hedera-web/locale/fr/modules/account.json
new file mode 100755
index 00000000..9e9e75dd
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/fr/modules/account.json
@@ -0,0 +1,11 @@
+{
+ "PasswordsChanged": "Mot de passe modifié!"
+ ,"PasswordsDoesntMatch": "Les mots de passe ne correspondent pas!"
+ ,"Configuration": "Configuration"
+ ,"UserNumber": "Numéro utilisateur:"
+ ,"UserName": "Utilisateur:"
+ ,"Password": "Mot de passe:"
+ ,"Email": "Courrier électronique:"
+ ,"Billing": "Facturation"
+ ,"BillingByEmail": "Envoi de factures par e-mail"
+}
diff --git a/package/usr/share/hedera-web/locale/fr/modules/agencies.json b/package/usr/share/hedera-web/locale/fr/modules/agencies.json
new file mode 100755
index 00000000..5394818a
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/fr/modules/agencies.json
@@ -0,0 +1,16 @@
+{
+ "ListByAgency": "Listado de bultos por agencia"
+
+ ,"ShowByProvince": "Mostrar desglose por provincia"
+ ,"Agency": "Agencia"
+ ,"Exps": "Exps"
+ ,"Bundles": "Bultos"
+ ,"Prevision": "Previsión"
+
+ ,"ByProvince": "Desglose por provincia"
+
+ ,"SelectAgency": "Seleccione una agencia en el listado de la izquierda"
+ ,"Province": "Provincia"
+ ,"Expeditions": "Expediciones"
+ ,"Left": "Faltan"
+}
diff --git a/package/usr/share/hedera-web/locale/fr/modules/catalog.json b/package/usr/share/hedera-web/locale/fr/modules/catalog.json
new file mode 100755
index 00000000..e5dbecb1
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/fr/modules/catalog.json
@@ -0,0 +1,29 @@
+{
+ "SelectFamily": "Choisissez la famille"
+ ,"SelectSubtype": "S'il vous plaît sélectionnez le sous-menu sur la droite"
+ ,"ArticleNotFound": "Article pas trouvé"
+ ,"ArticleNotAvailable": "Article pas disponible"
+
+ ,"StartOrder": "Acheter"
+ ,"ShoppingBasket": "Voir mon panier"
+
+ ,"Realm": "Famille"
+ ,"Subtype": "Sous-genre"
+ ,"Date:": "Date:"
+ ,"Warehouse:": "Magasin:"
+ ,"Search:": "Recherche:"
+ ,"GeneralSearch": "Recherche générale"
+
+ ,"Amount": "Quant"
+ ,"Aval": "Disp"
+ ,"Name": "Nom"
+ ,"S1": "Mes"
+ ,"S2": "S2"
+ ,"Stems": "Tige"
+ ,"Cat": "Cat"
+ ,"Pack": "Pack"
+ ,"Origin": "Origine"
+ ,"AstPrice": "* Prix"
+
+ ,"FixedPrices": "* Les prix en vert sont fixes, le reste sont orientatives."
+}
diff --git a/package/usr/share/hedera-web/locale/fr/modules/contact.json b/package/usr/share/hedera-web/locale/fr/modules/contact.json
new file mode 100755
index 00000000..ad10ff8b
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/fr/modules/contact.json
@@ -0,0 +1,20 @@
+{
+ "IWantCustomer": "Je veux être un client!"
+
+ ,"FillFormData": "Remplissez le formulaire avec vos coordonnées et nous prendrons contact avec vous sous peu."
+ ,"OrCallUs": "Ou si vous préférez nous appeler au 0033 781 533 900."
+ ,"AllFieldsMandatory": "* Todos los campos son obligatorios."
+
+ ,"Name:": "Nom:"
+ ,"Surname:": "Nom:"
+ ,"EMail:": "Email:"
+ ,"Message:": "Message:"
+ ,"Address:": "Adresse:"
+ ,"PC:": "Code postal:"
+ ,"City:": "Ville:"
+ ,"Phone:": "Téléphone:"
+ ,"Send": "Envoyer des données"
+
+ ,"DataSentSuccess": "Vos détails ont été envoyés avec succès. Peu de temps nous vous contacterons."
+ ,"ErrorSendingData": "Échec de l'envoi de vos données. S'il vous plaît vérifiez que vous avez rempli tous les champs et a mis en place le code anti-spam correctement."
+}
diff --git a/package/usr/share/hedera-web/locale/fr/modules/home.json b/package/usr/share/hedera-web/locale/fr/modules/home.json
new file mode 100755
index 00000000..8b6e12a6
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/fr/modules/home.json
@@ -0,0 +1,12 @@
+{
+ "Sent": "Enviado"
+ ,"Author": "Autor"
+ ,"votes": "votos"
+ ,"NoAnswerSelected": "No ha seleccionado ninguna respuesta"
+ ,"ThanksForVote": "¡Gracias por su voto!"
+ ,"Vote": "Voter"
+ ,"Total": "Total"
+ ,"BrownserRecommend":
+ "Verdnatura recommande d'utiliser le navigateur Web Mozilla Firefox pour obtenir toutes les fonctionnalités de notre site web."
+ ,"PressHere": "Cliquez ici pour télécharger Firefox"
+}
diff --git a/package/usr/share/hedera-web/locale/fr/modules/links.json b/package/usr/share/hedera-web/locale/fr/modules/links.json
new file mode 100755
index 00000000..f5ad68a7
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/fr/modules/links.json
@@ -0,0 +1,4 @@
+{
+ "Module": "Module"
+ ,"Description": "Description"
+}
diff --git a/package/usr/share/hedera-web/locale/fr/modules/location.json b/package/usr/share/hedera-web/locale/fr/modules/location.json
new file mode 100755
index 00000000..4b515c3a
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/fr/modules/location.json
@@ -0,0 +1,3 @@
+{
+ "ShowMap": "Show Map"
+}
diff --git a/package/usr/share/hedera-web/locale/fr/modules/new.json b/package/usr/share/hedera-web/locale/fr/modules/new.json
new file mode 100755
index 00000000..0500c1a2
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/fr/modules/new.json
@@ -0,0 +1,9 @@
+{
+ "AddNew": "Ajouter/Editer nouvelles"
+
+ ,"Title:": "Titre:"
+ ,"NewBody:": "Corps:"
+
+ ,"Cancel": "Annuler"
+ ,"Accept": "Accepter"
+}
diff --git a/package/usr/share/hedera-web/locale/fr/modules/news.json b/package/usr/share/hedera-web/locale/fr/modules/news.json
new file mode 100755
index 00000000..acd4ebf4
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/fr/modules/news.json
@@ -0,0 +1,12 @@
+{
+ "NewsManagement": "Gestion des nouvelles"
+
+ ,"AddNew": "Ajouter nouvelles"
+ ,"EditNew": "Modifier nouvelles"
+
+ ,"NewNum": "Nº nouvelles"
+ ,"Date": "Date"
+ ,"Author": "Auteur"
+ ,"Title": "Titre"
+ ,"Priority": "Priorité"
+}
diff --git a/package/usr/share/hedera-web/locale/fr/modules/order.json b/package/usr/share/hedera-web/locale/fr/modules/order.json
new file mode 100755
index 00000000..b261c6bb
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/fr/modules/order.json
@@ -0,0 +1,62 @@
+{
+ "Delete": "Effacer"
+ ,"GoToCatalog": "Accédez au catalogue"
+ ,"Checkout": "Caisse"
+
+ ,"OrderNumber:": "Numéro de commande:"
+ ,"DateExit:": "Date de sortie:"
+ ,"Warehouse:": "Magasin:"
+ ,"OrderTotal:": "Total commande:"
+ ,"VATNotIncluded": "(TVA et frais de port non inclus)"
+
+ ,"Amount": "Quant"
+ ,"Pack": "Pack"
+ ,"Stems": "Tige"
+ ,"Avail": "Disp"
+ ,"Item": "Nom"
+ ,"Cat": "Cat"
+ ,"S1": "Mes"
+ ,"Color": "Couleur"
+ ,"Origin": "Origine"
+ ,"Price": "* Prix"
+ ,"Disc": "Desc"
+ ,"Subtotal": "Sous-total"
+
+ ,"GoBasket": "Retour au"
+ ,"Confirm": "Confirmer"
+
+ ,"PayCash": "COD / Trésorerie"
+ ,"PayMethod:": "Mode de paiement:"
+ ,"Notes:": "Remarques:"
+ ,"SendMethod:": "Mode de livraison:"
+ ,"Insurance": "S'assurer que la marchandise: 5% du montant de la commande (uniquement pour les envois par agence)"
+
+ ,"Consignee": "Destinataire"
+ ,"Province": "Province"
+ ,"PC": "Code postal"
+ ,"City": "Ville"
+ ,"Address": "Maison"
+
+ ,"SureDelOrder": "Êtes-vous sûr de vouloir supprimer la commande?"
+ ,"SureConfirmOrder": "Voulez-vous confirmer votre commande?"
+ ,"OrderConfirmed": "Votre commande a été traitée avec succès et confirmé"
+
+ ,"ClientAcceptCash": "Le client accepte régler en contre-remboursement/cash"
+ ,"InetOrder": "Commande passée par internet"
+ ,"NoOrderFound": "Aucune commande trouvée"
+ ,"NoArticleAdded": "Aucune produit dans sa commande"
+ ,"OrderExceeded": "Numéro maximum de commandes non confirmées, s'il vous plaît, confirmez ou supprimez les commandes déjà lancées"
+ ,"HighQuantity": "Certains produits ne sont pas déjà disponibles ou vous avez choissi pus quantité de la quantité disponible, revisez les champs en rouge"
+ ,"NoArticleAdded": "Vous n'avez pas choisi aucune produit"
+ ,"IsertOrderType": "Saisissez le type de commande"
+ ,"QuantityIntroduced": "La quantité saisie de"
+ ,"IsHigherThan": "est plus elevé que la quantité disponible, nous ajouterons le maximun disponible"
+ ,"RoundedTo": "arrondie, de vente en boîte"
+ ,"NoOrderAfterHour": "N'est pas possible passer commades aprés"
+ ,"NoOrderOnHolidays": "N'est pas possible passer commades Dimanche ou jours fériés"
+ ,"DateLow": "La date d'envoi doit être supérieure ou égale a ce jour"
+ ,"DateHigh": "La date saisie est tros grande"
+ ,"DateUpdatedTo": "Date d'envoi mise à jour a "
+ ,"CreditExceeded": "Ha excedido su crédito máximo permitido, si desea confimar el pedido de todas formas marque la casilla Pago Contrareembolso/Contado o reduzca el importe de su pedido en "
+ ,"InsuranceQuestion": "Las agencias de transporte disponen de un menor número de trabajadores en verano, por las vacaciones, lo que puede ocasionar retrasos en la entrega. Esto, unido al calor, ha causado, en algunas ocasiones, que la mercancía no llegara en óptimas condiciones. Ya que nuestros portes habituales no incluyen ningún tipo de seguro, le ofrecemos la posibilidad de asegurar este envio. El coste sería de el 5% del valor de la mercancía. ¿Desea contratarlo?"
+}
diff --git a/package/usr/share/hedera-web/locale/fr/modules/orders.json b/package/usr/share/hedera-web/locale/fr/modules/orders.json
new file mode 100755
index 00000000..5cc57b86
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/fr/modules/orders.json
@@ -0,0 +1,34 @@
+{
+ "StartedOrdersDesc":
+ "Commandes en cours de confirmation."
+
+ ,"StartOrder": "Acheter"
+ ,"ContinueOrder": "Continuer la commande"
+ ,"OrderNumber": "Numéro de commande"
+ ,"DateMake": "Date de creation"
+ ,"DateExit": "Date de sortie"
+ ,"SendMethod": "Typo"
+
+ ,"ConfirmedOrdersDesc":
+ "Commandes confirmées."
+
+ ,"PendingBalance:": "Balance:"
+ ,"PaymentInfo": "Pour effectuer un paiement vers le bas, cliquez sur le bouton à droite et effectuer le paiement par la société. Le montant indiqué est le solde aujourd'hui, ne prend pas en compte les commandes futures. Vous pouvez faire un acompte sur le montant que vous voulez. Si vous voulez payer un ordre spécifique, vous pouvez cliquer directement sur le bouton de paiement Ordre."
+ ,"MakePayment": "Effectuer un paiement"
+ ,"Company": "Entreprise"
+ ,"Pending": "Pente"
+ ,"Pay": "Payer"
+
+ ,"SeeOrder": "Votre panier"
+ ,"TicketNumber": "Numéro ticket"
+ ,"SentAddress": "Adresse de livraison"
+ ,"Consignee": "Destinataire"
+ ,"Boxes": "Colis"
+ ,"TotalWithVAT": "Total avec TVA"
+ ,"Pending": "En attente"
+ ,"PayOrder": "Payer la commande"
+
+ ,"AmountToPay:": "Montant à payer (€):"
+ ,"AmountError": "La quantité doit être un neméro positif et inférieur ou égal à la somme restant à payer"
+ ,"PayError": "Impossible d'effectuer le paiement"
+}
diff --git a/package/usr/share/hedera-web/locale/fr/modules/ticket.json b/package/usr/share/hedera-web/locale/fr/modules/ticket.json
new file mode 100755
index 00000000..9c3a2d4d
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/fr/modules/ticket.json
@@ -0,0 +1,28 @@
+{
+ "Print": "Imprimer bulletin de livraison"
+
+ ,"TicketNumber:": "Num ticket:"
+ ,"DateExit:": "Date d'envoi:"
+ ,"SendMethod:": "Mode d'envoi:"
+ ,"Notes:": "Notes:"
+ ,"TicketTotal:": "Total:"
+ ,"(VATIncluded)": "(TVA comprise)"
+
+ ,"PC": "Code postal"
+ ,"City": "Ville"
+ ,"Province": "Province"
+ ,"Address": "Maison"
+ ,"Consignee": "Destinataire"
+
+ ,"ItemNumber": "Num article"
+ ,"Amount": "Quant"
+ ,"Item": "Article"
+ ,"Category": "catégorie"
+ ,"S1": "Mes"
+ ,"Stems": "Tiges"
+ ,"Color": "Couleur"
+ ,"Origin": "Origine"
+ ,"Price": "Prix"
+ ,"Disc": "Remise"
+ ,"Subtotal": "Sous-total"
+}
diff --git a/package/usr/share/hedera-web/locale/fr/modules/users.json b/package/usr/share/hedera-web/locale/fr/modules/users.json
new file mode 100755
index 00000000..03148fed
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/fr/modules/users.json
@@ -0,0 +1,12 @@
+{
+ "UserManagement": "Gestion des utilisateurs"
+
+ ,"UserName:": "Nom d'utilisateur:"
+
+ ,"UserNumber": "No. utilisateurs"
+ ,"UserName": "Nom d'utilisateur"
+ ,"Alias": "Alias"
+
+ ,"AccessAsUser": "Identité de l'utilisateur"
+ ,"AccessLog": "Fiche d'accès"
+}
diff --git a/package/usr/share/hedera-web/locale/fr/modules/visits.json b/package/usr/share/hedera-web/locale/fr/modules/visits.json
new file mode 100755
index 00000000..8a4f3649
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/fr/modules/visits.json
@@ -0,0 +1,31 @@
+{
+ "Visits": "Visitas"
+ ,"VisitsManagement": "Gestión de visitas"
+
+ ,"ActiveSessions": "Usuarios conectados"
+ ,"VisitsQuery": "Consulta de visitas"
+ ,"Refresh": "Actualizar"
+
+ ,"ActiveSessions:": "Usuarios conectados:"
+ ,"NewVisitsTotal:": "Nuevas visitas:"
+
+ ,"SessionNumber": "Nº sesión"
+ ,"User": "Usuario"
+ ,"Login": "Hora de acceso"
+ ,"LastActivity": "Última actividad"
+ ,"SO": "Sistema Operativo"
+ ,"Version": "Versión"
+ ,"NewVisit": "Nueva visita"
+
+ ,"SelectDateInterval": "Seleccione un intérvalo de fechas"
+ ,"FromDate:": "Desde el día:"
+ ,"ToDate:": "Hasta el día:"
+ ,"VisitsTotal:": "Total visitas:"
+
+ ,"Browser": "Navegador"
+ ,"MinVersion": "Versión mínima"
+ ,"MaxVersion": "Versión máxima"
+ ,"LastVisit": "Última visita"
+ ,"NewVisits": "Nuevas visitas"
+ ,"%a, %e %b %Y at %T": "%a, %e %b %Y a las %T"
+}
diff --git a/package/usr/share/hedera-web/locale/fr/modules/why.json b/package/usr/share/hedera-web/locale/fr/modules/why.json
new file mode 100755
index 00000000..edd4516e
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/fr/modules/why.json
@@ -0,0 +1,18 @@
+{
+ "AboutCompany": "Pourquoi Verdnatura?"
+ ,"StorePhoto": "Photo Magasin"
+ ,"AboutWhy":
+ "
Parce que nous avons le plus grand catalogue du secteur, renouvelé tous les jours.
Parce que avec ce site web vous avez un stock accessible en temps réel.
Parce que notre service d'achat dispose de 9 acheteurs spécialisés.
Parce qu'il est très facile de passer commande par internet ou par téléphone.
Parce que notre département commercial dispose de professionnels qui trouveront toujours la solution qui vous convient .
Parce que nous avons ce qu'il vous faut quand vous en avez besoin.
"
+
+ ,"AboutDesc":
+ "Somos una empresa dedicada a la venta mayorista y distribución de una amplia gama de complementos, verdes y flores naturales a floristerías u otros mayoristas."
+
+ ,"AboutService":
+ "Disponemos de servicio de reparto a domicilio con nuestros vehículos por toda la provincia de Valencia y áreas limitadas de Castellón, Alicante, Murcia, Albacete y Madrid enviamos al resto de la península mediante agencias de transporte con servicio 24/48 horas (Zeleris, Viaexpress). También realizamos venta directa a floristas en cualquiera de nuestras instalaciones."
+
+ ,"AboutDisp":
+ "Nuestra empresa dispone de más de 50 trabajadores y varias sucursales. La principal se encuentra situada en Valencia y cuenta con más de 8000 m2. También disponemos de un almacén situado en Mercaflor - Mercavalencia (Valencia) en el que únicamente realizamos venta directa."
+
+ ,"AboutOrder":
+ "Puede realizar sus pedidos y reservas por teléfono llamando al 96 324 21 00, por Internet a través de nuestra página web o bien directamente en nuestras instalaciones."
+}
diff --git a/package/usr/share/hedera-web/locale/fr/pages/login.json b/package/usr/share/hedera-web/locale/fr/pages/login.json
new file mode 100755
index 00000000..1fd9db08
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/fr/pages/login.json
@@ -0,0 +1,9 @@
+{
+ "User": "Utilisateur"
+ ,"Password": "Mot de passe"
+ ,"NotCloseSession": "Garder ma session active"
+ ,"IWantToKnowMore": "En savoir plus!"
+ ,"Enter": "Entrer"
+ ,"LoginMail": "ruben@verdnatura.es"
+ ,"LoginPhone": "+33 781 533 900"
+}
diff --git a/package/usr/share/hedera-web/locale/fr/pages/tpv.json b/package/usr/share/hedera-web/locale/fr/pages/tpv.json
new file mode 100755
index 00000000..d87f4ce7
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/fr/pages/tpv.json
@@ -0,0 +1,4 @@
+{
+ "PaymentComplete": "Le paiement terminé, vous pouvez maintenant revenir à notre site."
+ ,"ReturnToWeb": "Retour au Verdnatura"
+}
diff --git a/package/usr/share/hedera-web/locale/fr/pages/update-browser.json b/package/usr/share/hedera-web/locale/fr/pages/update-browser.json
new file mode 100755
index 00000000..c9e977e0
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/fr/pages/update-browser.json
@@ -0,0 +1,4 @@
+{
+ "UpdateYourBrowser": "Mettez à jour votre navigateur"
+ ,"ContinueAnyway": "Continuer"
+}
diff --git a/package/usr/share/hedera-web/locale/fr/pages/web.json b/package/usr/share/hedera-web/locale/fr/pages/web.json
new file mode 100755
index 00000000..dff01b04
--- /dev/null
+++ b/package/usr/share/hedera-web/locale/fr/pages/web.json
@@ -0,0 +1,4 @@
+{
+ "Welcome": "Bienvenue"
+ ,"Exit": "Sortir"
+}
diff --git a/package/usr/share/hedera-web/module.php b/package/usr/share/hedera-web/module.php
new file mode 100755
index 00000000..05aba3af
--- /dev/null
+++ b/package/usr/share/hedera-web/module.php
@@ -0,0 +1,28 @@
+
diff --git a/package/usr/share/hedera-web/modules/about/about.js b/package/usr/share/hedera-web/modules/about/about.js
new file mode 100755
index 00000000..3afbcc80
--- /dev/null
+++ b/package/usr/share/hedera-web/modules/about/about.js
@@ -0,0 +1,6 @@
+
+Vn.About = new Class
+({
+ Extends: Vn.Module
+});
+
diff --git a/package/usr/share/hedera-web/modules/about/html.php b/package/usr/share/hedera-web/modules/about/html.php
new file mode 100755
index 00000000..305f513c
--- /dev/null
+++ b/package/usr/share/hedera-web/modules/about/html.php
@@ -0,0 +1,83 @@
+
+
+
=s('QualityAndVariety')?>
+
=s('MaximumFreshness')?>
+
=s('SquareMeters')?>
+
+
=s('AboutRealms')?>
+
=s('AboutLocation')?>
+
+
+
+ =s('PurchaseThroughWeb')?>
+
+
+
+
+
=s('WhatMakeUsDifferent')?>
+
=s('DesignVariety')?>
+
+
=s('AdaptToYourNeeds')?>
+
=s('TheBestQuality')?>
+
+
+
=s('AtYourService')?>
+
=s('BuyersAndTraders')?>
+
+
+
+
=s('Training')?>
+
=s('GoodTraining')?>
+
+
=s('SpecialTrainingPrices')?>
+
+
=s('YoutubeChannel')?>
+
+
+
+
=s('HowWeWork')?>
+
=s('AalsmeerAuction')?>
+
+
=s('BeforeAuction')?>
+
+
=s('DirectlyFromProviders')?>
+
=s('GoodsDischarge')?>
+
+
+ =s('FirstQualityControl')?>
+
+
+
+
=s('GoodsTravel')?>
+
+
=s('GoodsReception')?>
+
+ =s('SecondQualityControl')?>
+
+
+
=s('CustomerOrders')?>
+
+
=s('AfterOrder')?>
+
+
+ =s('ThirdQualityControl')?>
+
+
+
=s('BuyerControl')?>
+
+ =s('FourthQualityControl')?>
+
+
+
=s('EmbeddedSection')?>
+
+
=s('AfterEmbedAgency')?>
+
+
=s('FreshnessGuaranteed')?>
+
+
+
+ =s('AboutSummary')?>
+
+
+
+
diff --git a/package/usr/share/hedera-web/modules/about/image/2_control.png b/package/usr/share/hedera-web/modules/about/image/2_control.png
new file mode 100755
index 00000000..baf92e2e
Binary files /dev/null and b/package/usr/share/hedera-web/modules/about/image/2_control.png differ
diff --git a/package/usr/share/hedera-web/modules/about/image/4_control.png b/package/usr/share/hedera-web/modules/about/image/4_control.png
new file mode 100755
index 00000000..e40677f9
Binary files /dev/null and b/package/usr/share/hedera-web/modules/about/image/4_control.png differ
diff --git a/package/usr/share/hedera-web/modules/about/image/agencies.png b/package/usr/share/hedera-web/modules/about/image/agencies.png
new file mode 100755
index 00000000..22efc294
Binary files /dev/null and b/package/usr/share/hedera-web/modules/about/image/agencies.png differ
diff --git a/package/usr/share/hedera-web/modules/about/image/auction.png b/package/usr/share/hedera-web/modules/about/image/auction.png
new file mode 100755
index 00000000..2c6c71b8
Binary files /dev/null and b/package/usr/share/hedera-web/modules/about/image/auction.png differ
diff --git a/package/usr/share/hedera-web/modules/about/image/commercial.png b/package/usr/share/hedera-web/modules/about/image/commercial.png
new file mode 100755
index 00000000..9047d848
Binary files /dev/null and b/package/usr/share/hedera-web/modules/about/image/commercial.png differ
diff --git a/package/usr/share/hedera-web/modules/about/image/courses.png b/package/usr/share/hedera-web/modules/about/image/courses.png
new file mode 100755
index 00000000..95e78235
Binary files /dev/null and b/package/usr/share/hedera-web/modules/about/image/courses.png differ
diff --git a/package/usr/share/hedera-web/modules/about/image/dealer.png b/package/usr/share/hedera-web/modules/about/image/dealer.png
new file mode 100755
index 00000000..6d306d1b
Binary files /dev/null and b/package/usr/share/hedera-web/modules/about/image/dealer.png differ
diff --git a/package/usr/share/hedera-web/modules/about/image/differentiates_us.png b/package/usr/share/hedera-web/modules/about/image/differentiates_us.png
new file mode 100755
index 00000000..0ba177e9
Binary files /dev/null and b/package/usr/share/hedera-web/modules/about/image/differentiates_us.png differ
diff --git a/package/usr/share/hedera-web/modules/about/image/fit.png b/package/usr/share/hedera-web/modules/about/image/fit.png
new file mode 100755
index 00000000..27d36e60
Binary files /dev/null and b/package/usr/share/hedera-web/modules/about/image/fit.png differ
diff --git a/package/usr/share/hedera-web/modules/about/image/glass.png b/package/usr/share/hedera-web/modules/about/image/glass.png
new file mode 100755
index 00000000..53bfc34f
Binary files /dev/null and b/package/usr/share/hedera-web/modules/about/image/glass.png differ
diff --git a/package/usr/share/hedera-web/modules/about/image/goods_receive.png b/package/usr/share/hedera-web/modules/about/image/goods_receive.png
new file mode 100755
index 00000000..ac0a3b50
Binary files /dev/null and b/package/usr/share/hedera-web/modules/about/image/goods_receive.png differ
diff --git a/package/usr/share/hedera-web/modules/about/image/goods_transport.png b/package/usr/share/hedera-web/modules/about/image/goods_transport.png
new file mode 100755
index 00000000..18ae6dc4
Binary files /dev/null and b/package/usr/share/hedera-web/modules/about/image/goods_transport.png differ
diff --git a/package/usr/share/hedera-web/modules/about/image/palletizing.png b/package/usr/share/hedera-web/modules/about/image/palletizing.png
new file mode 100755
index 00000000..3fec9c36
Binary files /dev/null and b/package/usr/share/hedera-web/modules/about/image/palletizing.png differ
diff --git a/package/usr/share/hedera-web/modules/about/image/producers.png b/package/usr/share/hedera-web/modules/about/image/producers.png
new file mode 100755
index 00000000..0a8949d5
Binary files /dev/null and b/package/usr/share/hedera-web/modules/about/image/producers.png differ
diff --git a/package/usr/share/hedera-web/modules/about/image/store.png b/package/usr/share/hedera-web/modules/about/image/store.png
new file mode 100755
index 00000000..266be20c
Binary files /dev/null and b/package/usr/share/hedera-web/modules/about/image/store.png differ
diff --git a/package/usr/share/hedera-web/modules/about/image/summary.png b/package/usr/share/hedera-web/modules/about/image/summary.png
new file mode 100755
index 00000000..7e3fc8e3
Binary files /dev/null and b/package/usr/share/hedera-web/modules/about/image/summary.png differ
diff --git a/package/usr/share/hedera-web/modules/about/image/trailer.png b/package/usr/share/hedera-web/modules/about/image/trailer.png
new file mode 100755
index 00000000..accd4db6
Binary files /dev/null and b/package/usr/share/hedera-web/modules/about/image/trailer.png differ
diff --git a/package/usr/share/hedera-web/modules/about/image/training.png b/package/usr/share/hedera-web/modules/about/image/training.png
new file mode 100755
index 00000000..4e925700
Binary files /dev/null and b/package/usr/share/hedera-web/modules/about/image/training.png differ
diff --git a/package/usr/share/hedera-web/modules/about/image/web.png b/package/usr/share/hedera-web/modules/about/image/web.png
new file mode 100755
index 00000000..bbdb4903
Binary files /dev/null and b/package/usr/share/hedera-web/modules/about/image/web.png differ
diff --git a/package/usr/share/hedera-web/modules/about/image/youtube.png b/package/usr/share/hedera-web/modules/about/image/youtube.png
new file mode 100755
index 00000000..2be1cc74
Binary files /dev/null and b/package/usr/share/hedera-web/modules/about/image/youtube.png differ
diff --git a/package/usr/share/hedera-web/modules/about/style.css b/package/usr/share/hedera-web/modules/about/style.css
new file mode 100755
index 00000000..5cffb31e
--- /dev/null
+++ b/package/usr/share/hedera-web/modules/about/style.css
@@ -0,0 +1,82 @@
+#about
+{
+ position: relative;
+ max-width: 50em;
+ display: block;
+ margin: 0px auto;
+}
+#about h1
+{
+ text-align: center;
+ font-size: 20px;
+ font-weight: normal;
+ margin: 20px 0px;
+ background-color: #F91;
+ border: #D70 solid 1px;
+ border-radius: 2px;
+}
+#about h2
+{
+ text-align: center;
+ font-size: 15px;
+ margin: 15px;
+}
+#about h3
+{
+ text-align: center;
+ font-size: 16px;
+ color: #4A1;
+ margin: 15px;
+}
+#about p
+{
+ width: 90%;
+ font-size: 15px;
+ display: block;
+ margin: 20px auto;
+}
+#about p.summary
+{
+ width: 370px;
+ text-align: center;
+ font-weight: bold;
+ background-color: #FF8;
+ padding: 30px;
+ border: #DD6 solid 1px;
+ border-radius: 2px;
+ margin: 40px auto;
+}
+
+/* Images */
+
+#about img
+{
+ text-align: center;
+ padding: 15px;
+ display: block;
+ margin: 0px auto;
+}
+#about img[alt="producers"],
+#about img[alt="4_control"],
+#about img[alt="dealer"],
+#about img[alt="goods_transport"]
+{
+ float: right;
+}
+#about img[alt="2_control"]
+{
+ float: left;
+}
+#about img[alt="glass"]
+{
+ display: inline;
+ padding: 0px;
+ padding-left: 10px;
+ vertical-align: middle;
+}
+#about img[alt="logo_small"]
+{
+ padding: 0px;
+ padding-top: 30px;
+}
+
diff --git a/package/usr/share/hedera-web/modules/access/access.js b/package/usr/share/hedera-web/modules/access/access.js
new file mode 100755
index 00000000..94535b61
--- /dev/null
+++ b/package/usr/share/hedera-web/modules/access/access.js
@@ -0,0 +1,16 @@
+
+Vn.Access = new Class
+({
+ Extends: Vn.Module
+
+ ,activate: function ()
+ {
+// this.get ('return').on ('clicked', this.returnClicked.bind (this));
+ }
+
+ ,returnClicked: function (column, value)
+ {
+ this.hash.set ({'module': 'users'});
+ }
+});
+
diff --git a/package/usr/share/hedera-web/modules/access/html.php b/package/usr/share/hedera-web/modules/access/html.php
new file mode 100755
index 00000000..fb7af238
--- /dev/null
+++ b/package/usr/share/hedera-web/modules/access/html.php
@@ -0,0 +1,73 @@
+
+
+
+ SELECT s.id, c.Cliente, e.date_time login, is_new,
+ s.date_time last_activity, a.platform, a.browser, a.version
+ FROM user_session s
+ JOIN visit_user e ON s.visit_user_id = e.id
+ JOIN visit_access c ON e.access_id = c.id
+ JOIN visit_agent a ON c.agent_id = a.id
+ JOIN visit v ON a.visit_id = v.id
+ JOIN account.user u ON e.user_id = u.id
+ JOIN vn2008.Clientes c ON e.user_id = c.Id_cliente
+ ORDER BY last_activity DESC
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SELECT browser
+ ,MIN(CAST(version AS DECIMAL(4,1))) min_version
+ ,MAX(CAST(version AS DECIMAL(4,1))) max_version
+ ,MAX(e.date_time) last_visit
+ ,COUNT(DISTINCT c.id) visits
+ ,SUM(is_new) new_visits
+ FROM visit_user e
+ JOIN visit_access c ON e.access_id = c.id
+ JOIN visit_agent a ON c.agent_id = a.id
+ JOIN visit v ON a.visit_id = v.id
+ WHERE e.date_time BETWEEN TIMESTAMP(#from,'00:00:00') AND TIMESTAMP(#to,'23:59:59')
+ GROUP BY browser ORDER BY visits DESC
+
+
+
+
+
+
+
+
+
+
+
+
+