var aOnViewItems = [];
var aOnViewPriorityItems = [];
var aCombinedViewItems = [];
var nBuildRowCount = 0;
var sPreviousSortArrow = '';

function setDataArrays(sType){
	var aData = aDataMappings[sType];
	var nPriorityCount = aOnViewPriorityItems.length;
	var nCount = aOnViewItems.length;	

	for(var i=0; i<aData.length; i++){
		if(aData[i]["priority"]){
			aOnViewPriorityItems[nPriorityCount] = aData[i];
			nPriorityCount ++;
		}
		else {
			aOnViewItems[nCount] = aData[i];
			nCount ++;
		}
	}
}

function generateCompareItems(sCol, sDataType){
	return function compareRows(oRow1, oRow2){
						var oVal1 = GL_Convert(oRow1[sCol], sDataType);		
						var oVal2 = GL_Convert(oRow2[sCol], sDataType);
						
						if(oVal1 < oVal2){
							return -1
						}
						else if(oVal1 > oVal2){
							return 1
						}
						else {
							return 0;
						}
					};
}

function getDisplayData(sType){	
	aOnViewItems.length = 0;
	aOnViewPriorityItems.length = 0;
	if(sType == 'all'){
		for(props in aDataMappings){
			if((props != 'UNDEFINED') && (props != 'KEYS')){
				setDataArrays(props);
			}
		}
	}
	else {
		setDataArrays(sType)
	}
	
	// Sort both arrays in descending order according to classification
	var sColId = ''; var sDataType = '';
	switch(sType){
		case 'brochures':			
 			sColId = 'updated_date'; sDataType = 'date';
  		break
		default:
			sColId = 'name'; sDataType = 'str';
		break
	}
	
	var oGrid = GL_GetEl('grid');
	oGrid.sortCol = sColId;
	
	aOnViewItems.sort(generateCompareItems(sColId, sDataType));
	aOnViewPriorityItems.sort(generateCompareItems('name', sDataType));
	aOnViewPriorityItems.sort(generateCompareItems('priority', sDataType));
			
	// Combine both sorted arrays with priority items top of the list
	aCombinedViewItems = aOnViewPriorityItems.concat(aOnViewItems);
	return aCombinedViewItems;
}

function buildRow(oCloneRow, oData){
	if(sSelectLanguage){
		if(oData["language"] != sSelectLanguage){
			return false;
		}
	}

	var oRow = oCloneRow.cloneNode(true);
	oRow.id = "";

	if(nBuildRowCount == 0){
		oRow.className += ' highlight';
		nBuildRowCount = 1;
	}
	else {
		nBuildRowCount = 0;
	}

	for(var j=0; j<oRow.childNodes.length; j++){
		if(oRow.childNodes[j].tagName == 'DIV'){
			var aClassNames = oRow.childNodes[j].className.split(' ');
			var sColumnId = aClassNames[1];

			if(oData[sColumnId]){
				if(sColumnId == 'name'){
					oRow.childNodes[j].firstChild.innerHTML = '<a href="' + oData['url'] + '" target="_blank" onclick="' + oData['hbxtracking'] + '">' + oData[sColumnId] + '</a>';
					if(oData["companyName"] != ''){
						oRow.childNodes[j].firstChild.innerHTML += ' (' + oData["companyName"] +')';
					}
				}
				else if(sColumnId == 'classification'){
					oRow.childNodes[j].firstChild.innerHTML = GL_Languages[oData[sColumnId]];
				}
				else {
					oRow.childNodes[j].firstChild.innerHTML = oData[sColumnId];
				}
			}
		}
	}

	if(oData["priority"]){
		oRow.className += ' priority';
	}
	return oRow;
}

function buildGrid(sType, aData, bHasPriority){
    sClassification = sType;
	var aData = (aData) ? aData : getDisplayData(sType);
	var oGrid = GL_GetEl('grid');
	var oDataContainer = GL_GetEl('data');
	oDataContainer.innerHTML = "";

	if(bHasPriority == 'true'){
		oGrid.sortCol = sType;
	}

	var oFragment = document.createDocumentFragment();
	var oCloneRow = GL_GetEl('rowClone');
	var nRowCount = 0;	
	for(var i=0; i<aData.length; i++){
		var oRow = buildRow(oCloneRow, aData[i]);
		if(oRow){
			oFragment.appendChild(oRow);
			nRowCount++;
		}
	}
	oDataContainer.appendChild(oFragment);
	var oGridRowCount = GL_GetEl('gridRowCount')
	oGridRowCount.innerHTML = nRowCount;
	
	var nPriorityItems = aOnViewPriorityItems.length;
	if((sPreviousSortArrow == '') && (nPriorityItems == 0)){
		sortArrowVisibility('arrow_name');
		sPreviousSortArrow = 'arrow_name';
	}
}

function sortColumn(sCol, sDataType, bHasPriority, bIsDescending){
	var oGrid = GL_GetEl('grid');
	var sShowId = 'arrow_' + sCol;
	// If there are priority items in the list initiate a re-sort
	var nPriorityItems = aOnViewPriorityItems.length;
	var dShowArrow = GL_GetEl(sShowId);
	var sSrc = dShowArrow.src;

	if((oGrid.sortCol == sCol) && (nPriorityItems == 0)){
		aCombinedViewItems.reverse();
		buildGrid('', aCombinedViewItems);
		if(sSrc.match('up')){
			dShowArrow.src = '/images/arrow_down_ffffff.gif';
		}
		else {
			dShowArrow.src = '/images/arrow_up_ffffff.gif';
		}
	}
	else {
		sortArrowVisibility(sShowId)
		sPreviousSortArrow = sShowId;
		aCombinedViewItems.sort(generateCompareItems(sCol, sDataType));
		if(bIsDescending){
			aCombinedViewItems.reverse();
			dShowArrow.src = '/images/arrow_down_ffffff.gif';
		}
		else {
			dShowArrow.src = '/images/arrow_up_ffffff.gif';
		}
		buildGrid('', aCombinedViewItems);
		oGrid.sortCol = sCol;
		aOnViewPriorityItems.length = 0;
	}
}


function sortArrowVisibility(sShowId){
	if((sPreviousSortArrow != '') || (sShowId == false)){
		var dHideArrow = GL_GetEl(sPreviousSortArrow);
		var sSrc = dHideArrow.src;
		dHideArrow.style.display = 'none';
		if(sSrc.match('up')){
			dHideArrow.src = '/images/arrow_down_ffffff.gif';
		}
		else {
			dHideArrow.src = '/images/arrow_up_ffffff.gif';
		}
	}
	if(sShowId){
		var dShowArrow = GL_GetEl(sShowId);
		dShowArrow.style.display = 'inline';
	}
}


function createDataMappings(aData, aDataMappings){
	aDataMappings["KEYS"] = [];
	for(var i=0; i<aData.length; i++){
		 GL_setArray(aDataMappings, aData[i].classification, aData[i]);
	}
	return aDataMappings;
}

function buildSelect(sId, aOptions, sSelectedItem){

	if(GL_Languages["ALL_LANGUAGES"] != aOptions[0]){
		aOptions.sort();
	}
	
	var dSelect = GL_GetEl(sId);
	for(var i=0; i<aOptions.length; i++){
		if(aOptions[i]){
			var oOption = document.createElement('OPTION');
		 	oOption.id = aOptions[i];
		 	(GL_Languages[aOptions[i]]) ?  oOption.innerHTML = GL_Languages[aOptions[i]] :  oOption.innerHTML = aOptions[i];
		 	dSelect.appendChild(oOption);
		 }
	}
}