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

    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);

    if ( ( axis == 'v' && wndo.maxY > 0 ) || ( axis == 'h' && wndo.maxX > 0 ) ) {

        el.style.visibility = 'visible';

    } else {

        el.style.visibility = 'hidden';

    }

}
