1 /*
  2  * Timemap.js Copyright 2010 Nick Rabinowitz.
  3  * Licensed under the MIT License (see LICENSE.txt)
  4  */
  5  
  6 /**
  7  * @fileOverview
  8  * XML Loader
  9  *
 10  * @author Nick Rabinowitz (www.nickrabinowitz.com)
 11  */
 12  
 13 /*globals TimeMap */
 14 
 15  /**
 16  * @class
 17  * This is a base loader class for XML files.
 18  *
 19  * @augments TimeMap.loaders.remote
 20  * @requires param.js
 21  *
 22  * @param {Object} options          All options for the loader
 23  * @param {String} options.url              URL of XML file to load (NB: must be local address)
 24  * @parem {String[]} [options.extraTags]    Array of names for extra tag elements to load
 25  * @param {Object} [options.tagMap]         Map of tagName:paramName pairs, if you want to load
 26  *                                          data into a differently-named elements
 27  * @param {mixed} [options[...]]            Other options (see {@link TimeMap.loaders.remote})
 28  * @return {TimeMap.loaders.remote} Remote loader configured for XML
 29  */
 30 TimeMap.loaders.xml = function(options) {
 31     var loader = new TimeMap.loaders.remote(options),
 32         tagMap = options.tagMap || {},
 33         extraTags = options.extraTags || [],
 34         params = loader.params;
 35     
 36     /**
 37      * Load function for remote XML files.
 38      * @name TimeMap.loaders.xml#load
 39      * @function
 40      *
 41      * @param {TimeMapDataset} dataset  Dataset to load data into
 42      * @param {Function} callback       Function to call once data is loaded
 43      */
 44     loader.load = function(dataset, callback) {
 45         // get loader callback name (allows cancellation)
 46         loader.callbackName = loader.getCallbackName(dataset, callback);
 47         // set the callback function
 48         // see http://docs.jquery.com/Specifying_the_Data_Type_for_AJAX_Requests
 49         loader.opts.dataType =  $.browser.msie ? "text" : "xml";
 50         loader.opts.success = function(data) {
 51             var xml;
 52             if (typeof data == "string") {
 53                 xml = new ActiveXObject("Microsoft.XMLDOM");
 54                 xml.async = false;
 55                 xml.loadXML(data);
 56             } else {
 57                 xml = data;
 58             }
 59             TimeMap.loaders.cb[loader.callbackName](xml);
 60         };
 61         // download remote data
 62         $.ajax(loader.opts);
 63     };
 64     
 65     /**
 66      * Additional parameters to load
 67      * @name TimeMap.loaders.xml#extraParams
 68      * @type TimeMap.params.OptionParam[]
 69      */
 70     loader.extraParams = [];
 71     
 72     // set up extra params
 73     extraTags.forEach(function(tagName) {
 74         loader.extraParams.push(
 75             new TimeMap.params.OptionParam(tagMap[tagName] || tagName, {
 76                 sourceName: tagName
 77             })
 78         );
 79     });
 80     
 81     /**
 82      * Parse any extra tags that have been specified into the config object
 83      * @name TimeMap.loaders.xml#parseExtra
 84      * @function
 85      *
 86      * @param {Object} config       Config object to modify
 87      * @param {XML NodeList} node   Parent node to look for tags in
 88      */
 89     loader.parseExtra = function(config, node) {
 90         loader.extraParams.forEach(function(ep) {
 91             ep.setConfigXML(config, node);
 92         });
 93         node = null;
 94     };
 95     
 96     return loader;
 97 };
 98