//Fuctions for check different fields for valid data. They are a user input filter functions

//Global variables, identifying the browser type
var isIE = false;
var isFF = false;
var isSF = false;
var isOP = false;

var ua = navigator.userAgent.toLowerCase(); 
if (window.opera) {
	isOP = true;
} else if (document.all && !window.opera) {
	isIE = true;
} else if ( ua.indexOf( "safari" ) != -1 ) {
	isSF = true;
} else if (document.getElementById)
	isFF = true;

if (eval("typeof $!='function'")){
	function $(id){
		return document.getElementById(id);
	}
}
if (!window.Node) var Node =
    {
      ELEMENT_NODE                :  1,
      ATTRIBUTE_NODE              :  2,
      TEXT_NODE                   :  3,
      CDATA_SECTION_NODE          :  4,
      ENTITY_REFERENCE_NODE       :  5,
      ENTITY_NODE                 :  6,
      PROCESSING_INSTRUCTION_NODE :  7,
      COMMENT_NODE                :  8,
      DOCUMENT_NODE               :  9,
      DOCUMENT_TYPE_NODE          : 10,
      DOCUMENT_FRAGMENT_NODE      : 11,
      NOTATION_NODE               : 12
    }

function open_popup(url,h,w,name)
{
	h = typeof(h) != 'undefined' ? h : '300';
	w = typeof(w) != 'undefined' ? w : '450';
	name = typeof(name) != 'undefined' ? name : 'Help';
	var newwindow=window.open(url,name,'resizable=1,scrollbars=1,height=' + h +',width=' + w);
	if (window.focus)
		newwindow.focus();
	return false;
}

function getposOffset(what, offsettype)
{
	var totaloffset=(offsettype=="left")? what.offsetLeft : what.offsetTop;
	var parentEl=what.offsetParent;
	while (parentEl!=null)
	{
		totaloffset=(offsettype=="left")? totaloffset+parentEl.offsetLeft : totaloffset+parentEl.offsetTop;
		parentEl=parentEl.offsetParent;
	}
	return totaloffset;
}

/*
Sometimes Internet Explorer keeps items in memory after the page is done using them.
Although these pseudo-leaks are freed after the user leaves the page, some web pages may be open for long periods of time.
To avoid pseudo-leaks, do not use removeChild to remove elements. Instead, set the parent's innerHTML to "" or use a function like this:
*/
function _discardElement(element) {
	var garbageBin = document.getElementById('IELeakGarbageBin');
	if (!garbageBin) {
		garbageBin = document.createElement('DIV');
		garbageBin.id = 'IELeakGarbageBin';
		garbageBin.style.display = 'none';
		document.body.appendChild(garbageBin);
	}
	// move the element to the garbage bin
	garbageBin.appendChild(element);
	garbageBin.innerHTML = '';
}

// this is safe way to dispose an element
function safeRemoveNode(node)
{
	if (isIE)
		_discardElement(node);
	else
	{
		if(node && node.parentNode)
			return node.parentNode.removeChild(node); // return a ref to the removed child
	}
}

function addOption(selectbox,text,value)
{
	var optn = document.createElement("OPTION");
	optn.text = text;
	optn.value = value;
	selectbox.options.add(optn);
}

function removeAllOptions(selectbox)
{
	var i;
	for(i=selectbox.options.length-1;i>=0;i--)
	{
		selectbox.remove(i);
	}
}

//Makes currency output, like $32,454.01
function pound(num)
{
    var i,l,d;
    var nums;
    var ret;
    nums = String(Math.round(num*100));
    while (nums.length <3) nums = "0" + nums;
    l = nums.length-3;
    ret = "." + nums.charAt(l+1) + nums.charAt(l+2);
    d=0;
    for (i=l; i>=0; i--) {
          ret = nums.charAt(i) + ret;
      d++;
          if (d==3 && i>0) {
        ret="," + ret;
        d=0;
          }
    }
    return ret;
}

//function clears and enables field with name $name
function clear_field(name)
{
	try{
		var f = document.getElementById(name);
		f.disabled = false;
		f.value = '';
	}
	catch(err){
		return;
	}
}

function removeAllChildNodes(node)
{
	if (node && node.hasChildNodes && node.removeChild)
	{
		while (node.hasChildNodes()) {
			safeRemoveNode(node.firstChild);
		}
	}
} // removeAllChildNodes()

/**
* Function : dump()
* Arguments: The data - array,hash(associative array),object
*    The level - OPTIONAL
* Returns  : The textual representation of the array.
* This function was inspired by the print_r function of PHP.
* This will accept some data as the argument and return a
* text that will be a more readable version of the
* array/hash/object that is given.
*/
function dump(arr,level)
{
	var dumped_text = "";
	if(!level) level = 0;

	//The padding given at the beginning of the line.
	var level_padding = "";
	for(var j=0;j<level+1;j++) level_padding += "    ";

	if(typeof(arr) == 'object') { //Array/Hashes/Objects
	 for(var item in arr) {
	  var value = arr[item];

	  if(typeof(value) == 'object') { //If it is an array,
	   dumped_text += level_padding + "'" + item + "' ...\n";
	   dumped_text += dump(value,level+1);
	  } else {
	   dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
	  }
	 }
	} else { //Stings/Chars/Numbers etc.
	 dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
	}
return dumped_text;
}

function getScreenCenterY(){
	return getScrollOffset()+(getInnerHeight()/2);
}

function getScreenCenterX(){
	return(document.body.clientWidth/2);
}

function getInnerHeight()
{
	var y;
	if (self.innerHeight) // all except Explorer
		y = self.innerHeight;
	else if (document.documentElement && document.documentElement.clientHeight) // Explorer 6 Strict Mode
		y = document.documentElement.clientHeight;
	else if (document.body) // other Explorers
		y = document.body.clientHeight;
	return(y);
}

function getScrollOffset()
{
	var y;
	if (self.pageYOffset) // all except Explorer
		y = self.pageYOffset;
	else if (document.documentElement && document.documentElement.scrollTop)	// Explorer 6 Strict
		y = document.documentElement.scrollTop;
	else if (document.body) // all other Explorers
		y = document.body.scrollTop;
	return(y);
}

/**
 * Go around DOM tree strating with node and find element with name node_name
 * @param mixed $node Root node to start search
 * @param string $node_name Look for an element with this name
 * @return mixed|boolean False if element is not found or element object
 */

function find_node(node, node_name)
{
	var r;
	if (node && (node.name == node_name))
		return node;
	for (var i=0; i<node.childNodes.length;i++)
	{
		r = find_node(node.childNodes[i], node_name);
		if (r)	return r;
	}
	return false;
}

/**
 * Checks if the given value exists in the array
 * @param mixed $needle What
 * @param string $haystack Where
 * @param bool $argStrict Compare types or not
 * @return boolean
 */

function in_array (needle, haystack, argStrict) {
    // 
    // 
    // version: 1103.1210
    // discuss at: http://phpjs.org/functions/in_array    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: vlado houba
    // +   input by: Billy
    // +   bugfixed by: Brett Zamir (http://brett-zamir.me)
    // *     example 1: in_array('van', ['Kevin', 'van', 'Zonneveld']);    // *     returns 1: true
    // *     example 2: in_array('vlado', {0: 'Kevin', vlado: 'van', 1: 'Zonneveld'});
    // *     returns 2: false
    // *     example 3: in_array(1, ['1', '2', '3']);
    // *     returns 3: true    // *     example 3: in_array(1, ['1', '2', '3'], false);
    // *     returns 3: true
    // *     example 4: in_array(1, ['1', '2', '3'], true);
    // *     returns 4: false
    var key = '',        strict = !! argStrict;
 
    if (strict) {
        for (key in haystack) {
            if (haystack[key] === needle) {                return true;
            }
        }
    } else {
        for (key in haystack) {            if (haystack[key] == needle) {
                return true;
            }
        }
    } 
    return false;
}

