/*
 *  Status box/area mangling © 2006-2009, Horus Web Engineering Ltd
 *
 *  $Id: status.js,v 1.15 2009-12-11 17:42:59 horus Exp $
 *
 *  licensed under the terms of the GNU Lesser General Public License:
 *    http://www.opensource.org/licenses/lgpl-license.php
 *
 *  needs horus.js, dom.js
 *  uses popover.js if popover is enabled
 *
 */

horus.script.load('dom');


horus.status         = function () { horus.status._add(arguments, false, false) };
horus.status.at      = function () { horus.status._add(arguments, false, true) };
horus.status.set     = function () { horus.status._add(arguments, true, false) };
horus.status.set.at  = function () { horus.status._add(arguments, true, true) };
horus.status.add     = function () { horus.status._add(arguments, null, false) };
horus.status.add.at  = function () { horus.status._add(arguments, null, true) };

horus.status.show    = function () { return horus.status._show(horus.status.box()) };
horus.status.hide    = function () { return horus.status._hide(horus.status.box()) };
horus.status.visible = function () { return horus.status.box()._visible };


horus.status.clear=
  function ( classname ) {
    horus.status._clear(horus.status.box(classname));
  };


horus.status.pending=
  function ( classname ) {
    horus.status._clear(horus.status.box(), true, classname);
  };


horus.status.group=
  function ( grouped, clear ) {
    if (grouped==null) grouped=true;
    if (clear==null) clear=grouped;
    var visible=horus.status.visible();

    if (clear) {
      var classname;
      if (typeof clear!='boolean') classname=clear;
      horus.status.clear(classname);
    }

    horus.status.grouped=grouped;
    horus.status.displayed={};
    return visible;
  };


horus.status.box=
  function ( classname ) {
    var status=horus.status.node;

    if (!status) {
      status=document.getElementById('statusbox');

      if (!status) {
	status=document.getElementById('content');
	if (!status) status=document.getElementById('admincontent');
	if (!status) status=document.body;

	status=horus.insertChild
	  (status,
	   [ 'div',
	     { id: 'statusbox', classname: 'error', style: { display: 'none' } } ]);

      }

      if (status._content==null) {
	status._content=horus.firstTag
	  (horus.firstTag(status, 'form') || status, 'div.error') || status;

	status._popover=horus.hasClass(status, 'popover');
      }

      horus.status.node=status;
    }

    if (classname!=null) status._content.className=classname;
    return status;
  };


horus.status._show=
  function ( status ) {
    if (status._visible) return;

    if (status._popover) {
      var windowpos=horus.windowpos();
      var pos={ moveable: true, focus: false };

      if (horus.status._focus)
	pos.reference=horus.status._focus;
      else {
	pos.y=horus.status.yoffset;
	pos.x=horus.status.xoffset;
      }

      horus.popover(status, pos);
    } else
      status.style.display='block';

    status._visible=true;
    return false;
  };


horus.status._hide=
  function ( status ) {
    if (!status._visible) return;

    if (status._popover)
      horus.popover.hide(status);
    else
      status.style.display='none';

    status._visible=false;
    return false;
  };


horus.status._clear=
  function ( status, pending, classname ) {
    if (pending) {
      horus.status._pending=true;
      horus.status._classname=classname;
    } else {
      horus.status._pending=false;

      if (horus.status._classname!=null) {
	status._content.className=horus.status._classname;
	horus.status._classname=null;
      }

      horus.removeContents(status._content);
      horus.status._hide(status);
    }
  };


horus.status._add=
  function ( argv, classname, node ) {
    var argc=argv.length;
    var offset=0;
    var clear=classname!=null;

    if (clear)
      if (classname)
	classname=argv[offset++];
      else
	classname='error';

    var status=horus.status.box(classname);
    var focus=node ? argv[offset++] : false;

    if (horus.status.grouped) {
      var tag=horus.toString(horus.toArray(argv).slice(offset));
      if (horus.status.displayed[tag]) return;
      horus.status.displayed[tag]=true;
    }

    horus.status.focus(focus);

    if (clear && !horus.status.grouped || horus.status._pending)
      horus.status._clear(status);

    if (argc<=offset) return;

    if (horus.childText(status._content, true)!='')
      horus.appendChild(status._content, horus.BR);

    var statustext=argv[offset++];

    if (offset==argc && horus.isSimpleValue(statustext) && /</.test(statustext)) {
      horus.appendChild(status._content, [ 'div', null ]).innerHTML=
	new String(statustext).replace(/\n/g, '<br/>');

      horus.status._show(status);
      return;
    }

    for (;;) {
      if (horus.isSimpleValue(statustext)) {
	statustext=new String(statustext).split(/(\n)/, true);

	for (var i=0; i<statustext.length; i++)
	  if (statustext[i]=='\n') statustext[i]=horus.BR;

	horus.appendChild(status._content, statustext, true);
      } else
	horus.appendChild(status._content, statustext);

      if (offset==argc) break;
      statustext=argv[offset++];
    }

    horus.status._show(status);
  };


horus.status.focus=
  function ( node ) {
    if (!node)
      horus.status._focus=null;
    else {
      var node=horus.getElement(node);
      if (node) horus.status._focus=node;
    }
  };


horus.status.init=
  function () {
    var status=document.getElementById('statusbox');

    if (status) {
      horus.status.box();

      if (status._popover) {
	status.style.top=horus.status.yoffset+'px';
	status.style.left=horus.status.xoffset+'px';
	status._visible=status.style.visibility=='visible';
      } else
	status._visible=status.style.display!='none';

    }
  };


horus.status.yoffset=100;
horus.status.xoffset=200;

horus.afterload(horus.status.init);
horus.script.loaded('status');
