/*
 *  Item visibility JavaScript © 1996-2010, Horus Web Engineering Ltd
 *
 *  $Id: visible.js,v 1.4 2010-05-13 12:50:33 horus Exp $
 *
 *  licensed under the terms of the GNU Lesser General Public License:
 *    http://www.opensource.org/licenses/lgpl-license.php
 *
 *  needs (and autoloaded from) horus.js
 *
 */


horus.visibility=
  function ( item, visibility ) {
    if (typeof visibility!='string' ||
	!/^(visible|hidden|collapse|inherit)$/.test(visibility))
      visibility=horus.toBoolean(visibility) ? 'visible' : 'hidden';

    if (item instanceof Array)
      for (var i=0; i<item.length; i++)
	horus.getElement(item[i]).style.visibility=visibility;

    else
      horus.getElement(item).style.visibility=visibility;

  };


// update visibility
//
// parameters:
//   1. id or list of ids to hide or show
//   2. optional id or list of ids to hide or restore
//   3. optional new state (default: state of first item in parameter 1 toggled)

horus.visible=
  function ( store ) {
    var restore=[];
    var newstate;
    var single;
    var imagelist=[];
    var argc=arguments.length-1;

    if (!(store instanceof Array)) store=[ store ];

    if (argc>0) {
      var lastarg=arguments[argc];
      var con=lastarg==null ? 'boolean' : typeof lastarg;

      if (con=='boolean' || con=='number' || con=='string' && /^[01]?$/.test(lastarg)) {
	newstate=horus.toBoolean(lastarg) ? '' : 'none';
	argc--;
      } else if (con=='string' && lastarg.match(/^(none|inline|block|single)$/)) {
	if (lastarg=='single')
	  single=horus.getElement(store[0]);
	else
	  newstate=lastarg;

	argc--;
      }

      for (var ptr=argc; ptr>0; ptr--) {
	var arg=arguments[ptr];

	if (arg instanceof Array) {
	  restore=restore.concat(arg);
	} else if (typeof arg=='string') {
	  var img=document.images[arg];

	  if (img)
	    imagelist.push(img);
	  else
	    restore.push(arg);

	} else {
	  alert('horus.js: unrecognised parameter ('+arg+') passed to horus.visible');
	}
      }
    }

    if (newstate==null)
      newstate=horus.getElement(store[0]).style.display=='none' ? '' : 'none';

    var set=[];

    for (ptr=0; ptr<store.length; ptr++) {
      var element=horus.getElement(store[ptr]);
      if (!element) continue;

      horus.visible.savedstate[element.id]=
	element.style.display ? element.style.display : '';

      element.style.display=newstate;
      set[element.id]=true;
    }

    for (ptr=0; ptr<imagelist.length; ptr++) {
      var image=imagelist[ptr];
      var old=Number(image.src.match(/\.(\d+)\.\w+$/)[1]);
      over=newstate=='none' ? old|2 : old&~2;
      image.src=image.src.replace(/\.\d+(\.\w+)$/, '.'+over+'$1');
    }    

    for (ptr=0; ptr<restore.length; ptr++) {
      element=horus.getElement(restore[ptr]);
      if (!element) continue;

      if (newstate=='none')
	element.style.display='none';
      else if (horus.visible.savedstate[element.id])
	element.style.display=horus.visible.savedstate[element.id];

      set[element.id]=true;
    }

    if (single) {
      var theitems=document.getElementsByTagName(single.nodeName);
      var theclass=single.className;

      for (var itemptr=0; itemptr<theitems.length; itemptr++) {
	var thisitem=theitems[itemptr];

	if (thisitem.className==theclass && !set[thisitem.id])
	  thisitem.style.display='none';

      }
    }

    horus.matchHeight();
  };


horus.visible.put=
  function () {
    var theForm=horus.formArgv(arguments, false)[0];
    var visible=theForm._visible.value;
    if (visible.length==0) return;
    visible=visible.split(',', true);

    for (var ptr=0; ptr<visible.length; ptr++)
      horus.visible.savedstate[visible[ptr]]=true;

  };


horus.visible.get=
  function () {
    var visible=[];

    for (var ptr in horus.visible.savedstate)
      if (horus.visible.savedstate[ptr]) visible.push(ptr);

    return visible.join(',');
  };


horus.visible.savedstate=[];
horus.script.loaded('visible');
