﻿var curSection=1;
var sSelectedYears = "None Selected";
var sSelectedCountries = "None Selected";
var sMoreSelectedCountries = "";
var sMoreSelectedYears = "";
var sMoreSelectedIndicators = "";
var sSelectedIndicators = "None Selected";
var sSelectedDataSets = "None Selected";
var sAdvancedDisplay="";
var IWantMore1 = false;
var IWantMore2 = false;
var IWantMore3 = false;

var treeIndicator;
var treeCountry;
var treeYear;
var treeDataSet;
var treeSchoolLevel;
var treeAgeGroup;
var treeDataSource;

var guidedResults;
var nodeIndex;
var searchoptions;
var bChanges = false;
var sIndicators = "";
var sCountries = "";
var sYears = "";
var sDataSets = "";
var bFirstLoad = true;
var arHeaders = [];
var bRet=false;

function search(){
    bRet = doesTreeHaveCheckedChildren(treeCountry, 'txtCountryCodes', true, "COUNTRY", true);

    if (!bRet){
        alert("You must select at least one country in order to proceed to the search results screen.");
    }
    else{
        bRet = doesTreeHaveCheckedChildren(treeIndicator, 'txtIndicatorCodes', true, "INDICATORS", true);
        if (!bRet){
            alert("You must select at least one indicator in order to proceed to the search results screen.");
        }
        else{
            bRet = doesTreeHaveCheckedChildren(treeYear, 'txtYears', false, "YEARS",false);
            if (!bRet) {
                alert("You must select at least one year in order to proceed to the search results screen.");
            }else{ //check the rest of the trees for unchecked boxes.  if any are unchecked then send the checked list to the sql 
                   doesTreeHaveCheckedChildren(treeUrbanRural, 'txtUrbanRural',false,"URBANRURAL",true);
                   doesTreeHaveCheckedChildren(treeGender, 'txtGender',false,"GENDER",true);
                   doesTreeHaveCheckedChildren(treeSubNational, 'txtSubNation',false,"SUBNATION",true);
                   doesTreeHaveCheckedChildren(treeCharacteristic, 'txtHHChar',false,"HHCHAR",true);
                   
                   doesTreeHaveCheckedChildren(treeSchoolLevel, 'txtSchoolLevel',true,"SCHOOLLEVEL",true);
                   doesTreeHaveCheckedChildren(treeDataSource, 'txtDataSource',true,"DATASOURCE",true);
                   doesTreeHaveCheckedChildren(treeAgeGroup, 'txtAgeGroup',true,"AGEGROUP",true);
                   doesTreeHaveCheckedChildren(treeLearningLevel, 'txtLearningLevel', false, "LEARNINGLEVEL", true);
                   document.getElementById("txtSearchType").value = sSearchType;
                   
            }
        }
    }
    return bRet;
}


function doesTreeHaveCheckedChildren(tree, fld, twolevels, whichTree,LabelValues){
    var bRet = false;
    var bAnyUnchecked=false;
    var sCodes = "";
    var nodes = tree.getRoot().children;
    for (var x=0;x<nodes.length;x++){
        if (twolevels){     //age, learninglevel, schoollevel, datasource,  indicators are all two levels, country is actually 3
                if (whichTree=="COUNTRY"){
                    if (nodes[x].label=="All Countries"){ //just one more level, loop and add selected countries
                        for (var y=0;y<nodes[x].children.length;y++){
                            var n = nodes[x].children[y];
                            if (n.checkState == 2) {
                                bRet=true;
                                sCodes += n.id.substring(3) + ",";
                            }
                        }
                    }else{//go another level down
                        for (var y=0;y<nodes[x].children.length;y++){
                            var n = nodes[x].children[y];
                            for (var z=0;z<n.children.length;z++){
                                var c=n.children[z];
                                if (c.checkState == 2) {
                                    bRet=true;
                                    if (sCodes.indexOf(c.id.substring(3))==-1){
                                        sCodes += c.id.substring(3) + ",";
                                        bAnyChecked=true
                                    }
                                }else{
                                    bAnyUnchecked=true;
                                }
                            }
                        }
                    }
                }else{
                    for (var y=0;y<nodes[x].children.length;y++){
                        var n = nodes[x].children[y];
                        if (n.checkState == 2) {
                            bRet = true;
                            sCodes += n.id + ",";
                        }else{
                            bAnyUnchecked=true;
                        }
                    }
                }
            
        }else{
            //subnation, hhchar, gender, learning levels and urbanrural are all one level
            var n = nodes[x];
            if (n.checkState == 2) {
                bRet = true;
                if (LabelValues == true)
                {
                    sCodes += n.id + ",";
                    if(whichTree=="HHCHAR"){
                        sCodes=null;
                    }else if (whichTree=="SUBNATION"){
                        if (x==0){
                            sCodes="0,";
                        }else{
                            sCodes=">0,";
                        }
                    }
                }else{
                    sCodes += n.label + ",";
                }
            }else{
                bAnyUnchecked=true;
                if(whichTree=="HHCHAR"){
                    sCodes="0,";
                }
            }
        }
    }
    if ((bAnyUnchecked==false) && (whichTree=="URBANRURAL" || whichTree=="GENDER" || whichTree=="SUBNATION" || whichTree=="AGEGROUP" || whichTree=="SCHOOLLEVEL" || whichTree=="DATASOURCE" || whichTree=="LEARNINGLEVEL")){
        //for most of the trees, if no values were unchecked then all are checked and no criteria was selected, don't add criteria to SQL, blank out the list of values
        sCodes="";
    }
    document.getElementById(fld).value = sCodes;
    return bRet;
}

function showSection(section){
    document.getElementById("detail" + curSection).style.display = "none";
    curSection = section;
    sIndicators = "";
    sCountries = "";
    sYears = "";
    sDataSets = "";
    apply();
}
//function showAdvancedCriteria(){
//    sAdvancedDisplay="none";
//    if (document.getElementById("chkAdvancedCriteria").checked == true) {
//        sAdvancedDisplay="";
//    }else{
//        //need to clear out any values and reset the visible parts to country
//    }            
//        for (var i=4;i<11;i++){
//        document.getElementById("criteria" + i).style.display = sAdvancedDisplay;
//        }
//}
function showMore(section){    
    arHeaders[section].showMore=true;
    document.getElementById("spnLabel" + section).innerHTML=arHeaders[section].text;
    document.getElementById("spnMore" + section).style.display = "none";
    document.getElementById("spnRemainder" + section).style.display = "inline";
    document.getElementById("spnRemainder" + section).innerHTML = sMoreSelectedIndicators + " <span id='spnLess'" + section + " onclick='showLess(" + section + ")' style='color:Red; text-decoration:underline;'>&nbsp;less...</span>";
}
function showLess(section){
    arHeaders[section].showMore=false;
    document.getElementById("spnLabel" + section).innerHTML=(arHeaders[section].text).substr(0,65);
    document.getElementById("spnMore" + section).style.display = "inline";
    document.getElementById("spnRemainder" + section).style.display = "none";
}
function uncheckAll(){
    searchoptions = {};
    searchoptions.Countries = [];
    searchoptions.Indicators = [];
    searchoptions.Years = [];
    searchoptions.DataSets = [];
    
    sCountriesCrit ="";
    sIndicatorCrit = "";
    sHHCharCrit = "";
    sGenderCrit = "";
    sAgeGroupCrit = "";
    sSubnationCrit ="";
    sUrbanRuralCrit ="";
    sYearCrit = "";
    sLearningLevelCrit ="";
    sSchoolLevelCrit = "";
    sDataSourceCrit = "";
    guidedResults=null;
    document.getElementById("divTotal").innerHTML ="";

    bFirstLoad = true;
    treeInit();
}

	
function treeInit() {
    sIndicators = "";
    sCountries = "";
    sYears = "";
    sDataSets = "";
    bChanges = false;
    initHeaders();
	buildTrees();
	subscribeNodeClicks();//this makes all the trees build headers when their nodes are clicked
    //document.getElementById("divTotal").innerHTML = "<small>Please select some search criteria from the lists at the left to start your search.</small>";
    setSectionText();
    bFirstLoad = false;
}
function initHeaders(){
    //initialize an array to determine whether headers show all criteria or not
        var Header ={"name":"COUNTRY","text":"None Selected","showMore":false,"twoLevels":true};
        arHeaders[1]=Header;
        Header ={"name":"INDICATORS","text":"None Selected","showMore":false,"twoLevels":true};
        arHeaders[2]=Header;
        Header ={"name":"YEARS","text":"None Selected","showMore":false,"twoLevels":false};
        arHeaders[3]=Header;
        Header ={"name":"SUBNATION","text":"All Selected","showMore":false,"twoLevels":false};
        arHeaders[4]=Header;
        Header ={"name":"URBANRURAL","text":"All Selected","showMore":false,"twoLevels":false};
        arHeaders[5]=Header;
        Header ={"name":"GENDER","text":"All Selected","showMore":false,"twoLevels":false};
        arHeaders[6]=Header;
        Header ={"name":"AGEGROUP","text":"All Selected","showMore":false,"twoLevels":true};
        arHeaders[7]=Header;
        Header ={"name":"DATASOURCE","text":"All Selected","showMore":false,"twoLevels":true};
        arHeaders[8]=Header;
        Header ={"name":"LEARNINGLEVEL","text":"All Selected","showMore":false,"twoLevels":false};
        arHeaders[9]=Header;
        Header ={"name":"SCHOOLLEVEL","text":"All Selected","showMore":false,"twoLevels":true};
        arHeaders[10]=Header;
        Header ={"name":"HHCHAR","text":"All Selected","showMore":false,"twoLevels":false};
        arHeaders[11]=Header;
        Header ={"name":"DataSets","text":"All Selected","showMore":false,"twoLevels":true};
        arHeaders[12]=Header;
        
        for (var x=1;x<12;x++){
            document.getElementById("spnLabel" + x).innerHTML = arHeaders[x].text;
        }

}
function clearOrFillTree(tree,iwhichHeader,checkState){
    var whichTree=arHeaders[iwhichHeader].name;
    var nodes = tree.getRoot().children;
    var sSpanLabel='';
    for (var x=0;x<nodes.length;x++){
           if (whichTree=="COUNTRY" || whichTree=="INDICATORS" ||  whichTree=="AGEGROUP" || whichTree=="SCHOOLLEVEL" || whichTree=="DATASOURCE"){
                if (whichTree=="COUNTRY"){//country is actually 3 levels, so we have to do additional looping
                    if (nodes[x].label=="All Countries"){ //just one more level, loop and add selected countries
                        for (var y=0;y<nodes[x].children.length;y++){
                            var n = nodes[x].children[y];
                                if (checkState=='checked'){
                                         n.check();
                                    }else{
                                        n.uncheck();
                                    }
                        }
                    }else{//go another level down
                        for (var y=0;y<nodes[x].children.length;y++){
                            var n = nodes[x].children[y];
                            for (var z=0;z<n.children.length;z++){
                                var c=n.children[z];
                                c.checked=checkState;
                                if (checkState=='checked'){
                                         c.check();
                                    }else{
                                        c.uncheck();
                                    }
                            }
                        }
                    }
                }else{
                    for (var y=0;y<nodes[x].children.length;y++){
                        var n = nodes[x].children[y];
                                if (checkState=='checked'){
                                         n.check();
                                    }else{
                                        n.uncheck();
                                    }
                    }
                }
            
        }else{
            //subnation, hhchar, gender, learning levels,year and urbanrural are all one level
            var n = nodes[x];
            if (checkState=='checked'){
                     n.check();
                }else{
                    n.uncheck();
                }
        }
    }
        if (checkState=='checked'){
            sSpanLabel="All Selected";
        }else{
            sSpanLabel="None Selected";
        }
    
        document.getElementById("spnLabel" + iwhichHeader).innerHTML = sSpanLabel;
        document.getElementById("spnRemainder" + iwhichHeader).style.display = "none";
        document.getElementById("spnMore" + iwhichHeader).style.display = "none";

}
function manageHeader(iwhichHeader, tree, init, curNode){

    var bAnyUnchecked=false;
    var bAnyChecked=false;
    var bNoList=false;
    var sSpanLabel = "SELECTED:  ";
    var whichTree=arHeaders[iwhichHeader].name;
    var twoLevels=arHeaders[iwhichHeader].twoLevels;
    var nodes = tree.getRoot().children;
    
    if (whichTree=="COUNTRY" && init!=true){
        var checkedList = {"countrylist":'',"checked":true};
        checkedList.checked=curNode.checked;
        //find out if a particular country is clicked or an entire group
        if (curNode.id.length>3){//single node checked/unchecked
            checkedList.countrylist=curNode.label;
        }else{//group of nodes checked/unchecked
            //build up list of countries under the node and find out if they are checked or not
            var x = curNode.id.charAt(2, 1);
            var sTemp = "";
            var nodes = treeCountry.getRoot().children;
            for (var y=0;y<curNode.children.length;y++){
                if (curNode.children[y].id.length > 3)
                {
                    checkedList.countrylist += curNode.children[y].label + ", ";
                }
                for (var z=0;z<curNode.children[y].children.length;z++)
                {
                    var n = curNode.children[y].children[z];
                    checkedList.countrylist += n.label + ", ";
                }
            }
        }
    }

    //first, iterate through the tree and create a comma delimited list
    for (var x=0;x<nodes.length;x++){
        if (twoLevels)//age, schoollevel, datasource, country, indicators are all two levels
        {
            if (whichTree=="COUNTRY"){//country is actually 3 levels, so we have to do additional looping
                if (nodes[x].label=="All Countries"){ //just one more level, loop and add selected countries
                    for (var y=0;y<nodes[x].children.length;y++){
                        var n = nodes[x].children[y];
                        if (init!=true){
                            if (checkedList.countrylist.indexOf(n.label)>-1){//make sure if a country is checked/unchecked, its checked/unchecked everywhere
                               if (checkedList.checked==true){
                                     n.check();
                                }else{
                                    n.uncheck();
                                }
                                //n.checkState=curNode.checkState;
                            }
                        } 
                        if (n.checkState == 2) {
                            if (sSpanLabel.indexOf(n.label)==-1){
                                sSpanLabel += n.label + ", ";
                            }
                            bAnyChecked=true
                        }else{
                            bAnyUnchecked=true;
                        }
                    }
                }else{//go another level down
                    for (var y=0;y<nodes[x].children.length;y++){
                        var n = nodes[x].children[y];
                        for (var z=0;z<n.children.length;z++){
                            var c=n.children[z];
                            if(init!=true){
                                if (checkedList.countrylist.indexOf(c.label)>-1){//make sure if a country is checked/unchecked, its checked/unchecked everywhere
                                   if (checkedList.checked==true){
                                         c.check();
                                    }else{
                                        c.uncheck();
                                    }
                                }
                            }
                            if (c.checkState == 2) {
                                if (sSpanLabel.indexOf(c.label)==-1){
                                    sSpanLabel += c.label + ", ";
                                    bAnyChecked=true
                                }
                            }else{
                                bAnyUnchecked=true;
                            }
                        }
                    }
                }
            }else{
                for (var y=0;y<nodes[x].children.length;y++){
                    var n = nodes[x].children[y];
                    if (n.checkState == 2) {
                        sSpanLabel += n.label + ", ";
                        bAnyChecked=true
                    }else{
                        bAnyUnchecked=true;
                    }
                }
            }
        }else{
            //subnation, hhchar, gender, learning levels,year and urbanrural are all one level
            var n = nodes[x];
            if (n.checkState == 2) {
                    sSpanLabel += n.label + ", ";
                    bAnyChecked=true;
            }else{
                bAnyUnchecked=true;
            }
        }
    }
    //if its all selected or none s
    if ((bAnyUnchecked==false) && (whichTree=="URBANRURAL" || whichTree=="GENDER" || whichTree=="SUBNATION" || whichTree=="AGEGROUP" || whichTree=="SCHOOLLEVEL" || whichTree=="DATASOURCE" || whichTree=="LEARNINGLEVEL")){
        //for most of the trees, if no values were unchecked then all are checked and no criteria was selected, don't add criteria to SQL, blank out the list of values
        sSpanLabel="All Selected";
        bNoList=true;
    }
    if ((bAnyChecked==false) && (whichTree=="COUNTRY" || whichTree=="INDICATORS" || whichTree=="YEARS" || whichTree=="URBANRURAL" || whichTree=="GENDER" || whichTree=="SUBNATION" || whichTree=="AGEGROUP" || whichTree=="SCHOOLLEVEL" || whichTree=="DATASOURCE" || whichTree=="LEARNINGLEVEL")){
        //for country, indicator and years, all unselected is the default.  If none were checked, leave the label as "None Selected"
        sSpanLabel="None Selected";
        bNoList=true;
    }

    arHeaders[iwhichHeader].text =  sSpanLabel;
    if (bNoList==false){
        //there is a list to be display, trim off the final comma
        sSpanLabel= sSpanLabel.substr(0, sSpanLabel.length-1);
        arHeaders[iwhichHeader].text =  sSpanLabel;

        if (arHeaders[iwhichHeader].showMore==false){
            if (sSpanLabel.length>75){//trim it and show the 'more'
                document.getElementById("spnLabel" + iwhichHeader).innerHTML = sSpanLabel.substr(0,65);
                document.getElementById("spnMore" + iwhichHeader).style.display = "inline";
            }else{
                document.getElementById("spnLabel" + iwhichHeader).innerHTML = sSpanLabel;
            }
            //document.getElementById("spnRemainder" + iwhichHeader).innerHTML = sMoreSelectedIndicators + " <span id='spnLess'" + iwhichHeader + " onclick='showLess(" + iwhichHeader + ")' style='color:Red; text-decoration:underline;'>less...</span>";
        }else{
            document.getElementById("spnLabel" + iwhichHeader).innerHTML = sSpanLabel;
            document.getElementById("spnRemainder" + iwhichHeader).style.display = "inline";
            document.getElementById("spnRemainder" + iwhichHeader).innerHTML = sMoreSelectedIndicators + " <span id='spnLess'" + iwhichHeader + " onclick='showLess(" + iwhichHeader + ")' style='color:Red; text-decoration:underline;'>&nbsp;less...</span>";
        }
    }else{
        //don't need a list of values, just either "none selected" or "all selected"
        document.getElementById("spnLabel" + iwhichHeader).innerHTML = sSpanLabel;
        document.getElementById("spnRemainder" + iwhichHeader).style.display = "none";
        document.getElementById("spnMore" + iwhichHeader).style.display = "none";
    }
    //document.getElementById("spnLabel" + iwhichHeader).title=sSpanLabel.substr(0,50);

}

function buildTrees() {

    //create single level tree views
    createIndicatorTreeView();
    createCountryTreeView();
    createYearList();
    createUrbanRuralList();
    createSubNational();
    createSex();
    createCharacteristic();
    createLearningLevel();
    
    //create two level treeviews
    treeSchoolLevel = new YAHOO.widget.TreeView("treeSchoolLevelDiv");
    treeAgeGroup = new YAHOO.widget.TreeView("treeAgeGroupDiv");
    treeDataSource = new YAHOO.widget.TreeView("treeDataSourceDiv");
    
    createHierTreeView(treeSchoolLevel, searchcriteria.SchoolLevel,sSchoolLevelCrit);
    manageHeader(10,treeSchoolLevel,true);
    createHierTreeView(treeAgeGroup, searchcriteria.AgeGroup,sAgeGroupCrit);
    manageHeader(7,treeAgeGroup,true);
    createHierTreeView(treeDataSource, searchcriteria.DataSource,sDataSourceCrit);
     manageHeader(8,treeDataSource,true);
        
    if (searchcriteria.DataSets.length > 1){
        document.getElementById("section4").style.display = "";
        createDataSetList();
    }
}
    
function subscribeNodeClicks(){
    treeLearningLevel.subscribe("checkClick", function(node) {manageHeader(9,treeLearningLevel,false,node);bChanges=true;});
    treeCountry.subscribe("checkClick", function(node) {manageHeader(1,treeCountry,false,node);bChanges=true;});
    treeIndicator.subscribe("checkClick", function(node) {manageHeader(2,treeIndicator,false,node);bChanges=true;});
    treeYear.subscribe("checkClick", function(node) {manageHeader(3,treeYear,false,node);bChanges=true;});
    treeSubNational.subscribe("checkClick", function(node) {manageHeader(4,treeSubNational,false,node);bChanges=true;});
    treeUrbanRural.subscribe("checkClick", function(node) {manageHeader(5,treeUrbanRural,false,node);bChanges=true;});
    treeGender.subscribe("checkClick", function(node) {manageHeader(6,treeGender,false,node);bChanges=true;});
    treeAgeGroup.subscribe("checkClick", function(node) {manageHeader(7,treeAgeGroup,false,node);bChanges=true;});
    treeDataSource.subscribe("checkClick", function(node) {manageHeader(8,treeDataSource,false,node);bChanges=true;});
    treeSchoolLevel.subscribe("checkClick", function(node) {manageHeader(10,treeSchoolLevel,false,node);bChanges=true;});
    treeCharacteristic.subscribe("checkClick", function(node) {manageHeader(11,treeCharacteristic,false,node);});
}
    
function createHierTreeView(tree, data,sPrePop){//used for schoollevel, agegroup, datasource
    //var tree = new YAHOO.widget.TreeView(treename);
    var checked = true;
    var sGuidedResults='';
    var searchArray;
    if (guidedResults!=null){
        switch(tree.id){
            case 'treeAgeGroupDiv':
                sGuidedResults=guidedResults.AgeGroup;
                searchArray = searchoptions.AgeGroup;
                break;
            case 'treeDataSourceDiv':
                sGuidedResults=guidedResults.DataSource;
                searchArray = searchoptions.DataSource;
                break;
            case 'treeSchoolLevelDiv':
                sGuidedResults=guidedResults.SchoolLevel;
                searchArray = searchoptions.SchoolLevel;
                break;
        }
    }
    for (var x=0;x<data.length;x++){
        var bExpanded = false;
        var parent = new YAHOO.widget.TaskNode(data[x].CategoryName, tree.getRoot(), bExpanded, checked);
        
        parent.id = "l1" + x;
        for (var y=0;y<data[x].Children.length;y++){
            if (guidedResults==null){
                if (sPrePop==","){
                        var child = new YAHOO.widget.TaskNode(data[x].Children[y].Name, parent, true, true);
                        child.id = data[x].Children[y].ID;
                }else{
                    if (sPrePop.indexOf("," + data[x].Children[y].ID + ",") >-1){
                        var child = new YAHOO.widget.TaskNode(data[x].Children[y].Name, parent, true, true);
                        child.id = data[x].Children[y].ID;
                    }else{
                        var child = new YAHOO.widget.TaskNode(data[x].Children[y].Name, parent, true, false);
                        child.id = data[x].Children[y].ID;
                    }
                }
            }else{
                if (sGuidedResults.indexOf(data[x].Children[y].ID)>-1){
                    var child = new YAHOO.widget.TaskNode(data[x].Children[y].Name, parent, true, iterateSearchOptions(data[x].Children[y].ID,searchArray));//iteratesearchoptions tells if it was checked or not
                    child.id = data[x].Children[y].ID;
                }
            }
        }
    }
    tree.draw();
}
function createIndicatorTreeView(){
    var manyIndicators = false;
    treeIndicator = new YAHOO.widget.TreeView("treeIndicators");
    for (var i = 0; i < searchcriteria.IndicatorCategories.length;i++) {
        var cat = searchcriteria.IndicatorCategories[i];
        
        var bExpanded = true;
        if (bFirstLoad) bExpanded = false;
        var tmpNode = new YAHOO.widget.TaskNode(cat.CategoryName, treeIndicator.getRoot(), bExpanded);
        for (var x=0;x<cat.Indicators.length;x++){
            if (guidedResults==null){//the criteria are not filtered, build entire treeview
                if (sIndicatorCrit.indexOf("," + cat.Indicators[x].ID + ",") > -1) {//prepopulate
                    if ((sSearchType == "3") || (sSearchType == "2" && cat.Indicators[x].IsProjection == "1") || (sSearchType == "1" && cat.Indicators[x].IsProjection == "0")) {
                        var tmpChild = new YAHOO.widget.TaskNode(cat.Indicators[x].Name, tmpNode, true, true);
                        tmpChild.id = cat.Indicators[x].ID;
                    }
                } else {//just build initial unpopulated treeview
                    if ((sSearchType=="3")||(sSearchType=="2" && cat.Indicators[x].IsProjection=="1")||(sSearchType=="1" && cat.Indicators[x].IsProjection=="0")){ 
                        var tmpChild = new YAHOO.widget.TaskNode(cat.Indicators[x].Name, tmpNode, false, false);
                        tmpChild.id = cat.Indicators[x].ID;
                    }
                }
            }else{//results are filtered (guided search), create filtered treeview
                if (guidedResults.Indicators.indexOf("|" + cat.Indicators[x].ID + "|", 0) > -1){
                    var checked = false;
                    for (var y=0;y<searchoptions.Indicators.length;y++){
                        if (searchoptions.Indicators[y] == cat.Indicators[x].ID) checked = true;
                    }
                    if ((sSearchType == "3") || (sSearchType == "2" && cat.Indicators[x].IsProjection == "1") || (sSearchType == "1" && cat.Indicators[x].IsProjection == "0")) {
                        var tmpChild = new YAHOO.widget.TaskNode(cat.Indicators[x].Name, tmpNode, true, checked);
                        tmpChild.id = cat.Indicators[x].ID;
                    }
                }
            }
        }
    }
    var nodes = treeIndicator.getRoot().children;
    for (var x=0;x<nodes.length;x++){
        if (nodes[x].children.length == 0){
            treeIndicator.removeNode(nodes[x]);
        }
    }

    treeIndicator.draw();
    manageHeader(2,treeIndicator,true);
}
    
function createCountryTreeView(){   
    treeCountry = new YAHOO.widget.TreeView("treeCountries");
    for (var x=0;x<regions.length;x++)
    {
        var bExpanded = false;
        var toplevel;
        if (regions[x].CountryRegionType == "All Countries"){
            toplevel = new YAHOO.widget.TaskNode(regions[x].CountryRegionType, treeCountry.getRoot(), bExpanded);
        }else{
            toplevel = new YAHOO.widget.TextNode(regions[x].CountryRegionType, treeCountry.getRoot(), bExpanded);
        }
        
        toplevel.id = "l1" + x;
        for (var y=0;y<regions[x].Regions.length;y++){
            var parent = toplevel;
            if (regions[x].Regions[y].RegionName != "All Countries"){
                parent = new YAHOO.widget.TaskNode(regions[x].Regions[y].RegionName, toplevel, false);
                parent.id = "l2" + x;
            }
            for (var z=0;z<regions[x].Regions[y].Countries.length;z++){
                    for (var i=0;i<searchcriteria.Countries.length;i++)
                    {
                            if (searchcriteria.Countries[i].ID == regions[x].Regions[y].Countries[z]){
                                if (guidedResults==null){
                                    if (sCountriesCrit.indexOf("," + searchcriteria.Countries[i].ID + ",")>-1){
                                        country = new YAHOO.widget.TaskNode(searchcriteria.Countries[i].Name, parent, true, true);
                                        country.id = "l3" + x + regions[x].Regions[y].Countries[z];
                                    }else{
                                        country = new YAHOO.widget.TaskNode(searchcriteria.Countries[i].Name, parent, true, false);
                                        country.id = "l3" + x + regions[x].Regions[y].Countries[z];
                                    }
                                }else{
                                    if (guidedResults.Countries.indexOf("|" + regions[x].Regions[y].Countries[z] + "|", 0) > -1){
                                        bAdd = true;
                                        checked=false;
                                        for (var a=0;a<searchoptions.Countries.length;a++){
                                            if (searchoptions.Countries[a] == searchcriteria.Countries[i].ID){
                                                checked = true;
                                                break;
                                            }
                                        }             
                                        country = new YAHOO.widget.TaskNode(searchcriteria.Countries[i].Name, parent, false, checked);
                                        country.id = "l3" + x + regions[x].Regions[y].Countries[z];
                                    }
                                }
                                break;
                            }
                     }
            }
            
        }
    }
    treeCountry.draw();
    manageHeader(1,treeCountry,true);
}
function createYearList(){
    var manyYears = false;
    var sYearList = "";
    treeYear = new YAHOO.widget.TreeView("treeYears");

    for (var x=0;x<searchcriteria.Years.length;x++){
        var year = searchcriteria.Years[x];
          if (guidedResults == null){
                if (sYearCrit.indexOf("," + year.YearDate + ",")>-1){//criteria exist, prepopulate, check this one off
                    if ((sSearchType == "3" && sYearList.indexOf(year.YearDate)== -1) || (sSearchType == "2" && year.IsProjection == "1") || (sSearchType == "1" && year.IsProjection == "0")) {
                        var node = new YAHOO.widget.TaskNode(year.YearDate + "", treeYear.getRoot(), true, true);
                        sYearList += year.YearDate + ",";
                    }
                } else {
                    if ((sSearchType == "3" && sYearList.indexOf(year.YearDate)== -1) || (sSearchType == "2" && year.IsProjection == "1") || (sSearchType == "1" && year.IsProjection == "0")) {
                        var node = new YAHOO.widget.TaskNode(year.YearDate + "", treeYear.getRoot(), true, false);
                        sYearList += year.YearDate + ",";
                    }
                }
          }else{
              if (guidedResults.Years.indexOf("|" + year + "|", 0) > -1){
                  var checked = false;
                    for (var y=0;y<searchoptions.Years.length;y++){
                        if (searchoptions.Years[y] == year){
                            checked = true;
                            break;
                        }
                    }
                    if ((sSearchType == "3" && sYearList.indexOf(year.YearDate) == -1) || (sSearchType == "2" && year.IsProjection == "1") || (sSearchType == "1" && year.IsProjection == "0")) {
                        var node = new YAHOO.widget.TaskNode(year.YearDate + "", treeYear.getRoot(), true, checked);
                        sYearList += year.YearDate + ",";
                    }
                }
           }
   }
    
    var j=0;
    treeYear.draw();
    manageHeader(3,treeYear,true);
}
 
 function createUrbanRuralList(){   
    treeUrbanRural = new YAHOO.widget.TreeView("treeUrbanRuralDiv");
    //for all the urban rural options, if there are not results(null), just create the node, if not check against results to see if they should be checked or not.  
    for (var x=0;x<searchcriteria.UrbanRural.length;x++){
        var sUrbanRural = searchcriteria.UrbanRural[x];
        
        if (guidedResults==null){
            if(sUrbanRuralCrit==","){//no criteria were selected, all are checked off
                var node = new YAHOO.widget.TaskNode(sUrbanRural.Name + "", treeUrbanRural.getRoot(), true,true);
                node.id = sUrbanRural.ID;
            }else{
                if(sUrbanRuralCrit.indexOf("," + sUrbanRural.ID + ",")>-1){//id found, check off
                    var node = new YAHOO.widget.TaskNode(sUrbanRural.Name + "", treeUrbanRural.getRoot(), true,true);
                    node.id = sUrbanRural.ID;
                }else{//id not found, don't pre-populate
                    var node = new YAHOO.widget.TaskNode(sUrbanRural.Name + "", treeUrbanRural.getRoot(), true,false);
                    node.id = sUrbanRural.ID;
                }
            }
        }else{
            if (guidedResults.UrbanRural.indexOf("|" + sUrbanRural.ID + "|", 0) > -1){
                  var ischecked = false;
                    for (var y=0;y<searchoptions.UrbanRural.length;y++){
                        if (searchoptions.UrbanRural[y] == sUrbanRural.ID){
                            ischecked = true;
                            break;
                        }
                    }
                 var node = new YAHOO.widget.TaskNode(sUrbanRural.Name + "", treeUrbanRural.getRoot(), true, ischecked);
                    node.id=sUrbanRural.ID;
                }
            }
    }       
    treeUrbanRural.draw();
    manageHeader(5,treeUrbanRural,true);
}

function createSubNational(){
        treeSubNational= new YAHOO.widget.TreeView("treeSubNationalDiv");
                var checked = true;
            if (sSubnationCrit == ","){//no criteria, create and check them both off
                var node = new YAHOO.widget.TaskNode("Show National" + "", treeSubNational.getRoot(), true, checked);
                node.id = 0;
                var node = new YAHOO.widget.TaskNode("Show Sub-National" + "", treeSubNational.getRoot(), true, checked);
                node.id = 1;
            }else{
                if (sSubnationCrit.indexOf(",0,")>-1){//create and check off National
                    var node = new YAHOO.widget.TaskNode("Show National" + "", treeSubNational.getRoot(), true, checked);
                    node.id = 0;
                }else{//create but don't check off national
                    var node = new YAHOO.widget.TaskNode("Show National" + "", treeSubNational.getRoot(), true, false);
                    node.id = 0;
                }
                if (sSubnationCrit.indexOf(",>0,")>-1){//create and check off subNational
                    var node = new YAHOO.widget.TaskNode("Show Sub-National" + "", treeSubNational.getRoot(), true, checked);
                    node.id = 1;
                }else{//create but don't check off Subnational
                    var node = new YAHOO.widget.TaskNode("Show Sub-National" + "", treeSubNational.getRoot(), true, false);
                    node.id = 1;
                }
            }
        treeSubNational.draw();
        manageHeader(4,treeSubNational,true);
}

function createSex(){
        treeGender= new YAHOO.widget.TreeView("treeSexDiv");
        //if no criteria was sent then they were all checked
        if (guidedResults==null){
            if (sGenderCrit==","){
                    var checked = true;
                    var node = new YAHOO.widget.TaskNode("None" + "", treeGender.getRoot(), true, checked);
                    node.id = 0;
                    var node = new YAHOO.widget.TaskNode("Both" + "", treeGender.getRoot(), true, checked);
                    node.id = 13;
                    var node = new YAHOO.widget.TaskNode("Female" + "", treeGender.getRoot(), true, checked);
                    node.id = 11;
                    var node = new YAHOO.widget.TaskNode("Male" + "", treeGender.getRoot(), true, checked);
                    node.id = 12;
            }else{
                    if (sGenderCrit.indexOf("0")>-1){checked=true;}
                    var node = new YAHOO.widget.TaskNode("None" + "", treeGender.getRoot(), true, checked);
                    node.id = 0;
                    
                    if (sGenderCrit.indexOf("13")>-1){checked=true;}
                    var node = new YAHOO.widget.TaskNode("Both" + "", treeGender.getRoot(), true, checked);
                    node.id = 13;
                    
                    if (sGenderCrit.indexOf("11")>-1){checked=true;}
                    var node = new YAHOO.widget.TaskNode("Female" + "", treeGender.getRoot(), true, checked);
                    node.id = 11;
                    
                    if (sGenderCrit.indexOf("12")>-1){checked=true;}
                    var node = new YAHOO.widget.TaskNode("Male" + "", treeGender.getRoot(), true, checked);
                    node.id = 12;
            }
        
        }else{
                    if (guidedResults.Gender.indexOf("0")>-1){
                        var node = new YAHOO.widget.TaskNode("None" + "", treeGender.getRoot(), true, iterateSearchOptions('0', searchoptions.Gender));
                        node.id = 0;
                    }
                    if (guidedResults.Gender.indexOf("13")>-1){
                        var node = new YAHOO.widget.TaskNode("Both" + "", treeGender.getRoot(), true, iterateSearchOptions('13', searchoptions.Gender));
                        node.id = 13;
                    }
                    if (guidedResults.Gender.indexOf("11")>-1){
                        var node = new YAHOO.widget.TaskNode("Female" + "", treeGender.getRoot(), true, iterateSearchOptions('11', searchoptions.Gender));
                        node.id = 11;
                    }
                    if (guidedResults.Gender.indexOf("12")>-1){
                        var node = new YAHOO.widget.TaskNode("Male" + "", treeGender.getRoot(), true, iterateSearchOptions('12', searchoptions.Gender));
                        node.id = 12;
                    }
        }
        treeGender.draw();
        manageHeader(6,treeGender,true);
}
function iterateSearchOptions(matchID, searchArray){
    var isChecked=false;
    for (var y=0;y<searchArray.length;y++){
        if (searchArray[y] == matchID){
            isChecked = true;
            break;
        }
    }
    return isChecked;
}
function createCharacteristic(){
        treeCharacteristic= new YAHOO.widget.TreeView("treeCharacteristicDiv");
            var checked = true;
            //if no criteria then all were checked
            if (sHHCharCrit==","){
                    var node = new YAHOO.widget.TaskNode("Include Characteristics" + "", treeCharacteristic.getRoot(), true, checked);
                    node.id = 0;
            }else{
                if (sHHCharCrit.indexOf("0") > -1) {
                    checked = false;
                    var node = new YAHOO.widget.TaskNode("Include Characteristics" + "", treeCharacteristic.getRoot(), true, checked);
                    node.id = 0;
                } else {
                    var node = new YAHOO.widget.TaskNode("Include Characteristics" + "", treeCharacteristic.getRoot(), true, checked);
                    node.id = 0;
                }
            }
        treeCharacteristic.draw();
}

function createLearningLevel(){   
        treeLearningLevel = new YAHOO.widget.TreeView("treeLearningLevelDiv");
        for (var x=0;x<searchcriteria.LearningLevel.length;x++){
            var sLearningLevel = searchcriteria.LearningLevel[x];
            var checked = true;
            if (guidedResults==null){
                if (sLearningLevelCrit==","){//no criteria, all should be created and selected
                    var node = new YAHOO.widget.TaskNode(sLearningLevel.Name + "", treeLearningLevel.getRoot(), true, checked);
                    node.id = sLearningLevel.ID;
                }else{
                    if(sLearningLevelCrit.indexOf("," +sLearningLevel.ID + ",")>-1){//create node and check it off
                        var node = new YAHOO.widget.TaskNode(sLearningLevel.Name + "", treeLearningLevel.getRoot(), true, checked);
                        node.id = sLearningLevel.ID;
                    }else{//not found in the criteria, create the node but don't check it off
                        var node = new YAHOO.widget.TaskNode(sLearningLevel.Name + "", treeLearningLevel.getRoot(), true, false);
                        node.id = sLearningLevel.ID;
                    }
                }
            }else{
                if (guidedResults.LearningLevel.indexOf("|" + sLearningLevel.ID + "|")>-1){
                    var node = new YAHOO.widget.TaskNode(sLearningLevel.Name + "", treeLearningLevel.getRoot(), true, iterateSearchOptions(sLearningLevel.ID,searchoptions.LearningLevel));
                    node.id = sLearningLevel.ID;
                }
            }
        }       
        treeLearningLevel.draw();
        manageHeader(9,treeLearningLevel,true);
}


function createDataSetList(){   
    treeDataSet = new YAHOO.widget.TreeView("treeDataSets");

    for (var x=0;x<searchcriteria.DataSets.length;x++){
        var ds = searchcriteria.DataSets[x];
        if (guidedResults == null){
            var sGroup = document.getElementById("ctl00_ctl00_bcr_bcr_hfGroup").value;
            if (sGroup == ds || bFirstLoad){
                var node = new YAHOO.widget.TaskNode(ds + "", treeDataSet.getRoot(), true, true);
                sDataSets += ds + ", ";
            }else{
                var node = new YAHOO.widget.TaskNode(ds + "", treeDataSet.getRoot(), true);
            }
        }else{
            if (guidedResults.DataSets.indexOf("|" + ds + "|", 0) > -1){
                var checked = false;
                for (var y=0;y<searchoptions.DataSets.length;y++){
                    if (searchoptions.DataSets[y] == ds) checked = true;
                }
                var node = new YAHOO.widget.TaskNode(ds + "", treeDataSet.getRoot(), true, checked);
            }
        }
    }

    treeDataSet.subscribe("checkClick", function(node) {
          bChanges = true;
       });
    treeDataSet.draw();
}

YAHOO.util.Event.on("btnApply", "click", function(e) {
	apply();
	YAHOO.util.Event.preventDefault(e);
});

function apply(){

    fillOutSearchOptions();

    setSectionText();
    if ((searchoptions.Countries.length > 0 || searchoptions.Indicators.length > 0 || searchoptions.Years.length > 0 || searchoptions.DataSets.length > 0)  && bChanges == true && document.getElementById("chkAutoSearch").checked == true){
        var params = "options=" + escape(YAHOO.AL.util.JSON.encode(searchoptions))
        rpc.startRequest(applyResults, "Unexpected failure", "getFilteredSearchCriteria.ashx", params)
    }else{
        document.getElementById("detail" + curSection).style.display = "";  
        if ((searchoptions.Countries.length > 0 || searchoptions.Indicators.length > 0 || searchoptions.Years.length > 0 || searchoptions.DataSets.length > 0) && document.getElementById("chkAutoSearch").checked == true && guidedResults!=null){
            document.getElementById("divTotal").innerHTML = "This search will return<br>" + guidedResults.Total + " data points.";
        }else{
            //document.getElementById("divTotal").innerHTML = "<small>Please select some search criteria from the lists at the left to start your search.<small>";
        }
    }
}
function setSectionText(){

//        document.getElementById("spnCountries").innerHTML = sSelectedCountries;
//        document.getElementById("spnIndicators").innerHTML = sSelectedIndicators;
//        document.getElementById("spnYears").innerHTML = sSelectedYears;
//        document.getElementById("spnDataSets").innerHTML = sSelectedDataSets;
    }
    function applyResults(o){
        guidedResults = eval('(' + o + ')');
        document.getElementById("divTotal").innerHTML = "This search will return<br>" + guidedResults.Total + " data points.";
        buildTrees();
        subscribeNodeClicks();
        document.getElementById("detail" + curSection).style.display = "";
        bChanges = false;
    }

    function flipProjectionsCheck() {
        if (document.getElementById("chkProjections").checked==false){
            sSearchType = initSearchType;
        }else{
            sSearchType="3";
        }
        buildTrees();
        subscribeNodeClicks();
        document.getElementById("detail" + curSection).style.display = "";
        bChanges = true;

    }
    function fillOutSearchOptions(){
    var allChecked=true;
    
        searchoptions = {};
        searchoptions.Countries = [];
        searchoptions.Indicators = [];
        searchoptions.Years = [];
        searchoptions.DataSets = [];
        searchoptions.UrbanRural = [];
        searchoptions.Gender = [];
        searchoptions.AgeGroup = [];
        searchoptions.DataSource = [];
        searchoptions.LearningLevel = [];
        searchoptions.SchoolLevel = [];
        searchoptions.AllSelectedList="";
        searchoptions.SearchType=sSearchType;
       // searchoptions.SearchType = document.getElementById("ctl00_ctl00_bcr_bcr_hfSearchType").value;

        //get countries
        var nodes = treeCountry.getRoot().children;
        for (var y=0;y<nodes[0].children.length;y++){
            var n = nodes[0].children[y];
            if (n.checkState == 2) {
                searchoptions.Countries.push(n.id.substring(3));
                sCountries += n.label + ", ";
            }else{
                allChecked=false;
            }
        }
        if (allChecked==true){//allchecked is the same as none checked
                searchoptions.AllSelectedList += "COUNTRIES|";
        }
//        //get indicators
        nodes = treeIndicator.getRoot().children;
        allChecked=true;
        for (var x=0;x<nodes.length;x++){
            for (var y=0;y<nodes[x].children.length;y++){
                var n = nodes[x].children[y];
                if (n.checkState == 2) {
                    searchoptions.Indicators.push(n.id);
                    sIndicators += n.label + ", ";
                }else{
                    allChecked=false;
                }
            }
        }
        if (allChecked==true){//allchecked is the same as none checked
                searchoptions.AllSelectedList += "INDICATORS|";
        }

        //get years
        nodes = treeYear.getRoot().children;
        allChecked=true;
        for (var x=0;x<nodes.length;x++){
            if (nodes[x].checkState == 2) {
                searchoptions.Years.push(nodes[x].label);
                sYears += nodes[x].label + ", ";
            }
        }

        //get datasets
        if (searchcriteria.DataSets.length > 1){        
            nodes = treeDataSet.getRoot().children;
            for (var x=0;x<nodes.length;x++){
                if (nodes[x].checkState == 2) {
                    searchoptions.DataSets.push(nodes[x].label);
                    sDataSets += nodes[x].label + ", ";
                }
            }
        }else{
            sDataSets = searchcriteria.DataSets[0];
        }

        
        //get urbanrural
        nodes = treeUrbanRural.getRoot().children;
        allChecked=true;
        for (var x=0;x<nodes.length;x++){
            if (nodes[x].checkState == 2) {
                searchoptions.UrbanRural.push(nodes[x].id);
                //sYears += nodes[x].label + ", ";
            }else{
                allChecked=false;
            }
        }
        if (allChecked==true){//allchecked is the same as none checked
                searchoptions.AllSelectedList += "URBANRURAL|";
        }

        //get Gender
        nodes = treeGender.getRoot().children;
        allChecked=true;
        for (var x=0;x<nodes.length;x++){
            if (nodes[x].checkState == 2) {
                searchoptions.Gender.push(nodes[x].id);
                //sYears += nodes[x].label + ", ";
            }else{
                allChecked=false;
            }
        }
        if (allChecked==true){//allchecked is the same as none checked
                searchoptions.AllSelectedList += "GENDER|";
        }

        //get learninglevel
        nodes = treeLearningLevel.getRoot().children;
        allChecked=true;
        for (var x=0;x<nodes.length;x++){
            if (nodes[x].checkState == 2) {
                searchoptions.LearningLevel.push(nodes[x].id);
                //sYears += nodes[x].label + ", ";
            }else{
                allChecked=false;
            }
        }
        if (allChecked==true){//allchecked is the same as none checked
                searchoptions.AllSelectedList += "LEARNINGLEVEL|";
        }

        //get Age group
        nodes = treeAgeGroup.getRoot().children;
        allChecked=true;
        for (var x=0;x<nodes.length;x++){
            for (var y=0;y<nodes[x].children.length;y++){
                var n = nodes[x].children[y];
                if (n.checkState == 2) {
                    searchoptions.AgeGroup.push(n.id);
                    //sIndicators += n.label + ", ";
                }else{
                    allChecked=false;
                }
            }
        }
        if (allChecked==true){//allchecked is the same as none checked
                searchoptions.AllSelectedList += "AGEGROUP|";
        }

        //get DataSource
        nodes = treeDataSource.getRoot().children;
        allChecked=true;
        for (var x=0;x<nodes.length;x++){
            for (var y=0;y<nodes[x].children.length;y++){
                var n = nodes[x].children[y];
                if (n.checkState == 2) {
                    searchoptions.DataSource.push(n.id);
                    //sIndicators += n.label + ", ";
                }else{
                    allChecked=false;
                }
            }
        }
        if (allChecked==true){//allchecked is the same as none checked
                searchoptions.AllSelectedList += "DATASOURCE|";
        }

        //get schoollevel
        nodes = treeSchoolLevel.getRoot().children;
        allChecked=true;
        for (var x=0;x<nodes.length;x++){
            for (var y=0;y<nodes[x].children.length;y++){
                var n = nodes[x].children[y];
                if (n.checkState == 2) {
                    searchoptions.SchoolLevel.push(n.id);
                    //sIndicators += n.label + ", ";
                }else{
                    allChecked=false;
                }
            }
        }
         if (allChecked==true){//allchecked is the same as none checked
                searchoptions.AllSelectedList += "SCHOOLLEVEL|";
        }

    
  }  
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   
 //Below this is code from Yahoo that runs the yahoo treeviews   
	YAHOO.util.Event.onDOMReady(treeInit);
//})();




YAHOO.namespace('AL.util');
YAHOO.AL.util.JSON = new function(){
    var useHasOwn = {}.hasOwnProperty ? true : false;
    var validRE = /^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/;
    
    var pad = function(n) {
        return n < 10 ? '0' + n : n;
    };
    
    var m = {
        '\b': '\\b',
        '\t': '\\t',
        '\n': '\\n',
        '\f': '\\f',
        '\r': '\\r',
        '"' : '\\"',
        '\\': '\\\\'
    };

    var encodeString = function(s){
        if (/["\\\x00-\x1f]/.test(s)) {
            return '"' + s.replace(/([\x00-\x1f\\"])/g, function(a, b) {
                var c = m[b];
                if(c){
                    return c;
                }
                c = b.charCodeAt();
                return '\\u00' +
                    Math.floor(c / 16).toString(16) +
                    (c % 16).toString(16);
            }) + '"';
        }
        return '"' + s + '"';
    };
    
    var encodeArray = function(o){
        var a = ['['], b, i, l = o.length, v;
            for (i = 0; i < l; i += 1) {
                v = o[i];
                switch (typeof v) {
                    case 'undefined':
                    case 'function':
                    case 'unknown':
                        break;
                    default:
                        if (b) {
                            a.push(',');
                        }
                        a.push(v === null ? "null" : YAHOO.AL.util.JSON.encode(v));
                        b = true;
                }
            }
            a.push(']');
            return a.join('');
    };
    
    var encodeDate = function(o){
        return '"' + o.getFullYear() + '-' +
                pad(o.getMonth() + 1) + '-' +
                pad(o.getDate()) + 'T' +
                pad(o.getHours()) + ':' +
                pad(o.getMinutes()) + ':' +
                pad(o.getSeconds()) + '"';
    };
    
    this.encode = function(o){
        if(typeof o == 'undefined' || o === null){
            return 'null';
        }else if(o instanceof Array){
            return encodeArray(o);
        }else if(o instanceof Date){
            return encodeDate(o);
        }else if(typeof o == 'string'){
            return encodeString(o);
        }else if(typeof o == 'number'){
            return isFinite(o) ? String(o) : "null";
        }else if(typeof o == 'boolean'){
            return String(o);
        }else {
            var a = ['{'], b, i, v;
            for (var i in o) {
                if(!useHasOwn || o.hasOwnProperty(i)) {
                    v = o[i];
                    switch (typeof v) {
                    case 'undefined':
                    case 'function':
                    case 'unknown':
                        break;
                    default:
                        if(b){
                            a.push(',');
                        }
                        a.push(this.encode(i), ':',
                                v === null ? "null" : this.encode(v));
                        b = true;
                    }
                }
            }
            a.push('}');
            return a.join('');
        }
    };
    
    this.decode = function(json){
        try{
            if(validRE.test(json)) {
                return eval('(' + json + ')');
            }
        }catch(e){
        }
        throw new SyntaxError("parseJSON");
    };
}();


var rpc = {
    "successevent":"",
    "failuremsg":"", 
    
    handleSuccess:function(o){
        YAHOO.example.container.wait.hide();
	    successevent(o.responseText);
    },
    handleFailure:function(o){
        alert(o.responseText);
        YAHOO.example.container.wait.hide();
        alert(failuremsg);
    },
    startRequest:function(sucevnt, failmsg, url, params) {
        successevent = sucevnt;
        failuremsg = failmsg;
        showProgress();   
        YAHOO.util.Connect.asyncRequest('POST', url, callback, params);
    }
};
var callback =
{
	success:rpc.handleSuccess,
	failure:rpc.handleFailure,
	scope: rpc
};

YAHOO.namespace("example.container");
function showProgress(){
    if (!YAHOO.example.container.wait) {
        // Initialize the temporary Panel to display while waiting for external content to load
        YAHOO.example.container.wait = 
                new YAHOO.widget.Panel("wait",  
                                                { width: "260px", 
                                                  fixedcenter: true, 
                                                  close: false, 
                                                  draggable: false, 
                                                  modal: true,
                                                  visible: false
                                                } 
                                            );
        YAHOO.example.container.wait.setHeader("<div style=\"background-color=#CCC;border:1px solid gray\">Narrowing search criteria, please wait...</div>");
        YAHOO.example.container.wait.setBody("<div style=\"background-color=white;border:1px solid gray\"><img src=\"Reserved.ReportViewerWebControl.axd?opType=Resource&Version=9.0.21022.143&Name=Microsoft.Reporting.WebForms.Icons.SpinningWheel.gif\"/> <span style='font-size:32px;'>Searching...</span></div>");
        YAHOO.example.container.wait.render(document.body);
    }
    YAHOO.example.container.wait.show();
}







/**
 * The check box marks a task complete.  It is a simulated form field 
 * with three states ...
 * 0=unchecked, 1=some children checked, 2=all children checked
 * When a task is clicked, the state of the nodes and parent and children
 * are updated, and this behavior cascades.
 *
 * @extends YAHOO.widget.TextNode
 * @constructor
 * @param oData    {object}  A string or object containing the data that will
 *                           be used to render this node.
 * @param oParent  {Node}    This node's parent node
 * @param expanded {boolean} The initial expanded/collapsed state
 * @param checked  {boolean} The initial checked/unchecked state
 */
YAHOO.widget.TaskNode = function(oData, oParent, expanded, checked) {

    if (YAHOO.widget.LogWriter) {
        this.logger = new YAHOO.widget.LogWriter(this.toString());
    } else {
        this.logger = YAHOO;
    }

    if (oData) { 
        this.init(oData, oParent, expanded);
        this.setUpLabel(oData);
        this.setUpCheck(checked);
    }

};

YAHOO.extend(YAHOO.widget.TaskNode, YAHOO.widget.TextNode, {

    /**
     * True if checkstate is 1 (some children checked) or 2 (all children checked),
     * false if 0.
     * @type boolean
     */
    checked: false,

    /**
     * checkState
     * 0=unchecked, 1=some children checked, 2=all children checked
     * @type int
     */
    checkState: 0,

    taskNodeParentChange: function() {
        //this.updateParent();
    },

    setUpCheck: function(checked) {
        // if this node is checked by default, run the check code to update
        // the parent's display state
        if (checked && checked === true) {
            this.check();
        // otherwise the parent needs to be updated only if its checkstate 
        // needs to change from fully selected to partially selected
        } else if (this.parent && 2 == this.parent.checkState) {
             this.updateParent();
        }

        // set up the custom event on the tree for checkClick
        /**
         * Custom event that is fired when the check box is clicked.  The
         * custom event is defined on the tree instance, so there is a single
         * event that handles all nodes in the tree.  The node clicked is 
         * provided as an argument.  Note, your custom node implentation can
         * implement its own node specific events this way.
         *
         * @event checkClick
         * @for YAHOO.widget.TreeView
         * @param {YAHOO.widget.Node} node the node clicked
         */
        if (this.tree && !this.tree.hasEvent("checkClick")) {
            this.tree.createEvent("checkClick", this.tree);
        }

        this.subscribe("parentChange", this.taskNodeParentChange);

    },

    /**
     * The id of the check element
     * @for YAHOO.widget.TaskNode
     * @type string
     */
    getCheckElId: function() { 
        return "ygtvcheck" + this.index; 
    },

    /**
     * Returns the check box element
     * @return the check html element (img)
     */
    getCheckEl: function() { 
            return document.getElementById(this.getCheckElId()); 
    },

    /**
     * The style of the check element, derived from its current state
     * @return {string} the css style for the current check state
     */
    getCheckStyle: function() { 
        return "ygtvcheck" + this.checkState;
    },

    /**
     * Returns the link that will invoke this node's check toggle
     * @return {string} returns the link required to adjust the checkbox state
     */
    getCheckLink: function() { 
        return "YAHOO.widget.TreeView.getNode(\'" + this.tree.id + "\'," + 
            this.index + ").checkClick()";
    },

    /**
     * Invoked when the user clicks the check box
     */
    checkClick: function() { 
        this.logger.log("previous checkstate: " + this.checkState);
        if (this.checkState === 0) {
            this.check();
        } else {
            this.uncheck();
        }
        this.onCheckClick(this);
        this.tree.fireEvent("checkClick", this);
    },

    /**
     * Override to get the check click event
     */
    onCheckClick: function() { 
        this.logger.log("onCheckClick: " + this);
    },

    /**
     * Refresh the state of this node's parent, and cascade up.
     */
    updateParent: function() { 
        var p = this.parent;

        if (!p || !p.updateParent) {
            this.logger.log("Abort udpate parent: " + this.index);
            return;
        }

        var somethingChecked = false;
        var somethingNotChecked = false;

        for (var i=0;i< p.children.length;++i) {
            if (p.children[i].checked) {
                somethingChecked = true;
                // checkState will be 1 if the child node has unchecked children
                if (p.children[i].checkState == 1) {
                    somethingNotChecked = true;
                }
            } else {
                somethingNotChecked = true;
            }
        }

        if (somethingChecked) {
            p.setCheckState( (somethingNotChecked) ? 1 : 2 );
        } else {
            p.setCheckState(0);
        }

        p.updateCheckHtml();
        p.updateParent();
    },

    /**
     * If the node has been rendered, update the html to reflect the current
     * state of the node.
     */
    updateCheckHtml: function() { 
        if (this.parent && this.parent.childrenRendered) {
            this.getCheckEl().className = this.getCheckStyle();
        }
    },

    /**
     * Updates the state.  The checked property is true if the state is 1 or 2
     * 
     * @param the new check state
     */
    setCheckState: function(state) { 
        this.checkState = state;
        this.checked = (state > 0);
    },

    /**
     * Check this node
     */
    check: function() { 
        this.logger.log("check");
        this.setCheckState(2);
        for (var i=0; i<this.children.length; ++i) {
            this.children[i].check();
        }
        this.updateCheckHtml();
        this.updateParent();
    },

    /**
     * Uncheck this node
     */
    uncheck: function() { 
        this.setCheckState(0);
        for (var i=0; i<this.children.length; ++i) {
            this.children[i].uncheck();
        }
        this.updateCheckHtml();
        this.updateParent();
    },

    // Overrides YAHOO.widget.TextNode
    getNodeHtml: function() { 
        this.logger.log("Generating html");
        var sb = [];

        var getNode = 'YAHOO.widget.TreeView.getNode(\'' +
                        this.tree.id + '\',' + this.index + ')';


        sb[sb.length] = '<table border="0" cellpadding="0" cellspacing="0">';
        sb[sb.length] = '<tr>';
        
        for (var i=0;i<this.depth;++i) {
            //sb[sb.length] = '<td class="' + this.getDepthStyle(i) + '"> </td>';
            sb[sb.length] = '<td class="' + this.getDepthStyle(i) + '"><div class="ygtvspacer"></div></td>';
        }

        sb[sb.length] = '<td';
        sb[sb.length] = ' id="' + this.getToggleElId() + '"';
        sb[sb.length] = ' class="' + this.getStyle() + '"';
        if (this.hasChildren(true)) {
            sb[sb.length] = ' onmouseover="this.className=';
            sb[sb.length] = 'YAHOO.widget.TreeView.getNode(\'';
            sb[sb.length] = this.tree.id + '\',' + this.index +  ').getHoverStyle()"';
            sb[sb.length] = ' onmouseout="this.className=';
            sb[sb.length] = 'YAHOO.widget.TreeView.getNode(\'';
            sb[sb.length] = this.tree.id + '\',' + this.index +  ').getStyle()"';
        }
        sb[sb.length] = ' onclick="javascript:' + this.getToggleLink() + '"> ';
        //sb[sb.length] = '</td>';
        sb[sb.length] = '<div class="ygtvspacer"></div></td>';

        // check box
        sb[sb.length] = '<td';
        sb[sb.length] = ' id="' + this.getCheckElId() + '"';
        sb[sb.length] = ' class="' + this.getCheckStyle() + '"';
        sb[sb.length] = ' onclick="javascript:' + this.getCheckLink() + '">';
        //sb[sb.length] = ' </td>';
        sb[sb.length] = '<div class="ygtvspacer"></div></td>';
        

        sb[sb.length] = '<td>';
        sb[sb.length] = '<a';
        sb[sb.length] = ' id="' + this.labelElId + '"';
        sb[sb.length] = ' class="' + this.labelStyle + '"';
        sb[sb.length] = ' href="' + this.href + '"';
        sb[sb.length] = ' target="' + this.target + '"';
        sb[sb.length] = ' onclick="return ' + getNode + '.onLabelClick(' + getNode +')"';
        if (this.hasChildren(true)) {
            sb[sb.length] = ' onmouseover="document.getElementById(\'';
            sb[sb.length] = this.getToggleElId() + '\').className=';
            sb[sb.length] = 'YAHOO.widget.TreeView.getNode(\'';
            sb[sb.length] = this.tree.id + '\',' + this.index +  ').getHoverStyle()"';
            sb[sb.length] = ' onmouseout="document.getElementById(\'';
            sb[sb.length] = this.getToggleElId() + '\').className=';
            sb[sb.length] = 'YAHOO.widget.TreeView.getNode(\'';
            sb[sb.length] = this.tree.id + '\',' + this.index +  ').getStyle()"';
        }
        sb[sb.length] = (this.nowrap) ? ' nowrap="nowrap" ' : '';
        sb[sb.length] = ' >';
        sb[sb.length] = this.label;
        sb[sb.length] = '</a>';
        sb[sb.length] = '</td>';
        sb[sb.length] = '</tr>';
        sb[sb.length] = '</table>';

        return sb.join("");

    },

    toString: function() {
        return "TaskNode (" + this.index + ") " + this.label;
    }

});








