/**
*@author Carsten Schäfer 25/02/05 10:20
*/

/**
* PAGE/URL
*/
function getAmountPages(amountItems, perpage)
{
  //log("amountItems"+amountItems);
  var amountpages = amountItems/perpage;
  var rounded     = Math.round(amountpages);
  var isOneMore   = amountpages > rounded;
  if(isOneMore )rounded++;
  return rounded;
}

function getParameterArray()
{
  var ret = new Array();
  if(location.href.indexOf("?")!=-1)
  {
    var urlquery=location.href.split("?");
    var urlterms=urlquery[1].split("&");
    if(urlterms.length>0)
    {
      for(var i=0;i < urlterms.length;i++){
        var val = urlterms[i];
        var urlitem=val.split("=");
        ret[urlitem[0]] = urlitem[1];
      }
    }
  }//else       alert(urlterms);
  return ret;
}

//##############################################################################################################
///**
//* ATOM TEMPLATE AND DATA
//*/
function checkOpenImage(size)
{
  var sizeDSP  = size < 1000000 ? (Math.round(size/1024))+" KB":(Math.round(size/1024/1024))+" MB";
  if(size > CONFIG['CONSTANTS']['alertImageSizeTrigger'])
    return confirm("Do you really want to display this Image ("+sizeDSP+") in your browser ?\nWe recommend to save this image by \n1) right-mouse-click, \n2) 'Save target as'");
  else
    return true;
}
function getMyteSite4Display(size)
{
  return size < 1000000 ? (Math.round(size/1024))+" KB":(Math.round(size/1024/1024))+" MB";
}
/**
function putMyteSite4Display(size)
{
  document.write(getMyteSite4Display(size));
}
*/

function putMyteSite4Display(size)
{
   if ( isNaN(size) ) {
    document.write("");
	} else 
  document.write(getMyteSite4Display(size));
}

function getZeroDateOfDay(dateObj)
{
  //var obj = dataObj['date'];
  return dateObj.getDate()+ "-" +dateObj.getMonth();
}


//##############################################################################################################
/**
* SEARCH
*/
function filterObjects(fullData, formData)
{
  //CHAR SEARCH IS NOT IMPLEMENTED YET!!
  var search = formData['search'];
  var isCharSearch = false;
  if(    CONFIG['CHR_SEARCH']['active']
      && CONFIG['CHR_SEARCH']['characterLengthRestriction'] > 0
      && search.length < CONFIG['CHR_SEARCH']['characterLengthRestriction']
    ) return data;

  var searchArray = getSearchAtoms(search);

  /*Actual routine*/
  var retObjects  = new Array();
  var retObjectsFiltered  = new Array();
  var counter         = 0;
  var counterFiltered = 0;
  var amountSearchPositive = 0;
  var objDatePub;
  //#####################
  //OBJECTS
  //#####################

  for(var i=0;i < fullData.length;i++)
  {
    var found            = true;
    var isPositiveResult = true;
    var dataObj          = fullData[i];
    /*Is object a recently published one ?*/
    //CONFIG['ACTIVE_FILTER_KEYS_SUB'] ???
    //XXXXXX DIRTY!!!! ATTENTION!!!!
    var isRecentlyPublished = dataObj['published'] && CONFIG['RUNNING_VARS']['currentNewTagLimitDateMillis'] <= dataObj['published'].getTime();
    var XXXDEBUG = false;

    //#####################
    //OBJECT KEYS
    //#####################
    for(var j=0;j < CONFIG['ACTIVE_FILTER_KEYS'].length;j++)
    {
      //XXXDEBUG = isPositiveResult && j>0;
      var currentKey   = CONFIG['ACTIVE_FILTER_KEYS'][j].trim();
      var skipKeyValue = CONFIG['GET_PARAMS_SKIPSEARCH_VALUE'][currentKey] ? CONFIG['GET_PARAMS_SKIPSEARCH_VALUE'][currentKey]:CONFIG['GET_PARAMS_SKIPSEARCH_VALUE_DEFAULT'];
      var content      = null;
      var formRequest  = formData[currentKey];
      //log("currentKey: "+currentKey);

      /*Catch Date-Keys*/
      if(CONFIG['ACTIVE_FILTER_KEYS_SUB'][currentKey]=="date"){
        if(currentKey=="months") content = dataObj['date'].getMonth();
        if(currentKey=="years") content = dataObj['date'].getFullYear();
        content = content==0 ? "0":content;
      }
      else
        content         = dataObj [currentKey];


      //log("content: '"+content+"' == formRequest: '"+formRequest + "' currentKey: '"+currentKey+"' (def val: '"+skipKeyValue+"')");
        var bn_1 = isPositiveResult;

        var bn_2 = (FORM_VALUES['recent']==true && isRecentlyPublished)
        var bn_3 = FORM_VALUES['recent']==false;
        var bn_4 = CONFIG['ACTIVE_FILTER_FIELDS']['useFormLatest']==false;

        var bn_5 = formRequest == (skipKeyValue);
        var bn_6 = formRequest =="";
        var bn_7 = isInCommaString(formRequest, content);

      var separators = CONFIG['ACTIVE_FILTER_KEYS_SEPARATOR'];
      var isWithinDelimitedString = isInDelimitedString(separators[currentKey] ? separators[currentKey]:separators['DEFAULT'], formRequest, content);

      isPositiveResult = isPositiveResult //previous was positive
                      //
                      && (
                             (FORM_VALUES['recent']==true && isRecentlyPublished)
                          || FORM_VALUES['recent']==false
                          || CONFIG['ACTIVE_FILTER_FIELDS']['useFormLatest']==false
                          )
                      && (
                             formRequest == skipKeyValue
                          || formRequest ==""
                          || isWithinDelimitedString
                         );
      if(XXXDEBUG){
        log("Item "+i+" key:"+currentKey);
        log("==Boolean 1: "+bn_1+" (true!)<br>AND");
        log("&nbsp;&nbsp;&nbsp;&nbsp;==Boolean 2: "+bn_2+" (OR true!)");
        log("&nbsp;&nbsp;&nbsp;&nbsp;==Boolean 3: "+bn_3+" (OR true!)");
        log("&nbsp;&nbsp;&nbsp;&nbsp;==Boolean 4: "+bn_4+" (OR true!) <br>AND");
        log("&nbsp;&nbsp;&nbsp;&nbsp;==Boolean 5: "+bn_5+" (OR true!)");
        log("&nbsp;&nbsp;&nbsp;&nbsp;==Boolean 6: "+bn_6+" (OR true!)");
        log("&nbsp;&nbsp;&nbsp;&nbsp;==Boolean 7: "+bn_7+" (OR true!)");
        log("<b>==&gt;: "+isPositiveResult+" ("+content+")<p>&nbsp;</b>");
      }
    }//going thru keys of an object
    //#####################
    //END OBJECT KEYS
    //#####################

    //found = (FORM_VALUES['recent']==false && isPositiveResult) || (FORM_VALUES['recent']==true && isRecentlyPublished);
    found = isPositiveResult;
    //if(found)log("==&gt;: "+found+"<p>");

    /*Text search*/
    for(var j=0;CONFIG['CHR_SEARCH']['active'] && j < searchArray.length && found;j++)
    {
      searchAtomEl = searchArray[j];
      var text     = dataObj['title'];//!!!registered fields!!!
      if(searchAtomEl.length >= CONFIG['CHR_SEARCH']['characterLengthRestriction'])//minimum length
        found = found  && text.toUpperCase().indexOf(searchAtomEl.toUpperCase())!=-1;
    }

    dataObj['SEARCH_FILTER_TAG_ISFOUND'] = found ? 1:-1;
    if(found) {
      amountSearchPositive++;
      retObjectsFiltered[counterFiltered++] = dataObj;
    }
    retObjects[counter++] = dataObj;

  }//going thru objects
  //#####################
  //END OBJECTS
  //#####################

  //log(retObjects[0]['title']);
  var returnDataContainer = new Array();
  returnDataContainer['data']         = retObjects;
  returnDataContainer['dataFiltered'] = retObjectsFiltered;
  returnDataContainer['amount']       = amountSearchPositive;
  return returnDataContainer;
}

function isInCommaString(nadel, heuhaufen)
{
  return isInDelimitedString(",", nadel, heuhaufen);
}
function isInDelimitedString(delimiter, nadel, heuhaufen)
{
  var checkArray = new Array();
  if(!heuhaufen || !nadel)
  {
    //alert("No heu!!"+nadel);
    return false;
  }
  var isNumeric = !heuhaufen.trim;
  var hasMore = !isNumeric && heuhaufen.indexOf(delimiter)!=-1;
  if(hasMore)
    checkArray = heuhaufen.split(delimiter);
  else
    checkArray[0] = heuhaufen;

  for(var j=0;j < checkArray.length;j++)
  {
    var checkString = ""+checkArray[j];
    if(!checkString) continue;
    var item = checkString.trim();
    //document.writeln(item+"=="+nadel+"<br>");
    if(item==nadel) return true;
  }
  return false;
}

function checkSearch()
{
  if(useCharacterRestrict && document.searchNav.search.value.length < searchCharacterRestrict)
  {
    alert("Search word too short! Must be at least "+searchCharacterRestrict+" characters!");
  }else{
    document.searchNav.page.value = 1;
    document.searchNav.submit();
  }
}

function cleanParams(FORM_VALUES)
{

  /*Have clean params*/
  for(var paramCounter = 0;paramCounter < CONFIG['GET_PARAMS'].length;paramCounter++)
  {
    /*Get parameter name that can exist*/
    var tempP = CONFIG['GET_PARAMS'][paramCounter];

    /*Add the current value to the param list, if undefined, then default skip parameter!*/
    FORM_VALUES[tempP] = FORM_VALUES[tempP] || !isNaN(FORM_VALUES[tempP]) ? FORM_VALUES[tempP]:(CONFIG['GET_PARAMS_DEF'][tempP] ? CONFIG['GET_PARAMS_DEF'][tempP]:CONFIG['GET_PARAMS_SKIPSEARCH_VALUE_DEFAULT']);

 	  /*Cleaning params*/
    FORM_VALUES[tempP] = cleanSearch(FORM_VALUES[tempP]);
    //log(tempP+" == "+FORM_VALUES[tempP]);
  }
  return FORM_VALUES;
}

function cleanSearch(search)
{
  var prev = search;
  if(!prev && !prev=="false") return "";
  if(prev=="false") return false;
  if(prev=="true") return true;
  var isANumber = isNaN(search)==false;
  if(isANumber) return search;
  if(!prev) return "";
//log("Cleaning "+prev);
  prev = prev.replace(/\+/g," ");
  prev = prev.replace(/#/g,"");
  //prev = prev.indexOf("#")==prev.length-1 ? prev.replace(/\+/g," ");;
  prev = unescape(prev);
  prev = prev=="0" ? 0:prev;
  //alert("Prev: '"+prev+"' ==> '"+prev+"'");
//log("Cleaned '"+prev+"'");
  return prev;
}

/*Char search only**/
function getSearchAtoms(search)
{
  var searchAtoms = search.split(" ");
  var newRetArr = new Array();
  for(var i=0;i<searchAtoms.length;i++){
    if(searchAtoms[i].trim().length < CONFIG['CHR_SEARCH']['characterLengthRestriction'])
      CONFIG['CHR_SEARCH']['ignoreList'].push(searchAtoms[i].trim());
    else
      newRetArr.push(searchAtoms[i]);
  }

  return newRetArr;
}

function clearSearch()
{
  clearSearch2("-1");
}
function clearSearch2(except)
{
  for(var i=0; i < CONFIG['ACTIVE_FILTER_KEYS'].length;i++)
  {
    field = CONFIG['ACTIVE_FILTER_KEYS'][i];
    if(except==field){
    	//alert("skipping "+field);
    	continue;
    }
    var obj = eval("document.searchNav."+field);
    if(obj)obj.value = CONFIG['GET_PARAMS_DEF'][field] ? CONFIG['GET_PARAMS_DEF'][field]:CONFIG['GET_PARAMS_SKIPSEARCH_VALUE_DEFAULT'];
  }
  /*Page navigation*/
  if(document.searchNav.page && except!="page")  document.searchNav.page.value   = CONFIG['GET_PARAMS_DEF']['page'];
  if(document.searchNav.sorter && except!="sorter")document.searchNav.sorter.value = CONFIG['GET_PARAMS_DEF']['sorter'];
  if(document.searchNav.recent && except!="recent")document.searchNav.recent.value = CONFIG['GET_PARAMS_DEF']['recent'];
  //alert("document.searchNav.showfullcomboalways "+document.searchNav.showfullcomboalways.value);
  if(document.searchNav.showfullcomboalways.value!=1  || except=="-1")document.searchNav.showfullcomboalways.value = CONFIG['GET_PARAMS_DEF']['showfullcomboalways'];

  /*if(document.searchNav.thm)document.searchNav.thm.value   = "-";
  if(document.searchNav.ctry)document.searchNav.ctry.value = "-";
  if(document.searchNav.sat)document.searchNav.sat.value   = "-";
  if(document.searchNav.search)document.searchNav.search.value='';
  if(document.searchNav.year)document.searchNav.year.value = -1;
  if(document.searchNav.mon)document.searchNav.mon.value   = -1;
  if(document.searchNav.sorter)document.searchNav.sorter.value = -1;
  if(document.searchNav.page)document.searchNav.page.value = 1;*/
}

function setPageNo(number)
{
  if(document.searchNav.page)document.searchNav.page.value = number;
}

function getSelectObject(selectData, key)
{

  var ret = ("<select id='search"+ key +"' class='search' name='"+key+"' "
                +"onchange='if(!isFilteredCombo()) clearSearch2(\""+key+"\");setPageNo(1);submit();'>");
  ret += ("<option class='search' value=\"-1\">--all--</option>");
  /*Sorting*/
  if(CONFIG['SEARCH_DISPLAY_TEXT_SORT'][key])
    eval("selectData.sort("+CONFIG['SEARCH_DISPLAY_TEXT_SORT'][key]+");");
  else
    selectData.sort();

  for(i=0; i < selectData.length;i++)
  {
    var dataItem = selectData[i];
    //log(dataItem);
    var text = dataItem;
    /*Changing display text*/
    if(CONFIG['CUT_CONTENT_LIMIT_CHARACTERS'][key]) text = text.substr(0, CONFIG['CUT_CONTENT_LIMIT_CHARACTERS'][key])+"...";
    if(CONFIG['SEARCH_DISPLAY_TEXT_CONVERT'][key])  text = eval(CONFIG['SEARCH_DISPLAY_TEXT_CONVERT'][key] +"(\"" +text+"\")");
    var hasIndexing = metaInfo[ CONFIG['INDEXING']['keyPrefix'] + key ];
    amount = hasIndexing ? metaInfo[ CONFIG['INDEXING']['keyPrefix'] + key ]['amountKeysFound'][dataItem]:null;
    if(dataItem=="0" || dataItem!="")
      ret += ("<option class='search' value='"+dataItem+"' "+(FORM_VALUES[key]==dataItem ? "selected":"")+">"
            + text + (amount!=null ? " ["+amount+"]":"")+"</option>");
  }
  ret += ("</select>");
  return ret;
}

function getCellItem()
{
  return "<td class='search'>\n<table border=0 width='100%'>\n"
               +"\t\t<tr><th class='search'>{header}</th></tr>\n"
               +"\t\t<tr><td class='search'>{value}</td></tr>\n"
              +"\t</table>\n"
              +"</td>\n";

}

function getResetButton()
{
  return ""
  //+"<td align='center'>"
  +"<input type=\"button\" class=\"butSearch\" value=\"Reset\" onclick='javascript:clearSearch();document.searchNav.submit();'>"
  //+"</td>"
  ;
}

function getComboFillCheckBox(selected)
{
  return "<input name='showfullcomboalways' type=\"checkbox\" lass=\"butSearch\" value=\""+(selected ? 1:-1)+"\" onclick='javascript:this.value=this.value*-1;document.searchNav.submit();' "+(selected ? "checked=\"checked\"":"")+"> <span class='contentMiddleText'>Show Unfiltered Lists</span>";
}

function getLatestButton(text)//bnRecent,
{
  var tpl = "";//"<input type=hidden   name='recent' value='"+bnRecent+"'>";
/*  tpl =   "<a href=\"#\" onclick='javascript:showRecentlyPublished();return false;'  id='searchRECENT' "
          +"class='butSearch"
          //+(true ? "Active":"")
          +"' title=\"Recently Published\">"
          //+"<span class='navPageNumber"+(recent ? "Active":"")+"'>"
          +"&nbsp;"+(recent ? "All":"Recent")+"&nbsp;"
          //+"</span>"
          +"</a>"
          ;*/
  //alert(bnRecent);
  tpl ="<input type=\"button\" class=\"butSearch\" value=\""
    + text
    + "\" onclick='javascript:showRecentlyPublished()'>"

 return tpl;
}

function getNewTag()
{
  return "<sup style=\"color:red\">NEW</sup>&nbsp;";
}

function isFilteredCombo()
{
  return FORM_VALUES['showfullcomboalways'] && FORM_VALUES['showfullcomboalways']==-1;
}
//##########################################
//############## LOGIC #####################
//##########################################
/*Uses global vars!!*/
function printSearchHeader(page, keys)
{
  document.writeln("<input type=\"hidden\" name=\"page\" value=\""+page+"\" >");
  if(CONFIG['ACTIVE_FILTER_FIELDS']['useFilterFunction']==false)return;

  var isRecent = FORM_VALUES['recent'] && FORM_VALUES['recent']==true ? true:false;
  var isFullComboContent = FORM_VALUES['showfullcomboalways'] && FORM_VALUES['showfullcomboalways']==1 ? true:false;
  document.writeln("<table class='search' border=0>");
  document.writeln("<tr class=\"navROW\">");

  /*Now iterate through all filter-groups desired*/
  var rowcount=0;
  var indexArray;
  var indexKey;
  //for(var i=0; i< keys.length;i++)
   for(var i=0; i< 5;i++)
  {
  	rowcount++;
  	indexKey = keys[i];
  	if( !metaInfo[CONFIG['INDEXING']['keyPrefix']+indexKey])continue;
  	indexArray = metaInfo[CONFIG['INDEXING']['keyPrefix']+indexKey]['byElementId'];
  	var cell = getCellItem();
  	cell = cell.replace("{header}", translateHeadline(indexKey));
  	cell = cell.replace("{value}", getSelectObject(indexArray, indexKey));
    document.writeln(cell);
  }
   document.writeln("</tr><tr><td colspan="+(rowcount-1)+">");
   document.writeln("<table cellspacing=\"0\" cellpadding=\"0\" padding=\"0\"><tr>");
  
  for(var i=5; i< keys.length;i++)
  {
  	//rowcount="5"
	rowcount++;
  	indexKey = keys[i];
  	if( !metaInfo[CONFIG['INDEXING']['keyPrefix']+indexKey])continue;
  	indexArray = metaInfo[CONFIG['INDEXING']['keyPrefix']+indexKey]['byElementId'];
  	var cell = getCellItem();
  	cell = cell.replace("{header}", translateHeadline(indexKey));
  	cell = cell.replace("{value}", getSelectObject(indexArray, indexKey));
    document.writeln(cell);
  }
  document.writeln("</tr></table></td>");
  document.writeln("</tr>");
  //document.writeln("<tr class=\"navROW\"><td colspan="+(rowcount-1)+">");
  document.writeln("<tr class=\"navROW\"><td colspan=\"4\">");
  
  //alert (rowcount);
  document.writeln("<input type=hidden   name='recent' value='"+isRecent+"'>");

  if(CONFIG['ACTIVE_FILTER_FIELDS']['useFormReset'])  document.writeln(getResetButton());
  if(CONFIG['ACTIVE_FILTER_FIELDS']['useComboFilterFillChoiceSwitch'])  document.writeln(getComboFillCheckBox(isFullComboContent));
  if(CONFIG['ACTIVE_FILTER_FIELDS']['useFormLatest']) document.writeln(getLatestButton(isRecent==true ? "Show all studies":"Show recent studies" ));

  if(CONFIG['ACTIVE_FILTER_FIELDS']['useSortField'])
  {
    var key = "sorter";
    cell = getCellItem();
  	cell = cell.replace("{header}", translateHeadline(key));
    var sorter = FORM_VALUES[key];

    /*Sort*/
    var tmp = ("<select id=\"search"+key+"\" class=\"search\" name=sorter  onchange=\"setPageNo(1);submit();\">")
        +("<option value=\"-1\"  "+(sorter==-1 ? "selected":"")+">Default</option>")
        +("<option value=\"-2\"  "+(sorter==-2 ? "selected":"")+">new first</option>")
        +("<option value=\"2\"   "+(sorter==2 ? "selected":"")+">older first</option>")
      +("</select>");
    cell = cell.replace("{value}", tmp);
    document.writeln(cell);
  }

  document.writeln("</td></tr>");
  document.writeln("</table>");

}

function translateHeadline(key)
{
  var tmp = CONFIG['SEARCH_DISPLAY_HEADLINE_CONVERT'][key];
  return tmp ? tmp:key;
}
//##########################################
//##########################################
var  showZeros = true;
//DATA
function getMetaData(data, indexer)
{
  var start = (new Date()).getTime();
  var retArray = new Array();
  /*Which meta we want ?*/
  for(var i=0;i < indexer.length;i++)
  {
    var val = indexer[i];
    //log(val);//date
    if(CONFIG['INDEXING']['SPECIAL_DATE_KEY']==val)
    {
      retArray[CONFIG['INDEXING']['keyPrefix']+val] = new Array();
      retArray[CONFIG['INDEXING']['keyPrefix']+val]['amountKeysFound'] = new Array();//easy access by country
      retArray[CONFIG['INDEXING']['keyPrefix']+val]['byElementId']     = new Array();//unique list of countries
      val = "years";
      retArray[CONFIG['INDEXING']['keyPrefix']+val] = new Array();
      retArray[CONFIG['INDEXING']['keyPrefix']+val]['amountKeysFound'] = new Array();//easy access by country
      retArray[CONFIG['INDEXING']['keyPrefix']+val]['byElementId']     = new Array();//unique list of countries
      val = "months";
      retArray[CONFIG['INDEXING']['keyPrefix']+val] = new Array();
      retArray[CONFIG['INDEXING']['keyPrefix']+val]['amountKeysFound'] = new Array();//easy access by country
      retArray[CONFIG['INDEXING']['keyPrefix']+val]['byElementId']     = new Array();//unique list of countries
    }else{
      retArray[CONFIG['INDEXING']['keyPrefix']+val] = new Array();
      retArray[CONFIG['INDEXING']['keyPrefix']+val]['amountKeysFound'] = new Array();//easy access by country
      retArray[CONFIG['INDEXING']['keyPrefix']+val]['byElementId']     = new Array();//unique list of countries
    }
  }
  var atom;
  var valueContainer = new Array();

  for(i=0;i < data.length;i++)
  {
    atom = data[i];
    var isZeroFound = atom['SEARCH_FILTER_TAG_ISFOUND'] && atom['SEARCH_FILTER_TAG_ISFOUND']==-1 ? true:false;

    /*Get possibly comma separated entries*/
    for(var j=0;j < indexer.length;j++)
    {
      var key       = indexer[j];
      var subkey    = "";
      var isNumeric = !atom[key].trim;
      var atomValue = atom[key];

      if(CONFIG['INDEXING']['SPECIAL_DATE_KEY']==key)
      {
        var year  = atomValue.getFullYear();
        var month = atomValue.getMonth();

        subkey = "years";
        valueContainer[subkey] = new Array();
        valueContainer[subkey]["original"] = year;
        valueContainer[subkey]["delimited"]= new Array();
        valueContainer[subkey]["delimited"][0] = valueContainer[subkey]["original"];
        retArray = processIndexing(valueContainer[subkey]["delimited"], subkey, retArray, isZeroFound);

        subkey = "months";
        valueContainer[subkey] = new Array();
        valueContainer[subkey]["original"] = month;
        valueContainer[subkey]["delimited"]= new Array();
        valueContainer[subkey]["delimited"][0] = valueContainer[subkey]["original"];
        retArray = processIndexing(valueContainer[subkey]["delimited"], subkey, retArray, isZeroFound);

      }else
      {
        valueContainer[key] = new Array();
        valueContainer[key]["original"]  = isNumeric ? atomValue:atomValue.trim();
        valueContainer[key]["delimited"] = new Array();

        /*Which delimiter*/
        var separators = CONFIG['ACTIVE_FILTER_KEYS_SEPARATOR'];
        var delimiter = separators[key] ? separators[key]:separators['DEFAULT'];

        if(!isNumeric && valueContainer[key]["original"].indexOf(delimiter) != -1)
          valueContainer[key]["delimited"] = valueContainer[key]["original"].split(delimiter);
        else
          valueContainer[key]["delimited"][0] = valueContainer[key]["original"];

        //log(valueContainer[key]["delimited"]);
        retArray = processIndexing(valueContainer[key]["delimited"], key, retArray,isZeroFound);
        //log(retArray.length);
      }
    }
  }

  var stop = (new Date()).getTime();
  status = ((stop-start)+" ms");
  return retArray;
}

/**
* No simple quotes! use \" instead (for param text)
*/
function replaceTag(obj, key, text){
  return eval("obj.replace(/{"+key+"}/g, '"+text+"')");
}


function log(txt){document.writeln(txt+"<br>");}
/*
    retArray[val]['amountKeysFound'] = new Array();//easy access by country
    retArray[val]['byElementId'] = new Array();//unique list of countries

*/

/**
* Goes thru all data-values of an object trying indexing the values to the given key. Returning a index-container for that key.
*/
function processIndexing(dataArr, key, retArray, isZeroFound)
{
  /*Ensure prefix*/
  key = key.indexOf(CONFIG['INDEXING']['keyPrefix'])==0 ? key:CONFIG['INDEXING']['keyPrefix']+key;
  var counter = 0;
  for(j=0;j < dataArr.length;j++)
  {
    var isNumeric = !dataArr[j].trim;
    var valueItem = isNumeric ? dataArr[j]:dataArr[j].trim();

    if(CONFIG['INDEXING']['SPECIAL_DATE_KEY']==key)
    {
      var year  = valueItem.getFullYear();
      var month = valueItem.getMonth();
      retArray = addIndexValue(retArray, "years", year, isZeroFound);
      retArray = addIndexValue(retArray, "months", month, isZeroFound);
    }
    else
    {
      retArray = addIndexValue(retArray, key, valueItem, isZeroFound);    }

  }
  //log("Amount entries for key '"+key+"' and entry '"+retArray[key]['byElementId'][0]+"': "+retArray[key]['amountKeysFound'][retArray[key]['byElementId'][0]]);
  return retArray;
}

function addIndexValue(indexArray, key, valueItem, isZeroFound)
{
  if(!indexArray[key]['amountKeysFound'][valueItem])
  {//was not yet added before
    indexArray[key]['amountKeysFound'][valueItem] = "0";//something must be filled
    counter = indexArray[key]['byElementId'].length;
    indexArray[key]['byElementId'][ counter ] = valueItem;
  }
  indexArray[key]['amountKeysFound'][valueItem]++;
  //xxxxxxx
  if(isZeroFound)indexArray[key]['amountKeysFound'][valueItem]="0";

  return indexArray;
}

function getMonthName(entry)
{
  return CONFIG['MAPPERS']['months'][entry] ? CONFIG['MAPPERS']['months'][entry]:entry;
}

//##############################################################################################################
/**
* CONVERSIONS
*/
function getSat(entry)
{
  return CONFIG['MAPPERS']['SATELLITES'][entry] ? CONFIG['MAPPERS']['SATELLITES'][entry]:entry;
}


// New additions by Sam for Product Navigator
function getInstr(entry)
{
  return CONFIG['MAPPERS']['INSTRUMENT'][entry] ? CONFIG['MAPPERS']['INSTRUMENT'][entry]:entry;
} 


function getProd(entry)
{
  return CONFIG['MAPPERS']['PRODUCTS'][entry] ? CONFIG['MAPPERS']['PRODUCTS'][entry]:entry; 
}

// End new additions


function getSatSmall(entry)
{
  return CONFIG['MAPPERS']['SATELLITES_SMALL'][entry] ? CONFIG['MAPPERS']['SATELLITES_SMALL'][entry]:entry;
}

function getTheme(entry)
{
  return themes[entry] ? themes[entry]:entry;
}

function getCategory(entry)
{
  return folders[entry] ? folders[entry]:entry;
}

function getCatFile(entry)
{
  return catFiles[entry] ? catFiles[entry]:entry;
}

function getDateFormat(dateObj)
{
		
	return   addZero(dateObj.getDate())+" "+CONFIG['MAPPERS']['months'][dateObj.getMonth()]+" "+dateObj.getFullYear();
	
}
// function to return the time  from date object

function getTimeFormat(dateObj)
{
	theTime = 	addZero(dateObj.getHours())+ ":" + addZero(dateObj.getMinutes()) + ":" + addZero(dateObj.getSeconds());
	return theTime;	
}



function getKommaSortFormat(dateObj)
{
  var splitter = dateObj.split(",");
  for(var xx = 0;xx < splitter.length;xx++){
    var tmp = splitter[xx]+"";
    splitter[xx] = tmp.trim();
  }
  splitter.sort();
  splitter = splitter.join(", ");
  return splitter;
}

function getPublishFormat(dateObj)
{
	newTag = "<span class=\"publishedText\">(published: "+dateObj.getDate()+" "+ CONFIG['MAPPERS']['months'][dateObj.getMonth()]+" "+dateObj.getFullYear()+")</span>";
  return newTag;
}


function getExtension(ext)
{
	
	var splitUpFile = ext.split(".")
	extension = splitUpFile[splitUpFile.length -1]
	//alert(extension);
	return extension;
	
}

function putExtension(ext)
{
	if (ext)
	 document.write(getExtension(ext).toUpperCase() + ",");
}

function addAnimationText(loop)
{
   if (loop)
	  document.write("<img src=\""+CONFIG['DATA']['cssImagePath']+"icon_link_coloured.gif\" class=\"navigationIcon\" alt=\"[Open]\" border=\"0\">View Animation");
}


function addTime(dateObj)
{
		
	//alert(addZero(dateObj.getHours())+ ":" + addZero(dateObj.getMinutes()) + ":" + addZero(dateObj.getSeconds()));
	document.write (dateObj.getTime());

	
}



//##############################################################################################################
//Sort
//##############################################################################################################

function DateSort(a,b)
{
  if(CONFIG['RUNNING_VARS']['reverse']==true){
    return b['date'].getTime()-a['date'].getTime();
  }else{
    return a['date'].getTime()-b['date'].getTime();
  }
}

function CountrySort(a,b)
{
  var ctry1 = a['ctry'].toLowerCase();
  var ctry2 = b['ctry'].toLowerCase();

  if(CONFIG['RUNNING_VARS']['expireDaysNewTag']['reverse']) sign=-1;else sign=1;
  if(ctry2 > ctry1) return -1*sign;
  if(ctry2 < ctry1) return 1*sign;
  if(ctry2 == ctry1) return 0;
}

function getUTCDate()
{
  var now = new Date();
  var offsetMillies = now.getTimezoneOffset()*60*1000;
  nowMillis = now.getTime();
  var utcDate = new Date(nowMillis+offsetMillies)
  //alert(utcDate);
  return utcDate;
}

function sortYears(a,b)
{
  var reverse = CONFIG['SEARCH_DISPLAY_TEXT_SORT_DIRECTION']['years'];
  reverse = reverse && reverse==-1 ? -1:1;
  return (a-b)*reverse;
}

function sortMonths(a,b)
{
  var reverse = CONFIG['SEARCH_DISPLAY_TEXT_SORT_DIRECTION']['months'];
  reverse = reverse && reverse==-1 ? -1:1;

  if(a > b) return 1*reverse;
  if(a < b) return -1*reverse;
  if(a == b) return 0;
}