/*
   $Id: menu1.js,v 1.24 2007/08/04 21:53:24 flip Exp $ 


   menu1.js -- Projäggd Menu 1 JavaScript Code


   Copyright (c) 2007 Philippe Kehl <phkehl at gmx dot net>
   All rights reserved.



   Credits/Ressources:

   - http://www.w3schools.com/js/default.asp
   - http://www.w3schools.com/jsref/
   - http://www.hunlock.com/blogs (/Mastering_Javascript_Arrays)
   - http://www.quirksmode.org/dom/getstyles.html



   TODO:

   - split pics into pages (1..20, 21..40, ...)

   - auto-repeat on prev/next	

   - play/stop icon in big view (slideshow)

   - (catch window size changes)

   - implement "smooth" switching (accelerated)

   - disabling events does not work in bloody ie

   - key presses do not work in ie


   http://www.hunlock.com/blogs/Ten_Javascript_Tools_Everyone_Should_Have


*/
 
var m1_ids = new Array();   /* ids of small pictures divs */
var m1_big = new Array();   /* src/w/h of big pictures */

var m1_c_default = {        /* configuration defaults */
  stack2_off: { h: 3,       /* horizontal and vertical offsets of pics */
                v: 4 },     /* for 'stack2' */
  stack1_fuzz: 15,          /* max offset from center of cards for 'stack1' */
  order_pad: { h: 10,       /* padding between pics for 'order' */
               v: 10 },
  padding: { t: 5, r: 10,   /* padding used in window (center, arrange) */
             b: 10, l: 10 },
  arr_style: 'shuffle',     /* default (and current) arrangment style */
  switch_speed: 30,
  speed: function(a, b)     /* arrangment speed (a = current, b = total) */
  {  return(20);  }
  /* speed: function(a, b)
     { return(5 + Math.floor(Math.sqrt(a + 1) / Math.sqrt(b) * 100)); } */
};

/* hold configuration and various global variables and states */
var m1_c = { images_loaded: false };

/*
  This prototype is provided by the Mozilla foundation and
  is distributed under the MIT license.
  http://www.ibiblio.org/pub/Linux/LICENSES/mit.license
*/

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}


/* Method that centers the element on the screen
   optionally with respect to padding */

DDObj.prototype.center = function(padding)
{
  if (typeof padding == 'undefined') padding = { t: 0, r: 0, b: 0, l: 0 };
  var cx = dd.getScrollX()
         + dd.Int( (dd.getWndW() - this.w - padding.l - padding.r) / 2 )
         + padding.l;
  var cy = dd.getScrollY()
         + dd.Int( (dd.getWndH() - this.h - padding.t - padding.b) / 2 )
         + padding.t;
  if (cx < padding.l) cx = padding.l;
  if (cy < padding.t) cy = padding.t;
  this.moveTo( cx, cy );
  return;
};


/* Method that limits the dragging to the window borders,
   optionally with respect to padding */

DDObj.prototype.limitDrag = function(padding)
{
  if (typeof padding == 'undefined') padding = { t: 0, r: 0, b: 0, l: 0 };

  this.maxoffl = this.defx - padding.l;
  this.maxoffr = dd.getWndW() - this.defx - this.w - padding.r;
  this.maxofft = this.defy - padding.t;
  this.maxoffb = dd.getWndH() - this.defy - this.h - padding.b;
  return;
};

DDObj.prototype.resetZ = function()
{
  this.setZ(this.defz);
  return;
};


/* initialises stuff */

function m1_init(config)
{

  if (typeof config == 'undefined')
    m1_c = m1_c_default;

  /* add DHTML elements
     (remember: only layers, images need to be initialised in SET_DHTML()) */

  SET_DHTML(CURSOR_HAND, 'bigpic'+NO_DRAG, 'bigimg'+NO_DRAG,
	    'bigicons'+NO_DRAG, 'bigdesc'+NO_DRAG,
	    'bigdate'+NO_DRAG, 'dark'+NO_DRAG,
	    'about', 'title'+NO_DRAG, 'toolbar'+NO_DRAG,
	    'smallpics'+NO_DRAG, 'info', 'loading'+NO_DRAG);


  dd.elements.loading.center();
  dd.elements.loading.defz = 9999; 
  dd.elements.loading.resetZ();
  dd.elements.loading.show();

  /* run images preload routine */
  m1_c.images_loaded = false;
  setTimeout('m1_preload()', 10);


  dd.elements.toolbar.hide();
  dd.elements.toolbar.defz = 9100;
  dd.elements.toolbar.resetZ();

  dd.elements.dark.defz = 9200;
  dd.elements.dark.resetZ();
  m1_c.dark = 0;

  dd.elements.bigpic.hide();
  dd.elements.bigpic.defz = 9300;
  dd.elements.bigpic.resetZ();

  dd.elements.bigimg.hide();
  dd.elements.bigimg.defz = 9310;
  dd.elements.bigimg.resetZ();
  
  dd.elements.bigdesc.hide();
  dd.elements.bigdesc.defz = 9320;
  dd.elements.bigdesc.resetZ();

  dd.elements.bigdate.hide();
  dd.elements.bigdate.defz = 9325;
  dd.elements.bigdate.resetZ();

  dd.elements.bigicons.hide();
  dd.elements.bigicons.defz = 9330;
  dd.elements.bigicons.resetZ();

  dd.elements.about.hide();
  dd.elements.about.defz = 9500;
  dd.elements.about.resetZ();

  dd.elements.info.hide();
  dd.elements.info.defz = 9700;
  dd.elements.info.resetZ();

  dd.elements.title.hide();
  dd.elements.title.defz = 9900;
  dd.elements.title.resetZ();


  dd.elements.smallpics.hide();

  /* add toolbar and title height to window padding */

  if (dd.elements.title.h > dd.elements.toolbar.h)
    m1_c.padding.t += dd.elements.title.h;
  else
    m1_c.padding.t += dd.elements.toolbar.h;

  m1_c.cur_big = -1;

  /* initialise small pics */

  var i = 0;
  for (i = 0; i < m1_ids.length; i++)
    {
      ADD_DHTML(m1_ids[i]);
      dd.elements[m1_ids[i]].setPickFunc(m1_smallPickFunc);
      dd.elements.smallpics.addChild(m1_ids[i]);
      dd.elements[m1_ids[i]].m1_idx = i;
      m1_c.top = i;
      dd.elements.smallpics.m1_maxz = i;
    }
  
  return;
}


function m1_preload()
{

  /* wait until all imges have loaded (if browser has document.images)
     FIXME: this is not accurate since document.images includes
            duplicate images (e.g. the zoom icon)

  */

  m1_c.images_loaded = false;
  if (typeof document.images != 'undefined')
    {
      n_loaded = 0;
      for (i = 0; i < document.images.length; i++)
	{
	  if (document.images[i].complete == true) n_loaded++;
	}
      if (n_loaded < document.images.length)
	{
	  p_loaded = Math.floor(n_loaded / document.images.length * 100);
	  document.getElementById('loadingtext').innerHTML = p_loaded + '%';
	  setTimeout('m1_preload()', 250);
	  return;
	}
      else
	{
	  document.getElementById('loadingtext').innerHTML = '&nbsp;';
	  m1_c.images_loaded = true;
	  dd.elements.loading.hide();
	}
    }

  return;
}



/* toggles the display of the about and info box */

function m1_toggle(element)
{
  var el = dd.elements[element];

  if (!el.visible)
    {
      m1_dark();


      if (dd.elements.toolbar.visible || dd.elements.title.visible)
	{
	  el.center(m1_c.padding);
	  el.resetZ();
	  el.center(m1_c.padding);
	  el.limitDrag(m1_c.padding);
	}
      else
	{
	  el.center();
	  el.limitDrag({t: 10, r: 10, b: 10, l: 10});
	}
      el.show();
    }
  else
    {
      el.hide();
      m1_undark();
    }
  return;
}


/* keeps track of which item is on top, changes style of active pic  */

function m1_smallPickFunc()
{
  var sp = dd.elements.smallpics;
  if (m1_c.arr_style != 'order')
    sp.children[m1_c.top].div.className = 'small';
  m1_c.top = this.m1_idx;
  if (m1_c.arr_style != 'order')
    sp.children[this.m1_idx].div.className = 'smallactive';
  this.setZ(++sp.m1_maxz);
  return;
}


/* put previous/next pic to the front */

/* switches n pics, where 
   n > 0      = forward
   n < 0      = backwards 
   n == 0     = abort switching 
   n >= 10000 = absolute switching to #n-10000

   state variable: m1_c.switching (bool)  switching going on
                   m1_c.switch_n  (int)   target
*/

function m1_switch(n)
{
  var sp = dd.elements.smallpics;

  if (typeof n == 'number') /* determine target # */
    {
      if (n == 0)
	n = m1_c.top;
      else
	if (m1_c.switching)
	  n = m1_c.switch_n + (n*m1_c.sort);
	else
	  n = m1_c.top + (n*m1_c.sort);
      
      /* check limits, do not wrap */
      if (n < 0) n = 0;
      if (n > sp.children.length-1) n = sp.children.length-1;

      m1_c.switch_n = n;

      /* initiate actual switching (if not already on-going) */
      if (!m1_c.switching)
	{
	  m1_c.switching = true;
	  setTimeout('m1_switch()', m1_c.switch_speed);
	}
    }
  else  /* do actual switching */
    {
      var d = m1_c.switch_n - m1_c.top; /* delta */
      
      if (d == 0) /* switching done/aborted */
	{
	  m1_c.switching = false;
	}
      else
	{
	  /* in 'order' style we directly jump to the right position */
	  if (m1_c.arr_style == 'order')
	    {
	      m1_c.top = m1_c.switch_n;
	      var ty = sp.children[m1_c.top].y
		- m1_c.padding.t - m1_c.order_pad.v;
	      window.scrollTo(0, ty);
	      m1_c.switching = false;
	    }
	  else
	    {
	      /* move current to its normal level and set CSS */
	      sp.children[m1_c.top].div.className = 'small';
	      sp.children[m1_c.top].resetZ();
	      
	      /* switch by one in the right direction */
	      if (d > 0)
		m1_c.top += m1_c.sort;
	      else
		m1_c.top -= m1_c.sort;
	      
	      /* set new top to top level and set CSS */
	      sp.children[m1_c.top].setZ(++sp.m1_maxz);
	      sp.children[m1_c.top].div.className = 'smallactive';
	      setTimeout('m1_switch()', m1_c.switch_speed);
	    }
	}

    }
  return;
}


function m1_oldswitch(dir)
{

  if (dir == 0) return;

  var sp = dd.elements.smallpics;


  /* consider sort order and don't wrap */

  dir = dir * m1_c.sort;

  if ( (m1_c.top >= sp.children.length-1 && dir > 0 ) ||
       (m1_c.top <= 0 && dir < 0))
    return;


  /* move current to its normal level, move next/prev to front */

  if (m1_c.arr_style != 'order')
    sp.children[m1_c.top].div.className = 'small';
  sp.children[m1_c.top].resetZ();

  if (dir > 0) { m1_c.top++; dir--; } else { m1_c.top--; dir++; }


  sp.children[m1_c.top].setZ(++sp.m1_maxz);
  if (m1_c.arr_style != 'order')
    sp.children[m1_c.top].div.className = 'smallactive';

  if (m1_c.arr_style == 'order')
{
//window.scrollTo(0,
      //		      sp.children[m1_c.top].y
      //		      - Math.floor(dd.getWndH() / 4));

      m1_scrollTo(0,
		      sp.children[m1_c.top].y
		      - Math.floor(dd.getWndH() / 4), 2);
    }

  dir = dir * m1_c.sort;

  // more to switch?

  if (dir != 0)
    setTimeout('m1_switch(' + dir + ');', m1_c.switch_speed);

  return;
}


/* darken screen */

function m1_dark()
{
  /* scale dark div to window size and activate (show) it */

  dd.elements.dark.resizeTo(dd.getWndW(), dd.getWndH());
  dd.elements.dark.moveTo(dd.getScrollX(), dd.getScrollY());
  dd.elements.dark.show();
  m1_c.dark++;
  return;
}

function m1_undark()
{  
  if (--m1_c.dark <= 0) { m1_c.dark = 0; dd.elements.dark.hide(); }
  return;
}



/* arranges the (enabled) pics with style */

function m1_arrange(style, stage)
{

  /* default parameters */

  if (typeof style == 'undefined') style = m1_c.arr_style;
  if (typeof stage == 'undefined') stage = 0;


  /* initialise at stage 0 */

  if (stage == 0)
    {

      var sp = dd.elements.smallpics;

      m1_disablecontrol();            /* disable mouse/keyboard control */

      sp.hide();                      /* hide all small pics */
      dd.elements.toolbar.hide();     /* hide toolvar */

      dd.elements.title.show();       /* show title */

      dd.elements.loading.center();   /* show loading animation */
      dd.elements.loading.show();

      if (m1_c.cur_big >= 0)
	  m1_hidebig();

      window.scrollTo(0, 0);          /* reset window scroll */

      m1_c.arr_style = style;         /* save arrangment style */

      m1_c.arrx = m1_c.padding.l;     /* initialise cursor */
      m1_c.arry = m1_c.padding.t;
      m1_c.arrh = 0;                  /* 'stack1' max. height in line */
      m1_c.arrd = 1;                  /* 'stack1' direction */

      m1_c.sort = 1;                  /* normal sort order by default */


      /* create a copy of the pics array in sp.arr */

      m1_c.arr = new Array();
      for (var i = 0, j = 0; i < sp.children.length; i++)
	m1_c.arr[j++] = sp.children[i];
      m1_c.narr = m1_c.arr.length;


      /* reverse array in case of style 'order' */

      if (style == 'order')
	{
	  for (var tmp, i = 0; i < m1_c.narr / 2; i++)
	    {
	      tmp                         = m1_c.arr[i];
	      m1_c.arr[i]                 = m1_c.arr[m1_c.narr - i - 1];
	      m1_c.arr[m1_c.narr - i - 1] = tmp;
	    }
	  m1_c.sort = -1;            /* normal sort order by default */
	}
    }



  /* select next pic (id) from the helper array */

  switch (style)
    {

    case 'stack1':
    case 'stack2':
    case 'order':
      var p = m1_c.arr[stage];
      break;

    case 'shuffle':                  /* choose a random pic */
      idx = Math.floor( Math.random() * (m1_c.arr.length) );
      var p = m1_c.arr[idx];
      m1_c.arr.splice(idx, 1);       /* remove pic from list */
      break;

    }


  /* arrange item or finish arranging */

  if (stage < m1_c.narr)
    {

      /* update loading display */

      document.getElementById('loadingtext').innerHTML = m1_c.narr - stage;


      /* determine new position, respect m1_margins */

      var x = 0, y = 0;
      
      switch (style)
	{
	  
	case 'shuffle':

	  /* arbitray position with respect to margins and size of the pic */

	  x = m1_c.padding.l
	    + Math.floor( Math.random()
			  * (dd.getWndW() - p.w
			     - m1_c.padding.r - m1_c.padding.l) );
	  y = m1_c.padding.t
	    + Math.floor( Math.random()
			  * (dd.getWndH() - p.h
			     - m1_c.padding.b - m1_c.padding.t) );
	  break;

	  
	case 'stack1':

	  /* center of screen, offset by w/2 and h/2, offset by random value */

	  x = (m1_c.padding.l + dd.getWndW() - m1_c.padding.r ) / 2
	    - p.w / 2
	    + Math.floor( Math.random() * 2 * m1_c.stack1_fuzz )
	    - m1_c.stack1_fuzz;
	  y = (m1_c.padding.t + dd.getWndH() - m1_c.padding.b ) / 2
	    - p.h / 2
	    + Math.floor( Math.random() * 2 * m1_c.stack1_fuzz )
	    - m1_c.stack1_fuzz;
	  break;

	  
	case 'stack2':

	  /* change direction of stacking if window border reached */

	  m1_c.arry += m1_c.arrd * m1_c.stack2_off.v;

	  if (m1_c.arrd > 0
	      && m1_c.arry + p.h >= dd.getWndH() - m1_c.padding.b)
	    {
	      m1_c.arrd = -1;
	      m1_c.arry -= 2 * m1_c.stack2_off.v;
	    }
	  if (m1_c.arrd < 0 && m1_c.arry <= m1_c.padding.t)
	    {
	      m1_c.arrd = 1;
	      m1_c.arry += 2 * m1_c.stack2_off.v;
	    }

	  x = m1_c.padding.l + (stage * m1_c.stack2_off.h);
	  y = m1_c.arry;
	  break;
	  

	case 'order':

	  /* check if there is enough space for the current pic,
	     start a new line if not. move curser for next iteration  */

	  if (m1_c.arrx + p.w > dd.getWndW() - m1_c.padding.r || stage == 0)
	    {
	      x = m1_c.padding.l;
	      m1_c.arrx = x + p.w;
	      m1_c.arry += m1_c.arrh + m1_c.order_pad.v;
	      y = m1_c.arry;
	      m1_c.arrh = p.h;
	    }
	  else /* yes, put at cursor position */
	    {
	      x = m1_c.arrx + m1_c.order_pad.h;
	      y = m1_c.arry;
	      m1_c.arrx = x + p.w;
	      if (p.h > m1_c.arrh) m1_c.arrh = p.h;
	    }

	  break;
	}


      /* move to new position, reset depth, adjust styles and show */

      p.setDraggable(false);       /* don't let the user d&d while arrange runs */

      p.div.className = 'small';   /* reset style */

      p.moveTo(x, y);              /* move to new position */
      p.defz = stage;              /* reset depth */
      p.resetZ();

      p.limitDrag(m1_c.padding);   /* limit dragging to window */

      p.show();                    /* show pic */

      m1_c.top = p.m1_idx;         /* keep track of the pic on top */


      /*  progress to next pic */

      /* FIXME: the dynamic effect is hardly noticable

      speed = m1_speed[0];
      speed = m1_speed[1]+Math.floor(Math.log(stage+1)/
                          Math.log(m1_arr.length)*m1_speed[2]);
      speed = m1_speed[1]+Math.floor(Math.sqrt(stage+1)/
                          Math.sqrt(m1_arr.length)*m1_speed[2]);
      console.log('speed = %d', speed);
      var speed = m1_c.speed[1] + Math.floor(Math.sqrt(stage + 1) /
		     Math.sqrt(m1_c.narr) * m1_c.speed[2]);
      */

      stage++;
      if (style == 'order')
	m1_arrange(style, stage);
      else
	setTimeout("m1_arrange('"+style+"', "+stage+')',
		   m1_c.speed(stage, m1_c.narr));

    }
  else
    {
      /* all pics arranged, clear status, show toolbar/title
         and prev/next icons if applicable */
      
      dd.elements.toolbar.show();

      if (m1_c.dis) dd.elements.showallicon.show();

      m1_enablecontrol();

      /* all small pics look active in order mode, else only current */
      if (style == 'order')
	{
	  for (i = 0; i < dd.elements.smallpics.children.length; i++)
	    dd.elements.smallpics.children[i].div.className = 'smallactive';

	  m1_c.top = m1_c.arr[0].m1_idx;
	}
      else
	dd.elements.smallpics.children[m1_c.top].div.className = 'smallactive';


      /* re-enable d&d */

      if (style != 'order')
	for (var i = 0; i < dd.elements.smallpics.children.length; i++)
	  dd.elements.smallpics.children[i].setDraggable(true);


      document.getElementById('loadingtext').innerHTML = '&nbsp;';
      dd.elements.loading.hide();

    }
  return;
}






/* mouse wheel stuff, from http://adomas.org/javascript-mouse-wheel */

function m1_wheel(event)
{
  var delta = 0;


  /* determine scroll direction (if at all) */

  if (!event)                                         /* For IE. */
    event = window.event;
  if (event.wheelDelta)                               /* IE/Opera. */
    { 
      delta = event.wheelDelta/120;
      if (window.opera)                               /* Opera 9 */
	delta = -delta;
    }
  else if (event.detail)                              /* Mozilla case. */
    {
      delta = -event.detail / 3;
    }  


  /* handle scroll events */

  if (delta)
    if (delta < 0)
      if (m1_c.cur_big > -1)
	m1_switchbig(+1);
      else
	m1_switch(+1);
    else
      if (m1_c.cur_big > -1)
	m1_switchbig(-1);
      else
	m1_switch(-1);

  /* Prevent default actions caused by mouse wheel.
    That might be ugly, but we handle scrolls somehow
    anyway, so don't bother here.. */
  if (event.preventDefault)
    event.preventDefault();
  event.returnValue = false;
  return;
}

function m1_keys(event)
{
  var keynum = 0;
  if (window.event) keynum = event.keyCode;
  else if (event.which) keynum = event.which;

  switch (keynum)
    {

    case 39: // right
    case 40: // down
      if (m1_c.cur_big > -1)
	m1_switchbig(+1);
      else
	m1_switch(+1);
      break;

    case 37: // left
    case 38: // up
      if (m1_c.cur_big > -1)
	m1_switchbig(-1);
      else
	m1_switch(-1);
      break;

    case 35: // end
      if (m1_c.cur_big > -1)
	m1_switchbig(m1_ids.length - m1_c.cur_big - 1);
      else
	m1_switch(+9999);
      break;
      
    case 36: // home
      if (m1_c.cur_big > -1)
	m1_switchbig(-m1_c.cur_big);
      else
	m1_switch(-9999);
      break;

    case 33: // pgup
      if (m1_c.cur_big > -1)
	m1_switchbig(-10);
      else
	m1_switch(-10);
      break;

    case 34: // pgdn
      if (m1_c.cur_big > -1)
	m1_switchbig(10);
      else
	m1_switch(10);
      break;

    case 90: // z
      m1_showbig(m1_c.top);
      break;

    case 67: // c
      m1_hidebig();
      break;

    case 49: // 1
      m1_arrange('shuffle');
      break;

    case 50: // 2
      m1_arrange('stack1');
      break;

    case 51: // 3
      m1_arrange('stack2');
      break;

    case 52: // 4
      m1_arrange('order');
      break;

    case 73: // i
      m1_toggle('info');
      break;

    case 65: // a
      m1_toggle('about');
      break;

    default:
      return; // pass key to browser
      break;
    }

  /* do not pass handled key presses to the browser */
  if (event.preventDefault)
    event.preventDefault();
  event.returnValue = false;
  return;
}


/* generic event (un-)register routines,
   from http://www.mediaevent.de/javascript/event_listener.html
   and http://ejohn.org/projects/flexible-javascript-events/ */

function addEvent( obj, type, fn )
{
   if (obj.addEventListener) {
      obj.addEventListener( type, fn, false );
   } else if (obj.attachEvent) {
      obj["e"+type+fn] = fn;
      obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
      obj.attachEvent( "on"+type, obj[type+fn] );
   }
}

function removeEvent( obj, type, fn )
{
   if (obj.removeEventListener) {
      obj.removeEventListener( type, fn, false );
   } else if (obj.detachEvent) {
      obj.detachEvent( "on"+type, obj[type+fn] );
      obj[type+fn] = null;
      obj["e"+type+fn] = null;
   }
}

function m1_enablecontrol()
{
  addEvent(window, 'DOMMouseScroll', m1_wheel);
  addEvent(window, 'mousewheel', m1_wheel);
  addEvent(document, 'mousewheel', m1_wheel);
  addEvent(window, 'keydown', m1_keys);
  return;
}


function m1_disablecontrol()
{
  if (dd.ie) return; // bloody ie cannot handle this..
  removeEvent(window, 'DOMMouseScroll', m1_wheel); // Moz
  removeEvent(window, 'mousewheel', m1_wheel);
  removeEvent(document, 'mousewheel', m1_wheel);
  removeEvent(window, 'keydown', m1_keys);
  return;
}


/* load big image and hand over to m1_displaybig() */

function m1_showbig(n)
{
  if (m1_c.cur_big < 0)
    m1_dark();                     /* dark screen */

  m1_c.cur_big = n;

  m1_enablecontrol();            /* enable controls */


  /* show loading animation */

  dd.elements.loading.center(m1_c.padding);
  dd.elements.loading.show();


  /* load new image  */

  var bigi = dd.elements.bigimg;
  bigi.swapImage(m1_big[n][0]);
  bigi.defw = m1_big[m1_c.cur_big][1];
  bigi.defh = m1_big[m1_c.cur_big][2];
  bigi.r = bigi.defw / bigi.defh;


  var date = document.getElementById('date' + m1_ids[m1_c.cur_big]);
  var bigt = dd.elements.bigdate;

  bigt.div.style.height = '';
  bigt.div.style.width = '';
  bigt.write(date.innerHTML);


  /* wait until image has loaded */

  setTimeout('m1_checkbig()', 100);


  return;
}


/* check if big image has loaded 
   FIXME: not sure if this really works */

function m1_checkbig()
{

  // property seems not to be available in dd.elements.bigimg
  if (document.getElementById('bigimg').complete)
    {
      dd.elements.loading.hide();
      m1_displaybig();
    }
  else
    {      
      setTimeout('m1_checkbig()', 100);
    }
  return;
}


/* displays big image */

function m1_displaybig()
{

  /* elements beeing manipulated */

  var bigp = dd.elements.bigpic;
  var bigi = dd.elements.bigimg;
  var bigd = dd.elements.bigdesc;
  var bigt = dd.elements.bigdate;
  var bigc = dd.elements.bigicons;


  /* determine available view port size */

  var vw = dd.getWndW() - bigp.defw - m1_c.padding.l - m1_c.padding.r;
  var vh = dd.getWndH() - bigp.defh - m1_c.padding.t - m1_c.padding.b;


  /* scale (if necessary) and position the image */

  if ( bigi.defw > vw  || bigi.defh > vh )
    if ( bigi.r > vw/vh )
      bigi.resizeTo(vw, Math.floor(vw / bigi.r));
    else
      bigi.resizeTo(Math.floor(vh * bigi.r), vh);
  else
    bigi.resizeTo(bigi.defw, bigi.defh);

  bigi.moveTo( dd.getScrollX()
	       + Math.floor( (vw - bigi.w + bigp.defw) / 2 )
	       + m1_c.padding.l,
	       dd.getScrollY()
	       + Math.floor( (vh - bigi.h + bigp.defh) / 2 )
	       + m1_c.padding.t );


  /* scale and position the image frame */

  bigp.resizeTo(bigi.w + bigp.defw, bigi.h + bigp.defh);
  bigp.moveTo( dd.getScrollX()
	       + Math.floor( (vw - bigp.w + bigp.defw) / 2 )
	       + m1_c.padding.l,
	       dd.getScrollY()
	       + Math.floor( (vh - bigp.h + bigp.defh) / 2 )
	       + m1_c.padding.t );

  bigp.show();

  bigi.show();


  /* scale and position the description (FIXME: good?) */

  //  bigd.div.style.width = '';
  //  bigd.div.style.height = '';
  //  bigd.div.style.maxWidth = (bigi.w - bigc.w) + 'px';
  //  bigd.moveTo(bigi.x, bigi.y);
  //  bigd.show();


  /* set image description and date */

  var desc = document.getElementById('desc' + m1_ids[m1_c.cur_big]);

  bigd.div.style.height = '';
  bigd.div.style.width = (bigi.w - bigd.defw) + 'px';
  bigd.write(desc.innerHTML);

  bigd.moveTo(bigi.x, bigi.y + bigi.h - bigd.h);
  bigd.show();

  bigt.moveTo(bigi.x, bigi.y);
  bigt.show();

  
  /* position icons */
  
  bigc.moveTo( bigi.x + bigi.w - bigc.w, bigi.y );
  bigc.show();

  dd.elements.loading.hide();

  /*
  console.log('m1_c.padding', m1_c.padding.t, m1_c.padding.r,
              m1_c.padding.b, m1_c.padding.l);
  console.log('winw', dd.getWndW(), 'winh', dd.getWndH(), 'vw', vw, 'vh', vh);
  console.log('vw', vw, 'vh', vh);
  console.log('bigi.defw', bigi.defw, 'bigi.defh', bigi.defh,
	      'bigi.w', bigi.w, 'bigi.h', bigi.h);
  console.log('bigd.defw', bigd.defw, 'bigd.defh', bigd.defh,
	      'bigd.w', bigd.w, 'bigd.h', bigd.h);
  console.log('bigc.w', bigc.w, 'bigc.h', bigc.h,
	      'bigc.x', bigc.x, 'bigc.y', bigc.y);
  */
  return;
}


/* Hide big pic */

function m1_hidebig()
{
  /* hide elements and nil img src */

  dd.elements.bigicons.hide();
  dd.elements.bigdesc.hide();
  dd.elements.bigdate.hide();
  dd.elements.bigimg.hide();
  dd.elements.bigpic.hide();
  m1_undark();


  /* adjust selection of small pic according to current big pic */

  var delta = (m1_c.cur_big - m1_c.top) * m1_c.sort;
  //  m1_c.top = m1_c.cur_big;
  m1_c.cur_big = -1;

  m1_switch(delta)

  return;
}


/* show next/previous big pic */

function m1_switchbig(dir)
{

  /* consider sort order and don't wrap */

  dir = dir * m1_c.sort;

  if ( (m1_c.cur_big >= m1_ids.length-1 && dir > 0 ) ||
       (m1_c.cur_big <= 0 && dir < 0))
    return;

  m1_c.cur_big += dir;
  
  if (m1_c.cur_big < 0) m1_c.cur_big = 0;
  if (m1_c.cur_big > m1_ids.length - 1) m1_c.cur_big = m1_ids.length - 1;
  

  m1_showbig(m1_c.cur_big);

  return;
}




/* eof */
