﻿/*
This license text has to stay intact at all times:
fleXcroll Public License Version
Cross Browser Custom Scroll Bar Script by Hesido.
Public version - Free for non-commercial uses.
 
This script cannot be used in any commercially built
web sites, or in sites that relates to commercial
activities. This script is not for re-distribution.
For licensing options:
Contact Emrah BASKAYA @ www.hesido.com
 
Derivative works are only allowed for personal uses,
and they cannot be redistributed.
 
FleXcroll Public Key Code: 20050907122003339
MD5 hash for this license: 9ada3be4d7496200ab2665160807745d
 
End of license text---
*/
//fleXcroll v1.9.5
var fleXenv = {

    fleXcrollInit: function() { this.addTrggr(window, 'load', this.globalInit); },

    fleXcrollMain: function(dDv) {
        //Main code beg
        var dC = document, wD = window, nV = navigator;
        var miogap = 35;
        if (!dC.getElementById || !dC.createElement) return;
        if (typeof (dDv) == 'string') dDv = document.getElementById(dDv);
        if (dDv == null || nV.userAgent.indexOf('OmniWeb') != -1 || ((nV.userAgent.indexOf('AppleWebKit') != -1 || nV.userAgent.indexOf('Safari') != -1) && !(typeof (HTMLElement) != "undefined" && HTMLElement.prototype)) || nV.vendor == 'KDE' || (nV.platform.indexOf('Mac') != -1 && nV.userAgent.indexOf('MSIE') != -1)) return;
        if (dDv.scrollUpdate) { dDv.scrollUpdate(); return; };
        if (!dDv.id || dDv.id == '') { var sTid = "flex__", c = 1; while (document.getElementById(sTid + c) != null) { c++ }; dDv.id = sTid + c; }
        var targetId = dDv.id;
        dDv.fleXdata = new Object(); var sC = dDv.fleXdata;
        sC.keyAct = { _37: ['-1s', 0], _38: [0, '-1s'], _39: ['1s', 0], _40: [0, '1s'], _33: [0, '-1p'], _34: [0, '1p'], _36: [0, '-100p'], _35: [0, '+100p'] };
        sC.wheelAct = ["-2s", "2s"];
        sC.baseAct = ["-2s", "2s"];
        var cDv = createDiv('contentwrapper', true), mDv = createDiv('mcontentwrapper', true), tDv = createDiv('scrollwrapper', true), pDv = createDiv('copyholder', true);
        var iDv = createDiv('domfixdiv', true), fDv = createDiv('zoomdetectdiv', true), stdMode = false;
        pDv.sY.border = '1px solid blue'; pDv.fHide();
        dDv.style.overflow = 'hidden';
        fDv.sY.fontSize = "12px"; fDv.sY.height = "1em"; fDv.sY.width = "1em"; fDv.sY.position = "absolute"; fDv.sY.zIndex = "-999"; fDv.fHide();
        var brdHeight = dDv.offsetHeight, brdWidth = dDv.offsetWidth;
        copyStyles(dDv, pDv, '0px', ['border-left-width', 'border-right-width', 'border-top-width', 'border-bottom-width']);
        var intlHeight = dDv.offsetHeight - miogap, intlWidth = dDv.offsetWidth, brdWidthLoss = brdWidth - intlWidth, brdHeightLoss = brdHeight - intlHeight;
        var oScrollY = (dDv.scrollTop) ? dDv.scrollTop : 0, oScrollX = (dDv.scrollLeft) ? dDv.scrollLeft : 0;
        var urlBase = document.location.href, uReg = /#([^#.]*)$/;
        var focusProtectList = ['textarea', 'input', 'select'];
        sC.scroller = []; sC.forcedBar = []; sC.containerSize = sC.cntRSize = []; sC.contentSize = sC.cntSize = []; sC.edge = [false, false];
        sC.reqS = []; sC.barSpace = [0, 0]; sC.forcedHide = []; sC.forcedPos = []; sC.paddings = [];
        while (dDv.firstChild) { cDv.appendChild(dDv.firstChild) };
        cDv.appendChild(iDv); dDv.appendChild(mDv); dDv.appendChild(pDv);
        if (getStyle(dDv, 'position') != 'absolute') dDv.style.position = "relative";

        var dAlign = getStyle(dDv, 'text-align'); dDv.style.textAlign = 'left';
        mDv.sY.width = "100px"; mDv.sY.height = "100px"; mDv.sY.top = "0px"; mDv.sY.left = "0px";
        copyStyles(dDv, pDv, "0px", ['padding-left', 'padding-top', 'padding-right', 'padding-bottom']);
        var postWidth = dDv.offsetWidth, postHeight = dDv.offsetHeight, mHeight;
        mHeight = mDv.offsetHeight; mDv.sY.borderBottom = "2px solid black";
        if (mDv.offsetHeight > mHeight) stdMode = true; mDv.sY.borderBottomWidth = "0px";
        copyStyles(pDv, dDv, false, ['padding-left', 'padding-top', 'padding-right', 'padding-bottom']);
        findPos(mDv); findPos(dDv);
        sC.paddings[0] = mDv.yPos - dDv.yPos; sC.paddings[2] = mDv.xPos - dDv.xPos;
        dDv.style.paddingTop = getStyle(dDv, "padding-bottom"); dDv.style.paddingLeft = getStyle(dDv, "padding-right");
        findPos(mDv); findPos(dDv);
        sC.paddings[1] = mDv.yPos - dDv.yPos; sC.paddings[3] = mDv.xPos - dDv.xPos;
        dDv.style.paddingTop = getStyle(pDv, "padding-top"); dDv.style.paddingLeft = getStyle(pDv, "padding-left");
        var padWidthComp = sC.paddings[2] + sC.paddings[3], padHeightComp = sC.paddings[0] + sC.paddings[1];

        mDv.style.textAlign = dAlign;
        copyStyles(dDv, mDv, false, ['padding-left', 'padding-right', 'padding-top', 'padding-bottom']);
        tDv.sY.width = dDv.offsetWidth + 'px'; tDv.sY.height = dDv.offsetHeight + 'px';
        mDv.sY.width = postWidth + 'px'; mDv.sY.height = postHeight + 'px';
        tDv.sY.position = 'absolute'; tDv.sY.top = '0px'; tDv.sY.left = '0px';
        tDv.fHide();

        mDv.appendChild(cDv); dDv.appendChild(tDv); tDv.appendChild(fDv);

        cDv.sY.position = 'relative'; mDv.sY.position = 'relative';
        cDv.sY.top = "0"; cDv.sY.width = "100%"; //fix IE7
        mDv.sY.overflow = 'hidden';
        mDv.sY.left = "-" + sC.paddings[2] + "px";
        mDv.sY.top = "-" + sC.paddings[0] + "px";
        sC.zTHeight = fDv.offsetHeight;

        sC.getContentWidth = function() {
            var cChilds = cDv.childNodes, maxCWidth = compPad = 0;
            for (var i = 0; i < cChilds.length; i++) { if (cChilds[i].offsetWidth) { maxCWidth = Math.max(cChilds[i].offsetWidth, maxCWidth) } };
            sC.cntRSize[0] = ((sC.reqS[1] && !sC.forcedHide[1]) || sC.forcedBar[1]) ? dDv.offsetWidth - sC.barSpace[0] : dDv.offsetWidth;
            sC.cntSize[0] = maxCWidth + padWidthComp;
            return sC.cntSize[0];
        };
        sC.getContentHeight = function() {
            sC.cntRSize[1] = ((sC.reqS[0] && !sC.forcedHide[0]) || sC.forcedBar[0]) ? dDv.offsetHeight - sC.barSpace[1] : dDv.offsetHeight;
            sC.cntSize[1] = cDv.offsetHeight + padHeightComp - 2;
            return sC.cntSize[1];
        };

        sC.fixIEDispBug = function() { cDv.sY.display = 'none'; cDv.sY.display = 'block'; };
        sC.setWidth = function() { mDv.sY.width = (stdMode) ? (sC.cntRSize[0] - padWidthComp - brdWidthLoss) + 'px' : sC.cntRSize[0] + 'px'; };
        sC.setHeight = function() { mDv.sY.height = (stdMode) ? (sC.cntRSize[1] - padHeightComp - brdHeightLoss) + 'px' : sC.cntRSize[1] + 'px'; };

        sC.createScrollBars = function() {
            sC.getContentWidth(); sC.getContentHeight();
            //vert
            tDv.vrt = new Array(); var vrT = tDv.vrt;
            createScrollBars(vrT, 'vscroller');
            vrT.barPadding = [parseInt(getStyle(vrT.sBr, 'padding-top')), parseInt(getStyle(vrT.sBr, 'padding-bottom'))];
            vrT.sBr.sY.padding = '0px'; vrT.sBr.curPos = 0; vrT.sBr.vertical = true;
            vrT.sBr.indx = 1; cDv.vBar = vrT.sBr;
            prepareScroll(vrT, 0); sC.barSpace[0] = vrT.sDv.offsetWidth; sC.setWidth();
            //horiz
            tDv.hrz = new Array(); var hrZ = tDv.hrz;
            createScrollBars(hrZ, 'hscroller');
            hrZ.barPadding = [parseInt(getStyle(hrZ.sBr, 'padding-left')), parseInt(getStyle(hrZ.sBr, 'padding-right'))];
            hrZ.sBr.sY.padding = '0px'; hrZ.sBr.curPos = 0; hrZ.sBr.vertical = false;
            hrZ.sBr.indx = 0; cDv.hBar = hrZ.sBr;
            if (wD.opera) hrZ.sBr.sY.position = 'relative';
            prepareScroll(hrZ, 0);
            sC.barSpace[1] = hrZ.sDv.offsetHeight; sC.setHeight();
            tDv.sY.height = dDv.offsetHeight + 'px';
            // jog
            hrZ.jBox = createDiv('scrollerjogbox');
            tDv.appendChild(hrZ.jBox); hrZ.jBox.onmousedown = function() {
                hrZ.sBr.scrollBoth = true; sC.goScroll = hrZ.sBr; hrZ.sBr.clicked = true;
                hrZ.sBr.moved = false; tDv.vrt.sBr.moved = false;
                fleXenv.addTrggr(dC, 'selectstart', retFalse); fleXenv.addTrggr(dC, 'mousemove', mMoveBar); fleXenv.addTrggr(dC, 'mouseup', mMouseUp);
                return false;
            };
        };

        sC.goScroll = null;
        sC.createScrollBars();
        cDv.removeChild(iDv);

        if (!this.addChckTrggr(dDv, 'mousewheel', mWheelProc) || !this.addChckTrggr(dDv, 'DOMMouseScroll', mWheelProc)) { dDv.onmousewheel = mWheelProc; };
        this.addChckTrggr(dDv, 'mousewheel', mWheelProc);
        this.addChckTrggr(dDv, 'DOMMouseScroll', mWheelProc);
        dDv.setAttribute('tabIndex', '0');

        this.addTrggr(dDv, 'keydown', function(e) {
            if (dDv.focusProtect) return;
            if (!e) { var e = wD.event; }; var pK = e.keyCode; sC.pkeY = pK;
            sC.mDPosFix();
            if (sC.keyAct['_' + pK] && !window.opera) { dDv.contentScroll(sC.keyAct['_' + pK][0], sC.keyAct['_' + pK][1], true); if (e.preventDefault) e.preventDefault(); return false; };
        });
        this.addTrggr(dDv, 'keypress', function(e) {//make Opera Happy
            if (dDv.focusProtect) return;
            if (!e) { var e = wD.event; }; var pK = e.keyCode;
            if (sC.keyAct['_' + pK]) { dDv.contentScroll(sC.keyAct['_' + pK][0], sC.keyAct['_' + pK][1], true); if (e.preventDefault) e.preventDefault(); return false; };
        });

        this.addTrggr(dDv, 'keyup', function() { sC.pkeY = false });

        this.addTrggr(dC, 'mouseup', intClear);
        this.addTrggr(dDv, 'mousedown', function(e) {
            if (!e) e = wD.event;
            var cTrgt = (e.target) ? e.target : (e.srcElement) ? e.srcElement : false;
            if (!cTrgt || (cTrgt.className && cTrgt.className.match(RegExp("\\bscrollgeneric\\b")))) return;
            sC.inMposX = e.clientX; sC.inMposY = e.clientY;
            pageScrolled(); findPos(dDv); intClear();
            fleXenv.addTrggr(dC, 'mousemove', tSelectMouse);
            sC.mTBox = [dDv.xPos + 10, dDv.xPos + sC.cntRSize[0] - 10, dDv.yPos + 10, dDv.yPos + sC.cntRSize[1] - 10];
        });

        function tSelectMouse(e) {
            if (!e) e = wD.event;
            var mX = e.clientX, mY = e.clientY, mdX = mX + sC.xScrld, mdY = mY + sC.yScrld;
            sC.mOnXEdge = (mdX < sC.mTBox[0] || mdX > sC.mTBox[1]) ? 1 : 0;
            sC.mOnYEdge = (mdY < sC.mTBox[2] || mdY > sC.mTBox[3]) ? 1 : 0;
            sC.xAw = mX - sC.inMposX; sC.yAw = mY - sC.inMposY;
            sC.sXdir = (sC.xAw > 40) ? 1 : (sC.xAw < -40) ? -1 : 0; sC.sYdir = (sC.yAw > 40) ? 1 : (sC.yAw < -40) ? -1 : 0;
            if ((sC.sXdir != 0 || sC.sYdir != 0) && !sC.tSelectFunc) sC.tSelectFunc = wD.setInterval(function() {
                if (sC.sXdir == 0 && sC.sYdir == 0) { wD.clearInterval(sC.tSelectFunc); sC.tSelectFunc = false; return; }; pageScrolled();
                if (sC.mOnXEdge == 1 || sC.mOnYEdge == 1) dDv.contentScroll((sC.sXdir * sC.mOnXEdge) + "s", (sC.sYdir * sC.mOnYEdge) + "s", true);
            }, 45)
        }
        function intClear() {
            fleXenv.remTrggr(dC, 'mousemove', tSelectMouse); if (sC.tSelectFunc) wD.clearInterval(sC.tSelectFunc); sC.tSelectFunc = false;
            if (sC.barClickRetard) wD.clearTimeout(sC.barClickRetard); if (sC.barClickScroll) wD.clearInterval(sC.barClickScroll);
        }
        function pageScrolled() {
            sC.xScrld = (wD.pageXOffset) ? wD.pageXOffset : (dC.documentElement && dC.documentElement.scrollLeft) ? dC.documentElement.scrollLeft : 0;
            sC.yScrld = (wD.pageYOffset) ? wD.pageYOffset : (dC.documentElement && dC.documentElement.scrollTop) ? dC.documentElement.scrollTop : 0;
        }

        dDv.scrollUpdate = function(recurse) {
            if (tDv.getSize[1]() === 0 || tDv.getSize[0]() === 0) return;
            cDv.sY.padding = '1px'; var reqH = sC.reqS[0], reqV = sC.reqS[1], vBr = tDv.vrt, hBr = tDv.hrz, vUpReq, hUpReq, cPSize = [];
            tDv.sY.width = dDv.offsetWidth - brdWidthLoss + 'px'; tDv.sY.height = dDv.offsetHeight - brdHeightLoss + 'px';
            cPSize[0] = sC.cntRSize[0]; cPSize[1] = sC.cntRSize[1];
            sC.reqS[0] = sC.getContentWidth() > sC.cntRSize[0];
            sC.reqS[1] = sC.getContentHeight() > sC.cntRSize[1];
            var stateChange = (reqH != sC.reqS[0] || reqV != sC.reqS[1] || cPSize[0] != sC.cntRSize[0] || cPSize[1] != sC.cntRSize[1]) ? true : false;
            vBr.sDv.setVisibility(sC.reqS[1]); hBr.sDv.setVisibility(sC.reqS[0]);
            vUpReq = (sC.reqS[1] || sC.forcedBar[1]); hUpReq = (sC.reqS[0] || sC.forcedBar[0]);
            sC.getContentWidth(); sC.getContentHeight(); sC.setHeight(); sC.setWidth();
            if (!sC.reqS[0] || !sC.reqS[1] || sC.forcedHide[0] || sC.forcedHide[1]) hBr.jBox.fHide();
            else hBr.jBox.fShow();
            if (vUpReq) updateScroll(vBr, (hUpReq && !sC.forcedHide[0]) ? sC.barSpace[1] : 0); else cDv.sY.top = "0";
            if (hUpReq) updateScroll(hBr, (vUpReq && !sC.forcedHide[1]) ? sC.barSpace[0] : 0); else cDv.sY.left = "0";
            if (stateChange && !recurse) dDv.scrollUpdate(true);
            cDv.sY.padding = '0px';
            sC.edge[0] = sC.edge[1] = false;
        };

        dDv.commitScroll = dDv.contentScroll = function(xPos, yPos, relative) {
            var reT = [[false, false], [false, false]], Bar;
            if ((xPos || xPos === 0) && sC.scroller[0]) { xPos = calcCScrollVal(xPos, 0); Bar = tDv.hrz.sBr; Bar.trgtScrll = (relative) ? Math.min(Math.max(Bar.mxScroll, Bar.trgtScrll - xPos), 0) : -xPos; Bar.contentScrollPos(); reT[0] = [-Bar.trgtScrll - Bar.targetSkew, -Bar.mxScroll] }
            if ((yPos || yPos === 0) && sC.scroller[1]) { yPos = calcCScrollVal(yPos, 1); Bar = tDv.vrt.sBr; Bar.trgtScrll = (relative) ? Math.min(Math.max(Bar.mxScroll, Bar.trgtScrll - yPos), 0) : -yPos; Bar.contentScrollPos(); reT[1] = [-Bar.trgtScrll - Bar.targetSkew, -Bar.mxScroll] }
            if (!relative) sC.edge[0] = sC.edge[1] = false;
            return reT;
        };

        dDv.scrollToElement = function(tEM) {
            if (tEM == null || !isddvChild(tEM)) return;
            var sPos = findRCpos(tEM);
            dDv.contentScroll(sPos[0] + sC.paddings[2], sPos[1] + sC.paddings[0], false);
            dDv.contentScroll(0, 0, true);
        };

        copyStyles(pDv, dDv, '0px', ['border-left-width', 'border-right-width', 'border-top-width', 'border-bottom-width']);

        dDv.removeChild(pDv);
        dDv.scrollTop = 0; dDv.scrollLeft = 0;
        dDv.fleXcroll = true;
        classChange(dDv, 'flexcrollactive', false);
        dDv.scrollUpdate();
        dDv.contentScroll(oScrollX, oScrollY, true);
        if (urlBase.match(uReg)) { dDv.scrollToElement(dC.getElementById(urlBase.match(uReg)[1])); }
        tDv.fShow();

        sC.sizeChangeDetect = wD.setInterval(function() {
            var n = fDv.offsetHeight; if (n != sC.zTHeight) { dDv.scrollUpdate(); sC.zTHeight = n };
        }, 2500);

        function calcCScrollVal(v, i) {
            var stR = v.toString(); v = parseFloat(stR);
            return parseInt((stR.match(/p$/)) ? v * sC.cntRSize[i] * 0.9 : (stR.match(/s$/)) ? v * sC.cntRSize[i] * 0.1 : v);
        }
        function camelConv(spL) {
            var spL = spL.split('-'), reT = spL[0], i;
            for (i = 1; parT = spL[i]; i++) { reT += parT.charAt(0).toUpperCase() + parT.substr(1); }
            return reT;
        }
        function getStyle(elem, style) {
            if (wD.getComputedStyle) return wD.getComputedStyle(elem, null).getPropertyValue(style);
            if (elem.currentStyle) return elem.currentStyle[camelConv(style)];
            return false;
        };

        function copyStyles(src, dest, replaceStr, sList) {
            var camelList = new Array();
            for (var i = 0; i < sList.length; i++) {
                camelList[i] = camelConv(sList[i]);
                dest.style[camelList[i]] = getStyle(src, sList[i], camelList[i]);
                if (replaceStr) src.style[camelList[i]] = replaceStr;
            }
        };
        function createDiv(typeName, noGenericClass) {
            var nDiv = dC.createElement('div')//,pTx=dC.createTextNode('\u00a0');
            nDiv.id = targetId + '_' + typeName;
            nDiv.className = (noGenericClass) ? typeName : typeName + ' scrollgeneric';
            nDiv.getSize = [function() { return nDiv.offsetWidth; }, function() { return nDiv.offsetHeight; } ];
            nDiv.setSize = [function(sVal) { nDiv.sY.width = sVal; }, function(sVal) { nDiv.sY.height = sVal; } ];
            nDiv.getPos = [function() { return getStyle(nDiv, "left"); }, function() { return getStyle(nDiv, "top"); } ];
            nDiv.setPos = [function(sVal) { nDiv.sY.left = sVal; }, function(sVal) { nDiv.sY.top = sVal; } ];
            nDiv.fHide = function() { nDiv.sY.visibility = "hidden" };
            nDiv.fShow = function(coPy) { nDiv.sY.visibility = (coPy) ? getStyle(coPy, 'visibility') : "visible" };
            nDiv.sY = nDiv.style;
            //	if(!noGenericClass) nDiv.appendChild(pTx);
            return nDiv;

        };
        function createScrollBars(ary, bse) {
            ary.sDv = createDiv(bse + 'base'); ary.sFDv = createDiv(bse + 'basebeg');
            ary.sSDv = createDiv(bse + 'baseend'); ary.sBr = createDiv(bse + 'bar');
            ary.sFBr = createDiv(bse + 'barbeg'); ary.sSBr = createDiv(bse + 'barend');
            tDv.appendChild(ary.sDv); ary.sDv.appendChild(ary.sBr);
            ary.sDv.appendChild(ary.sFDv); ary.sDv.appendChild(ary.sSDv);
            ary.sBr.appendChild(ary.sFBr); ary.sBr.appendChild(ary.sSBr);
        };
        function prepareScroll(bAr, reqSpace) {
            var sDv = bAr.sDv, sBr = bAr.sBr, i = sBr.indx;
            sBr.minPos = bAr.barPadding[0];
            sBr.ofstParent = sDv;
            sBr.mDv = mDv;
            sBr.scrlTrgt = cDv;
            sBr.targetSkew = 0;
            updateScroll(bAr, reqSpace, true);

            sBr.doScrollPos = function() {
                sBr.curPos = (Math.min(Math.max(sBr.curPos, 0), sBr.maxPos));
                sBr.trgtScrll = parseInt((sBr.curPos / sBr.sRange) * sBr.mxScroll);
                sBr.targetSkew = (sBr.curPos == 0) ? 0 : (sBr.curPos == sBr.maxPos) ? 0 : sBr.targetSkew;
                sBr.setPos[i](sBr.curPos + sBr.minPos + "px");
                cDv.setPos[i](sBr.trgtScrll + sBr.targetSkew + "px");
            };

            sBr.contentScrollPos = function() {
                sBr.curPos = parseInt((sBr.trgtScrll * sBr.sRange) / sBr.mxScroll);
                sBr.targetSkew = sBr.trgtScrll - parseInt((sBr.curPos / sBr.sRange) * sBr.mxScroll);
                sBr.curPos = (Math.min(Math.max(sBr.curPos, 0), sBr.maxPos));
                sBr.setPos[i](sBr.curPos + sBr.minPos + "px");
                sBr.setPos[i](sBr.curPos + sBr.minPos + "px");
                cDv.setPos[i](sBr.trgtScrll + "px");
            };

            sC.barZ = getStyle(sBr, 'z-index');
            sBr.sY.zIndex = (sC.barZ == "auto" || sC.barZ == "0" || sC.barZ == 'normal') ? 2 : sC.barZ;
            mDv.sY.zIndex = getStyle(sBr, 'z-index');

            sBr.onmousedown = function() {
                sBr.clicked = true; sC.goScroll = sBr; sBr.scrollBoth = false; sBr.moved = false;
                fleXenv.addTrggr(dC, 'selectstart', retFalse);
                fleXenv.addTrggr(dC, 'mousemove', mMoveBar);
                fleXenv.addTrggr(dC, 'mouseup', mMouseUp);
                return false;
            };

            sBr.onmouseover = intClear;

            sDv.onmousedown = sDv.ondblclick = function(e) {
                if (!e) { var e = wD.event; }
                if (e.target && (e.target == bAr.sFBr || e.target == bAr.sSBr || e.target == bAr.sBr)) return;
                if (e.srcElement && (e.srcElement == bAr.sFBr || e.srcElement == bAr.sSBr || e.srcElement == bAr.sBr)) return;
                var relPos, mV = []; pageScrolled();
                sC.mDPosFix();
                findPos(sBr);
                relPos = (sBr.vertical) ? e.clientY + sC.yScrld - sBr.yPos : e.clientX + sC.xScrld - sBr.xPos;
                mV[sBr.indx] = (relPos < 0) ? sC.baseAct[0] : sC.baseAct[1]; mV[1 - sBr.indx] = 0;
                dDv.contentScroll(mV[0], mV[1], true);
                if (e.type != "dblclick") {
                    intClear();
                    sC.barClickRetard = wD.setTimeout(function() {
                        sC.barClickScroll = wD.setInterval(function() {
                            dDv.contentScroll(mV[0], mV[1], true);
                        }, 80)
                    }, 425);
                }
                return false;
            };
            sDv.setVisibility = function(r) {
                if (r) {
                    sDv.fShow(dDv);
                    sC.forcedHide[i] = (getStyle(sDv, "visibility") == "hidden") ? true : false;
                    if (!sC.forcedHide[i]) sBr.fShow(dDv); else sBr.fHide();
                    sC.scroller[i] = true; classChange(sDv, "", "flexinactive");
                }
                else {
                    sDv.fHide(); sBr.fHide();
                    sC.forcedBar[i] = (getStyle(sDv, "visibility") != "hidden") ? true : false;
                    sC.scroller[i] = false; sBr.curPos = 0; cDv.setPos[i]('0px');
                    classChange(sDv, "flexinactive", "");
                }
                mDv.setPos[1 - i]((sC.forcedPos[i] && (r || sC.forcedBar[i]) && !sC.forcedHide[i]) ? sC.barSpace[1 - i] - sC.paddings[i * 2] + "px" : "-" + sC.paddings[i * 2] + "px");
            };
            sDv.onmouseclick = retFalse;
        };

        function updateScroll(bAr, reqSpace, firstRun) {
            var sDv = bAr.sDv, sBr = bAr.sBr, sFDv = bAr.sFDv, sFBr = bAr.sFBr, sSDv = bAr.sSDv, sSBr = bAr.sSBr, i = sBr.indx;
            sDv.setSize[i](tDv.getSize[i]() - reqSpace + 'px'); sDv.setPos[1 - i](tDv.getSize[1 - i]() - sDv.getSize[1 - i]() + 'px');
            sC.forcedPos[i] = (parseInt(sDv.getPos[1 - i]()) === 0) ? true : false;
            bAr.padLoss = bAr.barPadding[0] + bAr.barPadding[1]; bAr.baseProp = parseInt((sDv.getSize[i]() - bAr.padLoss) * 0.75);
            sBr.aSize = Math.min(Math.max(Math.min(parseInt(sC.cntRSize[i] / sC.cntSize[i] * sDv.getSize[i]()), bAr.baseProp), 45), bAr.baseProp);
            sBr.setSize[i](sBr.aSize + 'px'); sBr.maxPos = sDv.getSize[i]() - sBr.getSize[i]() - bAr.padLoss;
            sBr.curPos = Math.min(Math.max(0, sBr.curPos), sBr.maxPos);
            sBr.setPos[i](sBr.curPos + sBr.minPos + 'px'); sBr.mxScroll = mDv.getSize[i]() - sC.cntSize[i];
            sBr.sRange = sBr.maxPos;
            sFDv.setSize[i](sDv.getSize[i]() - sSDv.getSize[i]() + 'px');
            sFBr.setSize[i](sBr.getSize[i]() - sSBr.getSize[i]() + 'px');
            sSBr.setPos[i](sBr.getSize[i]() - sSBr.getSize[i]() + 'px');
            sSDv.setPos[i](sDv.getSize[i]() - sSDv.getSize[i]() + 'px');
            if (!firstRun) sBr.doScrollPos();
            sC.fixIEDispBug();
        };

        sC.mDPosFix = function() { mDv.scrollTop = 0; mDv.scrollLeft = 0; dDv.scrollTop = 0; dDv.scrollLeft = 0; };

        this.addTrggr(wD, 'load', function() { if (dDv.fleXcroll) dDv.scrollUpdate(); });
        this.addTrggr(wD, 'resize', function() {
            if (dDv.refreshTimeout) wD.clearTimeout(dDv.refreshTimeout);
            dDv.refreshTimeout = wD.setTimeout(function() { if (dDv.fleXcroll) dDv.scrollUpdate(); }, 80);
        });

        for (var j = 0, inputName; inputName = focusProtectList[j]; j++) {
            var inputList = dDv.getElementsByTagName(inputName);
            for (var i = 0, formItem; formItem = inputList[i]; i++) {
                fleXenv.addTrggr(formItem, 'focus', function() { dDv.focusProtect = true; });
                fleXenv.addTrggr(formItem, 'blur', onblur = function() { dDv.focusProtect = false; });
            }
        };

        function retFalse() { return false; };
        function mMoveBar(e) {
            if (!e) { var e = wD.event; };
            var FCBar = sC.goScroll, movBr, maxx, xScroll, yScroll;
            if (FCBar == null) return;
            if (!fleXenv.w3events && !e.button) mMouseUp();
            maxx = (FCBar.scrollBoth) ? 2 : 1;
            for (var i = 0; i < maxx; i++) {
                movBr = (i == 1) ? FCBar.scrlTrgt.vBar : FCBar;
                if (FCBar.clicked) {
                    if (!movBr.moved) {
                        sC.mDPosFix();
                        findPos(movBr); findPos(movBr.ofstParent); movBr.pointerOffsetY = e.clientY - movBr.yPos;
                        movBr.pointerOffsetX = e.clientX - movBr.xPos; movBr.inCurPos = movBr.curPos; movBr.moved = true;
                    };
                    movBr.curPos = (movBr.vertical) ? e.clientY - movBr.pointerOffsetY - movBr.ofstParent.yPos - movBr.minPos : e.clientX - movBr.pointerOffsetX - movBr.ofstParent.xPos - movBr.minPos;
                    if (FCBar.scrollBoth) movBr.curPos = movBr.curPos + (movBr.curPos - movBr.inCurPos);
                    movBr.doScrollPos();
                } else movBr.moved = false;
            };
        };

        function mMouseUp() {
            if (sC.goScroll != null) { sC.goScroll.clicked = false; }
            sC.goScroll = null;
            fleXenv.remTrggr(dC, 'selectstart', retFalse);
            fleXenv.remTrggr(dC, 'mousemove', mMoveBar);
            fleXenv.remTrggr(dC, 'mouseup', mMouseUp);
        };

        function mWheelProc(e) {
            if (!e) e = wD.event;
            if (!this.fleXcroll) return;
            var scrDv = this, vEdge, hEdge, hoverH = false, delta = 0, iNDx;
            sC.mDPosFix();
            hElem = (e.target) ? e.target : (e.srcElement) ? e.srcElement : this;
            if (hElem.id && hElem.id.match(/_hscroller/)) hoverH = true;
            if (e.wheelDelta) delta = -e.wheelDelta; if (e.detail) delta = e.detail;
            delta = (delta < 0) ? -1 : +1; iNDx = (delta < 0) ? 0 : 1; sC.edge[1 - iNDx] = false;
            if ((sC.edge[iNDx] && !hoverH) || (!sC.scroller[0] && !sC.scroller[1])) return;
            if (sC.scroller[1] && !hoverH) scrollState = dDv.contentScroll(false, sC.wheelAct[iNDx], true);
            vEdge = !sC.scroller[1] || hoverH || (sC.scroller[1] && ((scrollState[1][0] == scrollState[1][1] && delta > 0) || (scrollState[1][0] == 0 && delta < 0)));
            if (sC.scroller[0] && (!sC.scroller[1] || hoverH)) scrollState = dDv.contentScroll(sC.wheelAct[iNDx], false, true);
            hEdge = !sC.scroller[0] || (sC.scroller[0] && sC.scroller[1] && vEdge && !hoverH) || (sC.scroller[0] && ((scrollState[0][0] == scrollState[0][1] && delta > 0) || (scrollState[0][0] == 0 && delta < 0)));
            if (vEdge && hEdge && !hoverH) sC.edge[iNDx] = true; else sC.edge[iNDx] = false;
            if (e.preventDefault) e.preventDefault();
            return false;
        };

        function isddvChild(elem) { while (elem.parentNode) { elem = elem.parentNode; if (elem == dDv) return true; } return false; };

        function findPos(elem) {
            //modified from firetree.net
            var obj = elem, curleft = curtop = 0;
            var monc = "";
            if (obj.offsetParent) { while (obj) { curleft += obj.offsetLeft; curtop += obj.offsetTop; obj = obj.offsetParent; monc += curtop + " "; } }
            else if (obj.x) { curleft += obj.x; curtop += obj.y; }
            elem.xPos = curleft; elem.yPos = curtop;
        };

        function findRCpos(elem) {
            var obj = elem; curleft = curtop = 0;
            while (!obj.offsetHeight && obj.parentNode && obj != cDv && getStyle(obj, 'display') == "inline") { obj = obj.parentNode; }
            if (obj.offsetParent) { while (obj != cDv) { curleft += obj.offsetLeft; curtop += obj.offsetTop; obj = obj.offsetParent; } }
            return [curleft, curtop];
        };

        function classChange(elem, addClass, remClass) {
            if (!elem.className) elem.className = '';
            var clsnm = elem.className;
            if (addClass && !clsnm.match(RegExp("(^|\\s)" + addClass + "($|\\s)"))) clsnm = clsnm.replace(/(\S$)/, '$1 ') + addClass;
            if (remClass) clsnm = clsnm.replace(RegExp("((^|\\s)+" + remClass + ")+($|\\s)", "g"), '$2').replace(/\s$/, '');
            elem.className = clsnm;
        };
    },
    //main code end
    globalInit: function() {
        if (fleXenv.catchFastInit) window.clearInterval(fleXenv.catchFastInit);
        var regg = /#([^#.]*)$/, urlExt = /(.*)#.*$/, matcH, i, anchoR, anchorList = document.getElementsByTagName("a"), urlBase = document.location.href;
        if (urlBase.match(urlExt)) urlBase = urlBase.match(urlExt)[1];
        for (i = 0; anchoR = anchorList[i]; i++) {
            if (anchoR.href && anchoR.href.match(regg) && anchoR.href.match(urlExt) && urlBase === anchoR.href.match(urlExt)[1]) {
                anchoR.fleXanchor = true;
                fleXenv.addTrggr(anchoR, 'click', function(e) {
                    if (!e) e = window.event;
                    var clickeD = (e.srcElement) ? e.srcElement : this;
                    while (!clickeD.fleXanchor && clickeD.parentNode) { clickeD = clickeD.parentNode };
                    if (!clickeD.fleXanchor) return;
                    var tEL = document.getElementById(clickeD.href.match(regg)[1]), eScroll = false;
                    if (tEL == null) tEL = (tEL = document.getElementsByName(clickeD.href.match(regg)[1])[0]) ? tEL : null;
                    if (tEL != null) {
                        var elem = tEL;
                        while (elem.parentNode) {
                            elem = elem.parentNode; if (elem.scrollToElement) {
                                elem.scrollToElement(tEL); eScroll = elem;
                            };
                        };
                        if (eScroll) { if (e.preventDefault) e.preventDefault(); document.location.href = "#" + clickeD.href.match(regg)[1]; eScroll.fleXdata.mDPosFix(); return false; }
                    };
                });
            };
        };
        fleXenv.initByClass();
        if (window.onfleXcrollRun) window.onfleXcrollRun();
    },

    initByClass: function() {
        if (fleXenv.initialized) return;
        fleXenv.initialized = true;
        var fleXlist = fleXenv.getByClassName(document.getElementsByTagName("body")[0], "div", 'flexcroll');
        for (var i = 0, tgDiv; tgDiv = fleXlist[i]; i++) fleXenv.fleXcrollMain(tgDiv);
    },

    getByClassName: function(elem, elType, classString) {
        //v1.1fleX
        if (typeof (elem) == 'string') elem = document.getElementById(elem);
        if (elem == null) return false;
        var regExer = new RegExp("(^|\\s)" + classString + "($|\\s)"), clsnm, retArray = [], key = 0;
        var elems = elem.getElementsByTagName(elType);
        for (var i = 0, pusher; pusher = elems[i]; i++) {
            if (pusher.className && pusher.className.match(regExer)) {
                retArray[key] = pusher; key++;
            }
        }
        return retArray;
    },

    catchFastInit: window.setInterval(function() {
        var dElem = document.getElementById('flexcroll-init');
        if (dElem != null) { fleXenv.initByClass(); window.clearInterval(fleXenv.catchFastInit); }
    }, 100),

    addTrggr: function(elm, eventname, func) { if (!fleXenv.addChckTrggr(elm, eventname, func) && elm.attachEvent) { elm.attachEvent('on' + eventname, func); } },

    addChckTrggr: function(elm, eventname, func) { if (elm.addEventListener) { elm.addEventListener(eventname, func, false); fleXenv.w3events = true; window.addEventListener("unload", function() { fleXenv.remTrggr(elm, eventname, func) }, false); return true; } else return false; },

    remTrggr: function(elm, eventname, func) { if (!fleXenv.remChckTrggr(elm, eventname, func) && elm.detachEvent) elm.detachEvent('on' + eventname, func); },

    remChckTrggr: function(elm, eventname, func) { if (elm.removeEventListener) { elm.removeEventListener(eventname, func, false); return true; } else return false; }

};

function CSBfleXcroll(targetId) { fleXenv.fleXcrollMain(targetId) };
fleXenv.fleXcrollInit();
