var clientPC  = navigator.userAgent.toLowerCase();
var is_gecko  = ((clientPC.indexOf('gecko')!=-1) && (clientPC.indexOf('spoofer')==-1) &&
                (clientPC.indexOf('khtml') == -1) && (clientPC.indexOf('netscape/7.0')==-1));
var is_safari = ((clientPC.indexOf('AppleWebKit')!=-1) && (clientPC.indexOf('spoofer')==-1));
var is_khtml  = (navigator.vendor == 'KDE' || ( document.childNodes && !document.all && !navigator.taintEnabled ));
if (clientPC.indexOf('opera')!=-1) {
    var is_opera = true;
    var is_opera_preseven = (window.opera && !document.childNodes);
    var is_opera_seven = (window.opera && document.childNodes);
}

function CaretPosition()
{
 var start = null;
 var end = null;
}
function getCaretPosition(oField)
{
	var oCaretPos = new CaretPosition();
	if(oField.selectionStart || oField.selectionStart == '0')
	{
		oCaretPos.start = oField.selectionStart;
		oCaretPos.end = oField.selectionEnd;
	}
	else if(document.selection)
	{
		oField.focus();
		var range = document.selection.createRange();
		var stored_range = range.duplicate();
		stored_range.moveToElementText(oField);
		stored_range.setEndPoint('EndToEnd', range);
		oCaretPos.start = stored_range.text.length - range.text.length;
		oCaretPos.end = oCaretPos.start + range.text.length;
	}
	return (oCaretPos);
}

function insertAtCaret(obj, text, block) {
	var caret = getCaretPosition(obj);
	if(document.selection) {
		obj.focus();
		var range = document.selection.createRange();
		if(range.parentElement() != obj) {
			return false;
		}
		if(block && caret.start != 0) text = "\n" + text;
		range.text = text;	
	} else if(obj.selectionStart >= 0) {
		if(block && caret.start != 0) text = "\n" + text;
		obj.value = obj.value.substr(0, caret.start) 
			+ text 
			+ obj.value.substr(caret.end, obj.value.length);
	}
	
	if(caret != null) {
		if(navigator.appName == "Opera")
		{
			var arr = Array();
			arr = text.split('\n');
			caret.start += arr.length;
		}
		setCaretTo(obj, caret.start + text.length);
	} else {
		obj.value += text;
	}
}

function setCaretTo(obj, pos) {
	if(obj.createTextRange) {
		var range = obj.createTextRange();
		range.move('character', pos);
		range.select();
	} else if(obj.selectionStart) {
		obj.focus();
		obj.setSelectionRange(pos, pos);
	}
}

function insertTags(txtarea, tagOpen, tagClose, sampleText) {
  // IE
  if(document.selection  && !txtarea.selectionStart) {
    var theSelection = document.selection.createRange().text;
    var replaced = true;
    if(!theSelection){
      replaced = false;
      theSelection=sampleText;
    }
    txtarea.focus();

    // This has change
    var text = theSelection;
    if(theSelection.charAt(theSelection.length - 1) == " "){// exclude ending space char, if any
      theSelection = theSelection.substring(0, theSelection.length - 1);
      r = document.selection.createRange();
      r.text = tagOpen + theSelection + tagClose + " ";
    } else {
      r = document.selection.createRange();
      r.text = tagOpen + theSelection + tagClose;
    }
    if(!replaced){
      r.moveStart('character',-text.length-tagClose.length);
      r.moveEnd('character',-tagClose.length);
    }
    r.select();
  // Mozilla
  } else if(txtarea.selectionStart || txtarea.selectionStart == '0') {
    replaced = false;
    var startPos = txtarea.selectionStart;
    var endPos   = txtarea.selectionEnd;
    if(endPos - startPos){ replaced = true; }
    var scrollTop=txtarea.scrollTop;
    var myText = (txtarea.value).substring(startPos, endPos);
    if(!myText) { myText=sampleText;}
    if(myText.charAt(myText.length - 1) == " "){ // exclude ending space char, if any
      subst = tagOpen + myText.substring(0, (myText.length - 1)) + tagClose + " ";
    } else {
      subst = tagOpen + myText + tagClose;
    }
    txtarea.value = txtarea.value.substring(0, startPos) + subst +
                    txtarea.value.substring(endPos, txtarea.value.length);
    txtarea.focus();

    //set new selection
    if(replaced){
      var cPos=startPos+(tagOpen.length+myText.length+tagClose.length);
      txtarea.selectionStart=cPos;
      txtarea.selectionEnd=cPos;
    }else{
      txtarea.selectionStart=startPos+tagOpen.length;
      txtarea.selectionEnd=startPos+tagOpen.length+myText.length;
    }
    txtarea.scrollTop=scrollTop;
  // All others
  } else {
    var copy_alertText=alertText;
    var re1=new RegExp("\\$1","g");
    var re2=new RegExp("\\$2","g");
    copy_alertText=copy_alertText.replace(re1,sampleText);
    copy_alertText=copy_alertText.replace(re2,tagOpen+sampleText+tagClose);

    if (sampleText) {
      text=prompt(copy_alertText);
    } else {
      text="";
    }
    if(!text) { text=sampleText;}
    text=tagOpen+text+tagClose;
    //append to the end
    txtarea.value += "\n"+text;

    // in Safari this causes scrolling
    if(!is_safari) {
      txtarea.focus();
    }

  }
  // reposition cursor if possible
  if (txtarea.createTextRange){
    txtarea.caretPos = document.selection.createRange().duplicate();
  }
}

var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();

//Some AJAX Features
var http_request = false;
function makePOSTRequest(url, parameters, alertFunc)
{
	http_request = false;
	if (window.XMLHttpRequest)
	{ // Mozilla, Safari,...
		http_request = new XMLHttpRequest();
		if (http_request.overrideMimeType)
		{
			// set type accordingly to anticipated content type
			//http_request.overrideMimeType('text/xml');
			http_request.overrideMimeType('text/html');
		}
	}
	else if (window.ActiveXObject)
	{ // IE
		try
		{
			http_request = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e)
		{
			try
			{
				http_request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	if (!http_request)
	{
		alert('Îøèáêà: íå óäà¸òñÿ ñîçäàòü ýêçåìïëÿð XMLHTTP');
		return false;
	}
	if(alertFunc) http_request.onreadystatechange = alertFunc;
	http_request.open('POST', url, true);
	http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	http_request.setRequestHeader("Content-length", parameters.length);
	http_request.setRequestHeader("Connection", "close");
	http_request.send(parameters);
}

function getObjTopPos(obj)
{
	var top = obj.offsetTop;
	
	while( (obj = obj.offsetParent) != null )
	{
		top += obj.offsetTop;
	}
	
	return top;
}

/*- - - - - - - - - - - - - - - - FX Block - - - - - - - - - - - - - - - - */
function FX()
{
	this.paddingTop = 0;
	this.paddingBottom = 0;
	this.maxHeight = 0;
	this.visibility = false;
}

function visibilityInit(block)
{
	var visibility = true;
	if(block.offsetHeight <= 2) visibility = false;

	block.style.display = "block";
	var curHeight = block.offsetHeight;
	block.style.paddingTop = "0px";
	var paddingTop = curHeight - block.offsetHeight;
	curHeight = block.offsetHeight;
	block.style.paddingBottom = "0px";
	var paddingBottom = curHeight - block.offsetHeight;
	curHeight = block.offsetHeight;
	block.style.paddingTop = paddingTop + "px";
	block.style.paddingBottom = paddingBottom + "px";

	block.fx = new FX();
	block.fx.paddingTop = paddingTop;
	block.fx.paddingBottom = paddingBottom;
	block.fx.maxHeight = curHeight;
	block.fx.visibility = visibility;
	if(!visibility) block.style.display = "none";
	return visibility;
}

function setVisibilityBlock(block, visibility)
{
	if(!block.style) block = document.getElementById(block);
	if(!block.fx) visibilityInit(block);
	if(block.fx.visibility == visibility) return;
	var height = 0;
	if(block.fx.visibility) height = block.fx.maxHeight;
	block.fx.visibility = visibility;
	block.style.height = height+"px";		
	block.style.display = "block";	
	block.style.overflow = "hidden";
	var anim = function()
	{
		if(block.fx.visibility && height < block.fx.maxHeight - 5)
		{
			height += 5;
			setTimeout(anim, 20);
		}
		if(!block.fx.visibility && height >= 5)
		{
			height -= 5;
			if(height < 5) block.style.display = "none";
			setTimeout(anim, 20);
		}
		block.style.height = height+"px";		
	}
	setTimeout(anim, 20);
}

function showBlock(block)
{
	setVisibilityBlock(block, true);
}
function hideBlock(block)
{
	setVisibilityBlock(block, false);
}