/**
* generic utility javascript collection
* @created 10.09.2001
* @author Adrian Ciobanu
* @version 4.1
* @since 11.11.2005
* cbSetContent function fixed
* @since 8.11.2005
* isValidCreditCardNumber function added
* getGETData function added
* @since 10.01.2005
* MM_findObj() function imported
* cbSetContentById bug fixed: html content now supported
* @since 5.08.2004
* clearRadio() function added.
* @since 2.08.2004
* isNumber() function fixed. - was not recognised.
* @since 2.08.2004
* isInteger() function added. Supports only positive integers.
* @since 20.07.2004
* isFloat() function fixed - invalid chars are now rejected.
* @since 12.07.2004
* isFloat() function added
* @since 7.04.2004
* isIP() function added
* @since 30.03.2004
* getSelectedOptions() function added
* @since 7.10.2003 Adrian Ciobanu
* - isUrl() function added
* @since 23.06.2003 Adrian Ciobanu
* - isEmail() function added
* @since 12.05.2003 Adrian Ciobanu
* - getFileExtension() function added
* @since 16.04.2003 Adrian Ciobanu
* - growWindow() function added
* @since 7.03.2003 Adrian Ciobanu
* - new window functions comment added
* @since 23.12.2002 Adrian Ciobanu
* - isPhone() function modified. Now it accepts chars like -, ()
* @since 22.12.2002 Adrian Ciobanu
* - isNumber() function added
* @since 16.12.2002 Adrian Ciobanu
* - radioValue function added
* @since 11.12.2002 Adrian Ciobanu
*  - function isPhone() added for validating a phone like input field
* @since 11.12.2002 Adrian Ciobanu
*  - function cbSetContentById() added for setting id based content like span and div
* @since 7.12.2002 Adrian Ciobanu
* - radioIsChecked function bug fix:: if only one radio the function returns allways false.
* @since 21.11.2002 Adrian Ciobanu
* - openwindowlink() function added.
*/
function getFileExtension(fileName)
{
	var extension;
	var extensionStart;
	extension = new String;
	extension = '';
	if(fileName.length > 2) {
		//fetching the . position
		extensionStart = fileName.lastIndexOf('.');
		if(extensionStart > 0)
		extension = fileName.substr(extensionStart, fileName.length - extensionStart);
	}
	return extension;
}
function isBlankText(strObj)
{
	if (strObj.replace(/\s/g, "") == "") {
		return(true);
	} else {
		return(false);
	}
}

function isBlankHTML(strObj)
{
	if (strObj.replace(/\s|&nbsp;|<[^>]+>/g, "") == "") {
		return(true);
	} else {
		return(false);
	}
}

function strTrim(strObj)
{
	strObj = strObj.replace(/^\s+/, "");
	strObj = strObj.replace(/\s+$/, "");
	return(strObj);
}
/**
* checks if a radio button is checked
* @return bool the checking status
*/
function radioIsChecked(radioObject)
{
	var checkedStatus = false;
	var i;
	if(!(radioObject.length > 0))
	return radioObject.checked;
	for (i = 0; i < radioObject.length; i ++) {
		if (radioObject[i].checked)
		checkedStatus = true;
	}
	return checkedStatus;
}

/**
* returns the value of the currently checked radio button
* @return bool the checked value
*/
function radioValue(radioObject)
{
	var checkedStatus = -1;
	var i;
	if(!(radioObject.length > 0))
	return radioObject.value;
	for (i = 0; i < radioObject.length; i ++) {
		if (radioObject[i].checked)
		checkedStatus = radioObject[i].value;
	}
	return checkedStatus;
}
/**
* sets all inputs to false (not checked)
*/
function clearRadio(radioObject)
{
	var i;
	if(radioObject.length > 0) {
		for (i = 0; i < radioObject.length; i ++) {
			radioObject[i].checked = false;
		}
	}
}

/**
* opens a new window, with given parameters
* NOTE: window title MUST have no spaces
*/
function openwindowlink(url, windowTitle, height, width)
{
	newwin = window.open(url, windowTitle," height=" + height + ",width=" + width + ",toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes,copyhistory=no");
	newwin.focus();
}
/**
* opens a new window for image displaying, with no body margins
* NOTE: window title MUST have no spaces
*/
function openimagelink(url, windowTitle, height, width)
{
	var newContent;
	newwin = window.open('', windowTitle," height=" + height + ",width=" + width + ",toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,copyhistory=no");
	newContent = '<html><head><title>'+ windowTitle +'</title></head>';
	newContent = newContent + '<body leftmargin="0" topmargin="0" rightmargin="0" bottommargin="0" marginwidth="0" marginheight="0">';
	newContent = newContent + '<img src="' + url + '" align="top">';
	newContent = newContent + '</body></html>';
	newwin.document.write(newContent);
	newwin.document.close();
	newwin.focus();
}

/**
* sets a dynamic content like div/span. Note that in IE a div must already contain something to be able to set innerHTML 
*
* @param elementId id
* @param content content to be updated
*/
function cbSetContentById(elementId, content)
{
	if (document.all) {
		//ie >4
		var oElement;
		oElement = document.getElementById(elementId);
		//alert(oElement.type);
		if(oElement.innerHTML) {
			oElement.innerHTML = content;
		} else if(oElement.innerHtml) {
			oElement.innerHtml = content;
		} else {
		
			oElement.innerText = content;			
		}
	}else {
		//ns > 6
		dynamiccontentNS6(elementId, content);
	}
}
/**
* sets a dynamic content for ns6
* @param elementId id
* @param content content to be updated
*/
function dynamiccontentNS6(elementid,content)
{
	if (document.getElementById){
		rng = document.createRange();
		el = document.getElementById(elementid);
		rng.setStartBefore(el);
		htmlFrag = rng.createContextualFragment(content);
		while (el.hasChildNodes())
		el.removeChild(el.lastChild);
		el.appendChild(htmlFrag);
	}
}
/**
* gets a dynamic content like div/span
* @param elementId id
* @return string content
*/
function cbGetContentById(elementId)
{
	if (document.all) {
		//ie >4
		return document.getElementById(elementId).innerText;
	}else
	//ns > 6
	return getDynamiccontentNS6(elementId);
}
/**
* gets a dynamic content for ns6
* @param elementId id
* @return string content
*/
function getDynamiccontentNS6(elementid)
{
	if (document.getElementById){
		element = document.getElementById(elementid);
		return element.innerHtml;
	}
}


//checks the validity of a phone number
function isPhone(phoneObject)
{
	var inputlength = phoneObject.length;
	input = phoneObject.toLowerCase();
	var error = 0;
	var phonenumber = "";
	for (i = 0; i < inputlength; i++) {
		var character = input.charAt(i);
		switch(character) {
			case '0': break;
			case '1': break;
			case '2': break;
			case '3': break;
			case '4': break;
			case '5': break;
			case '6': break;
			case '7': break;
			case '8': break;
			case '9': break;
			case '+': break;
			case '-': break;
			case ')': break;
			case '(': break;
			case '.': break;
			case '-': break;
			default:
			error = 1;
			break;
		}
	}
	if(error == 1)
	return false;
	else
	return true;
}
//checks the validity of a number
function isNumber(numberObject)
{
	var inputlength = numberObject.length;
	input = numberObject.toLowerCase();
	var error = 0;
	for (i = 0; i < inputlength; i++) {
		var character = input.charAt(i);
		switch(character) {
			case '-': break;
			case '0': break;
			case '1': break;
			case '2': break;
			case '3': break;
			case '4': break;
			case '5': break;
			case '6': break;
			case '7': break;
			case '8': break;
			case '9': break;
			case '.': break;
			case ' ': break;
			default:
			error = 1;
			break;
		}
	}
	if(error == 1)
	return false;
	else
	return true;
}
//grows a window to fuil screen
function growWindow(inputWindow)
{
	inputWindow.moveTo(0,0);
	if (navigator.appName=="Microsoft Internet Explorer") {
		inputWindow.resizeTo(screen.availWidth,screen.availHeight);
	}
	if (navigator.appName=="Netscape") {
		inputWindow.outerHeight = screen.availHeight;
		inputWindow.outerWidth = screen.availWidth;
	}
}
//validates a email address
function isEmail(email_value)
{
	//-----
	//are regular exp supported?
	var suported = 0;
	var valid_email = false;
	if(window.RegExp) {
		var tempStr = "a";
		var tempReg = new RegExp(tempStr);
		if (tempReg.test(tempStr)) { supported = 1 };
	}
	if(!supported) {
		valid_email =  (email_value.indexOf(".") > 2) && (email_value.indexOf("@") > 0);
	}
	var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	valid_email = filter.test(email_value);


	if(!valid_email) {
		return false
	}
	return true;
}

//validates a url
function isUrl(url_value)
{
	//-----
	//are regular exp supported?
	var suported = 0;
	var valid = false;
	if(window.RegExp) {
		var tempStr = "a";
		var tempReg = new RegExp(tempStr);
		if (tempReg.test(tempStr)) { supported = 1 };
	}
	if(!supported) {
		//if not, for now just returning true
		valid = true;
	}
	var filter = new RegExp();
	filter.compile("^(http|https|ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~])*$");
	valid = filter.test(url_value);

	if(!valid) {
		return false
	}
	return true;
}
//returns the number of options selected in a select object
function getSelectedOptions(selectedObject)
{
	var listLength = selectedObject.length;
	var numberSelected = 0;
	for(indexOptions = 0; indexOptions < listLength; indexOptions ++) {
		if(selectedObject.options[indexOptions].selected)
		numberSelected ++;
	}
	return numberSelected;
}
//checks if the provided object is a valid ip address
function isIP(what) {
	if (what.search(/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/) != -1) {
		var myArray = what.split(/\./);
		if (myArray[0] > 255 || myArray[1] > 255 || myArray[2] > 255 || myArray[3] > 255)
		return false;
		if (myArray[0] == 0 && myArray[1] == 0 && myArray[2] == 0 && myArray[3] == 0)
		return false;
		return true;
	}
	else
	return false;
}

//checks the validity of a real number
function isFloat(numberObject)
{
	var floatNumber;
	//parsing approved chars
	if(!isNumber(numberObject))
	return false;
	floatNumber = parseFloat(numberObject);
	if(!isNaN(floatNumber))
	return true;
	return false;
}
//checks the validity of a integer number. This functions FAILS ON NEGATIVE INTEGER.
function isInteger(numberObject)
{
	var intNumber;
	var inputlength = numberObject.length;
	input = numberObject.toLowerCase();
	var error = 0;
	for (i = 0; i < inputlength; i++) {
		var character = input.charAt(i);
		switch(character) {
			case '0': break;
			case '1': break;
			case '2': break;
			case '3': break;
			case '4': break;
			case '5': break;
			case '6': break;
			case '7': break;
			case '8': break;
			case '9': break;
			default:
			error = 1;
			break;
		}
	}
	if(error == 1)
	return false;
	else {
		//checking validity
		intNumber = parseInt(numberObject);
		if(!isNaN(intNumber))
		return true;
		return false;
	}
}
//checks if an elements is found in an array
function inArray(arraySource, element)
{
	for(indexSource = 0; indexSource < arraySource.length; indexSource ++) {
		if(arraySource[indexSource] == element) {
			return true;
		}
	}
	return false;
}
//seeks an object by id
function MM_findObj(n, d) { //v4.0
var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
	d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}

	if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];

	for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);

	if(!x && document.getElementById) x=document.getElementById(n); return x;
	return false;
}

//computes the GET data into a variable
function getGETData()
{
	GET_DATA=new Array();
	var getDataString=new String(window.location);
	var questionMarkLocation=getDataString.search(/\?/);
	if (questionMarkLocation!=-1){
		getDataString=getDataString.substr(questionMarkLocation+1);
		var getDataArray=getDataString.split(/&/g);
		for (var i=0;i<getDataArray.length;i++){
			var nameValuePair=getDataArray[i].split(/=/);
			GET_DATA[unescape(nameValuePair[0])]=unescape(nameValuePair[1]);
		}
	}
	return GET_DATA;
}
//validates a credit card number. cardType can be : mastercard = 2, visa = 1, amex = 3
function isValidCreditCardNumber(cardNumber, cardType)
{
	var isValid = false;
	var ccCheckRegExp = /[^\d ]/;
	isValid = !ccCheckRegExp.test(cardNumber);

	if (isValid)
	{
		var cardNumbersOnly = cardNumber.replace(/ /g,"");
		var cardNumberLength = cardNumbersOnly.length;
		var lengthIsValid = false;
		var prefixIsValid = false;
		var prefixRegExp;

		switch(cardType)
		{
			case 2:
			lengthIsValid = (cardNumberLength == 16);
			prefixRegExp = /^5[1-5]/;
			break;

			case 1:
			lengthIsValid = (cardNumberLength == 16 || cardNumberLength == 13);
			prefixRegExp = /^4/;
			break;

			case 3:
			lengthIsValid = (cardNumberLength == 15);
			prefixRegExp = /^3(4|7)/;
			break;

			default:
			prefixRegExp = /^$/;
			alert("Card type not found");
		}

		prefixIsValid = prefixRegExp.test(cardNumbersOnly);
		isValid = prefixIsValid && lengthIsValid;
	}

	if (isValid)
	{
		var numberProduct;
		var numberProductDigitIndex;
		var checkSumTotal = 0;

		for (digitCounter = cardNumberLength - 1;
		digitCounter >= 0;
		digitCounter--)
		{
			checkSumTotal += parseInt (cardNumbersOnly.charAt(digitCounter));
			digitCounter--;
			numberProduct = String((cardNumbersOnly.charAt(digitCounter) * 2));
			for (var productDigitCounter = 0;
			productDigitCounter < numberProduct.length;
			productDigitCounter++)
			{
				checkSumTotal +=
				parseInt(numberProduct.charAt(productDigitCounter));
			}
		}

		isValid = (checkSumTotal % 10 == 0);
	}

	return isValid;
}