/*************************************************************************
2 This code is from Dynamic Web Coding at dyn-web.com
3 Copyright 2008 by Sharon Paine
4 See Terms of Use at www.dyn-web.com/business/terms.php
5 regarding conditions under which you may use this code.
6 This notice must be retained in the code as is!
7
8 unobtrusive event handling for use with dw_scroll.js
9 version date: Nov 2008
10*************************************************************************/

/////////////////////////////////////////////////////////////////////
// two ways to add style sheet for capable browsers

// Nov 2008 revision adds screen as option
// (may want printed copy to appear as on screen?)
dw_writeStyleSheet = function(file, screen) {
 var css = '<link rel="stylesheet" href="' + file + '"';
 if (screen !== false) {
 css += ' media="screen"';
 }
 document.write(css + ' />');
}

// slower, may flash unstyled ?
function dw_addLinkCSS(file, screen) {
 if ( !document.createElement ) return;
 var el = document.createElement("link");
 el.setAttribute("rel", "stylesheet");
 el.setAttribute("type", "text/css");
 if (screen !== false) {
 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(y, x, 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);
 if ( ( axis == 'v' && wndo.maxY > 0 ) || ( axis == 'h' && wndo.maxX > 0 ) ) {
 el.style.visibility = 'visible';
 } else {
 el.style.visibility = 'hidden';
 }
}
