/*
Copyright (c) 2010, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.com/yui/license.html
version: 2.8.1
 */
(function(){
    var lang=YAHOO.lang,util=YAHOO.util,Ev=util.Event;
    util.DataSourceBase=function(oLiveData,oConfigs){
        if(oLiveData===null||oLiveData===undefined){
            return;
        }
        this.liveData=oLiveData;
        this._oQueue={
            interval:null,
            conn:null,
            requests:[]
        };

        this.responseSchema={};

        if(oConfigs&&(oConfigs.constructor==Object)){
            for(var sConfig in oConfigs){
                if(sConfig){
                    this[sConfig]=oConfigs[sConfig];
                }
            }
            }
            var maxCacheEntries=this.maxCacheEntries;
if(!lang.isNumber(maxCacheEntries)||(maxCacheEntries<0)){
    maxCacheEntries=0;
}
this._aIntervals=[];
this.createEvent("cacheRequestEvent");
    this.createEvent("cacheResponseEvent");
    this.createEvent("requestEvent");
    this.createEvent("responseEvent");
    this.createEvent("responseParseEvent");
    this.createEvent("responseCacheEvent");
    this.createEvent("dataErrorEvent");
    this.createEvent("cacheFlushEvent");
    var DS=util.DataSourceBase;
    this._sName="DataSource instance"+DS._nIndex;
    DS._nIndex++;
    };

    var DS=util.DataSourceBase;
    lang.augmentObject(DS,{
        TYPE_UNKNOWN:-1,
        TYPE_JSARRAY:0,
        TYPE_JSFUNCTION:1,
        TYPE_XHR:2,
        TYPE_JSON:3,
        TYPE_XML:4,
        TYPE_TEXT:5,
        TYPE_HTMLTABLE:6,
        TYPE_SCRIPTNODE:7,
        TYPE_LOCAL:8,
        ERROR_DATAINVALID:"Invalid data",
        ERROR_DATANULL:"Null data",
        _nIndex:0,
        _nTransactionId:0,
        _getLocationValue:function(field,context){
            var locator=field.locator||field.key||field,xmldoc=context.ownerDocument||context,result,res,value=null;
            try{
                if(!lang.isUndefined(xmldoc.evaluate)){
                    result=xmldoc.evaluate(locator,context,xmldoc.createNSResolver(!context.ownerDocument?context.documentElement:context.ownerDocument.documentElement),0,null);
                    while(res=result.iterateNext()){
                        value=res.textContent;
                    }
                }else{
                xmldoc.setProperty("SelectionLanguage","XPath");
                result=context.selectNodes(locator)[0];
                value=result.value||result.text||null;
            }
            return value;
        }catch(e){}
    },
    issueCallback:function(callback,params,error,scope){
        if(lang.isFunction(callback)){
            callback.apply(scope,params);
        }else{
            if(lang.isObject(callback)){
                scope=callback.scope||scope||window;
                var callbackFunc=callback.success;
                if(error){
                    callbackFunc=callback.failure;
                }
                if(callbackFunc){
                    callbackFunc.apply(scope,params.concat([callback.argument]));
                }
            }
        }
},
parseString:function(oData){
    if(!lang.isValue(oData)){
        return null;
    }
    var string=oData+"";
    if(lang.isString(string)){
        return string;
    }else{
        return null;
    }
},
parseNumber:function(oData){
    if(!lang.isValue(oData)||(oData==="")){
        return null;
    }
    var number=oData*1;
    if(lang.isNumber(number)){
        return number;
    }else{
        return null;
    }
},
convertNumber:function(oData){
    return DS.parseNumber(oData);
},
parseDate:function(oData){
    var date=null;
    if(!(oData instanceof Date)){
        date=new Date(oData);
    }else{
        return oData;
    }
    if(date instanceof Date){
        return date;
    }else{
        return null;
    }
},
convertDate:function(oData){
    return DS.parseDate(oData);
}
});
DS.Parser={
    string:DS.parseString,
    number:DS.parseNumber,
    date:DS.parseDate
    };

DS.prototype={
    _sName:null,
    _aCache:null,
    _oQueue:null,
    _aIntervals:null,
    maxCacheEntries:0,
    liveData:null,
    dataType:DS.TYPE_UNKNOWN,
    responseType:DS.TYPE_UNKNOWN,
    responseSchema:null,
    useXPath:false,
    toString:function(){
        return this._sName;
    },
    getCachedResponse:function(oRequest,oCallback,oCaller){
        var aCache=this._aCache;
        if(this.maxCacheEntries>0){
            if(!aCache){
                this._aCache=[];
            }else{
                var nCacheLength=aCache.length;
                if(nCacheLength>0){
                    var oResponse=null;
                    this.fireEvent("cacheRequestEvent",{
                        request:oRequest,
                        callback:oCallback,
                        caller:oCaller
                    });
                    for(var i=nCacheLength-1;i>=0;i--){
                        var oCacheElem=aCache[i];
                        if(this.isCacheHit(oRequest,oCacheElem.request)){
                            oResponse=oCacheElem.response;
                            this.fireEvent("cacheResponseEvent",{
                                request:oRequest,
                                response:oResponse,
                                callback:oCallback,
                                caller:oCaller
                            });
                            if(i<nCacheLength-1){
                                aCache.splice(i,1);
                                this.addToCache(oRequest,oResponse);
                            }
                            oResponse.cached=true;
                            break;
                        }
                    }
                    return oResponse;
            }
        }
    }else{
    if(aCache){
        this._aCache=null;
    }
}
return null;
},
isCacheHit:function(oRequest,oCachedRequest){
    return(oRequest===oCachedRequest);
},
addToCache:function(oRequest,oResponse){
    var aCache=this._aCache;
    if(!aCache){
        return;
    }while(aCache.length>=this.maxCacheEntries){
        aCache.shift();
    }
    var oCacheElem={
        request:oRequest,
        response:oResponse
    };

    aCache[aCache.length]=oCacheElem;
    this.fireEvent("responseCacheEvent",{
        request:oRequest,
        response:oResponse
    });
},
flushCache:function(){
    if(this._aCache){
        this._aCache=[];
        this.fireEvent("cacheFlushEvent");
    }
},
setInterval:function(nMsec,oRequest,oCallback,oCaller){
    if(lang.isNumber(nMsec)&&(nMsec>=0)){
        var oSelf=this;
        var nId=setInterval(function(){
            oSelf.makeConnection(oRequest,oCallback,oCaller);
        },nMsec);
        this._aIntervals.push(nId);
        return nId;
    }else{}
},
clearInterval:function(nId){
    var tracker=this._aIntervals||[];
    for(var i=tracker.length-1;i>-1;i--){
        if(tracker[i]===nId){
            tracker.splice(i,1);
            clearInterval(nId);
        }
    }
    },
clearAllIntervals:function(){
    var tracker=this._aIntervals||[];
    for(var i=tracker.length-1;i>-1;i--){
        clearInterval(tracker[i]);
    }
    tracker=[];
},
sendRequest:function(oRequest,oCallback,oCaller){
    var oCachedResponse=this.getCachedResponse(oRequest,oCallback,oCaller);
    if(oCachedResponse){
        DS.issueCallback(oCallback,[oRequest,oCachedResponse],false,oCaller);
        return null;
    }
    return this.makeConnection(oRequest,oCallback,oCaller);
},
makeConnection:function(oRequest,oCallback,oCaller){
    var tId=DS._nTransactionId++;
    this.fireEvent("requestEvent",{
        tId:tId,
        request:oRequest,
        callback:oCallback,
        caller:oCaller
    });
    var oRawResponse=this.liveData;
    this.handleResponse(oRequest,oRawResponse,oCallback,oCaller,tId);
    return tId;
},
handleResponse:function(oRequest,oRawResponse,oCallback,oCaller,tId){
    this.fireEvent("responseEvent",{
        tId:tId,
        request:oRequest,
        response:oRawResponse,
        callback:oCallback,
        caller:oCaller
    });
    var xhr=(this.dataType==DS.TYPE_XHR)?true:false;
    var oParsedResponse=null;
    var oFullResponse=oRawResponse;
    if(this.responseType===DS.TYPE_UNKNOWN){
        var ctype=(oRawResponse&&oRawResponse.getResponseHeader)?oRawResponse.getResponseHeader["Content-Type"]:null;
        if(ctype){
            if(ctype.indexOf("text/xml")>-1){
                this.responseType=DS.TYPE_XML;
            }else{
                if(ctype.indexOf("application/json")>-1){
                    this.responseType=DS.TYPE_JSON;
                }else{
                    if(ctype.indexOf("text/plain")>-1){
                        this.responseType=DS.TYPE_TEXT;
                    }
                }
            }
    }else{
    if(YAHOO.lang.isArray(oRawResponse)){
        this.responseType=DS.TYPE_JSARRAY;
    }else{
        if(oRawResponse&&oRawResponse.nodeType&&(oRawResponse.nodeType===9||oRawResponse.nodeType===1||oRawResponse.nodeType===11)){
            this.responseType=DS.TYPE_XML;
        }else{
            if(oRawResponse&&oRawResponse.nodeName&&(oRawResponse.nodeName.toLowerCase()=="table")){
                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&&oRawResponse&&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&&JSON.parse){
                    oFullResponse=JSON.parse.apply(JSON,parseArgs);
                }else{
                    if(oFullResponse.parseJSON){
                        oFullResponse=oFullResponse.parseJSON.apply(oFullResponse,parseArgs.slice(1));
                    }else{
                        while(oFullResponse.length>0&&(oFullResponse.charAt(0)!="{")&&(oFullResponse.charAt(0)!="[")){
                            oFullResponse=oFullResponse.substring(1,oFullResponse.length);
                        }
                        if(oFullResponse.length>0){
                            var arrayEnd=Math.max(oFullResponse.lastIndexOf("]"),oFullResponse.lastIndexOf("}"));
                            oFullResponse=oFullResponse.substring(0,arrayEnd+1);
                            oFullResponse=eval("("+oFullResponse+")");
                        }
                    }
                }
        }
    }
}catch(e1){}
oFullResponse=this.doBeforeParseData(oRequest,oFullResponse,oCallback);
oParsedResponse=this.parseArrayData(oRequest,oFullResponse);
break;
case DS.TYPE_JSON:
    if(xhr&&oRawResponse&&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&&JSON.parse){
                oFullResponse=JSON.parse.apply(JSON,parseArgs);
            }else{
                if(oFullResponse.parseJSON){
                    oFullResponse=oFullResponse.parseJSON.apply(oFullResponse,parseArgs.slice(1));
                }else{
                    while(oFullResponse.length>0&&(oFullResponse.charAt(0)!="{")&&(oFullResponse.charAt(0)!="[")){
                        oFullResponse=oFullResponse.substring(1,oFullResponse.length);
                    }
                    if(oFullResponse.length>0){
                        var objEnd=Math.max(oFullResponse.lastIndexOf("]"),oFullResponse.lastIndexOf("}"));
                        oFullResponse=oFullResponse.substring(0,objEnd+1);
                        oFullResponse=eval("("+oFullResponse+")");
                    }
                }
            }
    }
}
}catch(e){}
oFullResponse=this.doBeforeParseData(oRequest,oFullResponse,oCallback);
oParsedResponse=this.parseJSONData(oRequest,oFullResponse);
break;
case DS.TYPE_HTMLTABLE:
    if(xhr&&oRawResponse.responseText){
    var el=document.createElement("div");
    el.innerHTML=oRawResponse.responseText;
    oFullResponse=el.getElementsByTagName("table")[0];
}
oFullResponse=this.doBeforeParseData(oRequest,oFullResponse,oCallback);
    oParsedResponse=this.parseHTMLTableData(oRequest,oFullResponse);
    break;
case DS.TYPE_XML:
    if(xhr&&oRawResponse.responseXML){
    oFullResponse=oRawResponse.responseXML;
}
oFullResponse=this.doBeforeParseData(oRequest,oFullResponse,oCallback);
    oParsedResponse=this.parseXMLData(oRequest,oFullResponse);
    break;
case DS.TYPE_TEXT:
    if(xhr&&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("responseParseEvent",{
        request:oRequest,
        response:oParsedResponse,
        callback:oCallback,
        caller:oCaller
    });
    this.addToCache(oRequest,oParsedResponse);
}else{
    oParsedResponse.error=true;
    this.fireEvent("dataErrorEvent",{
        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>=0;--i){
                if(typeof fields[i]!=="object"){
                    fields[i]={
                        key:fields[i]
                        };

            }
            }
            var parsers={},p;
    for(i=fields.length-1;i>=0;--i){
        p=(typeof fields[i].parser==="function"?fields[i].parser:DS.Parser[fields[i].parser+""])||fields[i].converter;
        if(p){
            parsers[fields[i].key]=p;
        }
    }
    var arrType=lang.isArray(oFullResponse[0]);
for(i=oFullResponse.length-1;i>-1;i--){
    var oResult={};

    rec=oFullResponse[i];
    if(typeof rec==="object"){
        for(j=fields.length-1;j>-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>-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)&&lang.isString(this.responseSchema.fieldDelim)){
            var oParsedResponse={
                results:[]
            };

            var recDelim=this.responseSchema.recordDelim;
            var fieldDelim=this.responseSchema.fieldDelim;
            if(oFullResponse.length>0){
                var newLength=oFullResponse.length-recDelim.length;
                if(oFullResponse.substr(newLength)==recDelim){
                    oFullResponse=oFullResponse.substr(0,newLength);
                }
                if(oFullResponse.length>0){
                    var recordsarray=oFullResponse.split(recDelim);
                    for(var i=0,len=recordsarray.length,recIdx=0;i<len;++i){
                        var bError=false,sRecord=recordsarray[i];
                        if(lang.isString(sRecord)&&(sRecord.length>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>-1;j--){
                                    try{
                                        var data=fielddataarray[j];
                                        if(lang.isString(data)){
                                            if(data.charAt(0)=='"'){
                                                data=data.substr(1);
                                            }
                                            if(data.charAt(data.length-1)=='"'){
                                                data=data.substr(0,data.length-1);
                                            }
                                            var field=fields[j];
                                            var key=(lang.isValue(field.key))?field.key:field;
                                            if(!field.parser&&field.converter){
                                                field.parser=field.converter;
                                            }
                                            var parser=(typeof field.parser==="function")?field.parser:DS.Parser[field.parser+""];
                                            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>=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&&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<len;j++){
                                if(item.childNodes[j].nodeValue){
                                    datapieces[datapieces.length]=item.childNodes[j].nodeValue;
                                }
                            }
                            if(datapieces.length>0){
                            data=datapieces.join("");
                        }
                    }
                }
        }
    }
if(data===null){
    data="";
}
if(!field.parser&&field.converter){
    field.parser=field.converter;
}
var parser=(typeof field.parser==="function")?field.parser:DS.Parser[field.parser+""];
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>=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)&&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(/\[(['"])(.*?)\1\]/g,function(x,$1,$2){
                keys[i]=$2;
                return".@"+(i++);
            }).replace(/\[(\d+)\]/g,function(x,$1){
                keys[i]=parseInt($1,10)|0;
                return".@"+(i++);
            }).replace(/^\./,"");
            if(!/[^\w\.\$@]/.test(needle)){
                path=needle.split(".");
                for(i=path.length-1;i>=0;--i){
                    if(path[i].charAt(0)==="@"){
                        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<len&&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<len;i++){
            field=fields[i];
            key=field.key||field;
            parser=((typeof field.parser==="function")?field.parser:DS.Parser[field.parser+""])||field.converter;
            path=buildPath(key);
            if(parser){
                fieldParsers[fieldParsers.length]={
                    key:key,
                    parser:parser
                };

        }
        if(path){
            if(path.length>1){
                fieldPaths[fieldPaths.length]={
                    key:key,
                    path:path
                };

        }else{
            simpleFields[simpleFields.length]={
                key:key,
                path:path[0]
                };

        }
    }else{}
}
for(i=resultsList.length-1;i>=0;--i){
    var r=resultsList[i],rec={};

    if(r){
        for(j=simpleFields.length-1;j>=0;--j){
            rec[simpleFields[j].key]=(r[simpleFields[j].path]!==undefined)?r[simpleFields[j].path]:r[j];
        }
        for(j=fieldPaths.length-1;j>=0;--j){
            rec[fieldPaths[j].key]=walkPath(fieldPaths[j].path,r);
        }
        for(j=fieldParsers.length-1;j>=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<elTable.tBodies.length;i++){
            var elTbody=elTable.tBodies[i];
            for(var j=elTbody.rows.length-1;j>-1;j--){
                var elRow=elTbody.rows[j];
                var oResult={};

                for(var k=fields.length-1;k>-1;k--){
                    var field=fields[k];
                    var key=(lang.isValue(field.key))?field.key:field;
                    var data=elRow.cells[k].innerHTML;
                    if(!field.parser&&field.converter){
                        field.parser=field.converter;
                    }
                    var parser=(typeof field.parser==="function")?field.parser:DS.Parser[field.parser+""];
                    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&&oLiveData.nodeType==9){
                this.responseType=DS.TYPE_XML;
            }else{
                if(oLiveData.nodeName&&(oLiveData.nodeName.toLowerCase()=="table")){
                    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("requestEvent",{
            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&&oRawResponse.nodeType&&oRawResponse.nodeType==9){
                    this.responseType=DS.TYPE_XML;
                }else{
                    if(oRawResponse&&oRawResponse.nodeName&&(oRawResponse.nodeName.toLowerCase()=="table")){
                        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||"";
    util.ScriptNodeDataSource.superclass.constructor.call(this,oLiveData,oConfigs);
};

lang.extend(util.ScriptNodeDataSource,DS,{
    getUtility:util.Get,
    asyncMode:"allowAll",
    scriptCallbackParam:"callback",
    generateRequestCallback:function(id){
        return"&"+this.scriptCallbackParam+"=YAHOO.util.ScriptNodeDataSource.callbacks["+id+"]";
    },
    doBeforeGetScriptNode:function(sUri){
        return sUri;
    },
    makeConnection:function(oRequest,oCallback,oCaller){
        var tId=DS._nTransactionId++;
        this.fireEvent("requestEvent",{
            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!=="ignoreStaleResponses")||(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&&oRawResponse.nodeType==9){
                            oSelf.responseType=DS.TYPE_XML;
                        }else{
                            if(oRawResponse.nodeName&&(oRawResponse.nodeName.toLowerCase()=="table")){
                                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||"";
    util.XHRDataSource.superclass.constructor.call(this,oLiveData,oConfigs);
};

lang.extend(util.XHRDataSource,DS,{
    connMgr:null,
    connXhrMode:"allowAll",
    connMethodPost:false,
    connTimeout:0,
    makeConnection:function(oRequest,oCallback,oCaller){
        var oRawResponse=null;
        var tId=DS._nTransactionId++;
        this.fireEvent("requestEvent",{
            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&&(this.connXhrMode=="ignoreStaleResponses")&&(oResponse.tId!=oQueue.conn.tId)){
                return null;
            }else{
                if(!oResponse){
                    this.fireEvent("dataErrorEvent",{
                        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["Content-Type"]:null;
                        if(ctype){
                            if(ctype.indexOf("text/xml")>-1){
                                this.responseType=DS.TYPE_XML;
                            }else{
                                if(ctype.indexOf("application/json")>-1){
                                    this.responseType=DS.TYPE_JSON;
                                }else{
                                    if(ctype.indexOf("text/plain")>-1){
                                        this.responseType=DS.TYPE_TEXT;
                                    }
                                }
                            }
                    }
            }
        this.handleResponse(oRequest,oResponse,oCallback,oCaller,tId);
}
}
};

var _xhrFailure=function(oResponse){
    this.fireEvent("dataErrorEvent",{
        request:oRequest,
        response:oResponse,
        callback:oCallback,
        caller:oCaller,
        message:DS.ERROR_DATAINVALID
        });
    if(lang.isString(this.liveData)&&lang.isString(oRequest)&&(this.liveData.lastIndexOf("?")!==this.liveData.length-1)&&(oRequest.indexOf("?")!==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=="cancelStaleRequests"){
    if(oQueue.conn){
        if(oConnMgr.abort){
            oConnMgr.abort(oQueue.conn);
            oQueue.conn=null;
        }else{}
}
}
if(oConnMgr&&oConnMgr.asyncRequest){
    var sLiveData=this.liveData;
    var isPost=this.connMethodPost;
    var sMethod=(isPost)?"POST":"GET";
    var sUri=(isPost||!lang.isValue(oRequest))?sLiveData:sLiveData+oRequest;
    var sRequest=(isPost)?oRequest:null;
    if(this.connXhrMode!="queueRequests"){
        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>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"";
        }
        B=!isFinite(+B)?0:+B;
        E=YAHOO.lang.merge(YAHOO.util.Number.format.defaults,(E||{}));
        var C=B<0,F=Math.abs(B),A=E.decimalPlaces,I=E.thousandsSeparator,H,G,D;
        if(A<0){
            H=F-(F%1)+"";
            D=H.length+A;
            if(D>0){
                H=Number("."+H).toFixed(D).slice(2)+new Array(H.length-D+1).join("0");
            }else{
                H="0";
            }
        }else{
        H=F<1&&F>=0.5&&!A?"1":F.toFixed(A);
    }
    if(F>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+"$1");
        H=G.join(E.decimalSeparator);
    }
    H=E.prefix+H+E.suffix;
    return C?E.negativeFormat.replace(/#/,H):H;
}
};

YAHOO.util.Number.format.defaults={
    decimalSeparator:".",
    decimalPlaces:null,
    thousandsSeparator:"",
    prefix:"",
    suffix:"",
    negativeFormat:"-#"
};
(function(){
    var A=function(C,E,D){
        if(typeof D==="undefined"){
            D=10;
        }
        for(;parseInt(C,10)<D&&D>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:["getDate","0"],
            e:["getDate"," "],
            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>D){
                    F++;
                }else{
                    if(C===0&&D>=52){
                        F--;
                    }
                }
                return F;
        },
        H:["getHours","0"],
        I:function(D){
            var C=D.getHours()%12;
            return A(C===0?12:C,0);
        },
        j:function(G){
            var F=new Date(""+G.getFullYear()+"/1/1 GMT");
            var D=new Date(""+G.getFullYear()+"/"+(G.getMonth()+1)+"/"+G.getDate()+" GMT");
            var C=D-F;
            var E=parseInt(C/60000/60/24,10)+1;
            return A(E,0,100);
        },
        k:["getHours"," "],
        l:function(D){
            var C=D.getHours()%12;
            return A(C===0?12:C," ");
        },
        m:function(C){
            return A(C.getMonth()+1,0);
        },
        M:["getMinutes","0"],
        p:function(D,C){
            return C.p[D.getHours()>=12?1:0];
        },
        P:function(D,C){
            return C.P[D.getHours()>=12?1:0];
        },
        s:function(D,C){
            return parseInt(D.getTime()/1000,10);
        },
        S:["getSeconds","0"],
        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(""+F.getFullYear()+"/1/1")).getDay();
            var D=E+(C>4||C<=1?0:1);
            if(D===53&&(new Date(""+F.getFullYear()+"/12/31")).getDay()<4){
                D=1;
            }else{
                if(D===0){
                    D=B.formats.V(new Date(""+(F.getFullYear()-1)+"/12/31"));
                }
            }
            return A(D,0);
    },
    w:"getDay",
    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:"getFullYear",
    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>0?"-":"+")+C+F;
    },
    Z:function(C){
        var D=C.toString().replace(/^.*:\d\d( GMT[+-]\d+)? \(?([A-Za-z ]+)\)?\d*$/,"$2").replace(/[a-z ]/g,"");
        if(D.length>4){
            D=B.formats.z(C);
        }
        return D;
    },
    "%":function(C){
        return"%";
    }
},
aggregates:{
    c:"locale",
    D:"%m/%d/%y",
    F:"%Y-%m-%d",
    h:"%b",
    n:"\n",
    r:"locale",
    R:"%H:%M",
    t:"\t",
    T:"%H:%M:%S",
    x:"locale",
    X:"locale"
},
format:function(G,F,D){
    F=F||{};

    if(!(G instanceof Date)){
        return YAHOO.lang.isValue(G)?G:"";
    }
    var H=F.format||"%m/%d/%Y";
    if(H==="YYYY/MM/DD"){
        H="%Y/%m/%d";
    }else{
        if(H==="DD/MM/YYYY"){
            H="%d/%m/%Y";
        }else{
            if(H==="MM/DD/YYYY"){
                H="%m/%d/%Y";
            }
        }
    }
D=D||"en";
if(!(D in YAHOO.util.DateLocale)){
    if(D.replace(/-[a-zA-Z]+$/,"") in YAHOO.util.DateLocale){
        D=D.replace(/-[a-zA-Z]+$/,"");
    }else{
        D="en";
    }
}
var J=YAHOO.util.DateLocale[D];
var C=function(L,K){
    var M=B.aggregates[K];
    return(M==="locale"?J[K]:M);
};

var E=function(L,K){
    var M=B.formats[K];
    if(typeof M==="string"){
        return G[M]();
    }else{
        if(typeof M==="function"){
            return M.call(G,G,J);
        }else{
            if(typeof M==="object"&&typeof M[0]==="string"){
                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("YAHOO.util");
YAHOO.util.Date=B;
YAHOO.util.DateLocale={
    a:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],
    A:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],
    b:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],
    B:["January","February","March","April","May","June","July","August","September","October","November","December"],
    c:"%a %d %b %Y %T %Z",
    p:["AM","PM"],
    P:["am","pm"],
    r:"%I:%M:%S %p",
    x:"%d/%m/%y",
    X:"%T"
};

YAHOO.util.DateLocale["en"]=YAHOO.lang.merge(YAHOO.util.DateLocale,{});
YAHOO.util.DateLocale["en-US"]=YAHOO.lang.merge(YAHOO.util.DateLocale["en"],{
    c:"%a %d %b %Y %I:%M:%S %p %Z",
    x:"%m/%d/%Y",
    X:"%I:%M:%S %p"
});
YAHOO.util.DateLocale["en-GB"]=YAHOO.lang.merge(YAHOO.util.DateLocale["en"],{
    r:"%l:%M:%S %P %Z"
});
YAHOO.util.DateLocale["en-AU"]=YAHOO.lang.merge(YAHOO.util.DateLocale["en"]);
})();
YAHOO.register("datasource",YAHOO.util.DataSource,{
    version:"2.8.1",
    build:"19"
});
