/*************************************************************************
    This code is from Dynamic Web Coding at dyn-web.com
    Copyright 2008 by Sharon Paine
    See Terms of Use at www.dyn-web.com/business/terms.php
    regarding conditions under which you may use this code.
    This notice must be retained in the code as is!

  unobtrusive event handling for use with dw_scroll.js
    version date: Aug 2008

*************************************************************************/

/////////////////////////////////////////////////////////////////////

// two ways to add style sheet for capable browsers

dw_writeStyleSheet = function(file) {
  document.write('<link rel="stylesheet" href="' + file + '" media="screen" />');
  }

function dw_addLinkCSS(file) {
  if (!document.createElement) return;
  var el = document.createElement("link");
  el.setAttribute("rel", "stylesheet");
  el.setAttribute("type", "text/css");
  el.setAttribute("media", "screen");
  el.setAttribute("href", file);
  document.getElementsByTagName('head')[0].appendChild(el);
  }

/////////////////////////////////////////////////////////////////////

// Example class names: load_wn_lyr1, load_wn_lyr2_t2

dw_scrollObj.prototype.setUpLoadLinks = function(controlsId) {
  var wndoId = this.id; var el = document.getElementById(controlsId);
  var links = el.getElementsByTagName('a');
  var cls, parts;
  for (var i=0; links[i]; i++) {
    cls = dw_scrollObj.get_DelimitedClass(links[i].className);
    parts = cls.split('_');
    if (parts[0] == 'load' && parts[1] == wndoId && parts.length > 2) {
      // no checks on lyrId, horizId
      var lyrId = parts[2];
      var horizId = parts[3] ? parts[3] : null;
      dw_Event.add(links[i], 'click', function(wndoId, lyrId, horizId) {
        return function(e) {
          dw_scrollObj.col[wndoId].load(lyrId, horizId);
          if (e && e.preventDefault) e.preventDefault();
          return false;
          }
        }(wndoId, lyrId, horizId)); // see Crockford js good parts pg 39
      }
    }
  }

dw_scrollObj.prototype.setUpScrollControls = function(controlsId, autoHide, axis) {
  var wndoId = this.id; var el = document.getElementById(controlsId);
  if (autoHide && axis == 'v' || axis == 'h') {
    dw_scrollObj.handleControlVis(controlsId, wndoId, axis);
    dw_Scrollbar_Co.addEvent(this, 'on_load', function() { dw_scrollObj.handleControlVis(controlsId, wndoId, axis); } );
    dw_Scrollbar_Co.addEvent(this, 'on_update', function() { dw_scrollObj.handleControlVis(controlsId, wndoId, axis); } );
    }

  var links = el.getElementsByTagName('a'), cls, eType;
  for (var i = 0; links[i]; i++) {
    cls = dw_scrollObj.get_DelimitedClass( links[i].className );
    eType = dw_scrollObj.getEv_FnType( cls.slice(0, cls.indexOf('_') ) );
    switch ( eType ) {
      case 'mouseover' :
      case 'mousedown' :
        dw_scrollObj.handleMouseOverDownLinks(links[i], wndoId, cls);
        break;
      case 'scrollToId':
        dw_scrollObj.handleScrollToId(links[i], wndoId, cls);
        break;
      case 'scrollTo' :
      case 'scrollBy':
      case 'click':
        dw_scrollObj.handleClick(links[i], wndoId, cls) ;
        break;
      }
    }
  }

dw_scrollObj.handleMouseOverDownLinks = function (linkEl, wndoId, cls) {
  var parts = cls.split('_'); var eType = parts[0];
  var re = /^(mouseover|mousedown)_(up|down|left|right)(_[\d]+)?$/;

  if (re.test(cls)) {
    var eAlt = (eType == 'mouseover')? 'mouseout': 'mouseup';
    var dir = parts[1];  var speed = parts[2] || null;
    var deg = (dir == 'up') ? 90 : (dir == 'down') ? 270 : (dir == 'left') ? 180 : 0;

    dw_Event.add(linkEl, eType, function (e) { dw_scrollObj.col[wndoId].initScrollVals(deg, speed); } );
    dw_Event.add(linkEl, eAlt, function (e) { dw_scrollObj.col[wndoId].ceaseScroll(); } );

    if (eType == 'mouseover') {
      dw_Event.add(linkEl, 'mousedown', function (e) { dw_scrollObj.col[wndoId].speed *= 3; } );
      dw_Event.add(linkEl, 'mouseup', function (e) {
        dw_scrollObj.col[wndoId].speed = dw_scrollObj.prototype.speed;
        } );
      }
    dw_Event.add( linkEl, 'click', function(e) { if (e && e.preventDefault) e.preventDefault(); return false; } );
    }
  }

// scrollToId_smile, scrollToId_smile_100, scrollToId_smile_lyr1_100

dw_scrollObj.handleScrollToId = function (linkEl, wndoId, cls) {
  var parts = cls.split('_'); var id = parts[1], lyrId, dur;
  if ( parts[2] ) {
    if ( isNaN( parseInt(parts[2]) ) ) {
      lyrId = parts[2];
      dur = ( parts[3] && !isNaN( parseInt(parts[3]) ) )? parseInt(parts[3]): null;
      }
    else {
      dur = parseInt( parts[2] );
      }
    }
  dw_Event.add( linkEl, 'click', function (e) {
    dw_scrollObj.scrollToId(wndoId, id, lyrId, dur);
    if (e && e.preventDefault) e.preventDefault();
      return false;
    } );
  }

// doesn't checks if lyrId in wndo, el in lyrId

dw_scrollObj.scrollToId = function(wndoId, id, lyrId, dur) {
  var wndo = dw_scrollObj.col[wndoId];
  var el = document.getElementById(id);
  if (el) {
    if (lyrId) {
      if (document.getElementById(lyrId) && wndo.lyrId != lyrId) {
        wndo.load(lyrId);
        }
      }
    var lyr = document.getElementById(wndo.lyrId);
    var x = dw_getLayerOffset(el, lyr, 'left');
    var y = dw_getLayerOffset(el, lyr, 'top');
    wndo.initScrollToVals(x, y, dur);
    }
  }

dw_scrollObj.handleClick = function (linkEl, wndoId, cls) {
  var wndo = dw_scrollObj.col[wndoId];
  var parts = cls.split('_'); var eType = parts[0];
  var dur_re = /^([\d]+)$/; var fn, re, x, y, dur;

  switch (eType) {
    case 'scrollTo' :
      fn = 'scrollTo';  re = /^(null|end|[\d]+)$/;
      x = re.test( parts[1] )? parts[1]: '';
      y = re.test( parts[2] )? parts[2]: '';
      dur = ( parts[3] && dur_re.test(parts[3]) )? parts[3]: null;
      break;
    case 'scrollBy': // scrollBy_m30_m40, scrollBy_null_m100, scrollBy_100_null
      fn = 'scrollBy';  re = /^(([m]?[\d]+)|null)$/;
      x = re.test( parts[1] )? parts[1]: '';
      y = re.test( parts[2] )? parts[2]: '';

      // negate numbers (m not - but vice versa)
      if (!isNaN(parseInt(x))) {
        x = -parseInt(x);
        }
      else if (typeof x == 'string') {
        x = x.indexOf('m') !=-1 ? x.replace('m', ''): x;
        }
      if (!isNaN(parseInt(y))) {
        y = -parseInt(y);
        }
      else if (typeof y == 'string') {
        y = y.indexOf('m') !=-1 ? y.replace('m', ''): y;
        }

      dur = (parts[3] && dur_re.test(parts[3])) ? parts[3] : null;
      break;

    case 'click':
      var o = dw_scrollObj.getClickParts(cls);
      fn = o.fn; x = o.x; y = o.y; dur = o.dur;
      break;
    }
  if (x !== '' && y !== '') {
    if (x == 'end') { x = wndo.maxX; }
    if (y == 'end') { y = wndo.maxY; }
    if (x === 'null' || x === null) { x = wndo.x; }
    if (y === 'null' || y === null) { y = wndo.y; }

    x = parseInt(x); y = parseInt(y);
    dur = !isNaN(parseInt(dur)) ? parseInt(dur) : null;

    if (fn == 'scrollBy') {
      dw_Event.add(linkEl, 'click', function (e) {
        dw_scrollObj.col[wndoId].initScrollByVals(x, y, dur);
        if (e && e.preventDefault) e.preventDefault();
        return false;
        } );
    } else if (fn == 'scrollTo') {
      dw_Event.add(linkEl, 'click', function (e) {
        dw_scrollObj.col[wndoId].initScrollToVals(x, y, dur);
        if (e && e.preventDefault) e.preventDefault();
        return false;
        } );
      }
    }
  }

// get info from className (e.g., click_down_by_100)

dw_scrollObj.getClickParts = function(cls) {
  var parts = cls.split('_');
  var re = /^(up|down|left|right)$/;
  var dir, fn = '', dur, ar, val, x = '', y = '';

  if ( parts.length >= 4 ) {
    ar = parts[1].match(re);
    dir = ar ? ar[1] : null;

    re = /^(to|by)$/;
    ar = parts[2].match(re);
    if (ar) {
      fn = (ar[0] == 'to') ? 'scrollTo' : 'scrollBy';
      }

    val = parts[3]; // value on x or y axis
    re = /^([\d]+)$/;
    dur = (parts[4] && re.test(parts[4])) ? parts[4] : null;

    switch (fn) {
      case 'scrollBy' :
        if ( !re.test( val ) ) {
          x = ''; y = ''; break;
          }
        switch (dir) { // 0 for unspecified axis
          case 'up' : x = 0; y = val; break;
          case 'down' : x = 0; y = -val; break;
          case 'left' : x = val; y = 0; break;
          case 'right' : x = -val; y = 0;
          }
        break;
      case 'scrollTo' :
        re = /^(end|[\d]+)$/;
        if ( !re.test( val ) ) {
          x = ''; y = ''; break;
          }
        switch (dir) { // null for unspecified axis
          case 'up' : x = null; y = val; break;
          case 'down' : x = null; y = (val == 'end')? val: -val; break;
          case 'left' : x = val; y = null; break;
          case 'right' : x = (val == 'end')? val: -val; y = null;
          }
        break;
      }
    }
  return { fn: fn, x: x, y: y, dur: dur }
  }

dw_scrollObj.getEv_FnType = function(str) {
  var re = /^(mouseover|mousedown|scrollBy|scrollTo|scrollToId|click)$/;
  if (re.test(str)) {
    return str;
    }
  return '';
  }

// return class name with underscores in it

dw_scrollObj.get_DelimitedClass = function(cls) {
  if (cls.indexOf('_') == -1) {
    return '';
    }
  var whitespace = /\s+/;
  if (!whitespace.test(cls)) {
    return cls;
    }
  else {
    var classes = cls.split(whitespace);
    for(var i = 0; classes[i]; i++) {
      if (classes[i].indexOf('_') != -1) {
        return classes[i];
        }
      }
    }
  }

dw_scrollObj.handleControlVis = function(controlsId, wndoId, axis) {
  var wndo = dw_scrollObj.col[wndoId];
  var el = document.getElementById(controlsId);
  el.style.visibility = (axis == 'v' && wndo.maxY > 0) || (axis == 'h' && wndo.maxX > 0) ? 'visible' : 'hidden';
  }




