/// Now start assembling the normal sub-modules ///
-addNames('YCollection', require('Y/types/collection'));
-addNames('YArray', require('Y/types/array'));
-addNames('YObject', require('Y/types/object'));
-addNames('YString', require('Y/types/string'));
-addNames('YNumber range', require('Y/types/number'));
+addNames('YCollection', require('Y/types/collection'));
+addNames('YArray', require('Y/types/array'));
+addNames('YObject deepcopy', require('Y/types/object'));
+addNames('YString', require('Y/types/string'));
+addNames('YNumber range', require('Y/types/number'));
var utils = require('Y/utils');
Y['bindAll'] = utils.bindAll;
init : function initConfig(defaults){
this._defaults = defaults || {};
- this._o = Y({}, this._defaults);
+ // this._o = Y({}, this._defaults);
+ this._o = Y(Y.deepcopy(this._defaults));
this.__emitter__ = new Emitter(this);
},
'key' : key,
'oldval' : oldval,
'newval' : newval,
+ 'defval' : this.getDefault(key),
'obj' : obj,
'root' : this
};
+//#ensure "Y/modules/y.kv"
var _document = document
, Y = require('Y').Y
, enc = encodeURIComponent
, dec = decodeURIComponent
-;
+,
-Y['cookies'] = exports;
+getAll =
+exports['all'] =
+ function getAll(){
+ return Y(_document.cookie+'').fromKV('; ');
+ }
+,
+getCookie =
exports['get'] =
function getCookie(k){
- var cookies = Y(_document.cookie+'').fromKV('; ');
+ var cookies = getAll();
if (k !== undefined)
return cookies[k];
else
return cookies;
- };
+ }
+,
+setCookie =
exports['set'] =
function setCookie(k, v, expires, path){
expires = 'expires='+(expires || "Sun, 24-Mar-2024 11:11:11 GMT");
path = 'path='+(path || "/");
_document.cookie = [ enc(k)+'='+enc(v), expires, path ].join('; ');
return Y.cookies.get();
- };
+ }
+,
+
+removeCookie =
+exports['remove'] =
+ function removeCookie(k, path){
+ if (_document.cookie)
+ _document.cookie = k+'= ; expires=Fri, 15-Jun-1984 11:11:11 GMT; path='+(path || '/');
+ }
+;
+
+Y['cookies'] = exports;
// TODO: YCollection methods on ns over kv pairs.
create =
exports['create'] =
function create(config, el){
+ var fields = {};
config.parts(
function createGroup(oldGroup, value, chain){
return jQuery('<fieldset/>')
var def = config.getDefault(chain)
, field = new Field(chain, def, value);
+ fields[chain] = field;
group.append(field.el);
config.addEventListener('set:'+chain, function onConfigSet(evt){
field.update(evt.data.newval);
return group;
},
el);
- return el;
+ return fields;
}
;
function setNested(o, chain, value){
if (o && chain){
var prop = getNestedMeta(ensure(o,chain), chain);
- prop.obj[prop.key] = value;
+ del.attr(prop.obj, prop.key, value);
}
return o;
}
-var YObject =
+var deepcopy =
+exports['deepcopy'] =
+function deepcopy(o){
+ if (!o)
+ return o;
+
+ if ( Y.isFunction(o.clone) )
+ return o.clone();
+
+ var path = new Y.YArray();
+ return core.reduce(o, function _deepcopy(acc, v, k){
+ var chain = path.push(k).join('.');
+
+ if ( v && Y.isFunction(v.clone) )
+ acc.setNested(chain, v.clone());
+
+ // Nested object -- recurse
+ else if ( Y.isPlainObject(v) )
+ core.reduce(v, _deepcopy, acc);
+
+ // "Normal" value -- just set
+ else
+ acc.setNested(chain, v);
+
+ path.pop();
+ return acc;
+ }, new YObject()).end();
+}
+,
+
+YObject =
exports['YObject'] =
-YCollection.subclass('YObject', function setupYObject(YObject){
+YCollection.subclass('YObject', {
- this['init'] =
- function initYObject(o){
+ init : function initYObject(o){
this._o = o || {};
- };
+ },
+
+ clone : function clone(){
+ return new YObject( deepcopy(this._o) );
+ }
});
//#ensure "jquery"
var Y = require('Y').Y
-, EventLoop = require('ezl/loop/eventloop').EventLoop
+, cookies = require('Y/modules/y.cookies')
, scaffold = require('Y/modules/y.scaffold')
+, EventLoop = require('ezl/loop/eventloop').EventLoop
, config = require('tanks/config').values
-, configUI
+, configUI, fields
;
exports['init'] =
function initConfigUi(){
- configUI = scaffold.create(config, jQuery('#config .box'));
- configUI.append( jQuery('<div class="clearer"></div>') );
+ configUI = jQuery('#config .box');
+ fields = scaffold.create(config, configUI);
+ Y.core.forEach(fields, function(field, key){
+ var cookie = cookies.get(key);
+ if (cookie) config.set(key, field.cast(cookie));
+ });
+ configUI.append( jQuery('<div class="clearer"></div>') );
config.addEventListener('set:game.timeDilation', function(evt){
EventLoop.fn.dilation = evt.data.newval;
});
};
+config.addEventListener('set', function(evt){
+ var d = evt.data;
+ if (d.newval !== d.defval)
+ cookies.set(d.key, d.newval);
+ else
+ cookies.remove(d.key);
+});
// exports['init'] =
// function initConfigUi(){
<script src="build/ezl.js" type="text/javascript"></script>
<script src="build/tanks/globals.js" type="text/javascript"></script>
<script src="build/jquery.hotkeys.js" type="text/javascript"></script>
-<script src="build/mustache.js" type="text/javascript"></script>
-<script src="build/jquery.mustache.js" type="text/javascript"></script>
<script src="build/ezl/util/binaryheap.js" type="text/javascript"></script>
<script src="build/ezl/util/astar.js" type="text/javascript"></script>
-<script src="build/Y/modules/y.scaffold.js" type="text/javascript"></script>
+<script src="build/Y/modules/y.cookies.js" type="text/javascript"></script>
<script src="build/Y/modules/y.kv.js" type="text/javascript"></script>
<script src="build/ezl/util/tree/quadtree.js" type="text/javascript"></script>
<script src="build/y/modules/y.config.js" type="text/javascript"></script>
+<script src="build/Y/modules/y.scaffold.js" type="text/javascript"></script>
<script src="build/tanks/config.js" type="text/javascript"></script>
<script src="build/tanks/ui/configui.js" type="text/javascript"></script>
<script src="build/tanks/thing/thing.js" type="text/javascript"></script>