var Object = require('./object'); var Param = require('./param'); var Hash = require('./hash'); module.exports = new Class({ Extends: Object ,Tag: 'vn-hash-param' ,Child: 'param' ,Properties: { param: { type: Param ,set: function(x) { this.link({_param: x}, {'changed': this._onParamChange}); this._refreshParam(); } ,get: function() { return this._param; } }, key: { type: String ,set: function(x) { this._key = x; this._onHashChange(); } ,get: function() { return this._key; } }, value: { type: Object ,set: function(x) { this._setValue(x, true); } ,get: function() { return this._value; } }, type: { type: Object ,set: function(x) { this._type = x; this._onHashChange(); } ,get: function() { return this._type; } } } ,_hashLock: false ,_paramLock: false ,_value: undefined ,_key: null ,_type: null ,initialize: function(props) { this.parent(props); var listener = Hash.getListener(); this.link({_listener: listener}, {'changed': this._onHashChange}); this._onHashChange(); } ,_onHashChange: function() { if (this._hashLock || !this._key || !this._listener) return; var newValue = Hash.get(this._key); if (newValue === '') newValue = null; if (this._type && newValue !== undefined && newValue !== null) switch (this._type) { case Boolean: newValue = (/^(true|1)$/i).test(newValue); break; case Number: newValue = 0 + new Number(newValue); break; } this._hashLock = true; this._setValue(newValue, true); this._hashLock = false; } ,_setValue: function(newValue, signal) { if (newValue == this._value) return; this._value = newValue; if (this._key && !this._hashLock) { this._hashLock = true; var map = {}; map[this._key] = newValue; Hash.add(map); this._hashLock = false; } this._refreshParam(); if (signal) this.signalEmit('changed', newValue); } ,_refreshParam: function() { if (this._param && !this._paramLock) { this._paramLock = true; this._param.value = this._value; this._paramLock = false; } } ,_onParamChange: function() { if (this._paramLock) return; this._paramLock = true; this._setValue(this._param.value); this._paramLock = false; } });