document.getElementsByClassName = function(clsName){
    var retVal = new Array();
    var elements = document.getElementsByTagName("*");
    for(var i = 0;i < elements.length;i++){
        if(elements[i].className.indexOf(" ") >= 0){
            var classes = elements[i].className.split(" ");
            for(var j = 0;j < classes.length;j++){
                if(classes[j] == clsName)
                    retVal.push(elements[i]);
            }
        }
        else if(elements[i].className == clsName)
            retVal.push(elements[i]);
    }
    return retVal;
}

function deb(inobj)
{
	op = window.open();
	op.document.open('text/plain');
	for (objprop in inobj) {
	op.document.write(objprop + ' => ' + inobj[objprop] + '\n');
	}
	op.document.close();
}

/**
 * opener - "open or close" element defined by id = itemID;
 */
function showHideItem( itemID )
{
	var item = document.getElementById( itemID );
	item.style.display = item.style.display == 'none' ?	'block' : 'none';
}

function opener( itemID ) { showHideItem( itemID ) }

/**
 * change image's 'src' attribute;
 */
function changeImageSrc( itemID, image1, image2 )
{
	var item = document.getElementById( itemID );
	item.src = item.src == image1 ?	item.src = image2 : image1;
}

/**
 *
 */
function openCloseSubpage( subpageID, imageID, image1, image2 )
{
	showHideItem( subpageID );
	changeImageSrc( imageID, image1, image2 );
}

/**
 * linkQuestion - this function load page determined by address if question is confirmed;
 */
function linkQuestion( address, question )
{
	if( (question && window.confirm(question) == true) || !question )
		window.location.href = address ? address : '#';
}

function action(reciever,name,params,ignoreErrors)
{
	xajax_action(reciever,name,paramsEncode(params),ignoreErrors);
}

function paramsEncode(params)
{
	if ('string' != typeof p) return params;
	var p = params.replace('/','//');
	p = p.replace(':','/:');
	p = p.replace(',','/,');
	return p;
}

//cross-browser event handling
var xb =
{
   evtHash: [],

   ieGetUniqueID: function(_elem)
   {
      if (_elem === window) { return 'theWindow'; }
      else if (_elem === document) { return 'theDocument'; }
      else { return _elem.uniqueID; }
   },
   
   addEvent: function(_elem, _evtName, _fn, _useCapture)
   {
      if (typeof _elem.addEventListener != 'undefined')
      { _elem.addEventListener(_evtName, _fn, _useCapture); }
      else if (typeof _elem.attachEvent != 'undefined')
      {
         var key = '{FNKEY::obj_' + xb.ieGetUniqueID(_elem) +
               '::evt_' + _evtName + '::fn_' + _fn + '}';
         var f = xb.evtHash[key];
         if (typeof f != 'undefined')
            { return; }
            
         f = function()
         {
            _fn.call(_elem);
         };
         
         xb.evtHash[key] = f;
         _elem.attachEvent('on' + _evtName, f);

         // attach unload event to the window to clean up possibly IE memory leaks
         window.attachEvent('onunload', function()
         {
            _elem.detachEvent('on' + _evtName, f);
         });
         
         key = null;
         //f = null;   /* DON'T null this out, or we won't be able to detach it */
      }
      else
         { _elem['on' + _evtName] = _fn; }
   },
   
   removeEvent: function(_elem, _evtName, _fn, _useCapture)
   {
      if (typeof _elem.removeEventListener != 'undefined')
         { _elem.removeEventListener(_evtName, _fn, _useCapture); }
      else if (typeof _elem.detachEvent != 'undefined')
      {
         var key = '{FNKEY::obj_' + xb.ieGetUniqueID(_elem) +
               '::evt' + _evtName + '::fn_' + _fn + '}';
         var f = xb.evtHash[key];
         if (typeof f != 'undefined')
         {
            _elem.detachEvent('on' + _evtName, f);
            delete xb.evtHash[key];
         }
         
         key = null;
         //f = null;   /* DON'T null this out, or we won't be able to detach it */
      }
   }
};
