<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -2580,7 +2580,6 @@ util.DataSource = function(oLiveData, oConfigs) {
 lang.augmentObject(util.DataSource, DS);
 
 })();
-
 /****************************************************************************/
 /****************************************************************************/
 /****************************************************************************/
@@ -2597,37 +2596,55 @@ lang.augmentObject(util.DataSource, DS);
  YAHOO.util.Number = {
  
      /**
-     * Takes a native JavaScript Number and formats to string for display to user.
+     * Takes a native JavaScript Number and formats to a string for display.
      *
      * @method format
      * @param nData {Number} Number.
      * @param oConfig {Object} (Optional) Optional configuration values:
      *  &lt;dl&gt;
-     *   &lt;dt&gt;prefix {String}&lt;/dd&gt;
+     *   &lt;dt&gt;format&lt;/dt&gt;
+     *   &lt;dd&gt;String used as a template for formatting positive numbers.
+     *   {placeholders} in the string are applied from the values in this
+     *   config object. {number} is used to indicate where the numeric portion
+     *   of the output goes.  For example &amp;quot;{prefix}{number} per item&amp;quot;
+     *   might yield &amp;quot;$5.25 per item&amp;quot;.  The only required
+     *   {placeholder} is {number}.&lt;/dd&gt;
+     *
+     *   &lt;dt&gt;negativeFormat&lt;/dt&gt;
+     *   &lt;dd&gt;Like format, but applied to negative numbers.  If set to null,
+     *   defaults from the configured format, prefixed with -.  This is
+     *   separate from format to support formats like &amp;quot;($12,345.67)&amp;quot;.
+     *
+     *   &lt;dt&gt;prefix {String} (deprecated, use format/negativeFormat)&lt;/dt&gt;
      *   &lt;dd&gt;String prepended before each number, like a currency designator &quot;$&quot;&lt;/dd&gt;
-     *   &lt;dt&gt;decimalPlaces {Number}&lt;/dd&gt;
+     *   &lt;dt&gt;decimalPlaces {Number}&lt;/dt&gt;
      *   &lt;dd&gt;Number of decimal places to round.&lt;/dd&gt;
-     *   &lt;dt&gt;decimalSeparator {String}&lt;/dd&gt;
+     *   &lt;dt&gt;decimalSeparator {String}&lt;/dt&gt;
      *   &lt;dd&gt;Decimal separator&lt;/dd&gt;
-     *   &lt;dt&gt;thousandsSeparator {String}&lt;/dd&gt;
+     *   &lt;dt&gt;thousandsSeparator {String}&lt;/dt&gt;
      *   &lt;dd&gt;Thousands separator&lt;/dd&gt;
-     *   &lt;dt&gt;suffix {String}&lt;/dd&gt;
+     *   &lt;dt&gt;suffix {String} (deprecated, use format/negativeFormat)&lt;/dt&gt;
      *   &lt;dd&gt;String appended after each number, like &quot; items&quot; (note the space)&lt;/dd&gt;
-     *   &lt;dt&gt;negativeFormat&lt;/dt&gt;
-     *   &lt;dd&gt;String used as a guide for how to indicate negative numbers.  The first '#' character in the string will be replaced by the number.  Default '-#'.&lt;/dd&gt;
      *  &lt;/dl&gt;
      * @return {String} Formatted number for display. Note, the following values
      * return as &quot;&quot;: null, undefined, NaN, &quot;&quot;.
      */
     format : function(n, cfg) {
-        if (!isFinite(+n)) {
+        if (n === '' || n === null || !isFinite(n)) {
             return '';
         }
 
-        n   = !isFinite(+n) ? 0 : +n;
+        n   = +n;
         cfg = YAHOO.lang.merge(YAHOO.util.Number.format.defaults, (cfg || {}));
 
-        var neg    = n &lt; 0,        absN   = Math.abs(n),
+        if (!cfg.negativeFormat) {
+            cfg.negativeFormat = '-' + cfg.format;
+        } else if (cfg.negativeFormat.indexOf('#') &gt; -1) {
+            // for backward compatibility of negativeFormat supporting '-#'
+            cfg.negativeFormat = cfg.negativeFormat.replace(/#/, cfg.format);
+        }
+
+        var absN   = Math.abs(n),
             places = cfg.decimalPlaces,
             sep    = cfg.thousandsSeparator,
             s, bits, i;
@@ -2639,41 +2656,50 @@ lang.augmentObject(util.DataSource, DS);
 
             // avoid 123 vs decimalPlaces -4 (should return &quot;0&quot;)
             if (i &gt; 0) {
-                    // leverage toFixed by making 123 =&gt; 0.123 for the rounding
-                    // operation, then add the appropriate number of zeros back on
+                // leverage toFixed by making 123 =&gt; 0.123 for the rounding
+                // operation, then add the appropriate number of zeros back on
                 s = Number('.' + s).toFixed(i).slice(2) +
                     new Array(s.length - i + 1).join('0');
             } else {
                 s = &quot;0&quot;;
             }
-        } else {        // There is a bug in IE's toFixed implementation:
+        } else {
+            // There is a bug in IE's toFixed implementation:
             // for n in {(-0.94, -0.5], [0.5, 0.94)} n.toFixed() returns 0
             // instead of -1 and 1. Manually handle that case.
             s = absN &lt; 1 &amp;&amp; absN &gt;= 0.5 &amp;&amp; !places ? '1' : absN.toFixed(places);
         }
 
+        bits  = s.split(/\D/);
+
         if (absN &gt;= 1000) {
-            bits  = s.split(/\D/);
             i  = bits[0].length % 3 || 3;
 
             bits[0] = bits[0].slice(0,i) +
                       bits[0].slice(i).replace(/(\d{3})/g, sep + '$1');
 
-            s = bits.join(cfg.decimalSeparator);
         }
 
-        s = cfg.prefix + s + cfg.suffix;
-
-        return neg ? cfg.negativeFormat.replace(/#/,s) : s;
+        return YAHOO.util.Number.format._applyFormat(
+            (n &lt; 0 ? cfg.negativeFormat : cfg.format),
+            bits.join(cfg.decimalSeparator),
+            cfg);
     }
 };
+
 YAHOO.util.Number.format.defaults = {
+    format : '{prefix}{number}{suffix}',
+    negativeFormat : null, // defaults to -(format)
     decimalSeparator : '.',
     decimalPlaces    : null,
-    thousandsSeparator : '',
-    prefix : '',
-    suffix : '',
-    negativeFormat : '-#'
+    thousandsSeparator : ''
+};
+
+YAHOO.util.Number.format._applyFormat = function (tmpl, num, data) {
+    return tmpl.replace(/\{(\w+)\}/g, function (_, token) {
+        return token === 'number' ? num :
+               token in data ? data[token] : '';
+    });
 };
 
 
@@ -3057,5 +3083,4 @@ var xPad=function (x, pad, r)
  YAHOO.util.DateLocale['en-AU'] = YAHOO.lang.merge(YAHOO.util.DateLocale['en']);
 
 })();
-
 YAHOO.register(&quot;datasource&quot;, YAHOO.util.DataSource, {version: &quot;@VERSION@&quot;, build: &quot;@BUILD@&quot;});</diff>
      <filename>build/datasource/datasource-debug.js</filename>
    </modified>
    <modified>
      <diff>@@ -2,5 +2,5 @@
 }else{if(oRawResponse&amp;&amp;oRawResponse.nodeType&amp;&amp;(oRawResponse.nodeType===9||oRawResponse.nodeType===1||oRawResponse.nodeType===11)){this.responseType=DS.TYPE_XML;}else{if(oRawResponse&amp;&amp;oRawResponse.nodeName&amp;&amp;(oRawResponse.nodeName.toLowerCase()==&quot;table&quot;)){this.responseType=DS.TYPE_HTMLTABLE;}else{if(YAHOO.lang.isObject(oRawResponse)){this.responseType=DS.TYPE_JSON;}else{if(YAHOO.lang.isString(oRawResponse)){this.responseType=DS.TYPE_TEXT;}}}}}}}switch(this.responseType){case DS.TYPE_JSARRAY:if(xhr&amp;&amp;oRawResponse&amp;&amp;oRawResponse.responseText){oFullResponse=oRawResponse.responseText;}try{if(lang.isString(oFullResponse)){var parseArgs=[oFullResponse].concat(this.parseJSONArgs);if(lang.JSON){oFullResponse=lang.JSON.parse.apply(lang.JSON,parseArgs);}else{if(window.JSON&amp;&amp;JSON.parse){oFullResponse=JSON.parse.apply(JSON,parseArgs);}else{if(oFullResponse.parseJSON){oFullResponse=oFullResponse.parseJSON.apply(oFullResponse,parseArgs.slice(1));}else{while(oFullResponse.length&gt;0&amp;&amp;(oFullResponse.charAt(0)!=&quot;{&quot;)&amp;&amp;(oFullResponse.charAt(0)!=&quot;[&quot;)){oFullResponse=oFullResponse.substring(1,oFullResponse.length);}if(oFullResponse.length&gt;0){var arrayEnd=Math.max(oFullResponse.lastIndexOf(&quot;]&quot;),oFullResponse.lastIndexOf(&quot;}&quot;));oFullResponse=oFullResponse.substring(0,arrayEnd+1);oFullResponse=eval(&quot;(&quot;+oFullResponse+&quot;)&quot;);}}}}}}catch(e1){}oFullResponse=this.doBeforeParseData(oRequest,oFullResponse,oCallback);oParsedResponse=this.parseArrayData(oRequest,oFullResponse);break;case DS.TYPE_JSON:if(xhr&amp;&amp;oRawResponse&amp;&amp;oRawResponse.responseText){oFullResponse=oRawResponse.responseText;}try{if(lang.isString(oFullResponse)){var parseArgs=[oFullResponse].concat(this.parseJSONArgs);if(lang.JSON){oFullResponse=lang.JSON.parse.apply(lang.JSON,parseArgs);}else{if(window.JSON&amp;&amp;JSON.parse){oFullResponse=JSON.parse.apply(JSON,parseArgs);}else{if(oFullResponse.parseJSON){oFullResponse=oFullResponse.parseJSON.apply(oFullResponse,parseArgs.slice(1));}else{while(oFullResponse.length&gt;0&amp;&amp;(oFullResponse.charAt(0)!=&quot;{&quot;)&amp;&amp;(oFullResponse.charAt(0)!=&quot;[&quot;)){oFullResponse=oFullResponse.substring(1,oFullResponse.length);}if(oFullResponse.length&gt;0){var objEnd=Math.max(oFullResponse.lastIndexOf(&quot;]&quot;),oFullResponse.lastIndexOf(&quot;}&quot;));oFullResponse=oFullResponse.substring(0,objEnd+1);oFullResponse=eval(&quot;(&quot;+oFullResponse+&quot;)&quot;);}}}}}}catch(e){}oFullResponse=this.doBeforeParseData(oRequest,oFullResponse,oCallback);oParsedResponse=this.parseJSONData(oRequest,oFullResponse);break;case DS.TYPE_HTMLTABLE:if(xhr&amp;&amp;oRawResponse.responseText){var el=document.createElement(&quot;div&quot;);el.innerHTML=oRawResponse.responseText;oFullResponse=el.getElementsByTagName(&quot;table&quot;)[0];}oFullResponse=this.doBeforeParseData(oRequest,oFullResponse,oCallback);oParsedResponse=this.parseHTMLTableData(oRequest,oFullResponse);break;case DS.TYPE_XML:if(xhr&amp;&amp;oRawResponse.responseXML){oFullResponse=oRawResponse.responseXML;}oFullResponse=this.doBeforeParseData(oRequest,oFullResponse,oCallback);oParsedResponse=this.parseXMLData(oRequest,oFullResponse);break;case DS.TYPE_TEXT:if(xhr&amp;&amp;lang.isString(oRawResponse.responseText)){oFullResponse=oRawResponse.responseText;}oFullResponse=this.doBeforeParseData(oRequest,oFullResponse,oCallback);oParsedResponse=this.parseTextData(oRequest,oFullResponse);break;default:oFullResponse=this.doBeforeParseData(oRequest,oFullResponse,oCallback);oParsedResponse=this.parseData(oRequest,oFullResponse);break;}oParsedResponse=oParsedResponse||{};if(!oParsedResponse.results){oParsedResponse.results=[];}if(!oParsedResponse.meta){oParsedResponse.meta={};}if(!oParsedResponse.error){oParsedResponse=this.doBeforeCallback(oRequest,oFullResponse,oParsedResponse,oCallback);this.fireEvent(&quot;responseParseEvent&quot;,{request:oRequest,response:oParsedResponse,callback:oCallback,caller:oCaller});this.addToCache(oRequest,oParsedResponse);}else{oParsedResponse.error=true;this.fireEvent(&quot;dataErrorEvent&quot;,{request:oRequest,response:oRawResponse,callback:oCallback,caller:oCaller,message:DS.ERROR_DATANULL});}oParsedResponse.tId=tId;DS.issueCallback(oCallback,[oRequest,oParsedResponse],oParsedResponse.error,oCaller);},doBeforeParseData:function(oRequest,oFullResponse,oCallback){return oFullResponse;},doBeforeCallback:function(oRequest,oFullResponse,oParsedResponse,oCallback){return oParsedResponse;},parseData:function(oRequest,oFullResponse){if(lang.isValue(oFullResponse)){var oParsedResponse={results:oFullResponse,meta:{}};return oParsedResponse;}return null;},parseArrayData:function(oRequest,oFullResponse){if(lang.isArray(oFullResponse)){var results=[],i,j,rec,field,data;if(lang.isArray(this.responseSchema.fields)){var fields=this.responseSchema.fields;for(i=fields.length-1;i&gt;=0;--i){if(typeof fields[i]!==&quot;object&quot;){fields[i]={key:fields[i]};}}var parsers={},p;for(i=fields.length-1;i&gt;=0;--i){p=(typeof fields[i].parser===&quot;function&quot;?fields[i].parser:DS.Parser[fields[i].parser+&quot;&quot;])||fields[i].converter;if(p){parsers[fields[i].key]=p;}}var arrType=lang.isArray(oFullResponse[0]);for(i=oFullResponse.length-1;i&gt;-1;i--){var oResult={};rec=oFullResponse[i];if(typeof rec===&quot;object&quot;){for(j=fields.length-1;j&gt;-1;j--){field=fields[j];data=arrType?rec[j]:rec[field.key];if(parsers[field.key]){data=parsers[field.key].call(this,data);}if(data===undefined){data=null;}oResult[field.key]=data;}}else{if(lang.isString(rec)){for(j=fields.length-1;j&gt;-1;j--){field=fields[j];data=rec;if(parsers[field.key]){data=parsers[field.key].call(this,data);}if(data===undefined){data=null;}oResult[field.key]=data;}}}results[i]=oResult;}}else{results=oFullResponse;}var oParsedResponse={results:results};return oParsedResponse;}return null;},parseTextData:function(oRequest,oFullResponse){if(lang.isString(oFullResponse)){if(lang.isString(this.responseSchema.recordDelim)&amp;&amp;lang.isString(this.responseSchema.fieldDelim)){var oParsedResponse={results:[]};var recDelim=this.responseSchema.recordDelim;var fieldDelim=this.responseSchema.fieldDelim;if(oFullResponse.length&gt;0){var newLength=oFullResponse.length-recDelim.length;if(oFullResponse.substr(newLength)==recDelim){oFullResponse=oFullResponse.substr(0,newLength);
 }if(oFullResponse.length&gt;0){var recordsarray=oFullResponse.split(recDelim);for(var i=0,len=recordsarray.length,recIdx=0;i&lt;len;++i){var bError=false,sRecord=recordsarray[i];if(lang.isString(sRecord)&amp;&amp;(sRecord.length&gt;0)){var fielddataarray=recordsarray[i].split(fieldDelim);var oResult={};if(lang.isArray(this.responseSchema.fields)){var fields=this.responseSchema.fields;for(var j=fields.length-1;j&gt;-1;j--){try{var data=fielddataarray[j];if(lang.isString(data)){if(data.charAt(0)=='&quot;'){data=data.substr(1);}if(data.charAt(data.length-1)=='&quot;'){data=data.substr(0,data.length-1);}var field=fields[j];var key=(lang.isValue(field.key))?field.key:field;if(!field.parser&amp;&amp;field.converter){field.parser=field.converter;}var parser=(typeof field.parser===&quot;function&quot;)?field.parser:DS.Parser[field.parser+&quot;&quot;];if(parser){data=parser.call(this,data);}if(data===undefined){data=null;}oResult[key]=data;}else{bError=true;}}catch(e){bError=true;}}}else{oResult=fielddataarray;}if(!bError){oParsedResponse.results[recIdx++]=oResult;}}}}}return oParsedResponse;}}return null;},parseXMLResult:function(result){var oResult={},schema=this.responseSchema;try{for(var m=schema.fields.length-1;m&gt;=0;m--){var field=schema.fields[m];var key=(lang.isValue(field.key))?field.key:field;var data=null;if(this.useXPath){data=YAHOO.util.DataSource._getLocationValue(field,result);}else{var xmlAttr=result.attributes.getNamedItem(key);if(xmlAttr){data=xmlAttr.value;}else{var xmlNode=result.getElementsByTagName(key);if(xmlNode&amp;&amp;xmlNode.item(0)){var item=xmlNode.item(0);data=(item)?((item.text)?item.text:(item.textContent)?item.textContent:null):null;if(!data){var datapieces=[];for(var j=0,len=item.childNodes.length;j&lt;len;j++){if(item.childNodes[j].nodeValue){datapieces[datapieces.length]=item.childNodes[j].nodeValue;}}if(datapieces.length&gt;0){data=datapieces.join(&quot;&quot;);}}}}}if(data===null){data=&quot;&quot;;}if(!field.parser&amp;&amp;field.converter){field.parser=field.converter;}var parser=(typeof field.parser===&quot;function&quot;)?field.parser:DS.Parser[field.parser+&quot;&quot;];if(parser){data=parser.call(this,data);}if(data===undefined){data=null;}oResult[key]=data;}}catch(e){}return oResult;},parseXMLData:function(oRequest,oFullResponse){var bError=false,schema=this.responseSchema,oParsedResponse={meta:{}},xmlList=null,metaNode=schema.metaNode,metaLocators=schema.metaFields||{},i,k,loc,v;try{if(this.useXPath){for(k in metaLocators){oParsedResponse.meta[k]=YAHOO.util.DataSource._getLocationValue(metaLocators[k],oFullResponse);}}else{metaNode=metaNode?oFullResponse.getElementsByTagName(metaNode)[0]:oFullResponse;if(metaNode){for(k in metaLocators){if(lang.hasOwnProperty(metaLocators,k)){loc=metaLocators[k];v=metaNode.getElementsByTagName(loc)[0];if(v){v=v.firstChild.nodeValue;}else{v=metaNode.attributes.getNamedItem(loc);if(v){v=v.value;}}if(lang.isValue(v)){oParsedResponse.meta[k]=v;}}}}}xmlList=(schema.resultNode)?oFullResponse.getElementsByTagName(schema.resultNode):null;}catch(e){}if(!xmlList||!lang.isArray(schema.fields)){bError=true;}else{oParsedResponse.results=[];for(i=xmlList.length-1;i&gt;=0;--i){var oResult=this.parseXMLResult(xmlList.item(i));oParsedResponse.results[i]=oResult;}}if(bError){oParsedResponse.error=true;}else{}return oParsedResponse;},parseJSONData:function(oRequest,oFullResponse){var oParsedResponse={results:[],meta:{}};if(lang.isObject(oFullResponse)&amp;&amp;this.responseSchema.resultsList){var schema=this.responseSchema,fields=schema.fields,resultsList=oFullResponse,results=[],metaFields=schema.metaFields||{},fieldParsers=[],fieldPaths=[],simpleFields=[],bError=false,i,len,j,v,key,parser,path;var buildPath=function(needle){var path=null,keys=[],i=0;if(needle){needle=needle.replace(/\[(['&quot;])(.*?)\1\]/g,function(x,$1,$2){keys[i]=$2;return&quot;.@&quot;+(i++);}).replace(/\[(\d+)\]/g,function(x,$1){keys[i]=parseInt($1,10)|0;return&quot;.@&quot;+(i++);}).replace(/^\./,&quot;&quot;);if(!/[^\w\.\$@]/.test(needle)){path=needle.split(&quot;.&quot;);for(i=path.length-1;i&gt;=0;--i){if(path[i].charAt(0)===&quot;@&quot;){path[i]=keys[parseInt(path[i].substr(1),10)];}}}else{}}return path;};var walkPath=function(path,origin){var v=origin,i=0,len=path.length;for(;i&lt;len&amp;&amp;v;++i){v=v[path[i]];}return v;};path=buildPath(schema.resultsList);if(path){resultsList=walkPath(path,oFullResponse);if(resultsList===undefined){bError=true;}}else{bError=true;}if(!resultsList){resultsList=[];}if(!lang.isArray(resultsList)){resultsList=[resultsList];}if(!bError){if(schema.fields){var field;for(i=0,len=fields.length;i&lt;len;i++){field=fields[i];key=field.key||field;parser=((typeof field.parser===&quot;function&quot;)?field.parser:DS.Parser[field.parser+&quot;&quot;])||field.converter;path=buildPath(key);if(parser){fieldParsers[fieldParsers.length]={key:key,parser:parser};}if(path){if(path.length&gt;1){fieldPaths[fieldPaths.length]={key:key,path:path};}else{simpleFields[simpleFields.length]={key:key,path:path[0]};}}else{}}for(i=resultsList.length-1;i&gt;=0;--i){var r=resultsList[i],rec={};if(r){for(j=simpleFields.length-1;j&gt;=0;--j){rec[simpleFields[j].key]=(r[simpleFields[j].path]!==undefined)?r[simpleFields[j].path]:r[j];}for(j=fieldPaths.length-1;j&gt;=0;--j){rec[fieldPaths[j].key]=walkPath(fieldPaths[j].path,r);}for(j=fieldParsers.length-1;j&gt;=0;--j){var p=fieldParsers[j].key;rec[p]=fieldParsers[j].parser(rec[p]);if(rec[p]===undefined){rec[p]=null;}}}results[i]=rec;}}else{results=resultsList;}for(key in metaFields){if(lang.hasOwnProperty(metaFields,key)){path=buildPath(metaFields[key]);if(path){v=walkPath(path,oFullResponse);oParsedResponse.meta[key]=v;}}}}else{oParsedResponse.error=true;}oParsedResponse.results=results;}else{oParsedResponse.error=true;}return oParsedResponse;},parseHTMLTableData:function(oRequest,oFullResponse){var bError=false;var elTable=oFullResponse;var fields=this.responseSchema.fields;var oParsedResponse={results:[]};if(lang.isArray(fields)){for(var i=0;i&lt;elTable.tBodies.length;i++){var elTbody=elTable.tBodies[i];for(var j=elTbody.rows.length-1;j&gt;-1;j--){var elRow=elTbody.rows[j];var oResult={};for(var k=fields.length-1;k&gt;-1;k--){var field=fields[k];var key=(lang.isValue(field.key))?field.key:field;
 var data=elRow.cells[k].innerHTML;if(!field.parser&amp;&amp;field.converter){field.parser=field.converter;}var parser=(typeof field.parser===&quot;function&quot;)?field.parser:DS.Parser[field.parser+&quot;&quot;];if(parser){data=parser.call(this,data);}if(data===undefined){data=null;}oResult[key]=data;}oParsedResponse.results[j]=oResult;}}}else{bError=true;}if(bError){oParsedResponse.error=true;}else{}return oParsedResponse;}};lang.augmentProto(DS,util.EventProvider);util.LocalDataSource=function(oLiveData,oConfigs){this.dataType=DS.TYPE_LOCAL;if(oLiveData){if(YAHOO.lang.isArray(oLiveData)){this.responseType=DS.TYPE_JSARRAY;}else{if(oLiveData.nodeType&amp;&amp;oLiveData.nodeType==9){this.responseType=DS.TYPE_XML;}else{if(oLiveData.nodeName&amp;&amp;(oLiveData.nodeName.toLowerCase()==&quot;table&quot;)){this.responseType=DS.TYPE_HTMLTABLE;oLiveData=oLiveData.cloneNode(true);}else{if(YAHOO.lang.isString(oLiveData)){this.responseType=DS.TYPE_TEXT;}else{if(YAHOO.lang.isObject(oLiveData)){this.responseType=DS.TYPE_JSON;}}}}}}else{oLiveData=[];this.responseType=DS.TYPE_JSARRAY;}util.LocalDataSource.superclass.constructor.call(this,oLiveData,oConfigs);};lang.extend(util.LocalDataSource,DS);lang.augmentObject(util.LocalDataSource,DS);util.FunctionDataSource=function(oLiveData,oConfigs){this.dataType=DS.TYPE_JSFUNCTION;oLiveData=oLiveData||function(){};util.FunctionDataSource.superclass.constructor.call(this,oLiveData,oConfigs);};lang.extend(util.FunctionDataSource,DS,{scope:null,makeConnection:function(oRequest,oCallback,oCaller){var tId=DS._nTransactionId++;this.fireEvent(&quot;requestEvent&quot;,{tId:tId,request:oRequest,callback:oCallback,caller:oCaller});var oRawResponse=(this.scope)?this.liveData.call(this.scope,oRequest,this):this.liveData(oRequest);if(this.responseType===DS.TYPE_UNKNOWN){if(YAHOO.lang.isArray(oRawResponse)){this.responseType=DS.TYPE_JSARRAY;}else{if(oRawResponse&amp;&amp;oRawResponse.nodeType&amp;&amp;oRawResponse.nodeType==9){this.responseType=DS.TYPE_XML;}else{if(oRawResponse&amp;&amp;oRawResponse.nodeName&amp;&amp;(oRawResponse.nodeName.toLowerCase()==&quot;table&quot;)){this.responseType=DS.TYPE_HTMLTABLE;}else{if(YAHOO.lang.isObject(oRawResponse)){this.responseType=DS.TYPE_JSON;}else{if(YAHOO.lang.isString(oRawResponse)){this.responseType=DS.TYPE_TEXT;}}}}}}this.handleResponse(oRequest,oRawResponse,oCallback,oCaller,tId);return tId;}});lang.augmentObject(util.FunctionDataSource,DS);util.ScriptNodeDataSource=function(oLiveData,oConfigs){this.dataType=DS.TYPE_SCRIPTNODE;oLiveData=oLiveData||&quot;&quot;;util.ScriptNodeDataSource.superclass.constructor.call(this,oLiveData,oConfigs);};lang.extend(util.ScriptNodeDataSource,DS,{getUtility:util.Get,asyncMode:&quot;allowAll&quot;,scriptCallbackParam:&quot;callback&quot;,generateRequestCallback:function(id){return&quot;&amp;&quot;+this.scriptCallbackParam+&quot;=YAHOO.util.ScriptNodeDataSource.callbacks[&quot;+id+&quot;]&quot;;},doBeforeGetScriptNode:function(sUri){return sUri;},makeConnection:function(oRequest,oCallback,oCaller){var tId=DS._nTransactionId++;this.fireEvent(&quot;requestEvent&quot;,{tId:tId,request:oRequest,callback:oCallback,caller:oCaller});if(util.ScriptNodeDataSource._nPending===0){util.ScriptNodeDataSource.callbacks=[];util.ScriptNodeDataSource._nId=0;}var id=util.ScriptNodeDataSource._nId;util.ScriptNodeDataSource._nId++;var oSelf=this;util.ScriptNodeDataSource.callbacks[id]=function(oRawResponse){if((oSelf.asyncMode!==&quot;ignoreStaleResponses&quot;)||(id===util.ScriptNodeDataSource.callbacks.length-1)){if(oSelf.responseType===DS.TYPE_UNKNOWN){if(YAHOO.lang.isArray(oRawResponse)){oSelf.responseType=DS.TYPE_JSARRAY;}else{if(oRawResponse.nodeType&amp;&amp;oRawResponse.nodeType==9){oSelf.responseType=DS.TYPE_XML;}else{if(oRawResponse.nodeName&amp;&amp;(oRawResponse.nodeName.toLowerCase()==&quot;table&quot;)){oSelf.responseType=DS.TYPE_HTMLTABLE;}else{if(YAHOO.lang.isObject(oRawResponse)){oSelf.responseType=DS.TYPE_JSON;}else{if(YAHOO.lang.isString(oRawResponse)){oSelf.responseType=DS.TYPE_TEXT;}}}}}}oSelf.handleResponse(oRequest,oRawResponse,oCallback,oCaller,tId);}else{}delete util.ScriptNodeDataSource.callbacks[id];};util.ScriptNodeDataSource._nPending++;var sUri=this.liveData+oRequest+this.generateRequestCallback(id);sUri=this.doBeforeGetScriptNode(sUri);this.getUtility.script(sUri,{autopurge:true,onsuccess:util.ScriptNodeDataSource._bumpPendingDown,onfail:util.ScriptNodeDataSource._bumpPendingDown});return tId;}});lang.augmentObject(util.ScriptNodeDataSource,DS);lang.augmentObject(util.ScriptNodeDataSource,{_nId:0,_nPending:0,callbacks:[]});util.XHRDataSource=function(oLiveData,oConfigs){this.dataType=DS.TYPE_XHR;this.connMgr=this.connMgr||util.Connect;oLiveData=oLiveData||&quot;&quot;;util.XHRDataSource.superclass.constructor.call(this,oLiveData,oConfigs);};lang.extend(util.XHRDataSource,DS,{connMgr:null,connXhrMode:&quot;allowAll&quot;,connMethodPost:false,connTimeout:0,makeConnection:function(oRequest,oCallback,oCaller){var oRawResponse=null;var tId=DS._nTransactionId++;this.fireEvent(&quot;requestEvent&quot;,{tId:tId,request:oRequest,callback:oCallback,caller:oCaller});var oSelf=this;var oConnMgr=this.connMgr;var oQueue=this._oQueue;var _xhrSuccess=function(oResponse){if(oResponse&amp;&amp;(this.connXhrMode==&quot;ignoreStaleResponses&quot;)&amp;&amp;(oResponse.tId!=oQueue.conn.tId)){return null;}else{if(!oResponse){this.fireEvent(&quot;dataErrorEvent&quot;,{request:oRequest,response:null,callback:oCallback,caller:oCaller,message:DS.ERROR_DATANULL});DS.issueCallback(oCallback,[oRequest,{error:true}],true,oCaller);return null;}else{if(this.responseType===DS.TYPE_UNKNOWN){var ctype=(oResponse.getResponseHeader)?oResponse.getResponseHeader[&quot;Content-Type&quot;]:null;if(ctype){if(ctype.indexOf(&quot;text/xml&quot;)&gt;-1){this.responseType=DS.TYPE_XML;}else{if(ctype.indexOf(&quot;application/json&quot;)&gt;-1){this.responseType=DS.TYPE_JSON;}else{if(ctype.indexOf(&quot;text/plain&quot;)&gt;-1){this.responseType=DS.TYPE_TEXT;}}}}}this.handleResponse(oRequest,oResponse,oCallback,oCaller,tId);}}};var _xhrFailure=function(oResponse){this.fireEvent(&quot;dataErrorEvent&quot;,{request:oRequest,response:oResponse,callback:oCallback,caller:oCaller,message:DS.ERROR_DATAINVALID});if(lang.isString(this.liveData)&amp;&amp;lang.isString(oRequest)&amp;&amp;(this.liveData.lastIndexOf(&quot;?&quot;)!==this.liveData.length-1)&amp;&amp;(oRequest.indexOf(&quot;?&quot;)!==0)){}oResponse=oResponse||{};
-oResponse.error=true;DS.issueCallback(oCallback,[oRequest,oResponse],true,oCaller);return null;};var _xhrCallback={success:_xhrSuccess,failure:_xhrFailure,scope:this};if(lang.isNumber(this.connTimeout)){_xhrCallback.timeout=this.connTimeout;}if(this.connXhrMode==&quot;cancelStaleRequests&quot;){if(oQueue.conn){if(oConnMgr.abort){oConnMgr.abort(oQueue.conn);oQueue.conn=null;}else{}}}if(oConnMgr&amp;&amp;oConnMgr.asyncRequest){var sLiveData=this.liveData;var isPost=this.connMethodPost;var sMethod=(isPost)?&quot;POST&quot;:&quot;GET&quot;;var sUri=(isPost||!lang.isValue(oRequest))?sLiveData:sLiveData+oRequest;var sRequest=(isPost)?oRequest:null;if(this.connXhrMode!=&quot;queueRequests&quot;){oQueue.conn=oConnMgr.asyncRequest(sMethod,sUri,_xhrCallback,sRequest);}else{if(oQueue.conn){var allRequests=oQueue.requests;allRequests.push({request:oRequest,callback:_xhrCallback});if(!oQueue.interval){oQueue.interval=setInterval(function(){if(oConnMgr.isCallInProgress(oQueue.conn)){return;}else{if(allRequests.length&gt;0){sUri=(isPost||!lang.isValue(allRequests[0].request))?sLiveData:sLiveData+allRequests[0].request;sRequest=(isPost)?allRequests[0].request:null;oQueue.conn=oConnMgr.asyncRequest(sMethod,sUri,allRequests[0].callback,sRequest);allRequests.shift();}else{clearInterval(oQueue.interval);oQueue.interval=null;}}},50);}}else{oQueue.conn=oConnMgr.asyncRequest(sMethod,sUri,_xhrCallback,sRequest);}}}else{DS.issueCallback(oCallback,[oRequest,{error:true}],true,oCaller);}return tId;}});lang.augmentObject(util.XHRDataSource,DS);util.DataSource=function(oLiveData,oConfigs){oConfigs=oConfigs||{};var dataType=oConfigs.dataType;if(dataType){if(dataType==DS.TYPE_LOCAL){lang.augmentObject(util.DataSource,util.LocalDataSource);return new util.LocalDataSource(oLiveData,oConfigs);}else{if(dataType==DS.TYPE_XHR){lang.augmentObject(util.DataSource,util.XHRDataSource);return new util.XHRDataSource(oLiveData,oConfigs);}else{if(dataType==DS.TYPE_SCRIPTNODE){lang.augmentObject(util.DataSource,util.ScriptNodeDataSource);return new util.ScriptNodeDataSource(oLiveData,oConfigs);}else{if(dataType==DS.TYPE_JSFUNCTION){lang.augmentObject(util.DataSource,util.FunctionDataSource);return new util.FunctionDataSource(oLiveData,oConfigs);}}}}}if(YAHOO.lang.isString(oLiveData)){lang.augmentObject(util.DataSource,util.XHRDataSource);return new util.XHRDataSource(oLiveData,oConfigs);}else{if(YAHOO.lang.isFunction(oLiveData)){lang.augmentObject(util.DataSource,util.FunctionDataSource);return new util.FunctionDataSource(oLiveData,oConfigs);}else{lang.augmentObject(util.DataSource,util.LocalDataSource);return new util.LocalDataSource(oLiveData,oConfigs);}}};lang.augmentObject(util.DataSource,DS);})();YAHOO.util.Number={format:function(B,E){if(!isFinite(+B)){return&quot;&quot;;}B=!isFinite(+B)?0:+B;E=YAHOO.lang.merge(YAHOO.util.Number.format.defaults,(E||{}));var C=B&lt;0,F=Math.abs(B),A=E.decimalPlaces,I=E.thousandsSeparator,H,G,D;if(A&lt;0){H=F-(F%1)+&quot;&quot;;D=H.length+A;if(D&gt;0){H=Number(&quot;.&quot;+H).toFixed(D).slice(2)+new Array(H.length-D+1).join(&quot;0&quot;);}else{H=&quot;0&quot;;}}else{H=F&lt;1&amp;&amp;F&gt;=0.5&amp;&amp;!A?&quot;1&quot;:F.toFixed(A);}if(F&gt;=1000){G=H.split(/\D/);D=G[0].length%3||3;G[0]=G[0].slice(0,D)+G[0].slice(D).replace(/(\d{3})/g,I+&quot;$1&quot;);H=G.join(E.decimalSeparator);}H=E.prefix+H+E.suffix;return C?E.negativeFormat.replace(/#/,H):H;}};YAHOO.util.Number.format.defaults={decimalSeparator:&quot;.&quot;,decimalPlaces:null,thousandsSeparator:&quot;&quot;,prefix:&quot;&quot;,suffix:&quot;&quot;,negativeFormat:&quot;-#&quot;};(function(){var A=function(C,E,D){if(typeof D===&quot;undefined&quot;){D=10;}for(;parseInt(C,10)&lt;D&amp;&amp;D&gt;1;D/=10){C=E.toString()+C;}return C.toString();};var B={formats:{a:function(D,C){return C.a[D.getDay()];},A:function(D,C){return C.A[D.getDay()];},b:function(D,C){return C.b[D.getMonth()];},B:function(D,C){return C.B[D.getMonth()];},C:function(C){return A(parseInt(C.getFullYear()/100,10),0);},d:[&quot;getDate&quot;,&quot;0&quot;],e:[&quot;getDate&quot;,&quot; &quot;],g:function(C){return A(parseInt(B.formats.G(C)%100,10),0);},G:function(E){var F=E.getFullYear();var D=parseInt(B.formats.V(E),10);var C=parseInt(B.formats.W(E),10);if(C&gt;D){F++;}else{if(C===0&amp;&amp;D&gt;=52){F--;}}return F;},H:[&quot;getHours&quot;,&quot;0&quot;],I:function(D){var C=D.getHours()%12;return A(C===0?12:C,0);},j:function(G){var F=new Date(&quot;&quot;+G.getFullYear()+&quot;/1/1 GMT&quot;);var D=new Date(&quot;&quot;+G.getFullYear()+&quot;/&quot;+(G.getMonth()+1)+&quot;/&quot;+G.getDate()+&quot; GMT&quot;);var C=D-F;var E=parseInt(C/60000/60/24,10)+1;return A(E,0,100);},k:[&quot;getHours&quot;,&quot; &quot;],l:function(D){var C=D.getHours()%12;return A(C===0?12:C,&quot; &quot;);},m:function(C){return A(C.getMonth()+1,0);},M:[&quot;getMinutes&quot;,&quot;0&quot;],p:function(D,C){return C.p[D.getHours()&gt;=12?1:0];},P:function(D,C){return C.P[D.getHours()&gt;=12?1:0];},s:function(D,C){return parseInt(D.getTime()/1000,10);},S:[&quot;getSeconds&quot;,&quot;0&quot;],u:function(C){var D=C.getDay();return D===0?7:D;},U:function(F){var C=parseInt(B.formats.j(F),10);var E=6-F.getDay();var D=parseInt((C+E)/7,10);return A(D,0);},V:function(F){var E=parseInt(B.formats.W(F),10);var C=(new Date(&quot;&quot;+F.getFullYear()+&quot;/1/1&quot;)).getDay();var D=E+(C&gt;4||C&lt;=1?0:1);if(D===53&amp;&amp;(new Date(&quot;&quot;+F.getFullYear()+&quot;/12/31&quot;)).getDay()&lt;4){D=1;}else{if(D===0){D=B.formats.V(new Date(&quot;&quot;+(F.getFullYear()-1)+&quot;/12/31&quot;));}}return A(D,0);},w:&quot;getDay&quot;,W:function(F){var C=parseInt(B.formats.j(F),10);var E=7-B.formats.u(F);var D=parseInt((C+E)/7,10);return A(D,0,10);},y:function(C){return A(C.getFullYear()%100,0);},Y:&quot;getFullYear&quot;,z:function(E){var D=E.getTimezoneOffset();var C=A(parseInt(Math.abs(D/60),10),0);var F=A(Math.abs(D%60),0);return(D&gt;0?&quot;-&quot;:&quot;+&quot;)+C+F;},Z:function(C){var D=C.toString().replace(/^.*:\d\d( GMT[+-]\d+)? \(?([A-Za-z ]+)\)?\d*$/,&quot;$2&quot;).replace(/[a-z ]/g,&quot;&quot;);if(D.length&gt;4){D=B.formats.z(C);}return D;},&quot;%&quot;:function(C){return&quot;%&quot;;}},aggregates:{c:&quot;locale&quot;,D:&quot;%m/%d/%y&quot;,F:&quot;%Y-%m-%d&quot;,h:&quot;%b&quot;,n:&quot;\n&quot;,r:&quot;locale&quot;,R:&quot;%H:%M&quot;,t:&quot;\t&quot;,T:&quot;%H:%M:%S&quot;,x:&quot;locale&quot;,X:&quot;locale&quot;},format:function(G,F,D){F=F||{};if(!(G instanceof Date)){return YAHOO.lang.isValue(G)?G:&quot;&quot;;}var H=F.format||&quot;%m/%d/%Y&quot;;if(H===&quot;YYYY/MM/DD&quot;){H=&quot;%Y/%m/%d&quot;;}else{if(H===&quot;DD/MM/YYYY&quot;){H=&quot;%d/%m/%Y&quot;;}else{if(H===&quot;MM/DD/YYYY&quot;){H=&quot;%m/%d/%Y&quot;;}}}D=D||&quot;en&quot;;if(!(D in YAHOO.util.DateLocale)){if(D.replace(/-[a-zA-Z]+$/,&quot;&quot;) in YAHOO.util.DateLocale){D=D.replace(/-[a-zA-Z]+$/,&quot;&quot;);
-}else{D=&quot;en&quot;;}}var J=YAHOO.util.DateLocale[D];var C=function(L,K){var M=B.aggregates[K];return(M===&quot;locale&quot;?J[K]:M);};var E=function(L,K){var M=B.formats[K];if(typeof M===&quot;string&quot;){return G[M]();}else{if(typeof M===&quot;function&quot;){return M.call(G,G,J);}else{if(typeof M===&quot;object&quot;&amp;&amp;typeof M[0]===&quot;string&quot;){return A(G[M[0]](),M[1]);}else{return K;}}}};while(H.match(/%[cDFhnrRtTxX]/)){H=H.replace(/%([cDFhnrRtTxX])/g,C);}var I=H.replace(/%([aAbBCdegGHIjklmMpPsSuUVwWyYzZ%])/g,E);C=E=undefined;return I;}};YAHOO.namespace(&quot;YAHOO.util&quot;);YAHOO.util.Date=B;YAHOO.util.DateLocale={a:[&quot;Sun&quot;,&quot;Mon&quot;,&quot;Tue&quot;,&quot;Wed&quot;,&quot;Thu&quot;,&quot;Fri&quot;,&quot;Sat&quot;],A:[&quot;Sunday&quot;,&quot;Monday&quot;,&quot;Tuesday&quot;,&quot;Wednesday&quot;,&quot;Thursday&quot;,&quot;Friday&quot;,&quot;Saturday&quot;],b:[&quot;Jan&quot;,&quot;Feb&quot;,&quot;Mar&quot;,&quot;Apr&quot;,&quot;May&quot;,&quot;Jun&quot;,&quot;Jul&quot;,&quot;Aug&quot;,&quot;Sep&quot;,&quot;Oct&quot;,&quot;Nov&quot;,&quot;Dec&quot;],B:[&quot;January&quot;,&quot;February&quot;,&quot;March&quot;,&quot;April&quot;,&quot;May&quot;,&quot;June&quot;,&quot;July&quot;,&quot;August&quot;,&quot;September&quot;,&quot;October&quot;,&quot;November&quot;,&quot;December&quot;],c:&quot;%a %d %b %Y %T %Z&quot;,p:[&quot;AM&quot;,&quot;PM&quot;],P:[&quot;am&quot;,&quot;pm&quot;],r:&quot;%I:%M:%S %p&quot;,x:&quot;%d/%m/%y&quot;,X:&quot;%T&quot;};YAHOO.util.DateLocale[&quot;en&quot;]=YAHOO.lang.merge(YAHOO.util.DateLocale,{});YAHOO.util.DateLocale[&quot;en-US&quot;]=YAHOO.lang.merge(YAHOO.util.DateLocale[&quot;en&quot;],{c:&quot;%a %d %b %Y %I:%M:%S %p %Z&quot;,x:&quot;%m/%d/%Y&quot;,X:&quot;%I:%M:%S %p&quot;});YAHOO.util.DateLocale[&quot;en-GB&quot;]=YAHOO.lang.merge(YAHOO.util.DateLocale[&quot;en&quot;],{r:&quot;%l:%M:%S %P %Z&quot;});YAHOO.util.DateLocale[&quot;en-AU&quot;]=YAHOO.lang.merge(YAHOO.util.DateLocale[&quot;en&quot;]);})();YAHOO.register(&quot;datasource&quot;,YAHOO.util.DataSource,{version:&quot;@VERSION@&quot;,build:&quot;@BUILD@&quot;});
\ No newline at end of file
+oResponse.error=true;DS.issueCallback(oCallback,[oRequest,oResponse],true,oCaller);return null;};var _xhrCallback={success:_xhrSuccess,failure:_xhrFailure,scope:this};if(lang.isNumber(this.connTimeout)){_xhrCallback.timeout=this.connTimeout;}if(this.connXhrMode==&quot;cancelStaleRequests&quot;){if(oQueue.conn){if(oConnMgr.abort){oConnMgr.abort(oQueue.conn);oQueue.conn=null;}else{}}}if(oConnMgr&amp;&amp;oConnMgr.asyncRequest){var sLiveData=this.liveData;var isPost=this.connMethodPost;var sMethod=(isPost)?&quot;POST&quot;:&quot;GET&quot;;var sUri=(isPost||!lang.isValue(oRequest))?sLiveData:sLiveData+oRequest;var sRequest=(isPost)?oRequest:null;if(this.connXhrMode!=&quot;queueRequests&quot;){oQueue.conn=oConnMgr.asyncRequest(sMethod,sUri,_xhrCallback,sRequest);}else{if(oQueue.conn){var allRequests=oQueue.requests;allRequests.push({request:oRequest,callback:_xhrCallback});if(!oQueue.interval){oQueue.interval=setInterval(function(){if(oConnMgr.isCallInProgress(oQueue.conn)){return;}else{if(allRequests.length&gt;0){sUri=(isPost||!lang.isValue(allRequests[0].request))?sLiveData:sLiveData+allRequests[0].request;sRequest=(isPost)?allRequests[0].request:null;oQueue.conn=oConnMgr.asyncRequest(sMethod,sUri,allRequests[0].callback,sRequest);allRequests.shift();}else{clearInterval(oQueue.interval);oQueue.interval=null;}}},50);}}else{oQueue.conn=oConnMgr.asyncRequest(sMethod,sUri,_xhrCallback,sRequest);}}}else{DS.issueCallback(oCallback,[oRequest,{error:true}],true,oCaller);}return tId;}});lang.augmentObject(util.XHRDataSource,DS);util.DataSource=function(oLiveData,oConfigs){oConfigs=oConfigs||{};var dataType=oConfigs.dataType;if(dataType){if(dataType==DS.TYPE_LOCAL){lang.augmentObject(util.DataSource,util.LocalDataSource);return new util.LocalDataSource(oLiveData,oConfigs);}else{if(dataType==DS.TYPE_XHR){lang.augmentObject(util.DataSource,util.XHRDataSource);return new util.XHRDataSource(oLiveData,oConfigs);}else{if(dataType==DS.TYPE_SCRIPTNODE){lang.augmentObject(util.DataSource,util.ScriptNodeDataSource);return new util.ScriptNodeDataSource(oLiveData,oConfigs);}else{if(dataType==DS.TYPE_JSFUNCTION){lang.augmentObject(util.DataSource,util.FunctionDataSource);return new util.FunctionDataSource(oLiveData,oConfigs);}}}}}if(YAHOO.lang.isString(oLiveData)){lang.augmentObject(util.DataSource,util.XHRDataSource);return new util.XHRDataSource(oLiveData,oConfigs);}else{if(YAHOO.lang.isFunction(oLiveData)){lang.augmentObject(util.DataSource,util.FunctionDataSource);return new util.FunctionDataSource(oLiveData,oConfigs);}else{lang.augmentObject(util.DataSource,util.LocalDataSource);return new util.LocalDataSource(oLiveData,oConfigs);}}};lang.augmentObject(util.DataSource,DS);})();YAHOO.util.Number={format:function(H,A){if(H===&quot;&quot;||H===null||!isFinite(H)){return&quot;&quot;;}H=+H;A=YAHOO.lang.merge(YAHOO.util.Number.format.defaults,(A||{}));if(!A.negativeFormat){A.negativeFormat=&quot;-&quot;+A.format;}else{if(A.negativeFormat.indexOf(&quot;#&quot;)&gt;-1){A.negativeFormat=A.negativeFormat.replace(/#/,A.format);}}var G=Math.abs(H),C=A.decimalPlaces,B=A.thousandsSeparator,E,F,D;if(C&lt;0){E=G-(G%1)+&quot;&quot;;D=E.length+C;if(D&gt;0){E=Number(&quot;.&quot;+E).toFixed(D).slice(2)+new Array(E.length-D+1).join(&quot;0&quot;);}else{E=&quot;0&quot;;}}else{E=G&lt;1&amp;&amp;G&gt;=0.5&amp;&amp;!C?&quot;1&quot;:G.toFixed(C);}F=E.split(/\D/);if(G&gt;=1000){D=F[0].length%3||3;F[0]=F[0].slice(0,D)+F[0].slice(D).replace(/(\d{3})/g,B+&quot;$1&quot;);}return YAHOO.util.Number.format._applyFormat((H&lt;0?A.negativeFormat:A.format),F.join(A.decimalSeparator),A);}};YAHOO.util.Number.format.defaults={format:&quot;{prefix}{number}{suffix}&quot;,negativeFormat:null,decimalSeparator:&quot;.&quot;,decimalPlaces:null,thousandsSeparator:&quot;&quot;};YAHOO.util.Number.format._applyFormat=function(A,B,C){return A.replace(/\{(\w+)\}/g,function(D,E){return E===&quot;number&quot;?B:E in C?C[E]:&quot;&quot;;});};(function(){var A=function(C,E,D){if(typeof D===&quot;undefined&quot;){D=10;}for(;parseInt(C,10)&lt;D&amp;&amp;D&gt;1;D/=10){C=E.toString()+C;}return C.toString();};var B={formats:{a:function(D,C){return C.a[D.getDay()];},A:function(D,C){return C.A[D.getDay()];},b:function(D,C){return C.b[D.getMonth()];},B:function(D,C){return C.B[D.getMonth()];},C:function(C){return A(parseInt(C.getFullYear()/100,10),0);},d:[&quot;getDate&quot;,&quot;0&quot;],e:[&quot;getDate&quot;,&quot; &quot;],g:function(C){return A(parseInt(B.formats.G(C)%100,10),0);},G:function(E){var F=E.getFullYear();var D=parseInt(B.formats.V(E),10);var C=parseInt(B.formats.W(E),10);if(C&gt;D){F++;}else{if(C===0&amp;&amp;D&gt;=52){F--;}}return F;},H:[&quot;getHours&quot;,&quot;0&quot;],I:function(D){var C=D.getHours()%12;return A(C===0?12:C,0);},j:function(G){var F=new Date(&quot;&quot;+G.getFullYear()+&quot;/1/1 GMT&quot;);var D=new Date(&quot;&quot;+G.getFullYear()+&quot;/&quot;+(G.getMonth()+1)+&quot;/&quot;+G.getDate()+&quot; GMT&quot;);var C=D-F;var E=parseInt(C/60000/60/24,10)+1;return A(E,0,100);},k:[&quot;getHours&quot;,&quot; &quot;],l:function(D){var C=D.getHours()%12;return A(C===0?12:C,&quot; &quot;);},m:function(C){return A(C.getMonth()+1,0);},M:[&quot;getMinutes&quot;,&quot;0&quot;],p:function(D,C){return C.p[D.getHours()&gt;=12?1:0];},P:function(D,C){return C.P[D.getHours()&gt;=12?1:0];},s:function(D,C){return parseInt(D.getTime()/1000,10);},S:[&quot;getSeconds&quot;,&quot;0&quot;],u:function(C){var D=C.getDay();return D===0?7:D;},U:function(F){var C=parseInt(B.formats.j(F),10);var E=6-F.getDay();var D=parseInt((C+E)/7,10);return A(D,0);},V:function(F){var E=parseInt(B.formats.W(F),10);var C=(new Date(&quot;&quot;+F.getFullYear()+&quot;/1/1&quot;)).getDay();var D=E+(C&gt;4||C&lt;=1?0:1);if(D===53&amp;&amp;(new Date(&quot;&quot;+F.getFullYear()+&quot;/12/31&quot;)).getDay()&lt;4){D=1;}else{if(D===0){D=B.formats.V(new Date(&quot;&quot;+(F.getFullYear()-1)+&quot;/12/31&quot;));}}return A(D,0);},w:&quot;getDay&quot;,W:function(F){var C=parseInt(B.formats.j(F),10);var E=7-B.formats.u(F);var D=parseInt((C+E)/7,10);return A(D,0,10);},y:function(C){return A(C.getFullYear()%100,0);},Y:&quot;getFullYear&quot;,z:function(E){var D=E.getTimezoneOffset();var C=A(parseInt(Math.abs(D/60),10),0);var F=A(Math.abs(D%60),0);return(D&gt;0?&quot;-&quot;:&quot;+&quot;)+C+F;},Z:function(C){var D=C.toString().replace(/^.*:\d\d( GMT[+-]\d+)? \(?([A-Za-z ]+)\)?\d*$/,&quot;$2&quot;).replace(/[a-z ]/g,&quot;&quot;);if(D.length&gt;4){D=B.formats.z(C);}return D;},&quot;%&quot;:function(C){return&quot;%&quot;;}},aggregates:{c:&quot;locale&quot;,D:&quot;%m/%d/%y&quot;,F:&quot;%Y-%m-%d&quot;,h:&quot;%b&quot;,n:&quot;\n&quot;,r:&quot;locale&quot;,R:&quot;%H:%M&quot;,t:&quot;\t&quot;,T:&quot;%H:%M:%S&quot;,x:&quot;locale&quot;,X:&quot;locale&quot;},format:function(G,F,D){F=F||{};
+if(!(G instanceof Date)){return YAHOO.lang.isValue(G)?G:&quot;&quot;;}var H=F.format||&quot;%m/%d/%Y&quot;;if(H===&quot;YYYY/MM/DD&quot;){H=&quot;%Y/%m/%d&quot;;}else{if(H===&quot;DD/MM/YYYY&quot;){H=&quot;%d/%m/%Y&quot;;}else{if(H===&quot;MM/DD/YYYY&quot;){H=&quot;%m/%d/%Y&quot;;}}}D=D||&quot;en&quot;;if(!(D in YAHOO.util.DateLocale)){if(D.replace(/-[a-zA-Z]+$/,&quot;&quot;) in YAHOO.util.DateLocale){D=D.replace(/-[a-zA-Z]+$/,&quot;&quot;);}else{D=&quot;en&quot;;}}var J=YAHOO.util.DateLocale[D];var C=function(L,K){var M=B.aggregates[K];return(M===&quot;locale&quot;?J[K]:M);};var E=function(L,K){var M=B.formats[K];if(typeof M===&quot;string&quot;){return G[M]();}else{if(typeof M===&quot;function&quot;){return M.call(G,G,J);}else{if(typeof M===&quot;object&quot;&amp;&amp;typeof M[0]===&quot;string&quot;){return A(G[M[0]](),M[1]);}else{return K;}}}};while(H.match(/%[cDFhnrRtTxX]/)){H=H.replace(/%([cDFhnrRtTxX])/g,C);}var I=H.replace(/%([aAbBCdegGHIjklmMpPsSuUVwWyYzZ%])/g,E);C=E=undefined;return I;}};YAHOO.namespace(&quot;YAHOO.util&quot;);YAHOO.util.Date=B;YAHOO.util.DateLocale={a:[&quot;Sun&quot;,&quot;Mon&quot;,&quot;Tue&quot;,&quot;Wed&quot;,&quot;Thu&quot;,&quot;Fri&quot;,&quot;Sat&quot;],A:[&quot;Sunday&quot;,&quot;Monday&quot;,&quot;Tuesday&quot;,&quot;Wednesday&quot;,&quot;Thursday&quot;,&quot;Friday&quot;,&quot;Saturday&quot;],b:[&quot;Jan&quot;,&quot;Feb&quot;,&quot;Mar&quot;,&quot;Apr&quot;,&quot;May&quot;,&quot;Jun&quot;,&quot;Jul&quot;,&quot;Aug&quot;,&quot;Sep&quot;,&quot;Oct&quot;,&quot;Nov&quot;,&quot;Dec&quot;],B:[&quot;January&quot;,&quot;February&quot;,&quot;March&quot;,&quot;April&quot;,&quot;May&quot;,&quot;June&quot;,&quot;July&quot;,&quot;August&quot;,&quot;September&quot;,&quot;October&quot;,&quot;November&quot;,&quot;December&quot;],c:&quot;%a %d %b %Y %T %Z&quot;,p:[&quot;AM&quot;,&quot;PM&quot;],P:[&quot;am&quot;,&quot;pm&quot;],r:&quot;%I:%M:%S %p&quot;,x:&quot;%d/%m/%y&quot;,X:&quot;%T&quot;};YAHOO.util.DateLocale[&quot;en&quot;]=YAHOO.lang.merge(YAHOO.util.DateLocale,{});YAHOO.util.DateLocale[&quot;en-US&quot;]=YAHOO.lang.merge(YAHOO.util.DateLocale[&quot;en&quot;],{c:&quot;%a %d %b %Y %I:%M:%S %p %Z&quot;,x:&quot;%m/%d/%Y&quot;,X:&quot;%I:%M:%S %p&quot;});YAHOO.util.DateLocale[&quot;en-GB&quot;]=YAHOO.lang.merge(YAHOO.util.DateLocale[&quot;en&quot;],{r:&quot;%l:%M:%S %P %Z&quot;});YAHOO.util.DateLocale[&quot;en-AU&quot;]=YAHOO.lang.merge(YAHOO.util.DateLocale[&quot;en&quot;]);})();YAHOO.register(&quot;datasource&quot;,YAHOO.util.DataSource,{version:&quot;@VERSION@&quot;,build:&quot;@BUILD@&quot;});
\ No newline at end of file</diff>
      <filename>build/datasource/datasource-min.js</filename>
    </modified>
    <modified>
      <diff>@@ -2509,7 +2509,6 @@ util.DataSource = function(oLiveData, oConfigs) {
 lang.augmentObject(util.DataSource, DS);
 
 })();
-
 /****************************************************************************/
 /****************************************************************************/
 /****************************************************************************/
@@ -2526,37 +2525,55 @@ lang.augmentObject(util.DataSource, DS);
  YAHOO.util.Number = {
  
      /**
-     * Takes a native JavaScript Number and formats to string for display to user.
+     * Takes a native JavaScript Number and formats to a string for display.
      *
      * @method format
      * @param nData {Number} Number.
      * @param oConfig {Object} (Optional) Optional configuration values:
      *  &lt;dl&gt;
-     *   &lt;dt&gt;prefix {String}&lt;/dd&gt;
+     *   &lt;dt&gt;format&lt;/dt&gt;
+     *   &lt;dd&gt;String used as a template for formatting positive numbers.
+     *   {placeholders} in the string are applied from the values in this
+     *   config object. {number} is used to indicate where the numeric portion
+     *   of the output goes.  For example &amp;quot;{prefix}{number} per item&amp;quot;
+     *   might yield &amp;quot;$5.25 per item&amp;quot;.  The only required
+     *   {placeholder} is {number}.&lt;/dd&gt;
+     *
+     *   &lt;dt&gt;negativeFormat&lt;/dt&gt;
+     *   &lt;dd&gt;Like format, but applied to negative numbers.  If set to null,
+     *   defaults from the configured format, prefixed with -.  This is
+     *   separate from format to support formats like &amp;quot;($12,345.67)&amp;quot;.
+     *
+     *   &lt;dt&gt;prefix {String} (deprecated, use format/negativeFormat)&lt;/dt&gt;
      *   &lt;dd&gt;String prepended before each number, like a currency designator &quot;$&quot;&lt;/dd&gt;
-     *   &lt;dt&gt;decimalPlaces {Number}&lt;/dd&gt;
+     *   &lt;dt&gt;decimalPlaces {Number}&lt;/dt&gt;
      *   &lt;dd&gt;Number of decimal places to round.&lt;/dd&gt;
-     *   &lt;dt&gt;decimalSeparator {String}&lt;/dd&gt;
+     *   &lt;dt&gt;decimalSeparator {String}&lt;/dt&gt;
      *   &lt;dd&gt;Decimal separator&lt;/dd&gt;
-     *   &lt;dt&gt;thousandsSeparator {String}&lt;/dd&gt;
+     *   &lt;dt&gt;thousandsSeparator {String}&lt;/dt&gt;
      *   &lt;dd&gt;Thousands separator&lt;/dd&gt;
-     *   &lt;dt&gt;suffix {String}&lt;/dd&gt;
+     *   &lt;dt&gt;suffix {String} (deprecated, use format/negativeFormat)&lt;/dt&gt;
      *   &lt;dd&gt;String appended after each number, like &quot; items&quot; (note the space)&lt;/dd&gt;
-     *   &lt;dt&gt;negativeFormat&lt;/dt&gt;
-     *   &lt;dd&gt;String used as a guide for how to indicate negative numbers.  The first '#' character in the string will be replaced by the number.  Default '-#'.&lt;/dd&gt;
      *  &lt;/dl&gt;
      * @return {String} Formatted number for display. Note, the following values
      * return as &quot;&quot;: null, undefined, NaN, &quot;&quot;.
      */
     format : function(n, cfg) {
-        if (!isFinite(+n)) {
+        if (n === '' || n === null || !isFinite(n)) {
             return '';
         }
 
-        n   = !isFinite(+n) ? 0 : +n;
+        n   = +n;
         cfg = YAHOO.lang.merge(YAHOO.util.Number.format.defaults, (cfg || {}));
 
-        var neg    = n &lt; 0,        absN   = Math.abs(n),
+        if (!cfg.negativeFormat) {
+            cfg.negativeFormat = '-' + cfg.format;
+        } else if (cfg.negativeFormat.indexOf('#') &gt; -1) {
+            // for backward compatibility of negativeFormat supporting '-#'
+            cfg.negativeFormat = cfg.negativeFormat.replace(/#/, cfg.format);
+        }
+
+        var absN   = Math.abs(n),
             places = cfg.decimalPlaces,
             sep    = cfg.thousandsSeparator,
             s, bits, i;
@@ -2568,41 +2585,50 @@ lang.augmentObject(util.DataSource, DS);
 
             // avoid 123 vs decimalPlaces -4 (should return &quot;0&quot;)
             if (i &gt; 0) {
-                    // leverage toFixed by making 123 =&gt; 0.123 for the rounding
-                    // operation, then add the appropriate number of zeros back on
+                // leverage toFixed by making 123 =&gt; 0.123 for the rounding
+                // operation, then add the appropriate number of zeros back on
                 s = Number('.' + s).toFixed(i).slice(2) +
                     new Array(s.length - i + 1).join('0');
             } else {
                 s = &quot;0&quot;;
             }
-        } else {        // There is a bug in IE's toFixed implementation:
+        } else {
+            // There is a bug in IE's toFixed implementation:
             // for n in {(-0.94, -0.5], [0.5, 0.94)} n.toFixed() returns 0
             // instead of -1 and 1. Manually handle that case.
             s = absN &lt; 1 &amp;&amp; absN &gt;= 0.5 &amp;&amp; !places ? '1' : absN.toFixed(places);
         }
 
+        bits  = s.split(/\D/);
+
         if (absN &gt;= 1000) {
-            bits  = s.split(/\D/);
             i  = bits[0].length % 3 || 3;
 
             bits[0] = bits[0].slice(0,i) +
                       bits[0].slice(i).replace(/(\d{3})/g, sep + '$1');
 
-            s = bits.join(cfg.decimalSeparator);
         }
 
-        s = cfg.prefix + s + cfg.suffix;
-
-        return neg ? cfg.negativeFormat.replace(/#/,s) : s;
+        return YAHOO.util.Number.format._applyFormat(
+            (n &lt; 0 ? cfg.negativeFormat : cfg.format),
+            bits.join(cfg.decimalSeparator),
+            cfg);
     }
 };
+
 YAHOO.util.Number.format.defaults = {
+    format : '{prefix}{number}{suffix}',
+    negativeFormat : null, // defaults to -(format)
     decimalSeparator : '.',
     decimalPlaces    : null,
-    thousandsSeparator : '',
-    prefix : '',
-    suffix : '',
-    negativeFormat : '-#'
+    thousandsSeparator : ''
+};
+
+YAHOO.util.Number.format._applyFormat = function (tmpl, num, data) {
+    return tmpl.replace(/\{(\w+)\}/g, function (_, token) {
+        return token === 'number' ? num :
+               token in data ? data[token] : '';
+    });
 };
 
 
@@ -2986,5 +3012,4 @@ var xPad=function (x, pad, r)
  YAHOO.util.DateLocale['en-AU'] = YAHOO.lang.merge(YAHOO.util.DateLocale['en']);
 
 })();
-
 YAHOO.register(&quot;datasource&quot;, YAHOO.util.DataSource, {version: &quot;@VERSION@&quot;, build: &quot;@BUILD@&quot;});</diff>
      <filename>build/datasource/datasource.js</filename>
    </modified>
    <modified>
      <diff>@@ -14,37 +14,55 @@
  YAHOO.util.Number = {
  
      /**
-     * Takes a native JavaScript Number and formats to string for display to user.
+     * Takes a native JavaScript Number and formats to a string for display.
      *
      * @method format
      * @param nData {Number} Number.
      * @param oConfig {Object} (Optional) Optional configuration values:
      *  &lt;dl&gt;
-     *   &lt;dt&gt;prefix {String}&lt;/dd&gt;
+     *   &lt;dt&gt;format&lt;/dt&gt;
+     *   &lt;dd&gt;String used as a template for formatting positive numbers.
+     *   {placeholders} in the string are applied from the values in this
+     *   config object. {number} is used to indicate where the numeric portion
+     *   of the output goes.  For example &amp;quot;{prefix}{number} per item&amp;quot;
+     *   might yield &amp;quot;$5.25 per item&amp;quot;.  The only required
+     *   {placeholder} is {number}.&lt;/dd&gt;
+     *
+     *   &lt;dt&gt;negativeFormat&lt;/dt&gt;
+     *   &lt;dd&gt;Like format, but applied to negative numbers.  If set to null,
+     *   defaults from the configured format, prefixed with -.  This is
+     *   separate from format to support formats like &amp;quot;($12,345.67)&amp;quot;.
+     *
+     *   &lt;dt&gt;prefix {String} (deprecated, use format/negativeFormat)&lt;/dt&gt;
      *   &lt;dd&gt;String prepended before each number, like a currency designator &quot;$&quot;&lt;/dd&gt;
-     *   &lt;dt&gt;decimalPlaces {Number}&lt;/dd&gt;
+     *   &lt;dt&gt;decimalPlaces {Number}&lt;/dt&gt;
      *   &lt;dd&gt;Number of decimal places to round.&lt;/dd&gt;
-     *   &lt;dt&gt;decimalSeparator {String}&lt;/dd&gt;
+     *   &lt;dt&gt;decimalSeparator {String}&lt;/dt&gt;
      *   &lt;dd&gt;Decimal separator&lt;/dd&gt;
-     *   &lt;dt&gt;thousandsSeparator {String}&lt;/dd&gt;
+     *   &lt;dt&gt;thousandsSeparator {String}&lt;/dt&gt;
      *   &lt;dd&gt;Thousands separator&lt;/dd&gt;
-     *   &lt;dt&gt;suffix {String}&lt;/dd&gt;
+     *   &lt;dt&gt;suffix {String} (deprecated, use format/negativeFormat)&lt;/dt&gt;
      *   &lt;dd&gt;String appended after each number, like &quot; items&quot; (note the space)&lt;/dd&gt;
-     *   &lt;dt&gt;negativeFormat&lt;/dt&gt;
-     *   &lt;dd&gt;String used as a guide for how to indicate negative numbers.  The first '#' character in the string will be replaced by the number.  Default '-#'.&lt;/dd&gt;
      *  &lt;/dl&gt;
      * @return {String} Formatted number for display. Note, the following values
      * return as &quot;&quot;: null, undefined, NaN, &quot;&quot;.
      */
     format : function(n, cfg) {
-        if (!isFinite(+n)) {
+        if (n === '' || n === null || !isFinite(n)) {
             return '';
         }
 
-        n   = !isFinite(+n) ? 0 : +n;
+        n   = +n;
         cfg = YAHOO.lang.merge(YAHOO.util.Number.format.defaults, (cfg || {}));
 
-        var neg    = n &lt; 0,        absN   = Math.abs(n),
+        if (!cfg.negativeFormat) {
+            cfg.negativeFormat = '-' + cfg.format;
+        } else if (cfg.negativeFormat.indexOf('#') &gt; -1) {
+            // for backward compatibility of negativeFormat supporting '-#'
+            cfg.negativeFormat = cfg.negativeFormat.replace(/#/, cfg.format);
+        }
+
+        var absN   = Math.abs(n),
             places = cfg.decimalPlaces,
             sep    = cfg.thousandsSeparator,
             s, bits, i;
@@ -56,14 +74,15 @@
 
             // avoid 123 vs decimalPlaces -4 (should return &quot;0&quot;)
             if (i &gt; 0) {
-                    // leverage toFixed by making 123 =&gt; 0.123 for the rounding
-                    // operation, then add the appropriate number of zeros back on
+                // leverage toFixed by making 123 =&gt; 0.123 for the rounding
+                // operation, then add the appropriate number of zeros back on
                 s = Number('.' + s).toFixed(i).slice(2) +
                     new Array(s.length - i + 1).join('0');
             } else {
                 s = &quot;0&quot;;
             }
-        } else {        // There is a bug in IE's toFixed implementation:
+        } else {
+            // There is a bug in IE's toFixed implementation:
             // for n in {(-0.94, -0.5], [0.5, 0.94)} n.toFixed() returns 0
             // instead of -1 and 1. Manually handle that case.
             s = absN &lt; 1 &amp;&amp; absN &gt;= 0.5 &amp;&amp; !places ? '1' : absN.toFixed(places);
@@ -71,7 +90,7 @@
 
         bits  = s.split(/\D/);
 
-        if (absN &gt; 1000) {
+        if (absN &gt;= 1000) {
             i  = bits[0].length % 3 || 3;
 
             bits[0] = bits[0].slice(0,i) +
@@ -79,18 +98,26 @@
 
         }
 
-        s = cfg.prefix + bits.join(cfg.decimalSeparator) + cfg.suffix;
-
-        return neg ? cfg.negativeFormat.replace(/#/,s) : s;
+        return YAHOO.util.Number.format._applyFormat(
+            (n &lt; 0 ? cfg.negativeFormat : cfg.format),
+            bits.join(cfg.decimalSeparator),
+            cfg);
     }
 };
+
 YAHOO.util.Number.format.defaults = {
+    format : '{prefix}{number}{suffix}',
+    negativeFormat : null, // defaults to -(format)
     decimalSeparator : '.',
     decimalPlaces    : null,
-    thousandsSeparator : '',
-    prefix : '',
-    suffix : '',
-    negativeFormat : '-#'
+    thousandsSeparator : ''
+};
+
+YAHOO.util.Number.format._applyFormat = function (tmpl, num, data) {
+    return tmpl.replace(/\{(\w+)\}/g, function (_, token) {
+        return token === 'number' ? num :
+               token in data ? data[token] : '';
+    });
 };
 
 </diff>
      <filename>src/datasource/js/Type.js</filename>
    </modified>
    <modified>
      <diff>@@ -629,6 +629,54 @@ var XMLDocument = function(rootTagName, namespaceURL) {
 
         output = YAHOO.util.Number.format(&quot;1199&quot;, {decimalSeparator:&quot;,&quot;, decimalPlaces:2 });
         Assert.areSame(&quot;1199,00&quot;, output, &quot;Incorrect decimal separator&quot;);
+
+        // bug 2528651
+        output = YAHOO.util.Number.format(null);
+        Assert.areSame(&quot;&quot;, output, &quot;Incorrect output from null.&quot;);
+
+
+        output = YAHOO.util.Number.format(undefined);
+        Assert.areSame(&quot;&quot;, output, &quot;Incorrect output from undefined.&quot;);
+
+
+        output = YAHOO.util.Number.format(NaN);
+        Assert.areSame(&quot;&quot;, output, &quot;Incorrect output from NaN.&quot;);
+
+
+        output = YAHOO.util.Number.format(&quot;&quot;);
+        Assert.areSame(&quot;&quot;, output, &quot;Incorrect output from empty string.&quot;);
+
+        // test format and back compat for lame negativeFormat string w/ #
+        output = YAHOO.util.Number.format(&quot;-123123123.176&quot;,{
+                format: &quot;&amp;#165;{number}&quot;,
+                decimalPlaces:2,
+                thousandsSeparator:&quot;.&quot;,
+                decimalSeparator:&quot;,&quot;,
+                negativeFormat:&quot;# (neg)&quot;
+            });
+        Assert.areSame(&quot;&amp;#165;123.123.123,18 (neg)&quot;, output, &quot;Incorrect Yen formatting&quot;);
+
+        output = YAHOO.util.Number.format(123123123.176,{
+                format: &quot;({decimalPlaces}) x ${number} {foo}&quot;,
+                decimalPlaces:2,
+                thousandsSeparator:&quot;^&quot;,
+                decimalSeparator:&quot;_&quot;
+            });
+        Assert.areSame(&quot;(2) x $123^123^123_18 &quot;, output, &quot;Incorrect template interpretation&quot;);
+
+        output = YAHOO.util.Number.format(123123.1,{
+                negativeFormat: &quot;({number})&quot;,
+                thousandsSeparator: &quot;,&quot;,
+                decimalPlaces:-2
+            });
+        Assert.areSame(&quot;123,100&quot;, output, &quot;Incorrect format template interpretation&quot;);
+
+        output = YAHOO.util.Number.format(-123123.1,{
+                negativeFormat: &quot;({number})&quot;,
+                thousandsSeparator: &quot;,&quot;,
+                decimalPlaces:-2
+            });
+        Assert.areSame(&quot;(123,100)&quot;, output, &quot;Incorrect negativeFormat template interpretation&quot;);
     }
 });
 </diff>
      <filename>src/datasource/tests/datasource.html</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>7251c7fd462015a387174b634c95238aa8f35ea6</id>
    </parent>
  </parents>
  <author>
    <name>Luke Smith</name>
    <login></login>
    <email>lsmith@yahoo-inc.com</email>
  </author>
  <url>http://github.com/yui/yui2/commit/b0769a4e72c61cd85f79c788f7d78d4e39bfb816</url>
  <id>b0769a4e72c61cd85f79c788f7d78d4e39bfb816</id>
  <committed-date>2009-11-23T23:15:04-08:00</committed-date>
  <authored-date>2009-11-23T23:15:04-08:00</authored-date>
  <message>Added format property support to config object for templating rather than fixed prefix and suffix properties.  Expanded negativeFormat to also use this template system so $-123.45 is allowed again (back compat regression). null and empty string return empty string again (regression). [fixes #2528651]. Added tests for bug fix verification and for format/negativeFormat coverage.  Other misc formatting fixes.</message>
  <tree>57f31bed4f9a6f04ab5f00b1fa9c771d2af9a6e9</tree>
  <committer>
    <name>Luke Smith</name>
    <login></login>
    <email>lsmith@yahoo-inc.com</email>
  </committer>
</commit>
