
// ------------- JavaScript Utility Functions -----------------------

// Shortcut
function ge(id)
{
	return document.getElementById(id);
}

// Return item from array that matches key
function arrayLookup(array, keyName, val)
{
	for(var i = 0; i < array.length; i++)
	{
		var ret = eval('if(array[i].' + keyName + ' == val) array[i]; else null;');
		if(ret != null)
			return ret;
	}
	
	return null;
}

function subarrayLookup(array, subindex, val)
{
	for(var i = 0; i < array.length; i++)
	{
		if(array[i][subindex] == val)
			return array[i];
	}
	
	return null;
}

// Binary subarray lookup
// Lookup field must be ordered low-high, and have no duplicate keys
function subarrayBinLookup(array, subindex, val)
{
    var low = 0;
    var high = array.length - 1;
    
    while (low <= high)
    {
        var aTry = parseInt((low + high) / 2);
        var checkThis = array[aTry][subindex];
                
        if (checkThis < val)
        {
            low = aTry + 1;
            continue;
        }
        if (checkThis > val)
        {
            high = aTry - 1;
            continue;
        }
        
        return array[aTry];
    }
    
    return null;
}

// Return all items from array that matches key
function arraySelect(array, propertyName, val)
{
	var res = new Array();

	for(var i = 0; i < array.length; i++)
	{
		eval('if(array[i].' + propertyName + ' == val) res.push(array[i]);');
	}
	
	return res;
}

function subarraySelect(array, subindex, val)
{
	var res = new Array();

	for(var i = 0; i < array.length; i++)
	{
		if(array[i][subindex] == val) res.push(array[i]);
	}
	
	return res;
}

function ArrIndexOf(arr, object)
{
	for (var i = 0; i < arr.length; i++)
	if (arr[i] == object) return i;
	return -1;
}

function ArrWithout(arr, object)
{
	for (var i = 0; i < arr.length; i++)
	{
		if (arr[i] == object)
			arr.splice(i, 1);
	}
}

function clearOptions(elem)
{
	while(elem.options.length > 1)
	{
		elem.options[1] = null;
	}
}

function setVis(elem, vis)
{
	if(vis)
		elem.style.display = "";
	else
		elem.style.display = "none";
}

function addDays(myDate,days)
{
    return new Date(myDate.getTime() + days*24*60*60*1000);
}

function daysDiff(date1, date2)
{
    var ONE_DAY = 1000 * 60 * 60 * 24
    var date1_ms = date1.getTime()
    var date2_ms = date2.getTime()
    var difference_ms = Math.abs(date1_ms - date2_ms)
    return Math.round(difference_ms/ONE_DAY)
}

function dateEqual(date1, date2)
{
	return (date1.toDateString() == date2.toDateString());
}

function formatDate(date)
{
	return(date.getDate() + "/" + (date.getMonth() + 1) + "/" + date.getFullYear());
}

function formatDateForQS(date)
{
	return(date.getDate() + "|" + (date.getMonth() + 1) + "|" + date.getFullYear());
}

// Is a date string valid (dd/mm/yyyy)
function parseDate(date)
{
	var parts = date.split("/");
	
	if(parts.length == 3)
	{	
		if(!isNaN(parts[0]) && !isNaN(parts[1]) && !isNaN(parts[2]))
		{
			parts[1]--;
			var test = new Date(parts[2], parts[1], parts[0]);
			
			if(test.getDate() == parts[0] && test.getMonth() == parts[1] && test.getFullYear() == parts[2])
				return test;
		}
	}
	
	return false;
}

function formatCurrency(num)
{
	num = num.toString().replace(/\$|\,/g,'');
	
	if(isNaN(num)) num = "0";
	
	sign = (num == (num = Math.abs(num)));
	num = Math.floor(num*100+0.50000000001);
	cents = num%100;
	num = Math.floor(num/100).toString();
	
	if(cents<10)
		cents = "0" + cents;
		
	for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
		num = num.substring(0,num.length-(4*i+3))+','+num.substring(num.length-(4*i+3));
	
	return (((sign)?'':'-') + '$' + num + '.' + cents);
}

function formatPriceRange(priceLow, priceHigh)
{
	//if(priceLow == priceHigh)
		return formatCurrency(priceLow);
	//else
		//return formatCurrency(priceLow) + " - " + formatCurrency(priceHigh);
}

// Select item in ddl matching val
function selectOptionByVal(id, val)
{
	var optionElem = ge(id);

	for(var i = 0; i < optionElem.options.length; i++)
	{
		var opt = optionElem.options[i];
	
		if(opt.value == "" && (!val || val == ""))
			opt.selected = true;
		else if(val && opt.value == val)
			opt.selected = true;
		else
			opt.selected = false;
	}
}


/******************************************************************************/
// Additional function to find the actual offset of the menu navigation
// Modified: 23/03/2006
// Created by: Yoseph
/******************************************************************************/
function getLeftSubObj(subobj)
{	
	var tmp = subobj;
	var parentLeft = 0;	
	
	while((tmp=tmp.offsetParent)!=null){		
		parentLeft = parentLeft + tmp.offsetLeft;				
	}
	//parentLeft += subobj.offsetWidth;
	return parentLeft;
}

function getTopSubObj(subobj)
{	
	var tmp = subobj;
	var parentTop = 0;	
	
	while((tmp=tmp.offsetParent)!=null){		
		parentTop = parentTop + tmp.offsetTop;				
	}
	//parentLeft += subobj.offsetWidth;
	return parentTop;
}

function openPopUp(url,width,height,parameter)
{	
	Popup = window.open(url + '?' + parameter,'','width=' + width + ',height=' + height +',scrollbars=1');
	if (window.focus) {Popup.focus()}	
}
