function msec()
{
	var d = new Date();
	return  d.valueOf();
}
/*********************************************************
Set/unset check status for group of checkbox elements
*********************************************************/

function checkall(name, ob)
{
	var checkboxes = document.getElementsByName(name);
	if(!checkboxes) return;

	if(checkboxes.length>0)
		for(i=0; i<checkboxes.length; i++)
			checkboxes[i].checked = ob.checked;
	else
		checkboxes.checked = ob.checked;
}

/*********************************************************
Return absolute position of the element
*********************************************************/

function getElementPos(obj)
{
	if (!obj || !obj.offsetParent)
	return false;

	var res=Array()
	res["left"] = obj.offsetLeft;
	res["top"] = obj.offsetTop;
	var objParent = obj.offsetParent;
	while (objParent)
	{
		res["left"] += objParent.offsetLeft;
		res["top"] += objParent.offsetTop;
		objParent = objParent.offsetParent;
	}
	res["right"]=res["left"]+obj.offsetWidth;
	res["bottom"]=res["top"]+obj.offsetHeight;

	return res;
}

/*********************************************************
Return element object
*********************************************************/

function E(id)
{
	if( 'object' == typeof id )
		return id;
	var o = document.getElementById(id);
	if( 'object' != typeof o )
		return null;//debug("Cannot find element#"+id);
	return o;
}

/*********************************************************
Deletes an element object and and its all children if
	deleteChildren is "true", by default "false"
*********************************************************/
function deleteElement( obj, deleteChildren )
{
	if ( deleteChildren )
		for ( var i = 0; i < obj.childNodes.length; i++ )
			deleteElement( document.all ? obj.childNodes( i ) : obj.childNodes[i], deleteChildren );

	return obj.parentNode.removeChild( obj );
}

/*********************************************************
Show object
*********************************************************/

function showElement(ob)
{
	if( 'object' != typeof ob )
	ob = E(ob);
	ob.style.visibility = 'visible';
}

/*********************************************************
Hide object
*********************************************************/

function hideElement(ob)
{
	if( 'object' != typeof ob )
	ob = E(ob);
	ob.style.visibility = 'hidden';
}

/*********************************************************
Redirect
*********************************************************/

function redirect(url)
{
	window.location = url;
}

/*********************************************************
Sets to all elements value
*********************************************************/

function setAll( elements, value )
{
	for( i=0; i < elements.length; i++ )
	elements[i].value = value;
}
/*********************************************************
Create element, append child, set properties
*********************************************************/
function AC (node, newParrent){
	//Operation aborted fix
	if(newParrent)
	{
		return newParrent.appendChild(node);
	}
	if(!document || !document.body)
		return false;
	return document.body.insertBefore(node, document.body.firstChild);
	//return (newParrent || document.body).appendChild(node);
}
function IB(node, newParrent, beforeNode){
	if (beforeNode) return newParrent.insertBefore(node,beforeNode);
	else return newParrent.insertBefore(node,beforeNode);
}
function CE (nodeName, properties){
	var el = document.createElement(nodeName);
	for (var k in properties) {
		if (k == 'style') {
			for (var j in properties[k]) {
				el.style[j] = properties[k][j];
			}
		}
		else {
			el[k] = properties[k];
		}
	}
	return el;
}
function CEAC ( nodeName, parrentNode, properties){
	return AC (CE (nodeName, properties),parrentNode);
}
function CEIB ( nodeName, parrentNode, properties, beforeNode){
	return IB (CE (nodeName, properties),parrentNode,beforeNode);
}
/*********************************************************
Shortcut to create DIV
*********************************************************/

function CDiv(parrentNode, properties) {
	return CEAC('div',parrentNode,properties);
}

/*********************************************************
Shortcut to create DIV
*********************************************************/

includeArray = [];// move to better location but before any ather script
function include(name){
	includeArray.push(name);
}
/*********************************************************
calculate element cordinates relative to document.
*********************************************************/
// getAtributeFromNode x-brouser
function GA(node,atrName){
	if (isMozilla || isOpera) return node.getAttribute(atrName);
	else return node[atrName];
}
// set mouse over mouse out class changing.
// carefull, droping handlers
function MOCC(node,baseClass,overClass){
	node.className = baseClass;
	node.baseClass = baseClass;
	node.overClass = overClass;
	node.onmouseover = function (){this.className = this.overClass;}
	node.onmouseout = function (){this.className = this.baseClass;}
}
function errFocus(text, it)
{
	alert(text);
	it.focus();
	return false;
}


function isUrl(s)
{
	var regexp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
	return regexp.test(s);
}

/**
*	Set opacity level
*
*	@param		obj		object		HTML object
*	@param		level	int			opacity level [0-100]
*
*	@return		void
*/
function setOpacity(obj, level)
{
	if (isMozilla)
		obj.style.MozOpacity = level/100;
	else if (isOpera)
		obj.style.opacity = level/100;
	else
		obj.filters.alpha.opacity = level;
}

/**
*	Returns opacity level
*
*	@param		obj		object		HTML object
*
*	@return		int		opacity [0-100]
*/
function getOpacity(obj)
{
	if (isMozilla)
		return obj.style.MozOpacity * 100;
	else if (isOpera)
		return obj.style.opacity * 100;
	else
		return obj.filters.alpha.opacity;
}

/**
*	Execute JS code in the given html content.
*
*	@param		content		string			HTML content
*
*	@return		void
*/
function evalJS(content, callback)
{
	obj = document.createElement("div");
	obj.innerHTML = content;
	var scriptTags = obj.getElementsByTagName('SCRIPT');
	evalJsItems(scriptTags, 0, callback);
}

function evalJsItems(items, offset, callback)
{
	for(var i=offset; i<items.length; i++)
	{
		if (items[i].src)
		{
			//alert(i + " (src) " + items[i].src);
			//Operation aborted fix
			var s 		= document.body.insertBefore(document.createElement('script'), document.body.firstChild);
			//var s 		= document.body.appendChild(document.createElement('script'));
			s.type 		= "text/javascript";
			s.language	='javascript';
			void(s.src=items[i].src);
			s.onload 	= function(){ evalJsItems(items, i+1, callback) };
			s.onreadystatechange = function(){
				if(s.readyState == 'loaded')
				{
					evalJsItems(items, i+1, callback);
					s.onreadystatechange = function(){}
				}
			}
			return;
		}
		else
		{
			var code = items[i].innerHTML.replace(/(<!--|\/\/-->)/g, "");
			//alert(i + " (eval) " + code);
			try { eval(code); } catch(err) {/*alert('Inline script error '+err.name+ ' : '+err.message);*/}
		}
	}
	if( callback )
		callback();
}

/**
*	Returns document object of the frame
*
*	@param		frame		object			frame object
*
*	@return		object
*/
function getFrameDocument(frame)
{
	var doc;
	if (frame.contentDocument) // For NS6
	{
		doc = frame.contentDocument;
	}
	else if (frame.contentWindow) // For IE5.5 and IE6
	{
		doc = frame.contentWindow.document;
	}
	else if (frame.document) // For IE5
	{
		doc = frame.document;
	}
	else
	{
		debug("Error: could not find frame document");
	}
	return doc;
}

function quoteHTML(s)
{
	if (s)
	{
		s = s.replace(/&/g, '&amp;');
		s = s.replace(/</g, '&lt;');
		s = s.replace(/>/g, '&gt;');
		s = s.replace(/\"/g, '&quot;');
	}
	return s;
}
function checkEmail(email){
	var emailTest = "^[_\\.0-9A-Za-z-]+@([0-9A-Za-z][0-9A-Za-z_-]*\\.)+[A-Za-z]{2,}$";
	var regex = new RegExp(emailTest);
	if (!regex.test(email) || !(email.length > 0))
		return false;

	return true;
}
/**
*	Show popup
*
*	css styles stored at user_css.phtml file at section "Pop-up"
*/
function showPopup(_obj, noCache, dynamic){
	if(_obj == undefined || _obj.id == undefined && typeof(_obj) != 'string'){
		return;
	}
	if(noCache){
		if(E('popup')){
			deleteElement(E('popup'), true);
		}
		if(E('popup-content')){
			deleteElement(E('popup-content'), true);
		}
	}
	if(!E('popup')){
		var pop_up_div = document.createElement("div");
		pop_up_div.id = "popup";
		//Operation aborted fix
		document.body.insertBefore(pop_up_div, document.body.firstChild);
		//document.body.appendChild(pop_up_div);
	}
	if(!E('popup-content')){
		var pop_up_content_div = document.createElement("div");
		pop_up_content_div.id = "popup-content";
		//Operation aborted fix
		document.body.insertBefore(pop_up_content_div, document.body.firstChild);
		//document.body.appendChild(pop_up_content_div);
	}
	E('popup').className = "show";
	E('popup').onmousedown = function(){
		hidePopup();
	}
	E('popup-content').className = "show";
	if(typeof(_obj) != 'string'){
		if(!E(_obj.id+"-content").data){
			E(_obj.id+"-content").data = new Array();
		}
		if(!E(_obj.id+"-content").data[_obj.id+"-content"]){
			E('popup-content').innerHTML = E(_obj.id+"-content").innerHTML;
			if (!dynamic) {
			   E(_obj.id+"-content").data[_obj.id+"-content"] = E(_obj.id+"-content").innerHTML;
			   E(_obj.id+"-content").innerHTML = "";
			}
		}else{
			E('popup-content').innerHTML = E(_obj.id+"-content").data[_obj.id+"-content"];
		}
	}else{
		if(E(_obj).temp == undefined){
			E(_obj).temp = E(_obj).innerHTML;
		}
		E('popup-content').innerHTML = E(_obj).innerHTML;
	}
	//Fixing ie6 "fixed" property
	if((((navigator.userAgent.toLowerCase().indexOf("msie") != -1) && (navigator.userAgent.toLowerCase().indexOf("opera") == -1)) && (parseInt(navigator.appVersion) == 4) && (navigator.userAgent.toLowerCase().indexOf("msie 6.")!=-1) )){
		window.onscroll = function(){ var scrolltop = document.documentElement.scrollTop; document.getElementById("popup").style.top = scrolltop+'px'; document.getElementById("popup-content").style.top = 140+scrolltop+'px'; }
		window.onscroll();
	}
}
function hidePopup(){
	E('popup').className = "hide";
	E('popup-content').className = "hide";
	window.onscroll = "";
}


/*********************************************************
Functions from prototype.js
*********************************************************/
var Prototype2 = {
  K: function(x) { return x }
}

var $break = {}, $continue = new Error('"throw $continue" is deprecated, use "return" instead');

Object.extend = function(destination, source) {
	for (var property in source) {
		destination[property] = source[property];
	}
	return destination;
}

function $A(iterable) {
	if (!iterable) return [];
	var results = [];
	for (var i = 0, length = iterable.length; i < length; i++)
		results.push(iterable[i]);
	return results;
}

Object.extend(Array.prototype, {
	_each: function(iterator) {
		for (var i = 0, length = this.length; i < length; i++)
			iterator(this[i]);
	},

	foreach: function(iterator) {
		var index = 0;
		try {
			this._each(function(value) {
				iterator(value, index++);
			});
		} catch (e) {
			if (e != $break) throw e;
		}
		return this;
	}
});

function Hash(object) {
	if (object instanceof Hash) {
		this.merge(object);
	} else {
		Object.extend(this, object || {});
	}
};

Object.extend(Hash, {
	toQueryString: function(obj) {
		var parts = [];
		parts.add = arguments.callee.addPair;

    this.prototype._each.call(obj, function(pair) {
      if (!pair.key) return;
      var value = pair.value;

      if (value && typeof value == 'object') {
        if (value.constructor == Array) value.each(function(value) {
          parts.add(pair.key, value);
        });
        return;
      }
      parts.add(pair.key, value);
    });

    return parts.join('&');
  },

  toJSON: function(object) {
    var results = [];
    this.prototype._each.call(object, function(pair) {
      var value = Object.toJSON(pair.value);
      if (value !== undefined) results.push(pair.key.toJSON() + ': ' + value);
    });
    return '{' + results.join(', ') + '}';
  }
});

Hash.toQueryString.addPair = function(key, value, prefix) {
	key = encodeURIComponent(key);
	if (value === undefined) this.push(key);
	else this.push(key + '=' + (value == null ? '' : encodeURIComponent(value)));
}

Object.extend(Hash.prototype, {
  _each: function(iterator) {
    for (var key in this) {
      var value = this[key];
      if (value && value == Hash.prototype[key]) continue;

      var pair = [key, value];
      pair.key = key;
      pair.value = value;
      iterator(pair);
    }
  },

  foreach: function(iterator) {
    try {
      this._each(function(pair) {
        iterator(pair.value, pair.key);
      });
    } catch (e) {
      if (e != $break) throw e;
    }
    return this;
  },

  keys: function() {
	return this.pluck('key');
  },

  values: function() {
    return this.pluck('value');
  },

  merge: function(hash) {
    return $H(hash).inject(this, function(mergedHash, pair) {
      mergedHash[pair.key] = pair.value;
      return mergedHash;
    });
  },

  remove: function() {
    var result;
    for(var i = 0, length = arguments.length; i < length; i++) {
      var value = this[arguments[i]];
      if (value !== undefined){
        if (result === undefined) result = value;
        else {
          if (result.constructor != Array) result = [result];
          result.push(value)
        }
      }
      delete this[arguments[i]];
    }
    return result;
  },

  toQueryString: function() {
    return Hash.toQueryString(this);
  },

  inspect: function() {
    return '#<Hash:{' + this.map(function(pair) {
      return pair.map(Object.inspect).join(': ');
    }).join(', ') + '}>';
  },

  toJSON: function() {
    return Hash.toJSON(this);
  }
});

function $H(object) {
	if (object instanceof Hash) return object;
	return new Hash(object);
};

// Safari iterates over shadowed properties
if (function() {
  var i = 0, Test = function(value) { this.key = value };
  Test.prototype.key = 'foo';
  for (var property in new Test('bar')) i++;
  return i > 1;
}()) Hash.prototype._each = function(iterator) {
  var cache = [];
  for (var key in this) {
    var value = this[key];
    if ((value && value == Hash.prototype[key]) || cache.include(key)) continue;
    cache.push(key);
    var pair = [key, value];
    pair.key = key;
    pair.value = value;
    iterator(pair);
  }
};

function getStyle(element, style) {
	element = $(element);
	var value = element.style[style];
	if (!isMSIE) {
		if (!value) {
			var css = document.defaultView.getComputedStyle(element, null);
			value = css ? css[style] : null;
		}
		return value == 'auto' ? null : value;
	} else {
		var value = element.style[style];
		if (!value && element.currentStyle) value = element.currentStyle[style];
		return value;
	}
}

function getDimensions(element) {
	element = $(element);
	var display = getStyle(element,'display');
	if (display != 'none' && display != null) // Safari bug
		return {width: element.offsetWidth, height: element.offsetHeight};

	// All *Width and *Height properties give 0 on elements with display none,
	// so enable the element temporarily
	var els = element.style;
	var originalVisibility = els.visibility;
	var originalPosition = els.position;
	var originalDisplay = els.display;
	els.visibility = 'hidden';
	els.position = 'absolute';
	els.display = 'block';
	var originalWidth = element.clientWidth;
	var originalHeight = element.clientHeight;
	els.display = originalDisplay;
	els.position = originalPosition;
	els.visibility = originalVisibility;
	return {width: originalWidth, height: originalHeight};
}

function getHeight(element) {
	return getDimensions(element).height;
}

var Position = {
	cumulativeOffset: function(element) {
		var valueT = 0, valueL = 0;
		do {
			valueT += element.offsetTop  || 0;
			valueL += element.offsetLeft || 0;
			element = element.offsetParent;
		} while (element);
		return [valueL, valueT];
	},

	offsetParent: function(element) {
		if (element.offsetParent) return element.offsetParent;
		if (element == document.body) return element;

		while ((element = element.parentNode) && element != document.body)
			if (Element.getStyle(element, 'position') != 'static')
				return element;

		return document.body;
	}
}

Object.extend(Array.prototype, {
	without: function() {
		var values = $A(arguments);
		return this.select(function(value) {
			return !values.include(value);
			});
	},

	uniq: function() {
		if (this.length < 2)
			return this;
		var uniq_array = [this[0]];
		for (var i = 1; i < this.length; i++) {
			var repeat = false;
			for (var j = 0; j < uniq_array.length; j++) {
				if (this[i] === uniq_array[j])
					repeat = true;
			}
			if (!repeat)
				uniq_array.push(this[i]);
		}
		return uniq_array;
	}
});

Object.extend(String.prototype, {
	strip: function() {
		return this.replace(/^\s+/, '').replace(/\s+$/, '');
	}
});

var Enumerable = {
	each: function(iterator) {
		var index = 0;
		try {
			this._each(function(value) {
				iterator(value, index++);
			});
		} catch (e) {
			if (e != $break) throw e;
		}
		return this;
	},

	include: function(object) {
		var found = false;
		this.each(function(value) {
			if (value == object) {
				found = true;
				throw $break;
			}
		});
		return found;
	},

	select: function(iterator) {
		var results = [];
		this.each(function(value, index) {
			if (iterator(value, index))
				results.push(value);
		});
		return results;
	},

  map: function(iterator) {
    var results = [];
    this.each(function(value, index) {
      results.push((iterator || Prototype2.K)(value, index));
    });
    return results;
  },

  pluck: function(property) {
    var results = [];
    this._each(function(value, index) {
      results.push(value[property]);
    });
    return results;
  }

}

Object.extend(Array.prototype, Enumerable);
Object.extend(Hash.prototype, Enumerable);

function toggle(element) {
	element = $(element);
	if (!element)
		return false;

	if (element.style.display != 'none') {
		element.style.display = 'none';
	} else {
		element.style.display = '';
	}

	return element;
}

function showUserActions( to, nick, action ) {
    //alert(nick);
    function obj( obj_id) { this.id = obj_id; }
    var tmpObj = new obj(action);

    var a_to = document.getElementById(action+'_to');
    var a_nick = document.getElementById(action+'_nick');
    var a_nick_span = document.getElementById(action+'_nick_span');

    a_to.value = to;
    a_nick.value = nick;
    a_nick_span.innerHTML = nick;

    showPopup(tmpObj, 1, 1);
}