var common_js_loaded;
if( !common_js_loaded )
{
/**************************************************
*	this file defines the basis for JS constructs on any page of COMBY (and maybe not only)
**************************************************/
common_js_loaded = 1;
var isDOM=document.getElementById; //DOM1 browser (MSIE 5+, Netscape 6, Opera 5+)
var isOpera5=window.opera && isDOM; //Opera 5+
var isOpera6=isOpera5 && window.print; //Opera 6+
var isOpera7=isOpera5 && document.readyState; //Opera 7+
var isOpera=(isOpera5||isOpera6||isOpera7);
var isOpera8 = false;
var isMSIE=document.all && document.all.item && !isOpera; //Microsoft Internet Explorer 4+
var isMSIE5=isDOM && isMSIE; //MSIE 5+
var isNetscape4=document.layers; //Netscape 4.*
var isMozilla=isDOM && navigator.appName=="Netscape"; //Mozilla ????????? Netscape 6.*
var isSafari = navigator.userAgent.indexOf('Safari') != -1;
var active_nick;
var context_menu_active=0;
var mouse_on_nick=0;
var menu_type='user';
var Menu_timeout=1000;
var menu_item=false;
var drop_menu_timeout=false;
var launch_next_menu=1;
var menu_param_keys=false;
var menu_param_values=false;
var delayhide=false;
var update_menu=1;
var newMenuCaller = {};
var currentMenuCaller = {};
var comby_loaded=false;
var userAgent = navigator.userAgent.toLowerCase();

// Figure out what browser is being used
var User = new Object();
User.browser = {
	version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],
	safari: /webkit/.test( userAgent ),
	opera: /opera/.test( userAgent ),
	msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
	mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
};


// ****************  NEW MODULES  ********************

/***********************************************
* 	onLoad events controller module
* 	USAGE
* 	addition format onLoadHandlers['(module prefix)_(handler name)'] = function
* 	modules add personal onLoad hanlers like this onLoadHandlers['olh_locationSelector'] = locationSelectorInit;
***********************************************/
// GLOBAL VARIABLE
var onLoadHandlers = []; // storage for onload handlers 
function combyOnLoad(e) {
	if (comby_loaded) return;
	completeBrowserDetection();
	var shadow = document.getElementById('shadow_image');
	if (shadow)
	{
		shadow.style.visibility = 'visible';
	}
	comby_loaded = true;
	for( var i in onLoadHandlers )
	{
		if ('function' == typeof(onLoadHandlers[i]))
			onLoadHandlers[i]();
	}
}
window.onload = combyOnLoad;
// 	onLoad events controller module END

function completeBrowserDetection(){
	detectOpera8();
}
function detectOpera8(){
	if (isOpera && ('object' != (typeof document.body.currentStyle))){
		isOpera8 = true;
	}
}
//onLoadHandlers['detectOpera8'] = detectOpera8;
/***********************************************
* 	event hendlers controller module
* 	suport assigning multiple handlers to same event on same node
* 	suport save removing of handlers
***********************************************/
// GLOBAL VARIABLE
var handlerCollection  = [];// storage for handlers 

/**	Service function
*	Run a set of hendlers by key, eventName and event reference 
*
*	@param		string 		key			key of node
*	@param		string		eventName	name of current event
*	@param		object		_event		reference to current event
*
*	@return		void
**/
function runHandlers(key,eventName,_event){
	handlerCollection[key][eventName].foreach(function (handler)
	{
		handler(_event);
	});
}
/**	
*	add a handler to node
*
*	@param		element 	node		target DHTML element (reference)
*	@param		string		eventName	name of event to handle
*	@param		function	handler		a handler to add
*	@param		string		key			optional, if not set generated by node 
do not leave blank if node className or id may be changed.
must be unical
must be set for document or window 
TODO make autofill of key for document and window 
*
*	@return		void
**/
function addHandlerToNode(node,eventName,handler,key){
	/**	
	Service function used as prototype for handlers puted on nodes.
	**/
	function RunHandlersCaller(_event){
		if ('creation' == _event) _this = this;
		else runHandlers(_this.key,_this.eventName,_event);
	}
	if (!handlerCollection) handlerCollection = [];
	if (!key) key = node.tagName + node.className + node.id;
	if (!handlerCollection[key]) handlerCollection[key] = [];
	if (!handlerCollection[key][eventName]) {handlerCollection[key][eventName] = [];}
	if (handlerCollection[key][eventName].length == 0) {
		handlerCollection[key][eventName].push(handler);
		node[eventName] = handler;
	}
	else {
		if (handlerCollection[key][eventName].keyOf(handler)) {return }
		handlerCollection[key][eventName].push(handler);
		var runner = new RunHandlersCaller('creation');
		runner.key = key;
		runner.eventName = eventName;
		node[eventName] = runner;
	}
}
/**	
*	add a handler to node
*
*	@params	SAME AS addHandlerToNode
*
*	@return		boolean		true if handler deleted sucsessfuly
**/
function removeHandlerFromNode(node,eventName,handler,key){
	if (!key) key = node.tagName + node.className + node.id;
	if (!handlerCollection || !handlerCollection[key] || !handlerCollection[key][eventName]) return false;
	var index = handlerCollection[key][eventName].keyOf(handler);
	if (index) handlerCollection[key][eventName].splice(index,1);
	if (handlerCollection[key][eventName].length == 0) {
		node[eventName] = null;
	}
	return true;
}
// 	event hendlers controller module END

/***********************************************
* 	LANG module
* 	colect LANG and let all get them
***********************************************/

function Lang(){
	var langStorage = [];
	var debug = true;
	this.add = function LAdd(key,value,force)
	{
		if (langStorage[key]) 
		{
			if (debug) alert('double setting of '.key);
			if (force) langStorage[key] = value;
		}
		else langStorage[key] = value;
	}
	this.get = function LGet(key){return langStorage[key]}
}
// GLOBAL VARIABLE
lang = new Lang();
// LANG module


//*** Separate functions may be moved to tools.js

/**
*	Return coordinates of given element relative to start of the document
*
*	@param		element		DHTML element (reference)
*
*	@return		object		structure {left:(left coordinate),top:(top coordinate)}
**/
function getElementPosition(element,debug){
	var offsetLeft = 0;
	var offsetTop = 0;
	while(element) {
		/********************************************************
		IE 6.0 and earlyer have a bug in offsetTop of LI element 
		code lower will partualy correct this bug. 
		function will detect offset of LI but miss offset of element in LI
		*********************************************************/
		/*if (offsetTrail.tagName == 'LI'){
			offsetTop += 6;
			offsetLeft += offsetTrail.offsetLeft;
			offsetTrail = offsetTrail.offsetParent;
			continue;
		}*/
		if (debug) alert([element.tagName,element.offsetLeft,element.outerHTML]);
		offsetLeft += element.offsetLeft;
		offsetTop += element.offsetTop;
		element = element.offsetParent;
	}
	return { left:offsetLeft, top:offsetTop }
}
/**
*	Open browser controll of adding given url to favorites, recomend given title
*
*	@param		string		title	optional, if not set title in control will be blank
*	@param		string		url 	optional, if not set url of curent page is used 
*
*	@return		void
**/
function addToBrowserFavorites(title, url){
	//alert([title, url, window.sidebar, window.external]);
	if (!url) url = window.location.href;
	if (isMSIE)	window.external.AddFavorite(url, title);
	if (isMozilla) window.sidebar.addPanel(title, url, '');
	
	/*else if(window.sidebar)
		window.sidebar.addPanel(title, url, '');*/
}
/**
*	Show homepage icon
**/
function showHomepageIcon()
{
	if (!isMSIE)
		return false;
	var shp = document.getElementById('setHP');
	if (shp)
		shp.style.visibility = 'visible';
}
/**
*	returns y coordinate of element relative to screen;
*
*	@param		element		DHTML element (reference)
*
*	@return		int
**/

// XBrowser functions - may be collected in browser object in future

function getObjectScreenTop (node){
	return getElementPosition(node).top - getBodyScrollTop();
}
/**
*	returns curren height of element;(XBrowser)
*
*	@param		element		DHTML element (reference)
*
*	@return		int
**/
function getObjectCurrentHeight(node){
	if (isMozilla || isOpera8) {
		if ('auto' == document.defaultView.getComputedStyle(node, null).height)
			return node.offsetHeight;
		return parseInt(document.defaultView.getComputedStyle(node, null).height);
	}
	else {
		if ('auto' == node.currentStyle.height) return node.clientHeight;
		return parseInt(node.currentStyle.height);
	}
}
/**
*	returns curren width of element;(XBrowser)
*
*	@param		element		DHTML element (reference)
*
*	@return		int
**/
function getObjectCurrentWidth(node){
	// TODO change isOpera to isOpera8
	if (isMozilla || isOpera8) return parseInt(document.defaultView.getComputedStyle(node, null).width);
	else return parseInt(node.currentStyle.width);
}
/**
*	removes node from DOM (XBrowser)
*
*	@param		element		DHTML element (reference)
*
*	@return		void
**/
function removeNodeXB(node){
	if (isMSIE){
		node.removeNode();
	}
	else {
		node.parentNode.removeChild(node);
	}
}
// TODO coments
function getBodyClickTop(e){
	if (event) e = event;
	if (!e) return 0;
	return e.screenY+document.body.parentNode.scrollTop-screenTop-10;
}
function getBodyClickLeft(e){
	if (event) e = event;
	if (!e) return 0;
	return e.screenX+document.body.parentNode.scrollLeft-screenLeft;
}
// ****************  OLD MODULES ********************

/***********************************************
* Drop Down Menu
***********************************************/
var menuwidth='100px' //default menu width
var menubgcolor='#FFF6E5'  //menu bgcolor
var disappeardelay=250  //menu disappear speed onMouseout (in miliseconds)
var hidemenu_onclick="no" //hide menu when user clicks within menu?

/////No further editting needed

var ie4=document.all
var ns6=document.getElementById&&!document.all

 //   if (ie4||ns6)
 //         document.write('<div id="dropmenudiv" style="visibility:hidden;width:'+menuwidth+';background-color:'+menubgcolor+'" onMouseover="clearhidemenu()" onMouseout="dynamichide(event)"></div>')

// old shortcut usage not recomended, left here for compatibility to current code.
// use getElementPosition().left(.top) instead
function getposOffset(what, offsettype)
{
	if (offsettype=="left") return getElementPosition(what).left;
	else return getElementPosition(what).top;
	
	// OLD CODE to be deleted
	/*var totaloffset=(offsettype=="left")? what.offsetLeft : what.offsetTop;
	var parentEl=what.offsetParent;
	while (parentEl.offsetParent)
	{
		totaloffset+=(offsettype=="left")?parentEl.offsetLeft : parentEl.offsetTop;
		parentEl=parentEl.offsetParent;
	}
	return totaloffset;*/
}

function showhide(menucontents, obj, event_type, visible, hidden, menuwidth, gettype)
{
	if(update_menu)
	{
		if (gettype == 'ajax')
		{
			dropmenuobj.innerHTML = '<a><img src="'+portal_url+'img/indicator.gif" align="absmiddle">&nbsp;&nbsp;'+str_loading+'</a>';
			if (!window.XMLHttpRequest && !window.ActiveXObject)
				return true;
			getmenuhtml(menucontents, menu_param_keys, menu_param_values);
		}
		else
		{
			populatemenu_js(menucontents, menu_param_keys, menu_param_values);
		}
		if(obj===false)
			obj=dropmenuobj.style;
		if (ie4||ns6)
			obj.left=obj.top="-500px";
		if (menuwidth!="")
		{
			dropmenuobj.widthobj=dropmenuobj.style
			dropmenuobj.widthobj.width=menuwidth
		}
		if (event_type=="click" && obj.visibility==hidden || event_type=="mouseover")
		{
			update_menu=0;
			obj.visibility=visible;
		}
		else if (event_type=="click")
		{
			context_menu_active=0;
			update_menu=1;
			obj.visibility=hidden;
		}
		dropmenuobj.x=getposOffset(menu_item, "left");
		dropmenuobj.y=getposOffset(menu_item, "top");
		dropmenuobj.style.left=dropmenuobj.x-clearbrowseredge(menu_item, "rightedge")+"px";
		dropmenuobj.style.top=dropmenuobj.y-clearbrowseredge(menu_item, "bottomedge")+menu_item.offsetHeight+"px";
	}

}

function iecompattest(){
	return (document.compatMode && document.compatMode!="BackCompat")? document.documentElement : document.body
}

function clearbrowseredge(obj, whichedge){
var edgeoffset=0
if (whichedge=="rightedge"){
var windowedge=ie4 && !window.opera? iecompattest().scrollLeft+iecompattest().clientWidth-15 : window.pageXOffset+window.innerWidth-15
dropmenuobj.contentmeasure=dropmenuobj.offsetWidth
if (windowedge-dropmenuobj.x < dropmenuobj.contentmeasure)
edgeoffset=dropmenuobj.contentmeasure-obj.offsetWidth
}
else{
var topedge=ie4 && !window.opera? iecompattest().scrollTop : window.pageYOffset
var windowedge=ie4 && !window.opera? iecompattest().scrollTop+iecompattest().clientHeight-15 : window.pageYOffset+window.innerHeight-18
dropmenuobj.contentmeasure=dropmenuobj.offsetHeight
if (windowedge-dropmenuobj.y < dropmenuobj.contentmeasure){ //move up?
edgeoffset=dropmenuobj.contentmeasure+obj.offsetHeight
if ((dropmenuobj.y-topedge)<dropmenuobj.contentmeasure) //up no good either?
edgeoffset=dropmenuobj.y+obj.offsetHeight-topedge
}
}
return edgeoffset
}

function getmenuhtml(menucontents, param_keys, param_values)
{
  var URL="/ajax/?Action="+menucontents; //+"&service_name="+service_name;
  var param_keys;
  var param_values;

  if (param_keys.length)
    for (i=0;i<param_keys.length;i++)
      URL=URL+"&"+param_keys[i]+"="+param_values[i]
	LoadData(URL,"populatemenu_ajax","menu");
  return;
}

function populatemenu_js(what, param_keys, param_values)
{
  if (ie4||ns6)
  {
	  if (what!="undefined") 
	  {
	    menu_html=what.join("");
	    if (param_keys.length)
	    {
	      for (i=0;i<param_keys.length;i++)
	      {
	        menu_html=menu_html.replace(new RegExp("%"+param_keys[i]+"%", "gim"), param_values[i]);
	      }
	    }
	    dropmenuobj.innerHTML=menu_html;
	  }
  }
}

function populatemenu_ajax()
{
  RequestIndex=FindRequest("menu");
//  alert(RequestIndex);
  if (RequestIndex!==false) {
  	// only if reg shows "complete"
    if (RequestStack[RequestIndex].Request.readyState == 4)
    {
  		// only if "OK"
  		if (RequestStack[RequestIndex].Request.status == 200)
  		{
  			// ...processing statements go here...
  			if (RequestStack[RequestIndex].Request.responseText == null) return false;
  			dropmenuobj.innerHTML=RequestStack[RequestIndex].Request.responseText;
        UnsetRequest("menu");
        return true;
  		}
  	}
  }
  return false;
}
/*onmouseover="return dropdownmenu('user_my_menu',this,event,'ajax',
		['me', 'user_id' ],[1669, 1669 ],'125px');"
onmouseover="return dropdownmenu('user_context_menu',this,event,'ajax',
		['me', 'user_id' ],[1669, 132 ],'125px');"
*/
function dropdownmenu(menucontents, obj, e, gettype, param_keys, param_values, menuwidth)
{

	context_menu_active=1;
	launch_next_menu=0;
	menu_item=obj;
	if (window.event)
		event.cancelBubble=true;
	else if (e.stopPropagation)
		e.stopPropagation();
	clearhidemenu();
	menu_param_keys=param_keys;
	menu_param_values=param_values;
	dropmenuobj=document.getElementById? document.getElementById("dropmenudiv") : dropmenudiv;
	if (ie4||ns6)
	{
		if(e.type=='click')
			showhide(menucontents, false, e.type, "visible", "hidden", menuwidth, gettype);
		else
		{
			var argString = '"'+menucontents+'", '+false+', "'+e.type+'", "visible", "hidden",';
			argString += ' "'+menuwidth+'", "'+gettype+'"';
			var funcString = 'showhide(' + argString + ')';
			drop_menu_timeout=setTimeout(funcString,Menu_timeout);
		}
	}
	return clickreturnvalue();
}

function clickreturnvalue()
{
	if (ie4||ns6) return false
	else return true
}

function contains_ns6(a, b) 
{
	while (b.parentNode)
	if ((b = b.parentNode) == a)
	return true;
	return false;
}

function dynamichide(e)
{
	if (ie4&&!dropmenuobj.contains(e.toElement))
	delayhidemenu()
	else if (ns6&&e.currentTarget!= e.relatedTarget&& !contains_ns6(e.currentTarget, e.relatedTarget))
	delayhidemenu()
}

function hidemenu(e)
{
	context_menu_active=0;
	if(!mouse_on_nick)
 		show_hide_arrow(false,0,menu_type);
	if (typeof dropmenuobj!="undefined")
	{
		if (ie4||ns6)
		{
			dropmenuobj.style.visibility="hidden";
			update_menu=1;
		}
	}
}

function delayhidemenu()
{
	if (ie4||ns6)
	{
		delayhide=setTimeout("hidemenu()",disappeardelay);
		launch_next_menu=1;
	}
}

function clearhidemenu(){
if (typeof delayhide!="undefined")
clearTimeout(delayhide)
}

if (hidemenu_onclick=="yes")
document.onclick=hidemenu

function show_hide_arrow(obj,type,whom)
{
	if(type)
	{
		if(active_nick!=obj)
			update_menu=1;
//		alert('active=' + active_nick+ 'menu_type='+menu_type);
		if(active_nick)
			show_hide_arrow(active_nick,0,menu_type);
		active_nick=obj;
		clearTimeout(delayhide);

	}
	clearTimeout(drop_menu_timeout);
	if(!whom)
		whom='user';
	menu_type=whom;
	var class_type=(whom=='user')?'usernav':'communitynav';
	var class_name=(type)?'m-'+class_type+'-active':'m-'+class_type;
	if(active_nick)
		active_nick.className=class_name;
}
/***********************************************
* Menu Script ends here
***********************************************/

function repeat_changed(id_pefix)
{
	var obj=document.getElementById(id_pefix+'repeat');
	var radio=document.getElementsByName(id_pefix+'position');
	for(var i=0;i<radio.length;i++)
	{
		if(obj.value=='repeat')
		{
			radio[i].disabled=true;
			continue;
		}
		if(obj.value=='repeat-x')
		{
			switch(radio[i].value)
			{
				case 'top left':
				case 'center left':
				case 'bottom left':
					radio[i].disabled=false;
					break;
				default:
					radio[i].disabled=true;
					break;
			}
			continue;
		}
		if(obj.value=='repeat-y')
		{
			switch(radio[i].value)
			{
				case 'top left':
				case 'top center':
				case 'top right':
					radio[i].disabled=false;
					break;
				default:
					radio[i].disabled=true;
					break;
			}
			continue;
		}
		radio[i].disabled=false;
		continue;
	}
}

/***********************************************
* FAVORITES AJAX functions
***********************************************/
var favorites = new Array();

var fav_ajax_big_indicator_img = portal_url+"img/sandglass.gif";
var fav_add_big_img = portal_url+"img/fav.gif";
var fav_remove_big_img = portal_url+"img/fav-off.gif";

var fav_ajax_indicator_img = portal_url+"img/sandglass-small.gif";
var fav_remove_img = portal_url+"img/fav-small-off.gif";
var fav_add_img = portal_url+"img/fav-small.gif";

var prev_img = '';

function addToFavArray(type, id_info, img_size, change_link, id_fav)
{
  var idx = favorites.length;
  favorites[idx] = new Object();
  favorites[idx].type = type;
  favorites[idx].id_info = id_info;
  favorites[idx].img_size = img_size;
  favorites[idx].change_link = change_link;
  favorites[idx].id_fav = id_fav;
}

function FindFav(type, id_info)
{
	var found_idx=false;
	for(var i=0;i<favorites.length;i++)
	{
		if(favorites[i].type==type && favorites[i].id_info==id_info)
		{
			found_idx=i;
			break;
		}
	}
	return found_idx;
}

function Fav(type, id_info)
{
  idx = FindFav(type, id_info);

  if (idx !== false)
  {
    type = favorites[idx].type;
    id_info = favorites[idx].id_info;
    img_size = favorites[idx].img_size;
    id_fav = favorites[idx].id_fav;
   // REMOVE -----------------------------
    if (id_fav > 0)
    {
      var action = "removefav";
      var return_func = "RemoveFavRequestProcessing";
      var req_name = "RemoveFav";
    }
    // ADD --------------------------------
    else
    {
      var action = "add2fav";
      var return_func = "Add2FavRequestProcessing";
      var req_name = "Add2Fav";
    }

    var fimg = document.getElementById('fav_img_'+type+'_'+id_info);
    if (fimg) {
      prev_img = fimg.src;
      if (img_size == 'big') fimg.src = fav_ajax_big_indicator_img;
      else fimg.src = fav_ajax_indicator_img;
    }
    var URL="/ajax/?Action="+action+"&type="+type+"&id_info="+id_info+"&id_fav="+id_fav+"&idx="+idx;
    LoadData(URL, return_func, req_name);
  }
}

function Add2FavRequestProcessing() {return FavRequestProcessing("Add2Fav");}
function RemoveFavRequestProcessing() {return FavRequestProcessing("RemoveFav");}

function FavRequestProcessing(req_name)
{
  var Response=GetXMLResponse(req_name);
	if (Response===false) return;
	if (Response==='') return;

  var AN = Response.getElementsByTagName(req_name);

	if (!AN)
	{
		UnsetRequest(req_name);
		return false;
	}

	AN = AN[0];

  //alert(AN);
//  var action = AN.getAttribute('action');
	var res = AN.getAttribute('res');
//	var type  = AN.getAttribute('type');
//	var id_info  = AN.getAttribute('id_info');
  var idx  = AN.getAttribute('idx');
//	var idx  = FindFav(type, id_info);

  if (favorites[idx]) {
    var type  = favorites[idx].type;
    var id_info  = favorites[idx].id_info;
    var img_size = favorites[idx].img_size;
    var change_link = favorites[idx].change_link;

    var flink = document.getElementById('fav_link_'+type+'_'+id_info);
    var fimg = document.getElementById('fav_img_'+type+'_'+id_info);

  	UnsetRequest(req_name);
    // -----------------------------
    if (req_name == "Add2Fav")
    {
      if (res<0)
      {
        // too many requests
        if (prev_img) fimg.src = prev_img;
        flink.title = fav_too_much;
        fimg.alt = fav_too_much;
        alert(fav_too_much);
        return false;
      }
      else if (res>0)
      {
        favorites[idx].id_fav = res;
        if (change_link) flink.innerHTML = fav_remove;
        flink.title = fav_remove;
        if (img_size == 'big') {fimg.src = fav_remove_big_img;}
        else {fimg.src = fav_remove_img;}
        fimg.alt = fav_remove;
      }
    }
    // -----------------------------
    else if (req_name == "RemoveFav")
    {
      if (res == 1)
      {
        favorites[idx].id_fav = 0;
        if (change_link) flink.innerHTML = fav_add;
        flink.title = fav_add;
        if (img_size == 'big') {fimg.src = fav_add_big_img;}
        else {fimg.src = fav_add_img;}
        fimg.alt = fav_add;
      }
    }
  }
  return res;
}


/***********************************************
* Additional functions
***********************************************/
function jsTrim(str){
	return str.replace(/^\s+/,'').replace(/\s+$/,'')
}

function jsStripTags(str){
	var re= /<\S[^><]*>/g		
	return str.replace(re, "")		
}

function js_in_array(what, arr){
  var i;
  if (!arr.length)
    return false;

  for(i in arr){
    if (arr[i].toLowerCase() == what.toLowerCase()){
      return true;
    }
  }
  return false;
}

function getBodyScrollTop()
{
  return self.pageYOffset || (document.documentElement && document.documentElement.scrollTop) || (document.body && document.body.scrollTop);
}

function getBodyScrollLeft()
{
  return self.pageXOffset || (document.documentElement && document.documentElement.scrollLeft) || (document.body && document.body.scrollLeft);
}

function getClientWidth()
{
  return document.compatMode=='CSS1Compat' && !window.opera?document.documentElement.clientWidth:document.body.clientWidth;
}

function getClientHeight()
{
  return document.compatMode=='CSS1Compat' && !window.opera?document.documentElement.clientHeight:document.body.clientHeight;
}

function moveCaretToStart(inputObject)
{
  if (inputObject.createTextRange)
  {
   var r = inputObject.createTextRange();
   r.collapse(true);
   r.select();
  }
}

function moveCaretToEnd(inputObject)
{
  if (inputObject.createTextRange)
  {
   var r = inputObject.createTextRange();
   r.collapse(false);
   r.select();
  }
}


function getPageScroll()
{
	var yScroll = 0;

	if (self.pageYOffset) {
		yScroll = self.pageYOffset;
	} else if (document.documentElement && document.documentElement.scrollTop){	 // Explorer 6 Strict
		yScroll = document.documentElement.scrollTop;
	} else if (document.body) {// all other Explorers
		yScroll = document.body.scrollTop;
	}

	return yScroll;
}


function getPageSize(){

	var xScroll, yScroll;

	if (window.innerHeight && window.scrollMaxY) {
		xScroll = document.body.scrollWidth;
		yScroll = window.innerHeight + window.scrollMaxY;
	} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
		xScroll = document.body.scrollWidth;
		yScroll = document.body.scrollHeight;
	} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
		xScroll = document.body.offsetWidth;
		yScroll = document.body.offsetHeight;
	}

	var windowWidth, windowHeight;
	if (self.innerHeight) {	// all except Explorer
		windowWidth = self.innerWidth;
		windowHeight = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	} else if (document.body) { // other Explorers
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	}

	// for small pages with total height less then height of the viewport
	if(yScroll < windowHeight){
		pageHeight = windowHeight;
	} else {
		pageHeight = yScroll;
	}

	// for small pages with total width less then width of the viewport
	if(xScroll < windowWidth){
		pageWidth = windowWidth;
	} else {
		pageWidth = xScroll;
	}

	arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight)
	return arrayPageSize;
}



function hideSelect(obj,form,type)
{
	if(isMozilla)
		return;
	if(type==1)
		var show='hidden';
	else
		var show='visible';
//	var form=document.all.appearance_form;
	var left=obj.offsetLeft;
	var top=obj.offsetTop;
	var obj1=obj;
	while(obj1.offsetParent){
		top+= obj1.offsetParent.offsetTop;
		left+= obj1.offsetParent.offsetLeft;
		obj1 = obj1.offsetParent;
	}
	var bottom=top-(-obj.scrollHeight);
		var right=left-(-obj.scrollWidth);
	for(var i=0;i<form.elements.length;i++)
	{
		if(form[i].type=='select-one')
		{
			fl=form[i].offsetLeft;

			ft=form[i].offsetTop;
			obj1=form[i];
			while(obj1.offsetParent){
				ft+= obj1.offsetParent.offsetTop;
				fl+= obj1.offsetParent.offsetLeft;
				obj1 = obj1.offsetParent;
			}
			fb=ft-(-form[i].scrollHeight);
			fr=fl-(-form[i].scrollWidth);
//			alert(left+","+top+"  "+right+","+bottom+"\n"+fl+","+ft+"  "+fr+","+fb);
//			alert(ft+","+bottom+"  "+fb+","+top+"  "+fl+","+right+"  "+fr+","+left);
			if(ft<bottom && fb>top && fl<right && fr>left)
			{
				form[i].style.visibility=show;
			}
		}
	}
}

function coCheckEmail(email){
	var emailTest = "^[_\\.0-9A-Za-z-]+@([0-9A-Za-z][0-9A-Za-z_-]+\\.)+[A-Za-z]{2,4}$";
	var regex = new RegExp(emailTest);
	if (!regex.test(email) || !(email.length > 0))
		return false;

	return true;
}


/***********************************************
* Adding/Removing From Contacts
***********************************************/
// in_contacts: 1 - in contact list, 0 - not in contact list
var IdProcessingArray = new Array();
var IdContactStatuses = new Array();
function ContactsRequest(id_user_, in_contacts, userNickObj)
{
	var c_obj = document.getElementById('id_contact_link_'+id_user_);
  c_obj.style.color='red';
  if (!c_obj.in_contacts)
     c_obj.in_contacts = in_contacts;

 if (!IdContactStatuses[id_user_])
  IdContactStatuses[id_user_] = in_contacts;


  if (IdContactStatuses[id_user_] == 0)
    c_obj.innerHTML = str_contact_adding;
  else
    c_obj.innerHTML = str_contact_removing;

  if (IdProcessingArray[id_user_])
  	return false;

  IdProcessingArray[id_user_] = 1;
	var URL="/ajax/?Action=contact&id_user_="+id_user_;
	LoadData(URL,"ContactsRequestProcessing","ContactsRequest");
}


function ContactsRequestProcessing(){
  var Response=GetXMLResponse("ContactsRequest");
	if (Response===false) return;
	if (Response==='') return;
  var AN = Response.getElementsByTagName("ContactsRequest");
	if (!AN)
	{
		UnsetRequest("ContactsRequest");
		return false;
	}
	AN = AN[0];
	var id_user_     = AN.getAttribute('id_user_');
  var in_contacts  = AN.getAttribute('in_contacts');

	var c_obj = document.getElementById('id_contact_link_'+id_user_);
  c_obj.style.color='';
  IdProcessingArray[id_user_] = 0;
  IdContactStatuses[id_user_] = in_contacts;

  if (IdContactStatuses[id_user_] == 0)
    c_obj.innerHTML = str_contact_add;
  else
    c_obj.innerHTML = str_contact_remove;

  UnsetRequest("ContactsRequest");
}
}

onLoadHandlers['show_homepage_icon'] = showHomepageIcon;


/***********************************************
* 
*	Deema functions
*
***********************************************/

function $(element) {
	if (arguments.length > 1) {
		for (var i = 0, elements = [], length = arguments.length; i < length; i++)
			elements.push($(arguments[i]));
		return elements;
	}
	if (typeof element == 'string')
		element = document.getElementById(element);
	return element;
}

function makeUrl(url, args, drop_params)
{
	var url_args = [];
	if( url.match(/^([^?]*)\?(.+)/) )
	{
		url = RegExp.$1;
		var url_params = RegExp.$2.split(/&/);
		if (!drop_params)
		{
			for(var i = 0;i<url_params.length; i++)
			{
				var url_param = url_params[i].split(/=/,2);
				if( !( url_param[0] in args) )
					url_args.push(url_params[i]);
			}
		}
	}
	if( 'object' == typeof args )
	{
		var res = [];
		for( var i in args )
		{
			if ( i == 'map' || i == 'grep' || i == 'foreach' || i == 'keyOf' )
				continue;		
			res.push( i + '=' + escape(args[i]) );
		}
		args = res;
	}
	url_args = url_args.concat(args).join('&');
	if( url != '' && url_args != '')
		url = url + (url.match(/\?/) ? "&" : "?");
	return url + url_args;
}


/**
*	Dump any variable (objects, complicated hashes) into string. Usefull for debug.
*
*	@param		variable		mixed		variable to dump
*
*	@return		string
*/
function dump(variable,level)
{
	if (level == null)
		level = 1;

	var s = '';
	
	if (typeof(variable) == "object")
	{
		s += typeof(variable) + " {\n";
		for (var k in variable)
		{
			for (var i=0; i<level; i++)
			{
				s += "  ";
			}

			s += k+": " + dump(variable[k], level+1);
		}

		for (var i=0; i<level-1; i++)
		{
			s += "  ";
		}

		s += "}\n"
	}
	else
	{
		s += "" + variable + "\n";
	}
	return s;
}

/**
/*	Set class
*/
function cmnSet_class ( eOn, sClass_name, sInstead ) {
	if ( eOn ) {
		sClass_name = ( sClass_name.length ) ? sClass_name.replace( /(^\s+|\s+$)/, "" ) : "";
		if ( eOn.className.length ) {
			var sOld = sClass_name;
			if ( sInstead && sInstead.length ) {
				sInstead = sInstead.replace( /\s+(\S)/g, "|$1" );
				if ( sOld ) {
					sOld += "|";
				}
				sOld += sInstead;
			}
			eOn.className = eOn.className.replace( new RegExp("(^|\\s+)(" + sOld +")($|\\s+)", "g"), "$1" );
		}
		eOn.className += ( eOn.className.length && sClass_name ? " " : "" ) + sClass_name;
		//alert( eOn.className );
	}
}

/**
/*	Switch class
*/
function cmnSwitch_class ( eOn, sClass_name, sInstead ) {
	if (cmnMatch_class( eOn,sClass_name )) {
		cmnSet_class( eOn, sInstead, sClass_name );
	} else {
		cmnSet_class( eOn, sClass_name, sInstead );
	}
}

/**
/*	Remove class
*/
function cmnRemove_class( eOn, sClass_name ){
	cmnSet_class( eOn, "", sClass_name );
}

/**
/*	Match class
*/
function cmnMatch_class( eOn, sClass_name ){

	return ( sClass_name && eOn.className && eOn.className.length && eOn.className.match( new RegExp("(^|\\s+)(" + sClass_name +")($|\\s+)") ) );

}