westdc-zf1/htdocs/js/timemap/param.js

275 lines
8.8 KiB
JavaScript

/*
* Timemap.js Copyright 2010 Nick Rabinowitz.
* Licensed under the MIT License (see LICENSE.txt)
*/
/**
* @fileOverview
* This file defines the Param class, which is used to get, set, and serialize
* different fields on TimeMap and TimeMapItem objects.
*
* @author Nick Rabinowitz (www.nickrabinowitz.com)
*/
// save a few bytes
(function() {
/**
* @name TimeMap.params
* @namespace Namespace for parameter classes
*/
var params = TimeMap.params = {
/**
* @class
* A parameter, with methods to get, set, and serialize the current value.
*
* @constructor
* @param {String} paramName String name of the parameter
* @param {Object} options Container for named arguments
* @param {String} [sourceName] String name of the source element, if different
* @param {Function} [options.get] Function to get the current param value
* @param {Function} [options.set] Function to set the param to a new value
* @param {Function} [options.setConfig] Function to set a new value in a config object
* @param {Function} [options.fromStr] Function to parse the value from a string
* @param {Function} [options.toStr] Function to serialize the current value to a string
* @param {Function} [options.setConfigXML] Function to parse the value from an XML node and set to config
*/
Param: function(paramName, options) {
var param = this,
options = options || {};
/**
* String name of this param
* @name TimeMap.params.Param#paramName
* @type String
*/
param.paramName = paramName;
/**
* String name of the source element, if different
* @name TimeMap.params.Param#sourceName
*/
param.sourceName = options.sourceName || paramName;
/**
* Get the current state value from a TimeMap or TimeMapItem object
* @name TimeMap.params.Param#get
* @function
*
* @param {TimeMap|TimeMapItem} o Object to inspect
* @return {mixed} Current state value
*/
param.get = options.get;
/**
* Set the current state value on a TimeMap or TimeMapItem object
* @name TimeMap.params.Param#set
* @function
*
* @param {TimeMap|TimeMapItem} o Object to modify
* @param {mixed} value Value to set
*/
param.set = options.set;
/**
* Set a new value on a config object for TimeMap.init()
* @name TimeMap.params.Param#setConfig
* @function
* @see TimeMap.init
*
* @param {Object} config Config object to modify
* @param {mixed} value Value to set
*/
param.setConfig = options.setConfig || function(config, value) {
// default: set at top level
config[paramName] = value;
};
/**
* Parse a state value from a string
* @name TimeMap.params.Param#fromString
* @function
*
* @param {String} s String to parse
* @return {mixed} Current state value
*/
param.fromString = options.fromStr || function(s) {
// default: param is a string
return s;
};
/**
* Serialize a state value as a string
* @name TimeMap.params.Param#toString
* @function
*
* @param {mixed} value Value to serialize
* @return {String} Serialized string
*/
param.toString = options.toStr || function(value) {
// default: use the built-in string method
return value.toString();
};
/**
* Get the current value as a string
* @name TimeMap.params.Param#getString
* @function
*
* @param {TimeMap|TimeMapItem} o Object to inspect
*/
param.getString = function(o) {
param.toString(param.get(o));
};
/**
* Set the current state value from a string
* @name TimeMap.params.Param#setString
* @function
*
* @param {TimeMap|TimeMapItem} o Object to modify
* @param {String} s String version of value to set
*/
param.setString = function(o, s) {
param.set(o, param.fromString(s));
};
/**
* Set a config object based on an XML tag
* @name TimeMap.params.Param#setConfigXML
* @function
*
* @param {Object} config Config object to modify
* @param {XML NodeList} node Parent node of the desired tag
*/
param.setConfigXML = options.setConfigXML || function(config, node) {
var tagName = param.sourceName,
nameParts = tagName.split(':'),
ns;
// deal with namespaced tags
if (nameParts.length > 1) {
tagName = nameParts[1];
ns = nameParts[0];
}
// set to config
param.setConfig(config, TimeMap.util.getTagValue(node, tagName, ns));
};
},
/**
* @class
* A convenience class for those parameters which deal with a value
* in the options of a TimeMap or TimeMapItem object, setting some
* additional default functions.
*
* @augments TimeMap.params.Param
*
* @constructor
* @param {String} paramName String name of the option parameter
* @param {Object} [options] Container for named arguments (see {@link TimeMap.params.Param})
*/
OptionParam: function(paramName, options) {
options = options || {};
var defaults = {
/**
* Get the current state value from the opts object of a TimeMap or TimeMapItem
* @name TimeMap.params.OptionParam#get
* @function
*
* @param {TimeMap|TimeMapItem} o Object to inspect
* @return {mixed} Current state value
*/
get: function(o) {
return o.opts[paramName];
},
/**
* Set the state value in the opts object of a TimeMap or TimeMapItem
* @name TimeMap.params.OptionParam#set
*
* @param {TimeMap|TimeMapItem} o Object to modify
* @param {mixed} value Value to set
*/
set: function(o, value) {
o.opts[paramName] = value;
},
/**
* Set a new value on a config object for TimeMap.init() or a particular item
* @name TimeMap.params.OptionParam#setConfig
* @function
*
* @param {Object} config Config object to modify
* @param {mixed} value Value to set
*/
setConfig: function(config, value) {
config.options = config.options || {};
config.options[paramName] = value;
}
};
options = TimeMap.util.merge(options, defaults);
return new params.Param(paramName, options);
}
};
/*----------------------------------------------------------------------------
* TimeMapItem params
*---------------------------------------------------------------------------*/
/**
* @namespace Namespace for parameters used for loading data into a TimeMapItem
* object. Because these are intended for loading, only setConfig is defined.
*/
TimeMap.loaders.base.prototype.params = {
/**
* Item title
* @type TimeMap.params.Param
*/
title: new params.Param("title"),
/**
* Item start date
* @type TimeMap.params.Param
*/
start: new params.Param("start"),
/**
* Item end date
* @type TimeMap.params.Param
*/
end: new params.Param("end"),
/**
* Item description
* @type TimeMap.params.OptionParam
*/
description: new params.OptionParam("description"),
/**
* Item latitude
* @type TimeMap.params.Param
*/
lat: new params.Param("lat", {
setConfig: function(config, value) {
config.point = config.point || {};
config.point.lat = value;
}
}),
/**
* Item longitude
* @type TimeMap.params.Param
*/
lon: new params.Param("lon", {
setConfig: function(config, value) {
config.point = config.point || {};
config.point.lon = value;
}
})
};
})();