function StringBuilder(value){
    this.strings = new Array("");
    this.append(value);
}

StringBuilder.prototype.append = function (value){
    if (value)
    {
        this.strings.push(value);
    }
}

StringBuilder.prototype.clear = function (){
    this.strings.length = 1;
}

StringBuilder.prototype.toString = function (){
    return this.strings.join("");
}

var grantInfo;
var paginationChecked = true;
var canChange = true;
var selectedRegion = 'regionAll';
var currentSortOrder = "sort";
var currentSortDirection = "asc"; 
var currentPage = 0;
var resultsPerPage = 50;
var currentLastPage = 0;

var fieldCheckboxes = [ 'field_all', 
                        'field_ac',
                        'field_cs',
                        'field_cd',
                        'field_dfec',
                        'field_es',
	                    'field_ed',
	                    'field_g',
	                    'field_ha',
	                    'field_hr',
	                    'field_m',
	                    'field_o',
	                    'field_rsc',
	                    'field_srh',
	                    'field_wd'
                       ];
var regionInfo = new Object();

regionInfo["regionAll"] = {title:"All Regions", 
                           id: 'regionAll',
                           relatedFields: ['field_all', 
                                           'field_ac',
                                           'field_cs',
                                           'field_cd',
                                           'field_dfec',
                                           'field_es',
						                   'field_ed',
						                   'field_g',
						                   'field_ha',
						                   'field_hr',
						                   'field_m',
						                   'field_o',
						                   'field_rsc',
						                   'field_srh',
						                   'field_wd']
                            };
regionInfo["andeanRegionAndSouthernCone"] = {title:"Andean Region and Southern Cone", 
                           id: 'region_arsc',
                           relatedFields: [ 'field_all',
                                            'field_cs',
                                            'field_dfec',
                                            'field_es',
                                            'field_g',
                                            'field_hr',
                                            'field_o'
                                         ]
                            };

regionInfo["brazil"] = {title:"Brazil", 
                           id: 'region_b',
                           relatedFields: [ 'field_all', 
                                            'field_cd',
                                            'field_es',
                                            'field_ed',
                                            'field_g',
                                            'field_ha',
                                            'field_hr',
                                            'field_m',
                                            'field_o',
                                            'field_srh'
                                         ]
                            };
regionInfo["china"] = {title:"China", 
                           id: 'region_c',
                           relatedFields: [ 'field_all',
                                            'field_ac',
                                            'field_cs',
                                            'field_dfec',
                                            'field_es',
                                            'field_ed',
                                            'field_g',
                                            'field_ha',
                                            'field_hr',
                                            'field_o',
                                            'field_srh'
                                           ]
                           };
regionInfo["easternAfrica"] = {title:"Eastern Africa",                            
                              id: 'region_ea',
                              relatedFields: [ 'field_all',
                                'field_ac',
                                'field_cs',
                                'field_cd',
                                'field_es',
                                'field_ed',
                                'field_g',
                                'field_ha',
                                'field_hr',
                                'field_m',
                                'field_o',
                                'field_srh'
                                                                    ]
                                                       };
regionInfo["indiaNepalSriLanka"] = {title:"India, Nepal and Sri Lanka",                            
                           id: 'region_insl',
                           relatedFields: [ 'field_all',
                                            'field_ac',
                                            'field_cs',
                                            'field_dfec',
                                            'field_es',
                                            'field_ed',
                                            'field_g',
                                            'field_ha',
                                            'field_m',
                                            'field_o',
                                            'field_srh'
                            
                                         ]
                            };
regionInfo["indonesia"] = {title:"Indonesia", 
                           id: 'region_i',
                           relatedFields: [ 'field_all',
                                            'field_ac',
                                            'field_cs',
                                            'field_cd',
                                            'field_ed',
                                            'field_g',
                                            'field_m',
                                            'field_o',
                                            'field_srh'
                                         ]
                            };
regionInfo["mexicoAndCentralAmerica"] = {title:"Mexico and Central America", 
                           id: 'region_mca',
                           relatedFields: [ 'field_all',
                                            'field_ac',
                                            'field_cd',
                                            'field_dfec',
                                            'field_es',
                                            'field_ed',
                                            'field_ha',
                                            'field_hr',
                                            'field_o'
                                         ]
                            };
regionInfo["middleEastAndNorthAfrica"] = {title:"Middle East and North Africa", 
                           id: 'region_mena',
                           relatedFields: [ 'field_all',
                                            'field_ac',
                                            'field_cs',
                                            'field_es',
                                            'field_g',
                                            'field_ha',
                                            'field_hr',
                                            'field_m',
                                            'field_srh'
                                         ]
                            };
regionInfo["russia"] = {title:"Russia", 
                           id: 'region_r',
                           relatedFields: [ 'field_all',
                                            'field_ac',
                                            'field_dfec',
                                            'field_es',
                                            'field_ed',
                                            'field_ha',
                                            'field_hr',
                                            'field_m',
                                            'field_o',
                                            'field_srh'                            
                                         ]
                            };
regionInfo["southernAfrica"] = {title:"Southern Africa", 
                           id: 'region_sa',
                           relatedFields: [ 'field_all',
                                            'field_ac',
                                            'field_cs',
                                            'field_cd',
                                            'field_dfec',
                                            'field_es',
                                            'field_ed',
                                            'field_g',
                                            'field_ha',
                                            'field_hr',
                                            'field_o',
                                            'field_srh'
                                         ]
                            };
regionInfo["usa"] = {title:"United States", 
                           id: 'region_nyo',
                           relatedFields: [ 'field_all',
                                            'field_ac',
                                            'field_cs',
                                            'field_cd',
                                            'field_dfec',
                                            'field_es',
                                            'field_ed',
                                            'field_g',
                                            'field_ha',
                                            'field_hr',
                                            'field_m',
                                            'field_o',
                                            'field_rsc',
                                            'field_srh',
                                            'field_wd'
                                         ]
                            };
regionInfo["vietnamAndThailand"] = {title:"Vietnam and Thailand", 
                           id: 'region_vt',
                           relatedFields: [ 'field_all',
                                            'field_ac',
                                            'field_cs',
                                            'field_dfec',
                                            'field_es',
                                            'field_ed',
                                            'field_g',
                                            'field_ha',
                                            'field_o',
                                            'field_srh'
                                         ]
                            };
regionInfo["westAfrica"] = {title:"West Africa", 
                           id: 'region_wa',
                           relatedFields: [ 'field_all',
                                            'field_ac',
                                            'field_dfec',
                                            'field_g',
                                            'field_ha',
                                            'field_hr',
                                            'field_o',
                                            'field_srh'                                         
                                          ]
                            };

  function showRegions() {
      if (!canChange) return;
      canChange = false;
      $('choose_a_region').update('<b>CHOOSE A REGION:</b>');
      Effect.BlindDown("select_region_list", {duration: 0.5, afterFinish: function() { canChange = true;}});
      hideFields();
  }
  
  function selectRegion(regionId) {
      if (!canChange) return;
      canChange = false;
      currentPage = 0;
      currentSortOrder = 'sort';
      currentSortDirection = "asc";
      selectedRegion = regionId;
      var regionOb = regionInfo[regionId];
      hideRegions();
      showFields(regionOb);
      setHeader(regionOb);
      displayGrants.defer();
  }

  function hideRegions() {
        $('choose_a_region').update('<b>CHANGE REGION:</b>');
        Effect.BlindUp("select_region_list", {duration: 0.5 });
  }
  function setHeader(regionOb) {
       $("regionTitle").update(regionOb.title);
  }
  function hideFields() {        
     enableFields(regionInfo['regionAll']);
     Effect.BlindUp("select_field_list", {duration: 0.5} );
  }

 
  function showFields(regionOb) {
     enableFields(regionOb);
     //$('select_field_list').show();
     Effect.BlindDown("select_field_list", {duration: 0.5, afterFinish: function() { canChange = true;}});
  }

  function enableFields(regionOb){
      for(i = 0; i < fieldCheckboxes.length; ++i){
         enable_check(fieldCheckboxes[i],false);
         set_check(fieldCheckboxes[i], i == 0);
      }
      for(i = 0; i < regionOb.relatedFields.length; ++i){
         enable_check(regionOb.relatedFields[i],true);
      }
  } 
  
  function startWaitState(){
      $('grant_list').update("<div class ='GRprogramInfoCon2'>\n<div class='GRprogramInfoCon'>\n<div class='GRprogramSubLeft1'>&nbsp;</div>\n<div class='GRprogramSubLeft1'>&nbsp;</div>\n<div class='GRprogramSubLeft1'><img src=\"/images/spinner.gif\" alt=\"please wait...\" /></div>\n<div class='GRprogramSubLeft2'>&nbsp;</div>\n</div>\n</div>");		
  }
  function stopWaitState(){
      //  $('grant_list').setStyle('background-image: none;');  
  }
  function displayGrants_Original(){
    startWaitState();
    var regionOb = regionInfo[selectedRegion];
    var fieldList = $A(fieldCheckboxes).filter(function (id) {return is_checked(id);});
         
    var isSelectedRegion = function(d) {
        return (regionOb.id == 'regionAll') || d.hasClassName(regionOb.id);
    }
    var isSelectedField = function(d) {
        if (fieldList[0] == 'field_all'){
            return true;
        }
        for(var i = 0, len=fieldList.length; i < len; ++i){
            if (d.hasClassName(fieldList[i])){
                return true;
            }
        }
        return false;
    } 
    var test = function(d) {
        if (isSelectedRegion(d) && isSelectedField(d)) {
            d.show();
        }
        else {
            d.hide();
        }
    };
    var elts = $$('#grant_list > div');
    elts.each(test);
    stopWaitState();
  }
  function sortGrants(order){
    if (order == currentSortOrder){
        currentSortDirection = (currentSortDirection == "asc") ? "desc" : "asc";
    }
    currentPage = 0;
    currentSortOrder = order;
    displayGrants();
  }
  function reverse(s) { return s.split('').reverse().join(''); }
  
  function commaSeparate(n){
      var s = reverse(n), r = ''; 
      for (var i = 0; i < s.length; i++) {
        r += (i > 0 && i % 3 == 0 ? ',' : '') + s.charAt(i);
      }
      return reverse(r);
 }
  function displayGrants(){
    startWaitState();
    concludeDisplayGrants.defer();
  }
  
  function showSortOrder(){
    var cols = $w('sort amount region field');
    cols.each(function(c) {
        var elt = $('header_' + c);
        elt.removeClassName("sortUp"); 
        elt.removeClassName("sortDown"); 
    });
    var sortClass = (currentSortDirection == "asc")? "sortUp" : "sortDown";
    $('header_' + currentSortOrder).addClassName(sortClass);  
  }
  function showPagination(show) {
/*     enable_check('paginate',show);
    if (!show){
        paginationChecked = is_checked('paginate');
        set_check('paginate', false);
    }
    else {
       set_check('paginate', paginationChecked);
    }
   */
    if (show) {
        $('paginate').show();
        $('label_paginate').show();
    }
    else {
        $('paginate').hide();
        $('label_paginate').hide();
    } 
 
  }  

  function makePagination(currentPage, numPages) {
        if (numPages == 1) {
            return "";
        }
        var makeLink = function(pageNum, glyph) {
            var ret = "";
            if (currentPage != pageNum) {
                ret += "&nbsp;&nbsp;<a href='javascript:void(gotoPage(" + pageNum.toString() + "));'>"+ glyph +"</a> ";
            }
            else {
                ret = "&nbsp;&nbsp;<strong>" + glyph + "</strong>";
            }
            return ret;
          };
        var pagesPerSide = 4;
        var firstPageShown = Math.max(currentPage - pagesPerSide, 0);
        var showFirstPage = firstPageShown == 0;
        var targetRightPages = currentPage + pagesPerSide + (pagesPerSide - (currentPage - firstPageShown));
        var lastPageShown = Math.min(numPages - 1, targetRightPages);
        var showLastPage = lastPageShown == numPages - 1;
        var ret = showFirstPage ? "" : makeLink(0, "|&lt;") +  makeLink(currentPage - pagesPerSide - 1, "...");
        for(var i = firstPageShown; i <= lastPageShown; i++) {
            ret += makeLink(i, (i + 1).toString());    
        }
        ret += showLastPage ? "" :  makeLink(currentPage + pagesPerSide + 1, "...") + makeLink(numPages - 1, "&gt;|");
        return ret;
  }
  
  function concludeDisplayGrants(){
    var grants = '';
    var regionOb = regionInfo[selectedRegion];
    var fieldList = $A(fieldCheckboxes).filter(function (id) {return is_checked(id);});
    var sortFunction = function(g) {
        var ret = g[currentSortOrder]; 
        if ((currentSortOrder == 'sort') || (currentSortOrder == 'amount')) { 
            ret = parseInt(ret);
        }
        return ret;  
    }     
    var isSelectedRegion = function(g) {
        return (regionOb.id == 'regionAll') || (g.region_id == regionOb.id);
    }
    var isSelectedField = function(g) {
       if (fieldList[0] == 'field_all'){
            return true;
        }
        for(var i = 0, len=fieldList.length; i < len; ++i){
            if (g.field_id == fieldList[i]){
                return true;
            }
        }
        return false;
    } 
    
    var grantTemplate = ['<div class ="',
                         '#region_id', // [1]
                         ' ',
                         '#field_id',  // [3]
                         ' GRprogramInfoCon2">\n',
                         '   <div class="GRprogramInfoCon">\n',
                         '       <div class="GRprogramSubLeft1"><em>',
                         '#grantee',  // [7]
                         '</em></div>\n',
                         '       <div class="GRprogramSubLeft1">$',
                         '#amount', // [10]
                         '</div>\n',
                         '       <div class="GRprogramSubLeft1">',
                         '#region',// [13]
                         '</div>\n',
                         '       <div class="GRprogramSubLeft2">',
                         '#field',// [16]
                         '</div>\n',
                         '   </div>\n',
                         '   <div class="GRprogramInfoRight">',
                         '#description', // [20]
                         '</div>\n',
                         '</div>\n'];
    var sb = new StringBuilder("");                      
    var createHtml = function(g){
        /*
        <div class ="region_nyo field_cd GRprogramInfoCon2">
            <div class="GRprogramInfoCon">
                <div class="GRprogramSubLeft1"><em>First Nations Development Institute</em></div>
                <div class="GRprogramSubLeft1">$3,000,000</div>
                <div class="GRprogramSubLeft1">New York Office</div>
                <div class="GRprogramSubLeft2">Community Development</div>
            </div>
            <div class="GRprogramInfoRight">Endowment support to leverage contributions and ensure organizational sustainability and growth</div>
        </div>
 
        */
        grantTemplate[1] = g.region_id;
        grantTemplate[3] = g.field_id;
        grantTemplate[7] = g.grantee;
        grantTemplate[10] = commaSeparate(g.amount);
        grantTemplate[13] = g.region;
        grantTemplate[16] = g.field;
        grantTemplate[20] = g.description;
        //$('grant_list').insert(grantTemplate.join(""));
        sb.append(grantTemplate.join(""));
    }
    var test = function(g) {
        return isSelectedRegion(g) && isSelectedField(g);
    };
    currentGrants = grantInfo.filter(test);
    var sortedGrants = currentGrants.sortBy (sortFunction);
    if (currentSortDirection == "desc") {
        sortedGrants = sortedGrants.reverse();
    }
    showSortOrder();
    var numGrants = sortedGrants.length;
    currentLastPage = Math.ceil(numGrants / resultsPerPage);
    var paginateResults = is_checked('paginate');
    showPagination(currentLastPage != 1);
    if (paginateResults) {
        var firstGrant = currentPage * resultsPerPage;
        var lastGrant = Math.min( firstGrant + resultsPerPage - 1, numGrants - 1);
        var pagination = makePagination(currentPage, currentLastPage);
        $$('.paginationControls').each(function (d) {d.update(pagination); d.show(); } );
        
        //$$('.prevPage').each(function (d) { d.disabled = (currentPage <= 0); } );
        //$$('.nextPage').each(function (d) { d.disabled = (lastGrant >= numGrants - 1); } );
        
        for(var i = firstGrant; i <= lastGrant; i++){
            createHtml(sortedGrants[i]);
        }   
    } 
    else {
        $$('.paginationControls').each(function (d) {d.hide(); } );
        sortedGrants.each(createHtml);
    } 
    
    $('grant_list').update(sb.toString());
   // stopWaitState();
  }
// checkbox management
function showfields() {
    document.getElementById('fields').style.visibility='visible';
}
			   
function click_other(cb, list){
    set_check(list[0], none_checked(list));
    currentPage = 0;
    displayGrants.defer();
}

function click_all(cb, list){
    if(!cb.checked){
       cb.checked = true;
    }
    else {    
        uncheck_rest(list);
    }
    currentPage = 0;
    displayGrants.defer();
}

function uncheck_rest(list){
    for(i = 1; i < list.length; i++){
        set_check(list[i],false);
    }
}

function set_check(id, val){
    get_checkbox(id).checked = val;
}
function enable_check(id, val){
    get_checkbox(id).disabled = !val;
    var label = document.getElementById("label_" + id);
    label.style.color= val ? 'black' : 'gray';    
}

function none_checked(list) {
    ret = true;
    for(i = 1; i < list.length; i++){
        ret = ret && !is_checked(list[i]);
    }    
    return ret;
}

function is_checked(id){
    return get_checkbox(id).checked;
}
function gotoPage(pageNum) {
    currentPage = pageNum;
    displayGrants();
}

function prevPage() {
    if (currentPage > 0){
        --currentPage;
        displayGrants();
    }
}
function nextPage() {
    if (currentPage < currentLastPage){
        ++currentPage;
        displayGrants();
    }
}
function get_checkbox(id){
    return document.getElementById(id);
}

function loadGrants(){
  
     new Ajax.Request('/contents/impact/annualreports/2007/ar2007_grants_json.txt',  
                      {
                          method: 'get',
                          onSuccess: function(transport){
                                       grantInfo = transport.responseText.evalJSON();
                                       displayGrants();
                                   }
                       } 
     );
 }

function init(){
    hideFields();
    loadGrants.defer();
}

document.observe('dom:loaded', init);