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