/*
  29.05.2009 svl: fixed compatibility problems with FireFox, Safari
*/

var gallery = {

  // setInterval() handler for right button
  interval_fn_r_btn : function( par_id, child_id ) {

    var opts;

    try {
      opts = window.gallery[ child_id ];
      if( true == opts.scrolled_r_btn ) {

        var par   = window.document.getElementById( par_id );
        var scroller_w = gallery.width_get( par );

        var child = window.document.getElementById( child_id );
        var cur_pos = gallery.left_pos_get( child );
        var cntr_w = gallery.width_get( child );

        if( cur_pos + cntr_w > scroller_w )
          child.style.left = ( cur_pos - ( opts.double_speed ? opts.scroll_speed_fast : opts.scroll_speed ) ) + 'px';
        else {
          opts.scrolled_r_btn = false;
          opts.double_speed = false;
        }

        return;
      }

      clearInterval( opts.interval_r_id );
    } catch( e ) {
      if( typeof( opts ) != 'undefined' )
        clearInterval( opts.interval_r_id );
    } // try

  }, // interval_fn_r_btn

  // setInterval() handler for left button
  interval_fn_l_btn : function( par_id, child_id ) {

    var opts;

    try {
      opts = window.gallery[ child_id ];
      if( true == opts.scrolled_l_btn ) {

        var child = window.document.getElementById( child_id );
        var cur_pos = gallery.left_pos_get( child );

        if( cur_pos < 0 )
          child.style.left = ( cur_pos + ( opts.double_speed ? opts.scroll_speed_fast : opts.scroll_speed ) ) + 'px';
        else {
          opts.scrolled_l_btn = false;
          opts.double_speed = false;
        }

        return;
      }

      clearInterval( opts.interval_l_id );
    } catch( e ) {
      if( typeof( opts ) != 'undefined' )
        clearInterval( opts.interval_l_id );
    } // try

  }, // interval_fn_l_btn

  // Get left left position of element
  left_pos_get : function( el_obj ) {
    var cur_pos = el_obj.offsetLeft;
    if( isNaN( cur_pos ) )
      cur_pos = 0;

    return cur_pos;
  }, // left_pos_get

  // Get width of element
  width_get : function( el_obj ) {
    var cur_w = el_obj.clientWidth;
    if( isNaN( cur_w ) ) {
      cur_w = 0;
    }

    return cur_w;
  }, // width_get

// -------- Mouse enter/leave handlers start --------

  // use ids
  // onmouseenter handler for right scroll button
  scroll_r_over : function( par_id, child_id ) {

    var opts = window.gallery[ child_id ];

    if( false == opts.scrolled_r_btn ) {
      opts.scrolled_l_btn = false;
      opts.scrolled_r_btn = true;
      opts.double_speed = false;
      opts.interval_r_id = setInterval( 'gallery.interval_fn_r_btn("' + par_id + '","' + child_id + '")', opts.time_slice );
    }
  }, // scroll_r_over

  // onmouseleave handler for right scroll button
  scroll_r_out : function( child_id ) {
    var opts = window.gallery[ child_id ];
    opts.scrolled_r_btn = false;
  }, // scroll_r_out

  // onmouseenter handler for left scroll button
  scroll_l_over : function( par_id, child_id ) {

    var opts = window.gallery[ child_id ];

    if( false == opts.scrolled_l_btn ) {
      opts.scrolled_l_btn = true;
      opts.scrolled_r_btn = false;
      opts.double_speed = false;
      opts.interval_l_id = setInterval( 'gallery.interval_fn_l_btn( "' + par_id + '", "' + child_id + '" )', opts.time_slice );
      return;
    }
  }, // scroll_l_over

  // onmouseleave handler for left scroll button
  scroll_l_out : function( child_id ) {
    var opts = window.gallery[ child_id ];

    opts.scrolled_l_btn = false;
  }, // scroll_l_out

// -------- Mouse enter/leave handlers end --------

// -------- Click handlers start --------

  // TODO: remove fns
  // onmousedown handler for right scroll button
  scroll_r_click_dn : function( child_id ) {
    var opts = window.gallery[ child_id ];
    opts.double_speed = true;
  }, // scroll_r_click_dn

  // onmouseup handler for right scroll button
  scroll_r_click_up : function( child_id ) {
    var opts = window.gallery[ child_id ];

    opts.double_speed = false;
  }, // scroll_r_click_up

  // onmousedown handler for left scroll button
  scroll_l_click_dn : function( child_id ) {
    var opts = window.gallery[ child_id ];

    opts.double_speed = true;

  }, // scroll_l_click_dn

  // onmouseup handler for left scroll button
  scroll_l_click_up : function( child_id ) {
    var opts = window.gallery[ child_id ];

    opts.double_speed = false;
  }, // scroll_l_click_up

// -------- Click handlers end --------

  // get instance of option object
  opts_get : function() {
    var gallery_opts = {
      // Time slice ( in milliseconds )
      'time_slice' : 10,

      // Scroll speed ( in pixels per time slice )
      'scroll_speed' : 3,
      'scroll_speed_fast' : 7,

      // Multiply scroll speed by 2
      'double_speed' : false,

      // Button states
      'scrolled_r_btn' : false,
      'scrolled_l_btn' : false,

      // IDs of interval objects
      'interval_r_id' : null,
      'interval_l_id' : null
    }

    return gallery_opts;
  }, // opts_get

  scroll_init : function( par_id, child_id, lscroll_id, rscroll_id, err_show ) {
    try {

      if( null == window.gallery )
        window.gallery = {};

      window.gallery[ child_id ] = gallery.opts_get();

      var par   = window.document.getElementById( par_id );
      var child = window.document.getElementById( child_id );
      var l_btn = window.document.getElementById( lscroll_id );
      var r_btn = window.document.getElementById( rscroll_id );

      l_btn.onmouseover = function()  { gallery.scroll_l_over( par_id, child_id ); }
      l_btn.onmouseout   = function() { gallery.scroll_l_out( child_id ); }
      r_btn.onmouseover = function()  { gallery.scroll_r_over( par_id, child_id ); }
      r_btn.onmouseout   = function() { gallery.scroll_r_out( child_id ); }

      l_btn.onmousedown = function()  { gallery.scroll_l_click_dn( child_id ); }
      l_btn.onmouseup   = function()  { gallery.scroll_l_click_up( child_id ); }
      r_btn.onmousedown = function()  { gallery.scroll_r_click_dn( child_id ); }
      r_btn.onmouseup   = function()  { gallery.scroll_r_click_up( child_id ); }

      child.style.position = 'absolute';

      // Check if it's Mozilla FireFox or NS 6+
      if( document.getElementById && !document.all ) {

        // Gets all embed tags inside child
        var embeds = child.getElementsByTagName( "embed" );
        for ( i = 0; i < embeds.length; i++ ) {
          try {
            embeds[ i ].setAttribute( "wmode", "transparent" );
          } catch( e ) {
            if( err_show )
              alert( 'Gallery error: ' + e.message );
          }
        } // for

      } // if

      // Adjust size/position
      var child_width = gallery.width_get( child );

      if( child_width < 1 /* || par_width < 1 || child_width < par_width */ ) {
        l_btn.style.display = 'none';
        r_btn.style.display = 'none';
        par.style.overflow = 'hidden';
      } else {
        l_btn.style.display = 'block';
        r_btn.style.display = 'block';
        par.style.overflow = 'hidden';

        var l_btn_width = gallery.width_get( l_btn );
        var r_btn_width = gallery.width_get( r_btn );

        l_btn.style.display = 'none';
        r_btn.style.display = 'none';

        var cntr = par.parentNode;
        if( null != cntr && 'undefined' != typeof( cntr ) ) {
          var cover = cntr.parentNode;
          if( null != cover && 'undefined' != typeof( cover ) ) {
//            par.style.width = ( gallery.width_get( cover ) - ( l_btn_width * 2 ) - ( r_btn_width * 2 ) - 2 ) + 'px';
            par.style.width = ( gallery.width_get( cover ) - ( l_btn_width ) - ( r_btn_width ) - 2 ) + 'px';
          }
        }

//        var par_width = gallery.width_get( par );
        var par_width = gallery.width_get( cover );

        if( child_width > par_width ) {
          var cur_pos = gallery.left_pos_get( child );
          child.style.left = ( cur_pos - ( ( child_width / 2 ) - ( par_width / 2 ) ) ) + 'px';
          l_btn.style.display = 'block';
          r_btn.style.display = 'block';
          par.style.overflow = 'hidden';
        } else {
          l_btn.style.display = 'none';
          r_btn.style.display = 'none';
          par.style.overflow = 'hidden';
        }
      }

    } catch( e ) {
      if( err_show )
        alert( 'Gallery error: scroll_init: ' + e.message );

      return;
    } // try

  } // scroll_init

} // gallery
