///////////////////////////////////////////////////
// browser detection block  ///////////////////////
///////////////////////////////////////////////////

// Browser detection, BSAFER only works in Netscape 7.x, Mozilla 1.1x and IE 6
function BrowserDetectLite() {
	var ua = navigator.userAgent.toLowerCase();

	// browser name
	this.isGecko     = (ua.indexOf('gecko') != -1);
	this.isMozilla   = (this.isGecko && ua.indexOf("gecko/") + 14 == ua.length);
	this.isNS        = ( (this.isGecko) ? (ua.indexOf('netscape') != -1) : ( (ua.indexOf('mozilla') != -1) && (ua.indexOf('spoofer') == -1) && (ua.indexOf('compatible') == -1) && (ua.indexOf('opera') == -1) && (ua.indexOf('webtv') == -1) && (ua.indexOf('hotjava') == -1) ) );
	this.isIE        = ( (ua.indexOf("msie") != -1) && (ua.indexOf("opera") == -1) && (ua.indexOf("webtv") == -1) );

	// spoofing and compatible browsers
	this.isIECompatible = ( (ua.indexOf("msie") != -1) && !this.isIE);
	this.isNSCompatible = ( (ua.indexOf("mozilla") != -1) && !this.isNS && !this.isMozilla);

	// browser version
	this.versionMinor = parseFloat(navigator.appVersion);

	// correct version number
	if (this.isNS && this.isGecko) {
			this.versionMinor = parseFloat( ua.substring( ua.lastIndexOf('/') + 1 ) );
	} else if (this.isIE && this.versionMinor >= 4) {
			this.versionMinor = parseFloat( ua.substring( ua.indexOf('msie ') + 5 ) );
	}

	this.versionMajor = parseInt(this.versionMinor);
	this.geckoVersion = ( (this.isGecko) ? ua.substring( (ua.lastIndexOf('gecko/') + 6), (ua.lastIndexOf('gecko/') + 14) ) : -1 );

	// dom support
	this.isDOM1 = (document.getElementById);
	this.isDOM2Event = (document.addEventListener && document.removeEventListener);

	// css compatibility mode
	this.mode = document.compatMode ? document.compatMode : 'BackCompat';

	// specific browser shortcuts
	this.isNS7x = (this.isNS && this.versionMajor == 7);
	this.isMozilla11x = (this.isMozilla && this.versionMinor >= 1.1);
	this.isIE6x = (this.isIE && this.versionMajor == 6);
	this.isIE6up = (this.isIE && this.versionMajor >= 6);
}

var BROWSER = new BrowserDetectLite();

// backward compartibility
// this boolean variable is true, if user uses Internet Explorer
ISIE = BROWSER.isIE;

// does browser supports getElementById method
ISDOM = BROWSER.isDOM1;

// this boolean variable is true, if user uses Netscape Navigator 4
ISNS4 = document.layers ? true : false;
///////////////////////////////////////////////////

// hides element from page, leaving empty space
function hideElement(element) {
	if(ISDOM || ISIE)
	  element.style.visibility = 'hidden';
	else if(ISNS4)
	  element.visibility = 'hide';
}

// shows previously hidden element
function showElement(element) {
	if(ISDOM || ISIE)
	  element.style.visibility = 'visible';
	else if(ISNS4)
	  element.visibility = 'show';
}

// hides element from page, leaving empty space.
function hideElementById(id) {
	hideElement(getElement(window, id));
}

// shows previously hidden element
function showElementById(id) {
	showElement(getElement(window, id));
}

function getTableRowStyle() {
	return ISIE?"block":"table-row";
}

// when this function is called - script asks for user confirmation. If true - change current location to specified.
function confirmClick(url) {
	if (confirm(getMessage("main", "sure"))) {
		if (ISIE) {
			var link = document.createElement('A');
			if (link) {
				link.href = url;
				document.body.insertBefore(link);
				link.click();
				return;
			}
		}
		document.location.href = url;
	}
}

// this function is only for our applications
// Problem: all table cells have bottom border. But last cells(lowest in the table) doesn't looks nice with it.
// So this function removes style "border" from them.
function formatTable(){
	var tables = document.getElementsByTagName("TABLE");
	for(var i = 0; i < tables.length; i++){
		if (tables[i].id == "extended" && tables[i].className == "form_table") {
			var subTables = tables[i].getElementsByTagName("TABLE");

			for (var j = 0; j < subTables.length; j++) {
				var rows = subTables[j].rows;
				if(rows != null && rows.length != 0) {
					var tds = rows[rows.length - 1].getElementsByTagName("TD");

					for (var k = 0; k < tds.length; k++) {
						var classes = tds[k].className.split(" ");

						tds[k].className = "";

						for(var l = 0; l < classes.length; l++){
							if (classes[l] != "border")
								tds[k].className += classes[l] + " ";
						}
					}
		        }
			}
		}
	}
}

// in long table very usable to select table line that is currently under mouse pointer.
function tableRuler() {
	if (ISDOM){
		var tables = document.getElementsByTagName('table');

		for (var i = 0; i < tables.length; i++){
			// do smth only for tables, that have "ruler" as one of classes
			if(tables[i].className.indexOf('ruler') != -1){
				var trs = tables[i].getElementsByTagName('tr');

				for(var j = 0; j < trs.length; j++){
					if(trs[j].parentNode.nodeName=='TBODY' && trs[j].parentNode.parentNode.className != "actionTable"){
						trs[j].onmouseover=function() { this.className+=" jshover"; }
                        trs[j].onmouseout=function() { this.className=this.className.replace(" jshover", ""); }
						/*trs[j].onmouseover = function(){this.style.backgroundColor = "#006599"; this.style.color = "#FFFFFF"};
						trs[j].onmouseout = function(){this.style.backgroundColor = ""; this.style.color = ""};*/
					}

					// For custom lists this function also analyze if this column if sortable and put appropriate styles on it.
					if(trs[j].className=="header") {
						var ths = trs[j].getElementsByTagName("th");

						for(var k = 0; k < ths.length; k++)
							if (ths[k].className.indexOf("columnSortable") != -1) {
								if (ths[k].className == "columnSortableAsc") {
									ths[k].onmouseover=function(){this.className='columnSortableAscOver';return false}
									ths[k].onmouseout=function(){this.className='columnSortableAsc';return false}
								} else if (ths[k].className == "columnSortableDesc") {
									ths[k].onmouseover=function(){this.className='columnSortableDescOver';return false}
									ths[k].onmouseout=function(){this.className='columnSortableDesc';return false}
								} else {
									ths[k].onmouseover=function(){this.className='columnSortableOver';return false}
									ths[k].onmouseout=function(){this.className='columnSortable';return false}
								}
							}
					}
				}
			}
		}
	}
}

//
//
// *************************************************************************************************************
//
//

var highlightColor="#FFFFDF"

var previousHighlight=''
var eventobjHightlight

//Regular expression to highlight only form elements
var intended = /INPUT|TEXTAREA|SELECT|OPTION/

//Function to check whether element clicked is form element
function checkElement(which){
	if (which.style && intended.test(which.tagName)){
		if (BROWSER.isDOM1 && eventobjHightlight.nodeType == 3)
			eventobjHightlight = eventobjHightlight.parentNode.parentNode

		return true
	} else
		return false
}

//Function to highlight form element
function highlight(e){
	eventobjHightlight = e;

	if (previousHighlight != ''){
		if (checkElement(previousHighlight))
			previousHighlight.style.backgroundColor='';

		previousHighlight = eventobjHightlight;

		if (checkElement(eventobjHightlight))
			eventobjHightlight.style.backgroundColor = highlightColor;
	} else {
		if (checkElement(eventobjHightlight))
			eventobjHightlight.style.backgroundColor = highlightColor;

		previousHighlight = eventobjHightlight;
	}
}

// highlight element
function elementIsFocused(e) {
	if (window.event && window.event.srcElement)
			element = window.event.srcElement
	else if (e && e.target)
			element = e.target

	highlight(element);
}

// remove highlight from element on blur
function elementIsBlured(e) {
	if (window.event && window.event.srcElement)
		lnk = window.event.srcElement
	else if (e && e.target)
		lnk = e.target

	if (previousHighlight != ''){
		if (checkElement(previousHighlight))
			previousHighlight.style.backgroundColor = ''

		previousHighlight = ""
	}
}

// attach events to form elements to given form
function addFormEvents(form) {
	for(var k = 0; k < form.elements.length; k++) {
		element = form.elements[k];

		addEvent(element, "focus", elementIsFocused);
		addEvent(element, "blur", elementIsBlured);
	}
}

// attach events to form elements to all forms on the page
function addAllFormsEvents() {
	for(var k=0; k<document.forms.length; k++)
		addFormEvents(document.forms[k]);
}

function clearFilterFields(form){
	if(form == null)
		return;

	var inputs = getElementsByClassName("clearable", form);

	for(var i = 0; i < inputs.length; i++)
		clearElementValue(inputs[i]);
}

linkClicked = false;

function linkWasClicked(){
	if(linkClicked)
		return true;

	linkClicked = true;
	return false;
}

function isAlphaNumeric(evt){
	if(!evt) {
		evt = window.event;
	}

	var charCode = null;
	var newChar = null;

	if(BROWSER.isGecko){
	    if(evt.charCode){
			newChar = String.fromCharCode(evt.charCode);
	    } else {
	    	charCode = evt.keyCode;
	    }
	} else {
		charCode = evt.keyCode || evt.which;
		newChar = String.fromCharCode(charCode);
	}

	if(charCode == 0){
		charCode = null;
		newChar = null;
	}

	if(
		(
			newChar == null &&
			charCode != 8 &&
			charCode != 46
		) ||
		charCode == 9   ||  // tab
		charCode == 13  ||  // enter
		charCode == 16  ||  // shift
		charCode == 17  ||  // ctrl
		charCode == 18  ||  // alt
		charCode == 20  ||  // caps lock
		charCode == 27  ||  // escape
		charCode == 33  ||  // page up
		charCode == 34  ||  // page down
		charCode == 35  ||  // home
		charCode == 36  ||  // end
		charCode == 37  ||  // left arrow
		charCode == 38  ||  // up arrow
		charCode == 39  ||  // right arrow
		charCode == 40  ||  // down arrow
		charCode == 144     // num lock
	){
		return false;
	}
	return true;
}

function disableSubmits(form){
	if(form == null){
		return false;
	}
	
	form.onsubmit = function() {return false};

	var inputs = form.getElementsByTagName("input");

	for(var ii = 0; ii < inputs.length; ii++){
		var input = inputs[ii];

		if(input.type == "submit" || input.type == "image"){
			input.className += ' disabled';
		}
	}

	return true;
}

function toggleListFilter(controlId, bodyId, show) {
  var header = document.getElementById(controlId);
  var body = document.getElementById(bodyId);
  var expanded = getElementsByClassName('expanded', header)[0];
  var collapsed = getElementsByClassName('collapsed', header)[0];

  expanded.style.display = !show ? 'none' : 'block';
  collapsed.style.display = show ? 'none' : 'block';
  body.style.display = !show ? 'none' : 'block';
  return false;
}

function initCustomList() { 
    var customListContainer = 400;
    var theHandle = document.getElementById("containerHeader");
    var theRoot   = document.getElementById("customListContainer");
    //Drag.init(theHandle, theRoot, 0, null, 0);

    var pWidth = intValue(document.body.clientWidth);
    var pHeight = intValue(document.body.clientHeight);

    var pLeft = pWidth > customListContainer ? (pWidth - customListContainer) / 2 : 0;
    var pTop = pHeight > 300 ? 100 : 0;

	if (theRoot && theRoot!=undefined) {
    	theRoot.style.left = pLeft + 'px';
    	theRoot.style.top = pTop + 'px';
	}
}

function getPageScroll() {
	var yScrolltop;
	var xScrollleft;
	if(self.pageYOffset || self.pageXOffset) {
		yScrolltop = self.pageYOffset;
		xScrollleft = self.pageXOffset;
	} else if(document.documentElement && document.documentElement.scrollTop || document.documentElement.scrollLeft) {
		yScrolltop = document.documentElement.scrollTop;
		xScrollleft = document.documentElement.scrollLeft;
	} else if(document.body) {
		yScrolltop = document.body.scrollTop;
		xScrollleft = document.body.scrollLeft;
	}
	return new Array(xScrollleft, yScrolltop);
}

// changes status of all checkboxes in specified form depends on specified checkbox value
function changeAllCheckboxesInFormStartedWithStyle(element, formName, styleId) {
	var inputs = document.forms[formName].getElementsByTagName("input");
	for (var i=0; i != inputs.length; i++) {
		if (inputs[i].type=='checkbox' && inputs[i].id.indexOf(styleId) != -1 && !inputs[i].disabled)
			inputs[i].checked = element.checked;
	}
	return false;
}

